@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.
Files changed (44) hide show
  1. package/dist/bundle/{index-D-K0uxrm.mjs → index-C918bSpS.mjs} +38 -22
  2. package/dist/bundle/index-C918bSpS.mjs.map +1 -0
  3. package/dist/bundle/{index-DRtLjStG.mjs → index-MwaMRd0G.mjs} +595 -523
  4. package/dist/bundle/index-MwaMRd0G.mjs.map +1 -0
  5. package/dist/bundle/shell.mjs +2 -3
  6. package/dist/bundle/shell.mjs.map +1 -1
  7. package/dist/bundle/shell.umd.js +22 -22
  8. package/dist/bundle/shell.umd.js.map +1 -1
  9. package/dist/bundle/style.css +1 -1
  10. package/dist/lib/browser/meta.json +1 -1
  11. package/dist/lib/browser/react.mjs +33 -31
  12. package/dist/lib/browser/react.mjs.map +3 -3
  13. package/dist/lib/browser/testing/index.mjs +3 -2
  14. package/dist/lib/browser/testing/index.mjs.map +3 -3
  15. package/dist/types/src/components/InvitationList/InvitationListItem.js +5 -5
  16. package/dist/types/src/components/InvitationList/InvitationListItem.js.map +1 -1
  17. package/dist/types/src/panels/IdentityPanel/useAgentHandlers.d.ts.map +1 -1
  18. package/dist/types/src/panels/IdentityPanel/useAgentHandlers.js +5 -1
  19. package/dist/types/src/panels/IdentityPanel/useAgentHandlers.js.map +1 -1
  20. package/dist/types/src/panels/SpacePanel/steps/SpaceManager.d.ts.map +1 -1
  21. package/dist/types/src/panels/SpacePanel/steps/SpaceManager.js +3 -1
  22. package/dist/types/src/panels/SpacePanel/steps/SpaceManager.js.map +1 -1
  23. package/dist/types/src/playwright/invitations.spec.js +3 -1
  24. package/dist/types/src/playwright/invitations.spec.js.map +1 -1
  25. package/dist/types/src/steps/InvitationManager.d.ts +1 -1
  26. package/dist/types/src/steps/InvitationManager.d.ts.map +1 -1
  27. package/dist/types/src/steps/InvitationManager.js +3 -4
  28. package/dist/types/src/steps/InvitationManager.js.map +1 -1
  29. package/dist/types/src/stories/Invitations.e2e-stories.d.ts.map +1 -1
  30. package/dist/types/src/stories/Invitations.e2e-stories.js +5 -2
  31. package/dist/types/src/stories/Invitations.e2e-stories.js.map +1 -1
  32. package/dist/types/src/testing/shell-manager.d.ts.map +1 -1
  33. package/dist/types/src/testing/shell-manager.js +3 -2
  34. package/dist/types/src/testing/shell-manager.js.map +1 -1
  35. package/package.json +22 -21
  36. package/src/components/InvitationList/InvitationListItem.tsx +5 -5
  37. package/src/panels/IdentityPanel/useAgentHandlers.ts +5 -1
  38. package/src/panels/SpacePanel/steps/SpaceManager.tsx +3 -1
  39. package/src/playwright/invitations.spec.ts +3 -1
  40. package/src/steps/InvitationManager.tsx +4 -4
  41. package/src/stories/Invitations.e2e-stories.tsx +6 -3
  42. package/src/testing/shell-manager.ts +3 -2
  43. package/dist/bundle/index-D-K0uxrm.mjs.map +0 -1
  44. 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.b9b4602",
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/async": "0.4.10-main.b9b4602",
46
- "@dxos/debug": "0.4.10-main.b9b4602",
47
- "@dxos/client-protocol": "0.4.10-main.b9b4602",
48
- "@dxos/display-name": "0.4.10-main.b9b4602",
49
- "@dxos/client-services": "0.4.10-main.b9b4602",
50
- "@dxos/invariant": "0.4.10-main.b9b4602",
51
- "@dxos/log": "0.4.10-main.b9b4602",
52
- "@dxos/react-ui": "0.4.10-main.b9b4602",
53
- "@dxos/react-client": "0.4.10-main.b9b4602",
54
- "@dxos/react-ui-theme": "0.4.10-main.b9b4602",
55
- "@dxos/react-ui-types": "0.4.10-main.b9b4602",
56
- "@dxos/rpc-tunnel": "0.4.10-main.b9b4602",
57
- "@dxos/util": "0.4.10-main.b9b4602"
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.0.5",
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.1.7",
66
+ "vite": "^5.2.9",
67
67
  "vite-plugin-turbosnap": "^1.0.2",
68
- "@dxos/react-async": "0.4.10-main.b9b4602",
69
- "@dxos/config": "0.4.10-main.b9b4602",
70
- "@dxos/random": "0.4.10-main.b9b4602",
71
- "@dxos/react-ui-theme": "0.4.10-main.b9b4602",
72
- "@dxos/storybook-utils": "0.4.10-main.b9b4602"
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, type } = propsInvitationStatus;
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
- type === Invitation.Type.MULTIUSE ||
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(type === Invitation.Type.MULTIUSE ? 'invite many list item label' : 'invite one list item label')}
150
+ {t(multiUse ? 'invite many list item label' : 'invite one list item label')}
151
151
  </ListItem.Heading>
152
- {type === Invitation.Type.MULTIUSE && (
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(type === Invitation.Type.MULTIUSE ? 'invite many qr label' : 'invite one qr label')}
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({ type: Invitation.Type.MULTIUSE, authMethod: Invitation.AuthMethod.NONE });
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.MULTIUSE,
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, Invitation } from '@dxos/react-client/invitations';
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
- type,
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 = type === Invitation.Type.MULTIUSE ? 0 : invitationStatusValue.get(status!) ?? 0;
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(type === Invitation.Type.MULTIUSE ? 'invite many qr label' : 'invite one qr label')}
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, SpaceProxy, useSpaces } from '@dxos/react-client/echo';
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 instanceof SpaceProxy) {
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 instanceof SpaceProxy) {
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-input-confirm').click();
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 json = JSON.parse(message.text());
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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"}