@dxos/plugin-script 0.7.2 → 0.7.3-staging.971cd8d

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 (101) hide show
  1. package/dist/lib/browser/{AutomationPanel-BZCRRLOQ.mjs → AutomationPanel-PMTZROAZ.mjs} +18 -11
  2. package/dist/lib/browser/AutomationPanel-PMTZROAZ.mjs.map +7 -0
  3. package/dist/lib/browser/{ScriptContainer-GQ2KJ5BM.mjs → ScriptContainer-RYZFYCNK.mjs} +27 -25
  4. package/dist/lib/browser/ScriptContainer-RYZFYCNK.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-NCZUJKJE.mjs → chunk-K7KY6YMG.mjs} +14 -10
  6. package/dist/lib/browser/chunk-K7KY6YMG.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-DTVOXLPP.mjs → chunk-QFZUFT5G.mjs} +2 -2
  8. package/dist/lib/browser/{chunk-DTVOXLPP.mjs.map → chunk-QFZUFT5G.mjs.map} +3 -3
  9. package/dist/lib/browser/chunk-U3OP64V4.mjs +123 -0
  10. package/dist/lib/browser/chunk-U3OP64V4.mjs.map +7 -0
  11. package/dist/lib/browser/edge/index.mjs +5 -9
  12. package/dist/lib/browser/index.mjs +15 -18
  13. package/dist/lib/browser/index.mjs.map +3 -3
  14. package/dist/lib/browser/meta.json +1 -1
  15. package/dist/lib/browser/types/index.mjs +1 -1
  16. package/dist/lib/node/{AutomationPanel-VNLNP3EE.cjs → AutomationPanel-AAGQREH7.cjs} +21 -16
  17. package/dist/lib/node/AutomationPanel-AAGQREH7.cjs.map +7 -0
  18. package/dist/lib/node/{ScriptContainer-K67ZWCKL.cjs → ScriptContainer-FZ44UIRC.cjs} +32 -30
  19. package/dist/lib/node/ScriptContainer-FZ44UIRC.cjs.map +7 -0
  20. package/dist/lib/node/{chunk-BJ4WIWCP.cjs → chunk-4INUJLXL.cjs} +16 -12
  21. package/dist/lib/node/chunk-4INUJLXL.cjs.map +7 -0
  22. package/dist/lib/node/chunk-CS25QNKZ.cjs +151 -0
  23. package/dist/lib/node/chunk-CS25QNKZ.cjs.map +7 -0
  24. package/dist/lib/node/{chunk-T4PYTKIW.cjs → chunk-DQYAU2CJ.cjs} +5 -5
  25. package/dist/lib/node/{chunk-T4PYTKIW.cjs.map → chunk-DQYAU2CJ.cjs.map} +3 -3
  26. package/dist/lib/node/edge/index.cjs +10 -14
  27. package/dist/lib/node/edge/index.cjs.map +2 -2
  28. package/dist/lib/node/index.cjs +30 -33
  29. package/dist/lib/node/index.cjs.map +3 -3
  30. package/dist/lib/node/meta.json +1 -1
  31. package/dist/lib/node/types/index.cjs +4 -4
  32. package/dist/lib/node/types/index.cjs.map +1 -1
  33. package/dist/lib/node-esm/{AutomationPanel-NWE2QCOE.mjs → AutomationPanel-ETQEDY5I.mjs} +18 -11
  34. package/dist/lib/node-esm/AutomationPanel-ETQEDY5I.mjs.map +7 -0
  35. package/dist/lib/node-esm/{ScriptContainer-BVDYLJZI.mjs → ScriptContainer-3PKDW34A.mjs} +27 -25
  36. package/dist/lib/node-esm/ScriptContainer-3PKDW34A.mjs.map +7 -0
  37. package/dist/lib/node-esm/chunk-36DLLQ6E.mjs +125 -0
  38. package/dist/lib/node-esm/chunk-36DLLQ6E.mjs.map +7 -0
  39. package/dist/lib/node-esm/{chunk-2HYWFUEN.mjs → chunk-GMVPKT6A.mjs} +2 -2
  40. package/dist/lib/node-esm/{chunk-2HYWFUEN.mjs.map → chunk-GMVPKT6A.mjs.map} +3 -3
  41. package/dist/lib/node-esm/{chunk-DXWSRDEN.mjs → chunk-OFYGBUNI.mjs} +14 -10
  42. package/dist/lib/node-esm/chunk-OFYGBUNI.mjs.map +7 -0
  43. package/dist/lib/node-esm/edge/index.mjs +5 -9
  44. package/dist/lib/node-esm/index.mjs +15 -18
  45. package/dist/lib/node-esm/index.mjs.map +3 -3
  46. package/dist/lib/node-esm/meta.json +1 -1
  47. package/dist/lib/node-esm/types/index.mjs +1 -1
  48. package/dist/types/src/ScriptPlugin.d.ts.map +1 -1
  49. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts.map +1 -1
  50. package/dist/types/src/components/DebugPanel/DebugPanel.d.ts.map +1 -1
  51. package/dist/types/src/components/ScriptBlock/ScriptBlock.d.ts +1 -5
  52. package/dist/types/src/components/ScriptBlock/ScriptBlock.d.ts.map +1 -1
  53. package/dist/types/src/components/ScriptBlock/ScriptBlock.stories.d.ts.map +1 -1
  54. package/dist/types/src/components/ScriptEditor.d.ts.map +1 -1
  55. package/dist/types/src/components/ScriptSettingsPanel.d.ts.map +1 -1
  56. package/dist/types/src/edge/functions.d.ts +13 -21
  57. package/dist/types/src/edge/functions.d.ts.map +1 -1
  58. package/dist/types/src/edge/index.d.ts +0 -3
  59. package/dist/types/src/edge/index.d.ts.map +1 -1
  60. package/dist/types/src/translations.d.ts +43 -0
  61. package/dist/types/src/translations.d.ts.map +1 -1
  62. package/dist/types/src/types/schema.d.ts +2 -2
  63. package/dist/types/src/types/types.d.ts +2 -3
  64. package/dist/types/src/types/types.d.ts.map +1 -1
  65. package/package.json +37 -36
  66. package/src/ScriptPlugin.tsx +4 -8
  67. package/src/components/AutomationPanel/AutomationPanel.tsx +10 -5
  68. package/src/components/DebugPanel/DebugPanel.tsx +41 -30
  69. package/src/components/ScriptBlock/ScriptBlock.stories.tsx +5 -25
  70. package/src/components/ScriptBlock/ScriptBlock.tsx +3 -8
  71. package/src/components/ScriptEditor.tsx +16 -23
  72. package/src/components/ScriptSettingsPanel.tsx +1 -5
  73. package/src/edge/functions.ts +69 -109
  74. package/src/edge/index.ts +0 -3
  75. package/src/translations.ts +4 -0
  76. package/src/types/schema.ts +1 -1
  77. package/src/types/types.ts +1 -3
  78. package/dist/lib/browser/AutomationPanel-BZCRRLOQ.mjs.map +0 -7
  79. package/dist/lib/browser/ScriptContainer-GQ2KJ5BM.mjs.map +0 -7
  80. package/dist/lib/browser/chunk-5GGRYRS4.mjs +0 -253
  81. package/dist/lib/browser/chunk-5GGRYRS4.mjs.map +0 -7
  82. package/dist/lib/browser/chunk-NCZUJKJE.mjs.map +0 -7
  83. package/dist/lib/node/AutomationPanel-VNLNP3EE.cjs.map +0 -7
  84. package/dist/lib/node/ScriptContainer-K67ZWCKL.cjs.map +0 -7
  85. package/dist/lib/node/chunk-BJ4WIWCP.cjs.map +0 -7
  86. package/dist/lib/node/chunk-XS6GEYYH.cjs +0 -273
  87. package/dist/lib/node/chunk-XS6GEYYH.cjs.map +0 -7
  88. package/dist/lib/node-esm/AutomationPanel-NWE2QCOE.mjs.map +0 -7
  89. package/dist/lib/node-esm/ScriptContainer-BVDYLJZI.mjs.map +0 -7
  90. package/dist/lib/node-esm/chunk-DXWSRDEN.mjs.map +0 -7
  91. package/dist/lib/node-esm/chunk-V74XKPLC.mjs +0 -255
  92. package/dist/lib/node-esm/chunk-V74XKPLC.mjs.map +0 -7
  93. package/dist/types/src/edge/codec.d.ts +0 -4
  94. package/dist/types/src/edge/codec.d.ts.map +0 -1
  95. package/dist/types/src/edge/header-codec.d.ts +0 -24
  96. package/dist/types/src/edge/header-codec.d.ts.map +0 -1
  97. package/dist/types/src/edge/hub-protocol.d.ts +0 -6
  98. package/dist/types/src/edge/hub-protocol.d.ts.map +0 -1
  99. package/src/edge/codec.ts +0 -13
  100. package/src/edge/header-codec.ts +0 -97
  101. package/src/edge/hub-protocol.ts +0 -27
