@dxos/shell 0.4.10-main.b9b4602 → 0.4.10-main.bf49328
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundle/{index-D-K0uxrm.mjs → index-C918bSpS.mjs} +38 -22
- package/dist/bundle/index-C918bSpS.mjs.map +1 -0
- package/dist/bundle/{index-DRtLjStG.mjs → index-MwaMRd0G.mjs} +595 -523
- package/dist/bundle/index-MwaMRd0G.mjs.map +1 -0
- package/dist/bundle/shell.mjs +2 -3
- package/dist/bundle/shell.mjs.map +1 -1
- package/dist/bundle/shell.umd.js +22 -22
- package/dist/bundle/shell.umd.js.map +1 -1
- package/dist/bundle/style.css +1 -1
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/react.mjs +33 -31
- package/dist/lib/browser/react.mjs.map +3 -3
- package/dist/lib/browser/testing/index.mjs +3 -2
- package/dist/lib/browser/testing/index.mjs.map +3 -3
- package/dist/types/src/components/InvitationList/InvitationListItem.js +5 -5
- package/dist/types/src/components/InvitationList/InvitationListItem.js.map +1 -1
- package/dist/types/src/panels/IdentityPanel/useAgentHandlers.d.ts.map +1 -1
- package/dist/types/src/panels/IdentityPanel/useAgentHandlers.js +5 -1
- package/dist/types/src/panels/IdentityPanel/useAgentHandlers.js.map +1 -1
- package/dist/types/src/panels/SpacePanel/steps/SpaceManager.d.ts.map +1 -1
- package/dist/types/src/panels/SpacePanel/steps/SpaceManager.js +3 -1
- package/dist/types/src/panels/SpacePanel/steps/SpaceManager.js.map +1 -1
- package/dist/types/src/playwright/invitations.spec.js +3 -1
- package/dist/types/src/playwright/invitations.spec.js.map +1 -1
- package/dist/types/src/steps/InvitationManager.d.ts +1 -1
- package/dist/types/src/steps/InvitationManager.d.ts.map +1 -1
- package/dist/types/src/steps/InvitationManager.js +3 -4
- package/dist/types/src/steps/InvitationManager.js.map +1 -1
- package/dist/types/src/stories/Invitations.e2e-stories.d.ts.map +1 -1
- package/dist/types/src/stories/Invitations.e2e-stories.js +5 -2
- package/dist/types/src/stories/Invitations.e2e-stories.js.map +1 -1
- package/dist/types/src/testing/shell-manager.d.ts.map +1 -1
- package/dist/types/src/testing/shell-manager.js +3 -2
- package/dist/types/src/testing/shell-manager.js.map +1 -1
- package/package.json +22 -21
- package/src/components/InvitationList/InvitationListItem.tsx +5 -5
- package/src/panels/IdentityPanel/useAgentHandlers.ts +5 -1
- package/src/panels/SpacePanel/steps/SpaceManager.tsx +3 -1
- package/src/playwright/invitations.spec.ts +3 -1
- package/src/steps/InvitationManager.tsx +4 -4
- package/src/stories/Invitations.e2e-stories.tsx +6 -3
- package/src/testing/shell-manager.ts +3 -2
- package/dist/bundle/index-D-K0uxrm.mjs.map +0 -1
- package/dist/bundle/index-DRtLjStG.mjs.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/shell",
|
|
3
|
-
"version": "0.4.10-main.
|
|
3
|
+
"version": "0.4.10-main.bf49328",
|
|
4
4
|
"description": "DXOS’s OS experiences",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -42,34 +42,35 @@
|
|
|
42
42
|
"react-qr-rounded": "^1.0.0",
|
|
43
43
|
"url-join": "^5.0.0",
|
|
44
44
|
"xstate": "^4.37.0",
|
|
45
|
-
"@dxos/
|
|
46
|
-
"@dxos/debug": "0.4.10-main.
|
|
47
|
-
"@dxos/client-
|
|
48
|
-
"@dxos/
|
|
49
|
-
"@dxos/
|
|
50
|
-
"@dxos/invariant": "0.4.10-main.
|
|
51
|
-
"@dxos/log": "0.4.10-main.
|
|
52
|
-
"@dxos/react-
|
|
53
|
-
"@dxos/react-
|
|
54
|
-
"@dxos/react-ui-theme": "0.4.10-main.
|
|
55
|
-
"@dxos/
|
|
56
|
-
"@dxos/
|
|
57
|
-
"@dxos/util": "0.4.10-main.
|
|
45
|
+
"@dxos/client-protocol": "0.4.10-main.bf49328",
|
|
46
|
+
"@dxos/debug": "0.4.10-main.bf49328",
|
|
47
|
+
"@dxos/client-services": "0.4.10-main.bf49328",
|
|
48
|
+
"@dxos/async": "0.4.10-main.bf49328",
|
|
49
|
+
"@dxos/display-name": "0.4.10-main.bf49328",
|
|
50
|
+
"@dxos/invariant": "0.4.10-main.bf49328",
|
|
51
|
+
"@dxos/log": "0.4.10-main.bf49328",
|
|
52
|
+
"@dxos/react-client": "0.4.10-main.bf49328",
|
|
53
|
+
"@dxos/react-ui": "0.4.10-main.bf49328",
|
|
54
|
+
"@dxos/react-ui-theme": "0.4.10-main.bf49328",
|
|
55
|
+
"@dxos/rpc-tunnel": "0.4.10-main.bf49328",
|
|
56
|
+
"@dxos/react-ui-types": "0.4.10-main.bf49328",
|
|
57
|
+
"@dxos/util": "0.4.10-main.bf49328"
|
|
58
58
|
},
|
|
59
59
|
"devDependencies": {
|
|
60
|
-
"@phosphor-icons/react": "^2.
|
|
60
|
+
"@phosphor-icons/react": "^2.1.5",
|
|
61
61
|
"@types/react": "^18.0.21",
|
|
62
62
|
"@types/react-dom": "^18.0.6",
|
|
63
63
|
"@vitejs/plugin-react": "^4.2.1",
|
|
64
64
|
"react": "^18.2.0",
|
|
65
65
|
"react-dom": "^18.2.0",
|
|
66
|
-
"vite": "^5.
|
|
66
|
+
"vite": "^5.2.9",
|
|
67
67
|
"vite-plugin-turbosnap": "^1.0.2",
|
|
68
|
-
"@dxos/
|
|
69
|
-
"@dxos/
|
|
70
|
-
"@dxos/
|
|
71
|
-
"@dxos/
|
|
72
|
-
"@dxos/
|
|
68
|
+
"@dxos/config": "0.4.10-main.bf49328",
|
|
69
|
+
"@dxos/random": "0.4.10-main.bf49328",
|
|
70
|
+
"@dxos/react-async": "0.4.10-main.bf49328",
|
|
71
|
+
"@dxos/storybook-utils": "0.4.10-main.bf49328",
|
|
72
|
+
"@dxos/react-ui-theme": "0.4.10-main.bf49328",
|
|
73
|
+
"@dxos/protocols": "0.4.10-main.bf49328"
|
|
73
74
|
},
|
|
74
75
|
"peerDependencies": {
|
|
75
76
|
"@phosphor-icons/react": "^2.0.5",
|
|
@@ -96,14 +96,14 @@ export const InvitationListItemImpl = ({
|
|
|
96
96
|
...props
|
|
97
97
|
}: InvitationListItemImplProps) => {
|
|
98
98
|
const { t } = useTranslation('os');
|
|
99
|
-
const { cancel, status: invitationStatus, invitationCode, authCode,
|
|
99
|
+
const { cancel, status: invitationStatus, invitationCode, authCode, multiUse } = propsInvitationStatus;
|
|
100
100
|
|
|
101
101
|
const isCancellable = !(
|
|
102
102
|
[Invitation.State.ERROR, Invitation.State.TIMEOUT, Invitation.State.CANCELLED].indexOf(invitationStatus) >= 0
|
|
103
103
|
);
|
|
104
104
|
|
|
105
105
|
const showShare =
|
|
106
|
-
|
|
106
|
+
multiUse ||
|
|
107
107
|
[Invitation.State.INIT, Invitation.State.CONNECTING, Invitation.State.CONNECTED].indexOf(invitationStatus) >= 0;
|
|
108
108
|
|
|
109
109
|
const showAuthCode = invitationStatus === Invitation.State.READY_FOR_AUTHENTICATION;
|
|
@@ -147,9 +147,9 @@ export const InvitationListItemImpl = ({
|
|
|
147
147
|
classNames={['flex gap-2 pis-3 pie-1 items-center relative', props.classNames]}
|
|
148
148
|
>
|
|
149
149
|
<ListItem.Heading classNames='sr-only'>
|
|
150
|
-
{t(
|
|
150
|
+
{t(multiUse ? 'invite many list item label' : 'invite one list item label')}
|
|
151
151
|
</ListItem.Heading>
|
|
152
|
-
{
|
|
152
|
+
{multiUse && (
|
|
153
153
|
<AvatarStackEffect status={avatarStatus} animation={avatarAnimation} reverseEffects={reverseEffects} />
|
|
154
154
|
)}
|
|
155
155
|
<Tooltip.Root>
|
|
@@ -162,7 +162,7 @@ export const InvitationListItemImpl = ({
|
|
|
162
162
|
</Avatar.Root>
|
|
163
163
|
<Tooltip.Portal>
|
|
164
164
|
<Tooltip.Content side='left' classNames='z-[70]'>
|
|
165
|
-
{t(
|
|
165
|
+
{t(multiUse ? 'invite many qr label' : 'invite one qr label')}
|
|
166
166
|
<Tooltip.Arrow />
|
|
167
167
|
</Tooltip.Content>
|
|
168
168
|
</Tooltip.Portal>
|
|
@@ -67,7 +67,11 @@ export const useAgentHandlers = ({
|
|
|
67
67
|
invitations.forEach((invitation) => invitation.cancel());
|
|
68
68
|
|
|
69
69
|
// TODO(nf): do this work in the hosting provider client?
|
|
70
|
-
const invitation = client.halo.share({
|
|
70
|
+
const invitation = client.halo.share({
|
|
71
|
+
type: Invitation.Type.INTERACTIVE,
|
|
72
|
+
authMethod: Invitation.AuthMethod.NONE,
|
|
73
|
+
multiUse: true,
|
|
74
|
+
});
|
|
71
75
|
|
|
72
76
|
invitation.subscribe(handleAgentCreate);
|
|
73
77
|
};
|
|
@@ -59,6 +59,7 @@ export const SpaceManager = (props: SpaceManagerProps) => {
|
|
|
59
59
|
const invitation = space.share?.({
|
|
60
60
|
type: Invitation.Type.INTERACTIVE,
|
|
61
61
|
authMethod: Invitation.AuthMethod.SHARED_SECRET,
|
|
62
|
+
multiUse: false,
|
|
62
63
|
target,
|
|
63
64
|
});
|
|
64
65
|
if (invitation && config.values.runtime?.app?.env?.DX_ENVIRONMENT !== 'production') {
|
|
@@ -72,8 +73,9 @@ export const SpaceManager = (props: SpaceManagerProps) => {
|
|
|
72
73
|
icon: UsersThree,
|
|
73
74
|
onClick: useCallback(() => {
|
|
74
75
|
const invitation = space.share?.({
|
|
75
|
-
type: Invitation.Type.
|
|
76
|
+
type: Invitation.Type.INTERACTIVE,
|
|
76
77
|
authMethod: Invitation.AuthMethod.NONE,
|
|
78
|
+
multiUse: true,
|
|
77
79
|
target,
|
|
78
80
|
});
|
|
79
81
|
if (invitation && config.values.runtime?.app?.env?.DX_ENVIRONMENT !== 'production') {
|
|
@@ -15,7 +15,9 @@ test.describe('Invitations', () => {
|
|
|
15
15
|
let manager: InvitationsManager;
|
|
16
16
|
|
|
17
17
|
// TODO(wittjosiah): Storybook takes a bit to be ready for testing against.
|
|
18
|
-
test.beforeAll(async ({ browser }) => {
|
|
18
|
+
test.beforeAll(async ({ browser, browserName }) => {
|
|
19
|
+
// TODO(wittjosiah): Storybook is broken in Safari/Webkit.
|
|
20
|
+
test.skip(browserName === 'webkit');
|
|
19
21
|
test.setTimeout(60_000);
|
|
20
22
|
manager = new InvitationsManager(browser);
|
|
21
23
|
await manager.init();
|
|
@@ -6,7 +6,7 @@ import { Check, X } from '@phosphor-icons/react';
|
|
|
6
6
|
import React, { useMemo } from 'react';
|
|
7
7
|
import { QR } from 'react-qr-rounded';
|
|
8
8
|
|
|
9
|
-
import { type InvitationStatus
|
|
9
|
+
import { type InvitationStatus } from '@dxos/react-client/invitations';
|
|
10
10
|
import { useId, useTranslation } from '@dxos/react-ui';
|
|
11
11
|
import { descriptionText, getSize, mx } from '@dxos/react-ui-theme';
|
|
12
12
|
import { hexToEmoji } from '@dxos/util';
|
|
@@ -43,13 +43,13 @@ export const InvitationManager = ({
|
|
|
43
43
|
active,
|
|
44
44
|
send,
|
|
45
45
|
status,
|
|
46
|
-
|
|
46
|
+
multiUse,
|
|
47
47
|
authCode,
|
|
48
48
|
id = '0',
|
|
49
49
|
}: InvitationManagerProps) => {
|
|
50
50
|
const { t } = useTranslation('os');
|
|
51
51
|
const qrLabel = useId('invitation-manager__qr-code');
|
|
52
|
-
const statusValue =
|
|
52
|
+
const statusValue = multiUse ? 0 : invitationStatusValue.get(status!) ?? 0;
|
|
53
53
|
const showAuthCode = statusValue === 3;
|
|
54
54
|
const emoji = hexToEmoji(id);
|
|
55
55
|
const activeView = useMemo(() => {
|
|
@@ -69,7 +69,7 @@ export const InvitationManager = ({
|
|
|
69
69
|
<Viewport.Views>
|
|
70
70
|
<InvitationManagerView id='showing qr' emoji={emoji}>
|
|
71
71
|
<p className='text-sm mlb-1 font-normal text-center'>
|
|
72
|
-
{t(
|
|
72
|
+
{t(multiUse ? 'invite many qr label' : 'invite one qr label')}
|
|
73
73
|
</p>
|
|
74
74
|
<div role='none' className={mx(descriptionText, 'is-full max-is-[14rem] relative')}>
|
|
75
75
|
<QR
|
|
@@ -10,7 +10,7 @@ import React, { useMemo, useState } from 'react';
|
|
|
10
10
|
import { log } from '@dxos/log';
|
|
11
11
|
import { faker } from '@dxos/random';
|
|
12
12
|
import { useClient } from '@dxos/react-client';
|
|
13
|
-
import { type Space, type SpaceMember,
|
|
13
|
+
import { type Space, type SpaceMember, useSpaces } from '@dxos/react-client/echo';
|
|
14
14
|
import { useIdentity } from '@dxos/react-client/halo';
|
|
15
15
|
import { Invitation, InvitationEncoder } from '@dxos/react-client/invitations';
|
|
16
16
|
import { ConnectionState, useNetworkStatus } from '@dxos/react-client/mesh';
|
|
@@ -36,7 +36,7 @@ const Panel = ({ id, panel, setPanel }: { id: number; panel?: PanelType; setPane
|
|
|
36
36
|
const spaces = useSpaces();
|
|
37
37
|
|
|
38
38
|
useMemo(() => {
|
|
39
|
-
if (panel
|
|
39
|
+
if (panel && typeof panel !== 'string') {
|
|
40
40
|
(window as any)[`peer${id}CreateSpaceInvitation`] = (options?: Partial<Invitation>) => {
|
|
41
41
|
const invitation = panel.share(options);
|
|
42
42
|
|
|
@@ -50,7 +50,7 @@ const Panel = ({ id, panel, setPanel }: { id: number; panel?: PanelType; setPane
|
|
|
50
50
|
}
|
|
51
51
|
}, [panel]);
|
|
52
52
|
|
|
53
|
-
if (panel
|
|
53
|
+
if (panel && typeof panel !== 'string') {
|
|
54
54
|
return <SpacePanel space={panel} createInvitationUrl={createInvitationUrl} />;
|
|
55
55
|
}
|
|
56
56
|
|
|
@@ -216,6 +216,9 @@ const Invitations = (args: { id: number; count: number }) => {
|
|
|
216
216
|
);
|
|
217
217
|
};
|
|
218
218
|
|
|
219
|
+
// TODO(wittjosiah): This story fails to start in Safari/Webkit.
|
|
220
|
+
// The issue appears to be related to dynamic imports during client initialization.
|
|
221
|
+
// This does not seem to be a problem in other browsers nor in Safari in the app.
|
|
219
222
|
export const Default = {
|
|
220
223
|
render: (args: { id: number }) => (
|
|
221
224
|
<ClipboardProvider>
|
|
@@ -75,7 +75,7 @@ export class ShellManager extends ScopedShellManager {
|
|
|
75
75
|
await this.shell.getByTestId('device-list-item-current.options').click();
|
|
76
76
|
await this.shell.getByTestId('device-list-item-current.join-existing').click();
|
|
77
77
|
await this.shell.getByTestId('join-new-identity.reset-identity-input').fill('CONFIRM');
|
|
78
|
-
await this.shell.getByTestId('join-new-identity.reset-identity-
|
|
78
|
+
await this.shell.getByTestId('join-new-identity.reset-identity-confirm').click();
|
|
79
79
|
await this.inputInvitation('device', invitationCode, this.shell);
|
|
80
80
|
}
|
|
81
81
|
|
|
@@ -117,7 +117,8 @@ export class ShellManager extends ScopedShellManager {
|
|
|
117
117
|
|
|
118
118
|
private async _onConsoleMessage(message: ConsoleMessage) {
|
|
119
119
|
try {
|
|
120
|
-
const
|
|
120
|
+
const text = message.text();
|
|
121
|
+
const json = JSON.parse(text.slice(text.indexOf('{')));
|
|
121
122
|
if (json.invitationCode) {
|
|
122
123
|
this._invitationCode.wake(json.invitationCode);
|
|
123
124
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-D-K0uxrm.mjs","sources":["../../../../core/mesh/websocket-rpc/dist/lib/browser/index.mjs"],"sourcesContent":["import \"@dxos/node-std/globals\";\n\n// inject-globals:@inject-globals\nimport {\n global,\n Buffer,\n process\n} from \"@dxos/node-std/inject-globals\";\n\n// packages/core/mesh/websocket-rpc/src/client.ts\nimport WebSocket from \"isomorphic-ws\";\nimport { Event, Trigger } from \"@dxos/async\";\nimport { log, logInfo } from \"@dxos/log\";\nimport { createProtoRpcPeer } from \"@dxos/rpc\";\nfunction _ts_decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\")\n r = Reflect.decorate(decorators, target, key, desc);\n else\n for (var i = decorators.length - 1; i >= 0; i--)\n if (d = decorators[i])\n r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\nvar __dxlog_file = \"/home/runner/work/dxos/dxos/packages/core/mesh/websocket-rpc/src/client.ts\";\nvar WebsocketRpcClient = class {\n constructor(_params) {\n this._params = _params;\n this._connectTrigger = new Trigger();\n this.connected = new Event();\n this.disconnected = new Event();\n this.error = new Event();\n this._rpc = createProtoRpcPeer({\n requested: this._params.requested,\n exposed: this._params.exposed,\n handlers: this._params.handlers,\n port: {\n send: (msg) => {\n this._socket.send(msg);\n },\n subscribe: (cb) => {\n this._socket.onmessage = async (msg) => {\n if (typeof Blob !== \"undefined\" && msg.data instanceof Blob) {\n cb(Buffer.from(await msg.data.arrayBuffer()));\n } else {\n cb(msg.data);\n }\n };\n }\n }\n });\n }\n get url() {\n return this._params.url;\n }\n async open() {\n this._socket = new WebSocket(this._params.url);\n this._socket.onopen = async () => {\n log(\"Socket open\", void 0, {\n F: __dxlog_file,\n L: 55,\n S: this,\n C: (f, a) => f(...a)\n });\n try {\n await this._rpc.open();\n log(`RPC open ${this._params.url}`, void 0, {\n F: __dxlog_file,\n L: 58,\n S: this,\n C: (f, a) => f(...a)\n });\n this.connected.emit();\n this._connectTrigger.wake();\n } catch (err) {\n this.error.emit(err);\n }\n };\n this._socket.onclose = async () => {\n log(`Disconnected ${this._params.url}`, void 0, {\n F: __dxlog_file,\n L: 67,\n S: this,\n C: (f, a) => f(...a)\n });\n this.disconnected.emit();\n await this.close();\n };\n this._socket.onerror = (event) => {\n log.error(event.message ?? \"Socket error\", {\n url: this._params.url\n }, {\n F: __dxlog_file,\n L: 73,\n S: this,\n C: (f, a) => f(...a)\n });\n const error = event.error ?? new Error(event.message);\n this.error.emit(error);\n this._connectTrigger.throw(error);\n };\n await this._connectTrigger.wait();\n }\n async close() {\n try {\n await this._rpc?.close();\n } catch (err) {\n log.catch(err, void 0, {\n F: __dxlog_file,\n L: 86,\n S: this,\n C: (f, a) => f(...a)\n });\n }\n this._socket?.close();\n }\n get rpc() {\n return this._rpc.rpc;\n }\n};\n_ts_decorate([\n logInfo\n], WebsocketRpcClient.prototype, \"url\", null);\n\n// packages/core/mesh/websocket-rpc/src/server.ts\nimport WebSocket2 from \"isomorphic-ws\";\nimport { log as log2 } from \"@dxos/log\";\nimport { createProtoRpcPeer as createProtoRpcPeer2 } from \"@dxos/rpc\";\nvar __dxlog_file2 = \"/home/runner/work/dxos/dxos/packages/core/mesh/websocket-rpc/src/server.ts\";\nvar WebsocketRpcServer = class {\n constructor(_params) {\n this._params = _params;\n }\n async open() {\n this._server = new WebSocket2.Server({\n ...this._params\n });\n this._server.on(\"connection\", async (socket, request) => {\n log2(\"connection\", {\n request\n }, {\n F: __dxlog_file2,\n L: 34,\n S: this,\n C: (f, a) => f(...a)\n });\n const info = {\n request\n };\n const { onOpen, onClose, ...options } = await this._params.onConnection(info);\n const rpc = createProtoRpcPeer2({\n ...options,\n port: {\n send: (msg) => {\n socket.send(msg);\n },\n subscribe: (cb) => {\n socket.onmessage = async (msg) => {\n if (typeof Blob !== \"undefined\" && msg.data instanceof Blob) {\n cb(Buffer.from(await msg.data.arrayBuffer()));\n } else {\n cb(msg.data);\n }\n };\n }\n }\n });\n await rpc.open();\n await onOpen?.(rpc);\n socket.onclose = async () => {\n await onClose?.(rpc);\n await rpc.close();\n };\n });\n }\n async close() {\n this._server?.close();\n }\n};\nexport {\n WebsocketRpcClient,\n WebsocketRpcServer\n};\n//# sourceMappingURL=index.mjs.map\n"],"names":["_ts_decorate","decorators","target","key","desc","r","d","i","__dxlog_file","WebsocketRpcClient","_params","Trigger","Event","createProtoRpcPeer","msg","cb","Buffer","WebSocket","log","f","a","err","event","error","_a","_b","logInfo"],"mappings":"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"}
|