@@ -4,143 +4,67 @@
4
4
 
5
5
  import { type DID } from 'iso-did/types';
6
6
 
7
- import { Trigger } from '@dxos/async';
8
- import { type Config } from '@dxos/client';
9
- import { type Halo } from '@dxos/client-protocol';
10
- import { type JsonSchemaType, type ObjectMeta } from '@dxos/echo-schema';
7
+ import { type Client } from '@dxos/client';
8
+ import { type ObjectMeta } from '@dxos/echo-schema';
9
+ import { EdgeHttpClient, type EdgeIdentity } from '@dxos/edge-client';
11
10
  import { invariant } from '@dxos/invariant';
12
- import type { SpaceId } from '@dxos/keys';
11
+ import type { PublicKey, SpaceId } from '@dxos/keys';
13
12
  import { log } from '@dxos/log';
14
- import { type Credential } from '@dxos/protocols/proto/dxos/halo/credentials';
15
-
16
- import { codec } from './codec';
17
- import { matchServiceCredential } from './hub-protocol';
13
+ import { type UploadFunctionResponseBody } from '@dxos/protocols';
18
14
 
19
15
  // TODO: use URL scheme for source?
20
- const USERFUNCTIONS_META_KEY = 'dxos.org/service/function';
21
- export const USERFUNCTIONS_PRESET_META_KEY = 'dxos.org/service/function-preset';
22
- const USERFUNCTIONS_CREDENTIAL_CAPABILITY = 'composer:beta';
23
-
24
- // TODO: Synchronize API types with server
25
- export type UserFunctionUploadResult = {
26
- result: 'success' | 'error';
27
- errorMessage?: string;
28
- functionId?: string;
29
- functionVersionNumber?: number;
30
- meta: {
31
- inputSchema?: JsonSchemaType;
32
- };
33
- };
16
+ const FUNCTIONS_META_KEY = 'dxos.org/service/function';
17
+
18
+ export const FUNCTIONS_PRESET_META_KEY = 'dxos.org/service/function-preset';
34
19
 
35
- export type UploadWorkerProps = {
36
- clientConfig: Config;
37
- halo: Halo;
20
+ export type UploadWorkerArgs = {
21
+ client: Client;
38
22
  name?: string;
39
23
  source: string;
24
+ version: string;
40
25
  functionId?: string;
41
- ownerDid: DID;
42
- credentialLoadTimeout?: number; // ms to wait for credentials to load
43
- };
44
-
45
- // TODO(burdon): Config.
46
- const defaultUserFunctionsBaseUrl = 'https://edge-main.dxos.workers.dev/functions'; // 'http://localhost:8600';
47
-
48
- const getBaseUrl = (config: Config) => {
49
- if (config.values.runtime?.services?.edge?.url) {
50
- const url = new URL('/functions', config.values.runtime?.services?.edge?.url);
51
- url.protocol = 'https';
52
- return url.toString();
53
- } else {
54
- return defaultUserFunctionsBaseUrl;
55
- }
26
+ spaceId: SpaceId;
56
27
  };
57
28
 
58
29
  export const uploadWorkerFunction = async ({
59
- clientConfig,
60
- halo,
30
+ client,
61
31
  name,
32
+ version,
62
33
  source,
63
- ownerDid,
34
+ spaceId,
64
35
  functionId,
65
- credentialLoadTimeout,
66
- }: UploadWorkerProps) => {
67
- const identity = halo.identity.get();
68
- if (!identity) {
69
- throw new Error('Identity not available');
70
- }
71
- const userFunctionsBaseUrl = getBaseUrl(clientConfig);
72
-
73
- // TODO: codify naming convention
74
- const uploadUrl = `${userFunctionsBaseUrl}/${ownerDid}` + (functionId ? `/${functionId}` : '');
75
-
76
- log('Upload', { functionId, source, name, identityKey: identity.identityKey, uploadUrl: uploadUrl.toString() });
77
- const response = await fetch(uploadUrl, {
78
- method: 'PUT',
79
- body: JSON.stringify({ script: source, name }),
80
- headers: await presentationForIdentity({ halo, timeout: credentialLoadTimeout }),
36
+ }: UploadWorkerArgs): Promise<UploadFunctionResponseBody> => {
37
+ const edgeUrl = client.config.values.runtime?.services?.edge?.url;
38
+ invariant(edgeUrl, 'Edge is not configured.');
39
+ const edgeClient = new EdgeHttpClient(edgeUrl);
40
+ const edgeIdentity = createEdgeIdentity(client);
41
+ edgeClient.setIdentity(edgeIdentity);
42
+ const response = await edgeClient.uploadFunction({ spaceId, functionId }, { name, version, script: source });
43
+
44
+ log('Uploaded', {
45
+ functionId,
46
+ source,
47
+ name,
48
+ identityKey: edgeIdentity.identityKey,
49
+ response,
81
50
  });
82
- if (!response.ok) {
83
- return (await response.json()) as UserFunctionUploadResult;
84
- }
85
-
86
- const res = await response.json();
87
- log('Upload response', { status: response.status, res });
88
51
 
89
- return res as UserFunctionUploadResult;
52
+ return response;
90
53
  };
91
54
 
92
55
  export const getUserFunctionUrlInMetadata = (meta: ObjectMeta) => {
93
- return meta.keys.find((key) => key.source === USERFUNCTIONS_META_KEY)?.id;
56
+ return meta.keys.find((key) => key.source === FUNCTIONS_META_KEY)?.id;
94
57
  };
95
58
 
96
59
  export const setUserFunctionUrlInMetadata = (meta: ObjectMeta, functionUrl: string) => {
97
- const key = meta.keys.find((key) => key.source === USERFUNCTIONS_META_KEY);
60
+ const key = meta.keys.find((key) => key.source === FUNCTIONS_META_KEY);
98
61
  if (key) {
99
62
  if (key.id !== functionUrl) {
100
63
  throw new Error('Metadata mismatch');
101
64
  }
102
65
  } else {
103
- meta.keys.push({ source: USERFUNCTIONS_META_KEY, id: functionUrl });
104
- }
105
- };
106
-
107
- // TODO: handle team owner
108
-
109
- const presentationForIdentity = async ({ halo, timeout }: { halo: Halo; timeout?: number }) => {
110
- let credential: Credential | undefined;
111
-
112
- if (timeout) {
113
- const credentialsLoaded = new Trigger();
114
- halo.credentials.subscribe((c) => {
115
- credential = c.find(matchServiceCredential([USERFUNCTIONS_CREDENTIAL_CAPABILITY]));
116
- if (credential) {
117
- credentialsLoaded.wake();
118
- }
119
- });
120
- await credentialsLoaded.wait({
121
- timeout,
122
- });
123
- } else {
124
- credential = halo
125
- .queryCredentials()
126
- .toSorted((a, b) => b.issuanceDate.getTime() - a.issuanceDate.getTime())
127
- .find(matchServiceCredential([USERFUNCTIONS_CREDENTIAL_CAPABILITY]));
128
- }
129
-
130
- if (!credential) {
131
- throw new Error('No credential found');
66
+ meta.keys.push({ source: FUNCTIONS_META_KEY, id: functionUrl });
132
67
  }
133
- log('credential found', { credential });
134
- // TODO(wittjosiah): If id is required to present credentials, then it should always be present for queried credentials.
135
- invariant(credential.id, 'beta credential missing id');
136
- const presentation = await halo.presentCredentials({ ids: [credential.id] });
137
-
138
- return { Authorization: `Bearer ${codec.encode(presentation)}` };
139
- };
140
-
141
- export type InvocationOptions = {
142
- spaceId?: SpaceId;
143
- subjectId?: string;
144
68
  };
145
69
 
146
70
  export const getInvocationUrl = (functionUrl: string, edgeUrl: string, options: InvocationOptions = {}) => {
@@ -154,3 +78,39 @@ export const getInvocationUrl = (functionUrl: string, edgeUrl: string, options:
154
78
  url.protocol = 'https';
155
79
  return url.toString();
156
80
  };
81
+
82
+ const createEdgeIdentity = (client: Client): EdgeIdentity => {
83
+ const identity = client.halo.identity.get();
84
+ const device = client.halo.device;
85
+ if (!identity || !device) {
86
+ throw new Error('Identity not available');
87
+ }
88
+ return {
89
+ identityKey: identity.identityKey.toHex(),
90
+ peerKey: device.deviceKey.toHex(),
91
+ presentCredentials: async ({ challenge }) => {
92
+ const identityService = client.services.services.IdentityService!;
93
+ const authCredential = await identityService.createAuthCredential();
94
+ return identityService.signPresentation({
95
+ presentation: { credentials: [authCredential] },
96
+ nonce: challenge,
97
+ });
98
+ },
99
+ };
100
+ };
101
+
102
+ export const incrementSemverPatch = (version: string): string => {
103
+ const [major, minor, patch] = version.split('.');
104
+ const patchNum = Number(patch);
105
+ invariant(!Number.isNaN(patchNum), 'Unexpected function version format.');
106
+ return [major, minor, String(patchNum + 1)].join('.');
107
+ };
108
+
109
+ export const publicKeyToDid = (key: PublicKey): DID => {
110
+ return `did:key:${key.toHex()}`;
111
+ };
112
+
113
+ export type InvocationOptions = {
114
+ spaceId?: SpaceId;
115
+ subjectId?: string;
116
+ };
package/src/edge/index.ts CHANGED
@@ -4,7 +4,4 @@
4
4
 
5
5
  // TODO(wittjosiah): Factor out.
6
6
 
7
- export * from './codec';
8
7
  export * from './functions';
9
- export * from './header-codec';
10
- export * from './hub-protocol';
@@ -3,10 +3,14 @@
3
3
  //
4
4
 
5
5
  import { SCRIPT_PLUGIN } from './meta';
6
+ import { ScriptType } from './types';
6
7
 
7
8
  export default [
8
9
  {
9
10
  'en-US': {
11
+ [ScriptType.typename]: {
12
+ 'typename label': 'Script',
13
+ },
10
14
  [SCRIPT_PLUGIN]: {
11
15
  'plugin name': 'Scripts',
12
16
  'object title placeholder': 'New script',
@@ -31,7 +31,7 @@ export class FunctionType extends TypedObject({
31
31
  })({
32
32
  // TODO(burdon): Rename to id/uri?
33
33
  name: S.NonEmptyString,
34
- version: S.Number,
34
+ version: S.String,
35
35
 
36
36
  // Reference to a source script if it exists within ECHO.
37
37
  // TODO(burdon): Don't ref ScriptType directly (core).
@@ -10,8 +10,7 @@ import type {
10
10
  SurfaceProvides,
11
11
  TranslationsProvides,
12
12
  } from '@dxos/app-framework';
13
- import { type SchemaProvides } from '@dxos/plugin-client';
14
- import { type SpaceInitProvides } from '@dxos/plugin-space';
13
+ import { type SchemaProvides } from '@dxos/plugin-space';
15
14
 
16
15
  import { SCRIPT_PLUGIN } from '../meta';
17
16
 
@@ -26,6 +25,5 @@ export type ScriptPluginProvides = GraphBuilderProvides &
26
25
  MetadataRecordsProvides &
27
26
  SchemaProvides &
28
27
  SettingsProvides<ScriptSettingsProps> &
29
- SpaceInitProvides &
30
28
  SurfaceProvides &
31
29
  TranslationsProvides;
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/AutomationPanel/AutomationPanel.tsx", "../../../src/components/AutomationPanel/index.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useMemo, useState } from 'react';\n\nimport { type ReactiveEchoObject } from '@dxos/client/echo';\nimport { failUndefined } from '@dxos/debug';\nimport { useClient } from '@dxos/react-client';\nimport { Filter, getMeta, getSpace, useQuery } from '@dxos/react-client/echo';\nimport { Select } from '@dxos/react-ui';\n\nimport { getInvocationUrl, getUserFunctionUrlInMetadata } from '../../edge';\nimport { FunctionType, ScriptType } from '../../types';\nimport { DebugPanel } from '../DebugPanel';\n\nexport interface AutomationPanelProps {\n subject: ReactiveEchoObject<any>;\n}\n\nexport const AutomationPanel = ({ subject }: AutomationPanelProps) => {\n const space = getSpace(subject);\n\n // TODO(dmaretskyi): Parametric query.\n const functions = useQuery(\n space ?? undefined,\n Filter.schema(FunctionType, (fn) => (subject instanceof ScriptType ? fn.source === subject : fn.binding != null)),\n {},\n [subject],\n );\n const [selectedFunction, setSelectedFunction] = useState<FunctionType | null>(null);\n const functionToChatWith = subject instanceof ScriptType ? functions[0] : selectedFunction;\n\n return (\n <div className='h-full flex flex-col'>\n {!(subject instanceof ScriptType) && (\n <BindingSelect\n selectedFunction={selectedFunction}\n setSelectedFunction={setSelectedFunction}\n functions={functions}\n />\n )}\n {functionToChatWith && <ChatPanel fn={functionToChatWith} subject={subject} />}\n {subject instanceof ScriptType && functions.length === 0 && <p>Deploy function to interact with it.</p>}\n </div>\n );\n};\n\nexport interface ChatPanelProps {\n fn: FunctionType;\n subject: ReactiveEchoObject<any>;\n}\n\nconst ChatPanel = ({ fn, subject }: ChatPanelProps) => {\n const client = useClient();\n const space = getSpace(fn);\n const existingFunctionUrl = getUserFunctionUrlInMetadata(getMeta(fn));\n const functionUrl = useMemo(() => {\n if (!existingFunctionUrl) {\n return;\n }\n\n return getInvocationUrl(existingFunctionUrl, client.config.values.runtime?.services?.edge?.url ?? '', {\n spaceId: space?.id,\n subjectId: subject?.id,\n });\n }, [existingFunctionUrl, space, subject]);\n\n return <DebugPanel functionUrl={functionUrl} classNames='flex-1' />;\n};\n\nexport interface BindingSelectProps {\n selectedFunction: FunctionType | null;\n setSelectedFunction: (fn: FunctionType) => void;\n functions: FunctionType[];\n}\n\nconst BindingSelect = ({ selectedFunction, setSelectedFunction, functions }: BindingSelectProps) => {\n return (\n <Select.Root\n value={selectedFunction?.id}\n onValueChange={(id) => setSelectedFunction(functions.find((fn) => fn.id === id) ?? failUndefined())}\n >\n <Select.TriggerButton placeholder='Select value' />\n <Select.Portal>\n <Select.Content>\n <Select.ScrollUpButton />\n <Select.Viewport>\n {functions.map(({ id, binding }) => (\n <Select.Option key={id} value={id}>\n {binding}\n </Select.Option>\n ))}\n </Select.Viewport>\n <Select.ScrollDownButton />\n <Select.Arrow />\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { AutomationPanel } from './AutomationPanel';\n\nexport * from './AutomationPanel';\n\nexport default AutomationPanel;\n"],
5
- "mappings": ";;;;;;;;;;;;;;AAIA,OAAOA,SAASC,SAASC,gBAAgB;AAGzC,SAASC,qBAAqB;AAC9B,SAASC,iBAAiB;AAC1B,SAASC,QAAQC,SAASC,UAAUC,gBAAgB;AACpD,SAASC,cAAc;AAUhB,IAAMC,kBAAkB,CAAC,EAAEC,QAAO,MAAwB;AAC/D,QAAMC,QAAQC,SAASF,OAAAA;AAGvB,QAAMG,YAAYC,SAChBH,SAASI,QACTC,OAAOC,OAAOC,cAAc,CAACC,OAAQT,mBAAmBU,aAAaD,GAAGE,WAAWX,UAAUS,GAAGG,WAAW,IAAA,GAC3G,CAAC,GACD;IAACZ;GAAQ;AAEX,QAAM,CAACa,kBAAkBC,mBAAAA,IAAuBC,SAA8B,IAAA;AAC9E,QAAMC,qBAAqBhB,mBAAmBU,aAAaP,UAAU,CAAA,IAAKU;AAE1E,SACE,sBAAA,cAACI,OAAAA;IAAIC,WAAU;KACZ,EAAElB,mBAAmBU,eACpB,sBAAA,cAACS,eAAAA;IACCN;IACAC;IACAX;MAGHa,sBAAsB,sBAAA,cAACI,WAAAA;IAAUX,IAAIO;IAAoBhB;MACzDA,mBAAmBU,cAAcP,UAAUkB,WAAW,KAAK,sBAAA,cAACC,KAAAA,MAAE,sCAAA,CAAA;AAGrE;AAOA,IAAMF,YAAY,CAAC,EAAEX,IAAIT,QAAO,MAAkB;AAChD,QAAMuB,SAASC,UAAAA;AACf,QAAMvB,QAAQC,SAASO,EAAAA;AACvB,QAAMgB,sBAAsBC,6BAA6BC,QAAQlB,EAAAA,CAAAA;AACjE,QAAMmB,cAAcC,QAAQ,MAAA;AAC1B,QAAI,CAACJ,qBAAqB;AACxB;IACF;AAEA,WAAOK,iBAAiBL,qBAAqBF,OAAOQ,OAAOC,OAAOC,SAASC,UAAUC,MAAMC,OAAO,IAAI;MACpGC,SAASpC,OAAOqC;MAChBC,WAAWvC,SAASsC;IACtB,CAAA;EACF,GAAG;IAACb;IAAqBxB;IAAOD;GAAQ;AAExC,SAAO,sBAAA,cAACwC,YAAAA;IAAWZ;IAA0Ba,YAAW;;AAC1D;AAQA,IAAMtB,gBAAgB,CAAC,EAAEN,kBAAkBC,qBAAqBX,UAAS,MAAsB;AAC7F,SACE,sBAAA,cAACuC,OAAOC,MAAI;IACVC,OAAO/B,kBAAkByB;IACzBO,eAAe,CAACP,OAAOxB,oBAAoBX,UAAU2C,KAAK,CAACrC,OAAOA,GAAG6B,OAAOA,EAAAA,KAAOS,cAAAA,CAAAA;KAEnF,sBAAA,cAACL,OAAOM,eAAa;IAACC,aAAY;MAClC,sBAAA,cAACP,OAAOQ,QAAM,MACZ,sBAAA,cAACR,OAAOS,SAAO,MACb,sBAAA,cAACT,OAAOU,gBAAc,IAAA,GACtB,sBAAA,cAACV,OAAOW,UAAQ,MACblD,UAAUmD,IAAI,CAAC,EAAEhB,IAAI1B,QAAO,MAC3B,sBAAA,cAAC8B,OAAOa,QAAM;IAACC,KAAKlB;IAAIM,OAAON;KAC5B1B,OAAAA,CAAAA,CAAAA,GAIP,sBAAA,cAAC8B,OAAOe,kBAAgB,IAAA,GACxB,sBAAA,cAACf,OAAOgB,OAAK,IAAA,CAAA,CAAA,CAAA;AAKvB;;;AC5FA,IAAA,0BAAeC;",
6
- "names": ["React", "useMemo", "useState", "failUndefined", "useClient", "Filter", "getMeta", "getSpace", "useQuery", "Select", "AutomationPanel", "subject", "space", "getSpace", "functions", "useQuery", "undefined", "Filter", "schema", "FunctionType", "fn", "ScriptType", "source", "binding", "selectedFunction", "setSelectedFunction", "useState", "functionToChatWith", "div", "className", "BindingSelect", "ChatPanel", "length", "p", "client", "useClient", "existingFunctionUrl", "getUserFunctionUrlInMetadata", "getMeta", "functionUrl", "useMemo", "getInvocationUrl", "config", "values", "runtime", "services", "edge", "url", "spaceId", "id", "subjectId", "DebugPanel", "classNames", "Select", "Root", "value", "onValueChange", "find", "failUndefined", "TriggerButton", "placeholder", "Portal", "Content", "ScrollUpButton", "Viewport", "map", "Option", "key", "ScrollDownButton", "Arrow", "AutomationPanel"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/ScriptContainer.tsx", "../../../src/components/ScriptEditor.tsx", "../../../src/components/Toolbar/Toolbar.tsx", "../../../src/components/TypescriptEditor/TypescriptEditor.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport { useAttendableAttributes } from '@dxos/react-ui-attention';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { ScriptEditor, type ScriptEditorProps } from './ScriptEditor';\n\nconst ScriptContainer = ({ script, ...props }: ScriptEditorProps) => {\n const attendableAttrs = useAttendableAttributes(fullyQualifiedId(script));\n return (\n <div role='none' className={mx('flex row-span-2 w-full overflow-hidden attention-surface')} {...attendableAttrs}>\n <ScriptEditor {...props} script={script} />\n </div>\n );\n};\n\nexport default ScriptContainer;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type DID } from 'iso-did/types';\nimport { format } from 'prettier';\nimport prettierPluginEstree from 'prettier/plugins/estree';\nimport prettierPluginTypescript from 'prettier/plugins/typescript';\nimport React, { useCallback, useMemo, useState } from 'react';\n\nimport { log } from '@dxos/log';\nimport { useClient } from '@dxos/react-client';\nimport { create, createDocAccessor, Filter, getMeta, getSpace, useQuery } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { useTranslation, type ThemedClassName } from '@dxos/react-ui';\nimport { createDataExtensions, listener } from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { DebugPanel } from './DebugPanel';\nimport { type TemplateSelectProps, Toolbar, type ViewType } from './Toolbar';\nimport { TypescriptEditor, type TypescriptEditorProps } from './TypescriptEditor';\nimport { Bundler } from '../bundler';\nimport {\n getInvocationUrl,\n getUserFunctionUrlInMetadata,\n publicKeyToDid,\n setUserFunctionUrlInMetadata,\n uploadWorkerFunction,\n USERFUNCTIONS_PRESET_META_KEY,\n} from '../edge';\nimport { SCRIPT_PLUGIN } from '../meta';\nimport { templates } from '../templates';\nimport { FunctionType, type ScriptType } from '../types';\n\nexport type ScriptEditorProps = ThemedClassName<{\n script: ScriptType;\n}> &\n Pick<TypescriptEditorProps, 'env'>;\n\nexport const ScriptEditor = ({ classNames, script, env }: ScriptEditorProps) => {\n const { t } = useTranslation(SCRIPT_PLUGIN);\n const client = useClient();\n const identity = useIdentity();\n const space = getSpace(script);\n // TODO(dmaretskyi): Parametric query.\n const [fn] = useQuery(\n space,\n Filter.schema(FunctionType, (fn) => fn.source === script),\n );\n\n const extensions = useMemo(\n () => [\n listener({\n onChange: (text) => {\n if (script.source && script.source?.content !== text) {\n script.changed = true;\n }\n },\n }),\n createDataExtensions({\n id: script.id,\n text: script.source && createDocAccessor(script.source, ['content']),\n space,\n identity,\n }),\n ],\n [script, script.source, space, identity],\n );\n\n const [view, setView] = useState<ViewType>('editor');\n const existingFunctionUrl = fn && getUserFunctionUrlInMetadata(getMeta(fn));\n const [error, setError] = useState<string>();\n\n const handleFormat = useCallback(async () => {\n if (!script.source) {\n return;\n }\n\n try {\n script.source.content = await format(script.source.content, {\n parser: 'typescript',\n plugins: [prettierPluginEstree, prettierPluginTypescript],\n semi: true,\n singleQuote: true,\n });\n } catch (err: any) {\n // TODO(wittjosiah): Show error in UI.\n log.catch(err);\n }\n }, [script.source]);\n\n const handleTemplateChange: TemplateSelectProps['onTemplateSelect'] = (id) => {\n const template = templates.find((template) => template.id === id);\n if (template) {\n script.name = template.name;\n script.source!.content = template.source;\n const metaKeys = getMeta(script).keys;\n const oldPresetIndex = metaKeys.findIndex((key) => key.source === USERFUNCTIONS_PRESET_META_KEY);\n if (oldPresetIndex >= 0) {\n metaKeys.splice(oldPresetIndex, 1);\n }\n if (template.presetId) {\n metaKeys.push({ source: USERFUNCTIONS_PRESET_META_KEY, id: template.presetId });\n }\n }\n };\n\n const handleDeploy = useCallback(async () => {\n if (!script.source || !identity || !space) {\n return;\n }\n\n setError(undefined);\n\n try {\n const existingFunctionId = existingFunctionUrl?.split('/').at(-1);\n const ownerDid = (existingFunctionUrl?.split('/').at(-2) as DID) ?? publicKeyToDid(identity.identityKey);\n\n const bundler = new Bundler({ platform: 'browser', sandboxedModules: [], remoteModules: {} });\n const buildResult = await bundler.bundle(script.source.content);\n if (buildResult.error || !buildResult.bundle) {\n throw buildResult.error;\n }\n\n const { result, functionId, functionVersionNumber, errorMessage, meta } = await uploadWorkerFunction({\n clientConfig: client.config,\n halo: client.halo,\n ownerDid,\n functionId: existingFunctionId,\n source: buildResult.bundle,\n });\n if (result !== 'success' || functionId === undefined || functionVersionNumber === undefined) {\n throw new Error(errorMessage);\n }\n\n log.info('function uploaded', { functionId, functionVersionNumber });\n if (fn) {\n fn.version = functionVersionNumber;\n }\n\n const deployedFunction =\n fn ?? space.db.add(create(FunctionType, { name: functionId, version: functionVersionNumber, source: script }));\n\n script.changed = false;\n\n if (meta.inputSchema) {\n deployedFunction.inputSchema = meta.inputSchema;\n } else {\n log.verbose('no input schema in function metadata', { functionId });\n }\n\n setUserFunctionUrlInMetadata(getMeta(deployedFunction), `/${ownerDid}/${functionId}`);\n\n setView('split');\n } catch (err: any) {\n log.catch(err);\n setError(t('upload failed label'));\n }\n }, [fn, existingFunctionUrl, script, script.name, script.source]);\n\n const functionUrl = useMemo(() => {\n if (!existingFunctionUrl) {\n return;\n }\n\n return getInvocationUrl(existingFunctionUrl, client.config.values.runtime?.services?.edge?.url ?? '', {\n spaceId: space?.id,\n });\n }, [existingFunctionUrl, space]);\n\n return (\n <div role='none' className={mx('flex flex-col w-full overflow-hidden divide-y divide-separator', classNames)}>\n <Toolbar\n deployed={Boolean(existingFunctionUrl) && !script.changed}\n functionUrl={functionUrl}\n error={error}\n view={view}\n templates={templates}\n onDeploy={handleDeploy}\n onFormat={handleFormat}\n onViewChange={setView}\n onTemplateSelect={handleTemplateChange}\n />\n\n {view !== 'preview' && (\n <TypescriptEditor\n id={script.id}\n env={env}\n initialValue={script.source?.content}\n extensions={extensions}\n className='flex is-full bs-full overflow-hidden ch-focus-ring-inset-over-all'\n />\n )}\n\n {view !== 'editor' && <DebugPanel functionUrl={functionUrl} />}\n </div>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useState } from 'react';\n\nimport {\n ElevationProvider,\n Icon,\n Select,\n type ThemedClassName,\n ToggleGroup,\n ToggleGroupItem,\n type ToolbarButtonProps,\n Toolbar as NaturalToolbar,\n Tooltip,\n useTranslation,\n} from '@dxos/react-ui';\n\nimport { SCRIPT_PLUGIN } from '../../meta';\nimport { type Template } from '../../templates';\n\nexport type ToolbarProps = ThemedClassName<\n {\n deployed?: boolean;\n error?: string;\n functionUrl?: string;\n onDeploy?: () => Promise<void>;\n onFormat?: () => Promise<void>;\n } & TemplateSelectProps &\n ViewSelectorProps\n>;\n\nexport const Toolbar = ({\n classNames,\n deployed,\n error,\n functionUrl,\n view,\n templates,\n onDeploy,\n onFormat,\n onViewChange,\n onTemplateSelect,\n}: ToolbarProps) => {\n const { t } = useTranslation(SCRIPT_PLUGIN);\n const [pending, setPending] = useState(false);\n\n const handleCopyLink = async () => {\n if (!functionUrl) {\n return;\n }\n\n await navigator.clipboard.writeText(functionUrl);\n };\n\n const handleDeploy = async () => {\n if (!pending) {\n setPending(true);\n await onDeploy?.();\n setPending(false);\n }\n };\n\n // TODO(burdon): Factor out common toolbar components with sheet/editor?\n return (\n <ElevationProvider elevation='chrome'>\n <NaturalToolbar.Root classNames={['p-1', classNames]} style={{ contain: 'layout' }}>\n {templates && <TemplateSelect templates={templates} onTemplateSelect={onTemplateSelect} />}\n {onFormat && <ToolbarIconButton icon='ph--magic-wand--regular' text={t('format label')} onClick={onFormat} />}\n\n <div role='separator' className='grow' />\n\n {error ? (\n <Tooltip.Root>\n <Tooltip.Trigger>\n <Icon icon='ph--warning-circle--regular' size={4} />\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content>\n <Tooltip.Arrow />\n {error}\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n ) : null}\n\n {functionUrl && deployed && (\n <ToolbarIconButton icon='ph--link--regular' text={t('copy link label')} onClick={handleCopyLink} />\n )}\n\n {onDeploy && (\n <ToolbarIconButton\n icon={pending ? 'ph--spinner-gap--regular' : 'ph--cloud-arrow-up--regular'}\n classNames={[pending && 'animate-spin']}\n text={pending ? t('pending label') : t('deploy label')}\n onClick={handleDeploy}\n />\n )}\n\n <ViewSelector view={view} onViewChange={onViewChange} />\n </NaturalToolbar.Root>\n </ElevationProvider>\n );\n};\n\nconst ToolbarIconButton = ({\n icon,\n text,\n classNames,\n disabled,\n onClick,\n}: { icon: string; text: string } & Pick<ToolbarButtonProps, 'classNames' | 'disabled' | 'onClick'>) => {\n return (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <NaturalToolbar.Button variant='ghost' disabled={disabled} onClick={onClick}>\n <Icon icon={icon} size={4} classNames={classNames} />\n </NaturalToolbar.Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content>\n <Tooltip.Arrow />\n {text}\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n );\n};\n\nexport type ViewType = 'editor' | 'split' | 'preview';\n\nexport type TemplateSelectProps = {\n templates?: Template[];\n onTemplateSelect?: (id: string) => void;\n};\n\nexport const TemplateSelect = ({ templates = [], onTemplateSelect }: TemplateSelectProps) => {\n return (\n <Select.Root value={''} onValueChange={onTemplateSelect}>\n <Select.TriggerButton />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n <Select.Option value={''}>Template</Select.Option>\n {templates.map(({ id, name }) => (\n <Select.Option key={id} value={id}>\n {name}\n </Select.Option>\n ))}\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n );\n};\n\nexport type ViewSelectorProps = {\n view?: ViewType;\n onViewChange?: (view: ViewType) => void;\n};\n\nexport const ViewSelector = ({ view, onViewChange }: ViewSelectorProps) => {\n return (\n <ToggleGroup type='single' value={view} onValueChange={(value) => onViewChange?.(value as ViewType)}>\n <ToggleGroupItem value='editor' classNames='bg-transparent text-subdued'>\n <Icon icon='ph--code--regular' size={4} />\n </ToggleGroupItem>\n <ToggleGroupItem value='split' classNames='bg-transparent text-subdued'>\n <Icon icon='ph--square-split-vertical--regular' size={4} />\n </ToggleGroupItem>\n <ToggleGroupItem value='preview' classNames='bg-transparent text-subdued'>\n <Icon icon='ph--eye--regular' size={4} />\n </ToggleGroupItem>\n </ToggleGroup>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { javascript } from '@codemirror/lang-javascript';\nimport { type VirtualTypeScriptEnvironment } from '@typescript/vfs';\nimport { tsSync, tsFacet, tsLinter, tsAutocomplete, tsHover } from '@valtown/codemirror-ts';\nimport React from 'react';\n\nimport { useThemeContext } from '@dxos/react-ui';\nimport {\n autocomplete,\n createBasicExtensions,\n createThemeExtensions,\n editorFullWidth,\n editorGutter,\n editorMonospace,\n InputModeExtensions,\n useTextEditor,\n type UseTextEditorProps,\n} from '@dxos/react-ui-editor';\nimport { nonNullable } from '@dxos/util';\n\nexport type TypescriptEditorProps = {\n id: string;\n env?: VirtualTypeScriptEnvironment;\n} & Pick<UseTextEditorProps, 'className' | 'initialValue' | 'extensions' | 'scrollTo' | 'selection'>;\n\nexport const TypescriptEditor = ({\n id,\n env,\n className,\n initialValue,\n extensions,\n scrollTo,\n selection,\n}: TypescriptEditorProps) => {\n const { themeMode } = useThemeContext();\n const { parentRef, focusAttributes } = useTextEditor(\n () => ({\n id,\n initialValue,\n extensions: [\n extensions,\n createBasicExtensions({\n highlightActiveLine: true,\n indentWithTab: true,\n lineNumbers: true,\n lineWrapping: false,\n scrollPastEnd: true,\n }),\n createThemeExtensions({\n themeMode,\n syntaxHighlighting: true,\n slots: {\n content: { className: editorFullWidth },\n },\n }),\n editorGutter,\n // TODO(burdon): Factor out.\n [\n editorMonospace,\n javascript({ typescript: true }),\n // https://github.com/val-town/codemirror-ts\n autocomplete({ override: env ? [tsAutocomplete()] : [] }),\n env ? [tsFacet.of({ env, path: `/src/${id}.ts` }), tsSync(), tsLinter(), tsHover()] : [],\n InputModeExtensions.vscode,\n ],\n ].filter(nonNullable),\n selection,\n scrollTo,\n }),\n [id, extensions, themeMode, selection, scrollTo],\n );\n\n return <div ref={parentRef} className={className} {...focusAttributes} />;\n};\n\nexport default TypescriptEditor;\n"],
5
- "mappings": "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",
6
- "names": ["React", "fullyQualifiedId", "useAttendableAttributes", "mx", "format", "prettierPluginEstree", "prettierPluginTypescript", "React", "useCallback", "useMemo", "useState", "log", "useClient", "create", "createDocAccessor", "Filter", "getMeta", "getSpace", "useQuery", "useIdentity", "useTranslation", "createDataExtensions", "listener", "mx", "React", "useState", "ElevationProvider", "Icon", "Select", "ToggleGroup", "ToggleGroupItem", "Toolbar", "NaturalToolbar", "Tooltip", "useTranslation", "Toolbar", "classNames", "deployed", "error", "functionUrl", "view", "templates", "onDeploy", "onFormat", "onViewChange", "onTemplateSelect", "t", "useTranslation", "SCRIPT_PLUGIN", "pending", "setPending", "useState", "handleCopyLink", "navigator", "clipboard", "writeText", "handleDeploy", "ElevationProvider", "elevation", "NaturalToolbar", "Root", "style", "contain", "TemplateSelect", "ToolbarIconButton", "icon", "text", "onClick", "div", "role", "className", "Tooltip", "Trigger", "Icon", "size", "Portal", "Content", "Arrow", "ViewSelector", "disabled", "asChild", "Button", "variant", "Select", "value", "onValueChange", "TriggerButton", "Viewport", "Option", "map", "id", "name", "key", "ToggleGroup", "type", "ToggleGroupItem", "javascript", "tsSync", "tsFacet", "tsLinter", "tsAutocomplete", "tsHover", "React", "useThemeContext", "autocomplete", "createBasicExtensions", "createThemeExtensions", "editorFullWidth", "editorGutter", "editorMonospace", "InputModeExtensions", "useTextEditor", "nonNullable", "TypescriptEditor", "id", "env", "className", "initialValue", "extensions", "scrollTo", "selection", "themeMode", "useThemeContext", "parentRef", "focusAttributes", "useTextEditor", "createBasicExtensions", "highlightActiveLine", "indentWithTab", "lineNumbers", "lineWrapping", "scrollPastEnd", "createThemeExtensions", "syntaxHighlighting", "slots", "content", "editorFullWidth", "editorGutter", "editorMonospace", "javascript", "typescript", "autocomplete", "override", "tsAutocomplete", "tsFacet", "of", "path", "tsSync", "tsLinter", "tsHover", "InputModeExtensions", "vscode", "filter", "nonNullable", "React", "div", "ref", "ScriptEditor", "classNames", "script", "env", "t", "useTranslation", "SCRIPT_PLUGIN", "client", "useClient", "identity", "useIdentity", "space", "getSpace", "fn", "useQuery", "Filter", "schema", "FunctionType", "source", "extensions", "useMemo", "listener", "onChange", "text", "content", "changed", "createDataExtensions", "id", "createDocAccessor", "view", "setView", "useState", "existingFunctionUrl", "getUserFunctionUrlInMetadata", "getMeta", "error", "setError", "handleFormat", "useCallback", "format", "parser", "plugins", "prettierPluginEstree", "prettierPluginTypescript", "semi", "singleQuote", "err", "log", "catch", "handleTemplateChange", "template", "templates", "find", "name", "metaKeys", "keys", "oldPresetIndex", "findIndex", "key", "USERFUNCTIONS_PRESET_META_KEY", "splice", "presetId", "push", "handleDeploy", "undefined", "existingFunctionId", "split", "at", "ownerDid", "publicKeyToDid", "identityKey", "bundler", "Bundler", "platform", "sandboxedModules", "remoteModules", "buildResult", "bundle", "result", "functionId", "functionVersionNumber", "errorMessage", "meta", "uploadWorkerFunction", "clientConfig", "config", "halo", "Error", "info", "version", "deployedFunction", "db", "add", "create", "inputSchema", "verbose", "setUserFunctionUrlInMetadata", "functionUrl", "getInvocationUrl", "values", "runtime", "services", "edge", "url", "spaceId", "React", "div", "role", "className", "mx", "Toolbar", "deployed", "Boolean", "onDeploy", "onFormat", "onViewChange", "onTemplateSelect", "TypescriptEditor", "initialValue", "DebugPanel", "ScriptContainer", "script", "props", "attendableAttrs", "useAttendableAttributes", "fullyQualifiedId", "React", "div", "role", "className", "mx", "ScriptEditor"]
7
- }
@@ -1,253 +0,0 @@
1
- // packages/plugins/experimental/plugin-script/src/edge/codec.ts
2
- import { PublicKey } from "@dxos/keys";
3
-
4
- // packages/plugins/experimental/plugin-script/src/edge/header-codec.ts
5
- var ENCODING = "base64";
6
- var HeaderCodec = class {
7
- constructor(_keyCodec) {
8
- this._keyCodec = _keyCodec;
9
- }
10
- encode(obj) {
11
- const objectToEncode = this._prepareForEncoding(obj);
12
- const encoded = Buffer.from(JSON.stringify(objectToEncode));
13
- return encoded.toString(ENCODING);
14
- }
15
- decode(buffer) {
16
- const json = JSON.parse(Buffer.from(buffer, ENCODING).toString());
17
- return this._decodeRecursive(json);
18
- }
19
- _decodeRecursive(obj) {
20
- return this._recurse(obj, (value) => {
21
- if (isEncodedBytes(value)) {
22
- return decodeBytes(value.__b);
23
- }
24
- if (isEncodedKey(value)) {
25
- return this._keyCodec.decode(value);
26
- }
27
- if (isEncodedDate(value)) {
28
- return decodeDate(value);
29
- }
30
- return null;
31
- });
32
- }
33
- _prepareForEncoding(obj) {
34
- return this._recurse(obj, (value) => {
35
- if (value instanceof Uint8Array) {
36
- return {
37
- __b: encodeBytes(value)
38
- };
39
- }
40
- if (this._keyCodec.isKey(value)) {
41
- return this._keyCodec.encode(value);
42
- }
43
- if (value instanceof Date) {
44
- return encodeDate(value);
45
- }
46
- return null;
47
- });
48
- }
49
- _recurse(obj, handler) {
50
- if (typeof obj !== "object") {
51
- return obj;
52
- }
53
- const handled = handler(obj);
54
- if (handled != null) {
55
- return handled;
56
- }
57
- if (Array.isArray(obj)) {
58
- const result2 = [];
59
- for (const elem of obj) {
60
- result2.push(this._recurse(elem, handler));
61
- }
62
- return result2;
63
- }
64
- const result = {};
65
- for (const [key, value] of Object.entries(obj)) {
66
- result[key] = this._recurse(value, handler);
67
- }
68
- return result;
69
- }
70
- };
71
- var isEncodedKey = (obj) => "__k" in obj && typeof obj.__k === "string";
72
- var isEncodedBytes = (obj) => "__b" in obj && typeof obj.__b === "string";
73
- var isEncodedDate = (obj) => "__t" in obj && typeof obj.__t === "number";
74
- var encodeDate = (date) => ({
75
- __t: date.getTime()
76
- });
77
- var decodeDate = (timestamp) => new Date(timestamp.__t);
78
- var encodeBytes = (bytes) => Buffer.from(bytes).toString(ENCODING);
79
- var decodeBytes = (bytes) => Buffer.from(bytes, ENCODING);
80
-
81
- // packages/plugins/experimental/plugin-script/src/edge/codec.ts
82
- var codec = new HeaderCodec({
83
- isKey: (value) => value instanceof PublicKey,
84
- encode: (key) => ({
85
- __k: key.toHex()
86
- }),
87
- decode: (value) => PublicKey.fromHex(value.__k)
88
- });
89
-
90
- // packages/plugins/experimental/plugin-script/src/edge/functions.ts
91
- import { Trigger } from "@dxos/async";
92
- import { invariant } from "@dxos/invariant";
93
- import { log } from "@dxos/log";
94
-
95
- // packages/plugins/experimental/plugin-script/src/edge/hub-protocol.ts
96
- var matchServiceCredential = (capabilities = []) => (credential) => {
97
- if (credential.subject.assertion["@type"] !== "dxos.halo.credentials.ServiceAccess") {
98
- return false;
99
- }
100
- const { capabilities: credentialCapabilities } = credential.subject.assertion;
101
- return capabilities.every((capability) => credentialCapabilities.includes(capability));
102
- };
103
- var publicKeyToDid = (key) => {
104
- return `did:key:${key.toHex()}`;
105
- };
106
-
107
- // packages/plugins/experimental/plugin-script/src/edge/functions.ts
108
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/experimental/plugin-script/src/edge/functions.ts";
109
- var USERFUNCTIONS_META_KEY = "dxos.org/service/function";
110
- var USERFUNCTIONS_PRESET_META_KEY = "dxos.org/service/function-preset";
111
- var USERFUNCTIONS_CREDENTIAL_CAPABILITY = "composer:beta";
112
- var defaultUserFunctionsBaseUrl = "https://edge-main.dxos.workers.dev/functions";
113
- var getBaseUrl = (config) => {
114
- if (config.values.runtime?.services?.edge?.url) {
115
- const url = new URL("/functions", config.values.runtime?.services?.edge?.url);
116
- url.protocol = "https";
117
- return url.toString();
118
- } else {
119
- return defaultUserFunctionsBaseUrl;
120
- }
121
- };
122
- var uploadWorkerFunction = async ({ clientConfig, halo, name, source, ownerDid, functionId, credentialLoadTimeout }) => {
123
- const identity = halo.identity.get();
124
- if (!identity) {
125
- throw new Error("Identity not available");
126
- }
127
- const userFunctionsBaseUrl = getBaseUrl(clientConfig);
128
- const uploadUrl = `${userFunctionsBaseUrl}/${ownerDid}` + (functionId ? `/${functionId}` : "");
129
- log("Upload", {
130
- functionId,
131
- source,
132
- name,
133
- identityKey: identity.identityKey,
134
- uploadUrl: uploadUrl.toString()
135
- }, {
136
- F: __dxlog_file,
137
- L: 76,
138
- S: void 0,
139
- C: (f, a) => f(...a)
140
- });
141
- const response = await fetch(uploadUrl, {
142
- method: "PUT",
143
- body: JSON.stringify({
144
- script: source,
145
- name
146
- }),
147
- headers: await presentationForIdentity({
148
- halo,
149
- timeout: credentialLoadTimeout
150
- })
151
- });
152
- if (!response.ok) {
153
- return await response.json();
154
- }
155
- const res = await response.json();
156
- log("Upload response", {
157
- status: response.status,
158
- res
159
- }, {
160
- F: __dxlog_file,
161
- L: 87,
162
- S: void 0,
163
- C: (f, a) => f(...a)
164
- });
165
- return res;
166
- };
167
- var getUserFunctionUrlInMetadata = (meta) => {
168
- return meta.keys.find((key) => key.source === USERFUNCTIONS_META_KEY)?.id;
169
- };
170
- var setUserFunctionUrlInMetadata = (meta, functionUrl) => {
171
- const key = meta.keys.find((key2) => key2.source === USERFUNCTIONS_META_KEY);
172
- if (key) {
173
- if (key.id !== functionUrl) {
174
- throw new Error("Metadata mismatch");
175
- }
176
- } else {
177
- meta.keys.push({
178
- source: USERFUNCTIONS_META_KEY,
179
- id: functionUrl
180
- });
181
- }
182
- };
183
- var presentationForIdentity = async ({ halo, timeout }) => {
184
- let credential;
185
- if (timeout) {
186
- const credentialsLoaded = new Trigger();
187
- halo.credentials.subscribe((c) => {
188
- credential = c.find(matchServiceCredential([
189
- USERFUNCTIONS_CREDENTIAL_CAPABILITY
190
- ]));
191
- if (credential) {
192
- credentialsLoaded.wake();
193
- }
194
- });
195
- await credentialsLoaded.wait({
196
- timeout
197
- });
198
- } else {
199
- credential = halo.queryCredentials().toSorted((a, b) => b.issuanceDate.getTime() - a.issuanceDate.getTime()).find(matchServiceCredential([
200
- USERFUNCTIONS_CREDENTIAL_CAPABILITY
201
- ]));
202
- }
203
- if (!credential) {
204
- throw new Error("No credential found");
205
- }
206
- log("credential found", {
207
- credential
208
- }, {
209
- F: __dxlog_file,
210
- L: 133,
211
- S: void 0,
212
- C: (f, a) => f(...a)
213
- });
214
- invariant(credential.id, "beta credential missing id", {
215
- F: __dxlog_file,
216
- L: 135,
217
- S: void 0,
218
- A: [
219
- "credential.id",
220
- "'beta credential missing id'"
221
- ]
222
- });
223
- const presentation = await halo.presentCredentials({
224
- ids: [
225
- credential.id
226
- ]
227
- });
228
- return {
229
- Authorization: `Bearer ${codec.encode(presentation)}`
230
- };
231
- };
232
- var getInvocationUrl = (functionUrl, edgeUrl, options = {}) => {
233
- const baseUrl = new URL("functions/", edgeUrl);
234
- const relativeUrl = functionUrl.replace(/^\//, "");
235
- const url = new URL(`./${relativeUrl}`, baseUrl.toString());
236
- options.spaceId && url.searchParams.set("spaceId", options.spaceId);
237
- options.subjectId && url.searchParams.set("subjectId", options.subjectId);
238
- url.protocol = "https";
239
- return url.toString();
240
- };
241
-
242
- export {
243
- HeaderCodec,
244
- codec,
245
- matchServiceCredential,
246
- publicKeyToDid,
247
- USERFUNCTIONS_PRESET_META_KEY,
248
- uploadWorkerFunction,
249
- getUserFunctionUrlInMetadata,
250
- setUserFunctionUrlInMetadata,
251
- getInvocationUrl
252
- };
253
- //# sourceMappingURL=chunk-5GGRYRS4.mjs.map