@dxos/compute 0.8.4-main.e098934 → 0.8.4-main.e8ec1fe

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 (42) hide show
  1. package/dist/lib/browser/{chunk-XQYPCRZP.mjs → chunk-CPBXT2HX.mjs} +155 -181
  2. package/dist/lib/browser/chunk-CPBXT2HX.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +1 -1
  4. package/dist/lib/browser/meta.json +1 -1
  5. package/dist/lib/browser/testing/index.mjs +31 -20
  6. package/dist/lib/browser/testing/index.mjs.map +4 -4
  7. package/dist/lib/node-esm/{chunk-2XWWSGAU.mjs → chunk-D3RM3FQW.mjs} +155 -181
  8. package/dist/lib/node-esm/chunk-D3RM3FQW.mjs.map +7 -0
  9. package/dist/lib/node-esm/index.mjs +1 -1
  10. package/dist/lib/node-esm/meta.json +1 -1
  11. package/dist/lib/node-esm/testing/index.mjs +31 -20
  12. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  13. package/dist/types/src/compute-graph-registry.d.ts +8 -3
  14. package/dist/types/src/compute-graph-registry.d.ts.map +1 -1
  15. package/dist/types/src/compute-graph-registry.test.d.ts +2 -0
  16. package/dist/types/src/compute-graph-registry.test.d.ts.map +1 -0
  17. package/dist/types/src/compute-graph.d.ts +4 -1
  18. package/dist/types/src/compute-graph.d.ts.map +1 -1
  19. package/dist/types/src/functions/async-function.d.ts +11 -9
  20. package/dist/types/src/functions/async-function.d.ts.map +1 -1
  21. package/dist/types/src/functions/edge-function.d.ts.map +1 -1
  22. package/dist/types/src/index.d.ts.map +1 -1
  23. package/dist/types/src/testing/index.d.ts +1 -0
  24. package/dist/types/src/testing/index.d.ts.map +1 -1
  25. package/dist/types/src/testing/test-builder.d.ts +1 -1
  26. package/dist/types/src/testing/test-builder.d.ts.map +1 -1
  27. package/dist/types/src/testing/test-runtime.d.ts +10 -0
  28. package/dist/types/src/testing/test-runtime.d.ts.map +1 -0
  29. package/dist/types/tsconfig.tsbuildinfo +1 -1
  30. package/package.json +23 -22
  31. package/src/compute-graph-registry.test.ts +154 -0
  32. package/src/compute-graph-registry.ts +17 -8
  33. package/src/compute-graph.test.ts +29 -10
  34. package/src/compute-graph.ts +25 -13
  35. package/src/functions/async-function.ts +13 -12
  36. package/src/functions/edge-function.ts +22 -19
  37. package/src/index.ts +0 -27
  38. package/src/testing/index.ts +1 -0
  39. package/src/testing/test-builder.ts +8 -2
  40. package/src/testing/test-runtime.ts +33 -0
  41. package/dist/lib/browser/chunk-XQYPCRZP.mjs.map +0 -7
  42. package/dist/lib/node-esm/chunk-2XWWSGAU.mjs.map +0 -7
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../../src/testing/test-builder.ts", "../../../../src/testing/test-plugin.ts", "../../../../src/util.ts", "../../../../src/testing/util.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Client, type ClientOptions } from '@dxos/client';\nimport { type Context, Resource } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\n\nimport { type ComputeGraphOptions, ComputeGraphRegistry } from '../compute-graph-registry';\n\nexport type TestBuilderOptions = ClientOptions & ComputeGraphOptions;\n\n// TODO(burdon): Reconcile with @dxos/client/testing.\nexport class TestBuilder extends Resource {\n private _client?: Client;\n private _registry?: ComputeGraphRegistry;\n\n constructor(private readonly _options: TestBuilderOptions = {}) {\n super();\n }\n\n get ctx(): Context {\n return this._ctx;\n }\n\n get client(): Client {\n invariant(this._client);\n return this._client;\n }\n\n get registry(): ComputeGraphRegistry {\n invariant(this._registry);\n return this._registry;\n }\n\n override async _open(): Promise<void> {\n const client = new Client(this._options);\n await client.initialize();\n await client.halo.createIdentity();\n this._client = client;\n this._ctx.onDispose(async () => {\n await client.destroy();\n this._client = undefined;\n });\n\n const registry = new ComputeGraphRegistry(this._options);\n await registry.open();\n this._registry = registry;\n this._ctx.onDispose(async () => {\n await registry.close();\n this._registry = undefined;\n });\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { getDeep } from '@dxos/util';\nimport { type InterpreterState, type ProcedureAst } from '@dxos/vendor-hyperformula';\nimport { FunctionArgumentType } from '@dxos/vendor-hyperformula';\n\nimport { type ComputeGraphPlugin } from '../compute-graph-registry';\nimport { type AsyncFunction, AsyncFunctionPlugin } from '../functions';\nimport { parseNumberString } from '../util';\n\n/**\n * Testing functions run locally (not run via EDGE).\n * https://hyperformula.handsontable.com/guide/custom-functions.html#add-a-simple-custom-function\n */\nexport class TestPlugin extends AsyncFunctionPlugin {\n /**\n * Simple local function returns input value.\n */\n test(ast: ProcedureAst, state: InterpreterState) {\n const handler: AsyncFunction = async (_value) => {\n return _value;\n };\n\n return this.runAsyncFunction(ast, state, handler);\n }\n\n /**\n * Simple local function returns random number.\n */\n random(ast: ProcedureAst, state: InterpreterState) {\n const handler: AsyncFunction = async () => {\n return Math.random();\n };\n\n return this.runAsyncFunction(ast, state, handler);\n }\n\n /**\n * Async HTTP function.\n */\n crypto(ast: ProcedureAst, state: InterpreterState) {\n const handler: AsyncFunction = async (_currency) => {\n const currency = (_currency || 'USD').toUpperCase();\n const result = await fetch(`https://api.coindesk.com/v1/bpi/currentprice/${currency}.json`);\n const data = await result.json();\n const rate = getDeep<string>(data, ['bpi', currency, 'rate']);\n if (!rate) {\n return NaN;\n }\n\n return parseNumberString(rate);\n };\n\n return this.runAsyncFunction(ast, state, handler, { ttl: 10_000 });\n }\n}\n\nTestPlugin.implementedFunctions = {\n TEST: {\n method: 'test',\n parameters: [{ argumentType: FunctionArgumentType.NUMBER, optionalArg: false }],\n isVolatile: true,\n },\n\n RANDOM: {\n method: 'random',\n parameters: [],\n isVolatile: true,\n },\n\n CRYPTO: {\n method: 'crypto',\n parameters: [{ argumentType: FunctionArgumentType.STRING, optionalArg: true }],\n isVolatile: true,\n },\n};\n\nexport const TestPluginTranslations = {\n enGB: {\n TEST: 'Returns input value',\n RANDOM: 'Random number',\n CRYPTO: 'Crypto token value',\n },\n enUS: {\n TEST: 'Returns input value',\n RANDOM: 'Random number',\n CRYPTO: 'Crypto token value',\n },\n};\n\nexport const testFunctionPlugins: ComputeGraphPlugin[] = [\n {\n plugin: TestPlugin,\n translations: TestPluginTranslations,\n },\n];\n", "//\n// Copyright 2024 DXOS.org\n//\n\n// TODO(burdon): Factor out.\nexport const parseNumberString = (str: string): number => {\n return parseFloat(str.replace(/[^\\d.]/g, ''));\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { HyperFormula } from '@dxos/vendor-hyperformula';\n\nexport const getRegisteredFunctionNames = () => {\n return HyperFormula.buildEmpty({ licenseKey: 'gpl-v3' }).getRegisteredFunctionNames();\n};\n"],
5
- "mappings": "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",
6
- "names": ["Client", "Resource", "invariant", "TestBuilder", "Resource", "ctx", "_ctx", "client", "invariant", "_client", "registry", "_registry", "_open", "Client", "_options", "initialize", "halo", "createIdentity", "onDispose", "destroy", "undefined", "ComputeGraphRegistry", "open", "close", "getDeep", "FunctionArgumentType", "parseNumberString", "str", "parseFloat", "replace", "TestPlugin", "AsyncFunctionPlugin", "test", "ast", "state", "handler", "_value", "runAsyncFunction", "random", "Math", "crypto", "_currency", "currency", "toUpperCase", "result", "fetch", "data", "json", "rate", "getDeep", "NaN", "parseNumberString", "ttl", "implementedFunctions", "TEST", "method", "parameters", "argumentType", "FunctionArgumentType", "NUMBER", "optionalArg", "isVolatile", "RANDOM", "CRYPTO", "STRING", "TestPluginTranslations", "enGB", "enUS", "testFunctionPlugins", "plugin", "translations", "HyperFormula", "getRegisteredFunctionNames", "HyperFormula", "buildEmpty", "licenseKey"]
3
+ "sources": ["../../../../src/testing/test-builder.ts", "../../../../src/testing/test-runtime.ts", "../../../../src/testing/test-plugin.ts", "../../../../src/util.ts", "../../../../src/testing/util.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Client, type ClientOptions } from '@dxos/client';\nimport { type Context, Resource } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\n\nimport { type ComputeGraphOptions, ComputeGraphRegistry } from '../compute-graph-registry';\n\nimport { createMockedComputeRuntimeProvider } from './test-runtime';\n\nexport type TestBuilderOptions = ClientOptions & Partial<ComputeGraphOptions>;\n\n// TODO(burdon): Reconcile with @dxos/client/testing.\nexport class TestBuilder extends Resource {\n private _client?: Client;\n private _registry?: ComputeGraphRegistry;\n\n constructor(private readonly _options: TestBuilderOptions = {}) {\n super();\n }\n\n get ctx(): Context {\n return this._ctx;\n }\n\n get client(): Client {\n invariant(this._client);\n return this._client;\n }\n\n get registry(): ComputeGraphRegistry {\n invariant(this._registry);\n return this._registry;\n }\n\n override async _open(): Promise<void> {\n const client = new Client(this._options);\n await client.initialize();\n await client.halo.createIdentity();\n this._client = client;\n this._ctx.onDispose(async () => {\n await client.destroy();\n this._client = undefined;\n });\n\n const registry = new ComputeGraphRegistry({\n ...this._options,\n // Provide a default runtime provider for tests if not supplied.\n computeRuntime: this._options.computeRuntime ?? createMockedComputeRuntimeProvider(),\n });\n await registry.open();\n this._registry = registry;\n this._ctx.onDispose(async () => {\n await registry.close();\n this._registry = undefined;\n });\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Layer from 'effect/Layer';\nimport * as ManagedRuntime from 'effect/ManagedRuntime';\n\nimport { AiService } from '@dxos/ai';\nimport { type SpaceId } from '@dxos/client/echo';\nimport { CredentialsService, DatabaseService, type FunctionDefinition, QueueService } from '@dxos/functions';\nimport { FunctionInvocationServiceLayerTest } from '@dxos/functions-runtime/testing';\n\nimport { type FunctionsRuntimeProvider } from '../compute-graph-registry';\n\n/**\n * Minimal compute runtime provider for tests and Storybook.\n * Will cause errors if used for actual runtime.\n */\nexport const createMockedComputeRuntimeProvider = ({\n functions,\n}: { functions?: FunctionDefinition.Any[] } = {}): FunctionsRuntimeProvider => {\n return {\n getRuntime: (_spaceId: SpaceId) =>\n ManagedRuntime.make(\n FunctionInvocationServiceLayerTest({ functions }).pipe(\n Layer.provide(AiService.notAvailable),\n Layer.provide(CredentialsService.configuredLayer([])),\n Layer.provide(DatabaseService.notAvailable),\n Layer.provide(QueueService.notAvailable),\n ),\n ),\n };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { getDeep } from '@dxos/util';\nimport { type InterpreterState, type ProcedureAst } from '@dxos/vendor-hyperformula';\nimport { FunctionArgumentType } from '@dxos/vendor-hyperformula';\n\nimport { type ComputeGraphPlugin } from '../compute-graph-registry';\nimport { type AsyncFunction, AsyncFunctionPlugin } from '../functions';\nimport { parseNumberString } from '../util';\n\n/**\n * Testing functions run locally (not run via EDGE).\n * https://hyperformula.handsontable.com/guide/custom-functions.html#add-a-simple-custom-function\n */\nexport class TestPlugin extends AsyncFunctionPlugin {\n /**\n * Simple local function returns input value.\n */\n test(ast: ProcedureAst, state: InterpreterState) {\n const handler: AsyncFunction = async (_value) => {\n return _value;\n };\n\n return this.runAsyncFunction(ast, state, handler);\n }\n\n /**\n * Simple local function returns random number.\n */\n random(ast: ProcedureAst, state: InterpreterState) {\n const handler: AsyncFunction = async () => {\n return Math.random();\n };\n\n return this.runAsyncFunction(ast, state, handler);\n }\n\n /**\n * Async HTTP function.\n */\n crypto(ast: ProcedureAst, state: InterpreterState) {\n const handler: AsyncFunction = async (_currency) => {\n const currency = (_currency || 'USD').toUpperCase();\n const result = await fetch(`https://api.coindesk.com/v1/bpi/currentprice/${currency}.json`);\n const data = await result.json();\n const rate = getDeep<string>(data, ['bpi', currency, 'rate']);\n if (!rate) {\n return NaN;\n }\n\n return parseNumberString(rate);\n };\n\n return this.runAsyncFunction(ast, state, handler, { ttl: 10_000 });\n }\n}\n\nTestPlugin.implementedFunctions = {\n TEST: {\n method: 'test',\n parameters: [{ argumentType: FunctionArgumentType.NUMBER, optionalArg: false }],\n isVolatile: true,\n },\n\n RANDOM: {\n method: 'random',\n parameters: [],\n isVolatile: true,\n },\n\n CRYPTO: {\n method: 'crypto',\n parameters: [{ argumentType: FunctionArgumentType.STRING, optionalArg: true }],\n isVolatile: true,\n },\n};\n\nexport const TestPluginTranslations = {\n enGB: {\n TEST: 'Returns input value',\n RANDOM: 'Random number',\n CRYPTO: 'Crypto token value',\n },\n enUS: {\n TEST: 'Returns input value',\n RANDOM: 'Random number',\n CRYPTO: 'Crypto token value',\n },\n};\n\nexport const testFunctionPlugins: ComputeGraphPlugin[] = [\n {\n plugin: TestPlugin,\n translations: TestPluginTranslations,\n },\n];\n", "//\n// Copyright 2024 DXOS.org\n//\n\n// TODO(burdon): Factor out.\nexport const parseNumberString = (str: string): number => {\n return parseFloat(str.replace(/[^\\d.]/g, ''));\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { HyperFormula } from '@dxos/vendor-hyperformula';\n\nexport const getRegisteredFunctionNames = () => {\n return HyperFormula.buildEmpty({ licenseKey: 'gpl-v3' }).getRegisteredFunctionNames();\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["Client", "Resource", "invariant", "Layer", "ManagedRuntime", "AiService", "CredentialsService", "DatabaseService", "QueueService", "FunctionInvocationServiceLayerTest", "createMockedComputeRuntimeProvider", "functions", "getRuntime", "_spaceId", "make", "FunctionInvocationServiceLayerTest", "pipe", "provide", "AiService", "notAvailable", "CredentialsService", "configuredLayer", "DatabaseService", "QueueService", "TestBuilder", "Resource", "_client", "_registry", "_options", "ctx", "_ctx", "client", "invariant", "registry", "_open", "Client", "initialize", "halo", "createIdentity", "onDispose", "destroy", "undefined", "ComputeGraphRegistry", "computeRuntime", "createMockedComputeRuntimeProvider", "open", "close", "getDeep", "FunctionArgumentType", "parseNumberString", "str", "parseFloat", "replace", "TestPlugin", "AsyncFunctionPlugin", "test", "ast", "state", "handler", "_value", "runAsyncFunction", "random", "Math", "crypto", "_currency", "currency", "toUpperCase", "result", "fetch", "data", "json", "rate", "getDeep", "NaN", "parseNumberString", "ttl", "implementedFunctions", "TEST", "method", "parameters", "argumentType", "FunctionArgumentType", "NUMBER", "optionalArg", "isVolatile", "RANDOM", "CRYPTO", "STRING", "TestPluginTranslations", "enGB", "enUS", "testFunctionPlugins", "plugin", "translations", "HyperFormula", "getRegisteredFunctionNames", "HyperFormula", "buildEmpty", "licenseKey"]
7
7
  }
@@ -80,20 +80,13 @@ var inRange = (range, cell) => {
80
80
  import { Event } from "@dxos/async";
81
81
  import { Resource } from "@dxos/context";
82
82
  import { DetailedCellError as DetailedCellError2 } from "@dxos/vendor-hyperformula";
83
- function _define_property(obj, key, value) {
84
- if (key in obj) {
85
- Object.defineProperty(obj, key, {
86
- value,
87
- enumerable: true,
88
- configurable: true,
89
- writable: true
90
- });
91
- } else {
92
- obj[key] = value;
93
- }
94
- return obj;
95
- }
96
83
  var ComputeNode = class extends Resource {
84
+ _graph;
85
+ sheetId;
86
+ update = new Event();
87
+ constructor(_graph, sheetId) {
88
+ super(), this._graph = _graph, this.sheetId = sheetId;
89
+ }
97
90
  get graph() {
98
91
  return this._graph;
99
92
  }
@@ -126,9 +119,6 @@ var ComputeNode = class extends Resource {
126
119
  // TODO(burdon): Load data into sheet.
127
120
  async _open() {
128
121
  }
129
- constructor(_graph, sheetId) {
130
- super(), _define_property(this, "_graph", void 0), _define_property(this, "sheetId", void 0), _define_property(this, "update", void 0), this._graph = _graph, this.sheetId = sheetId, this.update = new Event();
131
- }
132
122
  };
133
123
 
134
124
  // src/functions/async-function.ts
@@ -136,26 +126,15 @@ import defaultsDeep from "lodash.defaultsdeep";
136
126
  import { debounce } from "@dxos/async";
137
127
  import { log } from "@dxos/log";
138
128
  import { CellError, EmptyValue, ErrorType, FunctionPlugin } from "@dxos/vendor-hyperformula";
139
- function _define_property2(obj, key, value) {
140
- if (key in obj) {
141
- Object.defineProperty(obj, key, {
142
- value,
143
- enumerable: true,
144
- configurable: true,
145
- writable: true
146
- });
147
- } else {
148
- obj[key] = value;
149
- }
150
- return obj;
151
- }
152
129
  var __dxlog_file2 = "/__w/dxos/dxos/packages/core/compute/src/functions/async-function.ts";
153
130
  var defaultFunctionContextOptions = {
154
131
  defaultTtl: 5e3,
155
- debounceDelay: 200,
156
- remoteFunctionUrl: "https://edge.dxos.workers.dev/functions"
132
+ debounceDelay: 200
157
133
  };
158
134
  var FunctionContext = class _FunctionContext {
135
+ _hf;
136
+ _runtime;
137
+ _space;
159
138
  // Mangle name with params.
160
139
  static createInvocationKey(name, ...args) {
161
140
  return JSON.stringify({
@@ -163,18 +142,46 @@ var FunctionContext = class _FunctionContext {
163
142
  ...args
164
143
  });
165
144
  }
145
+ // TODO(wittjosiah): Persist cached values.
146
+ // Cached values for cell.
147
+ _cache = /* @__PURE__ */ new Map();
148
+ // Active requests.
149
+ _pending = /* @__PURE__ */ new Map();
150
+ // Query subscriptions.
151
+ _subscriptions = /* @__PURE__ */ new Map();
152
+ // Invocation count.
153
+ _invocations = {};
154
+ _options;
155
+ // Debounced update handler.
156
+ _onUpdate;
157
+ constructor(_hf, _runtime, _space, _options) {
158
+ this._hf = _hf;
159
+ this._runtime = _runtime;
160
+ this._space = _space;
161
+ this._options = defaultsDeep(_options ?? {}, defaultFunctionContextOptions);
162
+ this._onUpdate = debounce((update) => {
163
+ log("update", update, {
164
+ F: __dxlog_file2,
165
+ L: 86,
166
+ S: this,
167
+ C: (f, a) => f(...a)
168
+ });
169
+ this._hf.resumeEvaluation();
170
+ this._options.onUpdate?.(update);
171
+ }, this._options.debounceDelay);
172
+ }
166
173
  get space() {
167
174
  return this._space;
168
175
  }
169
- get remoteFunctionUrl() {
170
- return this._options.remoteFunctionUrl;
171
- }
172
176
  get info() {
173
177
  return {
174
178
  cache: this._cache.size,
175
179
  invocations: this._invocations
176
180
  };
177
181
  }
182
+ get runtime() {
183
+ return this._runtime;
184
+ }
178
185
  flush() {
179
186
  this._cache.clear();
180
187
  this._invocations = {};
@@ -211,7 +218,7 @@ var FunctionContext = class _FunctionContext {
211
218
  value: value2
212
219
  }, {
213
220
  F: __dxlog_file2,
214
- L: 143,
221
+ L: 144,
215
222
  S: this,
216
223
  C: (f, a) => f(...a)
217
224
  });
@@ -225,7 +232,7 @@ var FunctionContext = class _FunctionContext {
225
232
  err
226
233
  }, {
227
234
  F: __dxlog_file2,
228
- L: 147,
235
+ L: 148,
229
236
  S: this,
230
237
  C: (f, a) => f(...a)
231
238
  });
@@ -245,39 +252,12 @@ var FunctionContext = class _FunctionContext {
245
252
  cache: value
246
253
  }, {
247
254
  F: __dxlog_file2,
248
- L: 155,
255
+ L: 156,
249
256
  S: this,
250
257
  C: (f, a) => f(...a)
251
258
  });
252
259
  return value;
253
260
  }
254
- constructor(_hf, _space, _options) {
255
- _define_property2(this, "_hf", void 0);
256
- _define_property2(this, "_space", void 0);
257
- _define_property2(this, "_cache", void 0);
258
- _define_property2(this, "_pending", void 0);
259
- _define_property2(this, "_subscriptions", void 0);
260
- _define_property2(this, "_invocations", void 0);
261
- _define_property2(this, "_options", void 0);
262
- _define_property2(this, "_onUpdate", void 0);
263
- this._hf = _hf;
264
- this._space = _space;
265
- this._cache = /* @__PURE__ */ new Map();
266
- this._pending = /* @__PURE__ */ new Map();
267
- this._subscriptions = /* @__PURE__ */ new Map();
268
- this._invocations = {};
269
- this._options = defaultsDeep(_options ?? {}, defaultFunctionContextOptions);
270
- this._onUpdate = debounce((update) => {
271
- log("update", update, {
272
- F: __dxlog_file2,
273
- L: 85,
274
- S: this,
275
- C: (f, a) => f(...a)
276
- });
277
- this._hf.resumeEvaluation();
278
- this._options.onUpdate?.(update);
279
- }, this._options.debounceDelay);
280
- }
281
261
  };
282
262
  var AsyncFunctionPlugin = class extends FunctionPlugin {
283
263
  get context() {
@@ -297,10 +277,12 @@ var AsyncFunctionPlugin = class extends FunctionPlugin {
297
277
 
298
278
  // src/functions/edge-function.ts
299
279
  import { effect } from "@preact/signals-core";
300
- import { SchemaAST } from "effect";
301
- import { Filter, getMeta } from "@dxos/client/echo";
302
- import { toEffectSchema } from "@dxos/echo-schema";
303
- import { FunctionType, getUserFunctionIdInMetadata } from "@dxos/functions";
280
+ import * as Effect from "effect/Effect";
281
+ import * as SchemaAST from "effect/SchemaAST";
282
+ import { Filter } from "@dxos/client/echo";
283
+ import { toEffectSchema } from "@dxos/echo/internal";
284
+ import { Function, FunctionInvocationService, TracingService } from "@dxos/functions";
285
+ import { FunctionDefinition } from "@dxos/functions";
304
286
  import { log as log2 } from "@dxos/log";
305
287
  import { isNonNullable } from "@dxos/util";
306
288
  import { CellError as CellError2, ErrorType as ErrorType2, FunctionArgumentType } from "@dxos/vendor-hyperformula";
@@ -314,7 +296,7 @@ var EdgeFunctionPlugin = class extends AsyncFunctionPlugin {
314
296
  if (!space) {
315
297
  return new CellError2(ErrorType2.REF, "Missing space");
316
298
  }
317
- const { objects: [fn] } = await space.db.query(Filter.type(FunctionType, {
299
+ const { objects: [fn] } = await space.db.query(Filter.type(Function.Function, {
318
300
  binding
319
301
  })).run();
320
302
  if (!fn) {
@@ -322,7 +304,7 @@ var EdgeFunctionPlugin = class extends AsyncFunctionPlugin {
322
304
  binding
323
305
  }, {
324
306
  F: __dxlog_file3,
325
- L: 41,
307
+ L: 43,
326
308
  S: this,
327
309
  C: (f, a) => f(...a)
328
310
  });
@@ -334,7 +316,7 @@ var EdgeFunctionPlugin = class extends AsyncFunctionPlugin {
334
316
  fn
335
317
  }, {
336
318
  F: __dxlog_file3,
337
- L: 47,
319
+ L: 49,
338
320
  S: this,
339
321
  C: (f, a) => f(...a)
340
322
  });
@@ -345,32 +327,24 @@ var EdgeFunctionPlugin = class extends AsyncFunctionPlugin {
345
327
  });
346
328
  this.context.createSubscription(ast.procedureName, unsubscribe);
347
329
  }
348
- const body = {};
330
+ const runtime = this.context.runtime;
331
+ const functionDef = FunctionDefinition.deserialize(fn);
332
+ let input;
349
333
  if (fn.inputSchema) {
350
334
  const schema = toEffectSchema(fn.inputSchema);
351
- SchemaAST.getPropertySignatures(schema.ast).forEach(({ name }, index) => {
352
- body[name.toString()] = args[index];
335
+ const props = SchemaAST.getPropertySignatures(schema.ast);
336
+ input = {};
337
+ props.forEach(({ name }, index) => {
338
+ input[name.toString()] = args[index];
353
339
  });
354
340
  } else {
355
- body.args = args.filter(isNonNullable);
341
+ input = {
342
+ args: args.filter(isNonNullable)
343
+ };
356
344
  }
357
- const id = getUserFunctionIdInMetadata(getMeta(fn));
358
- const response = await fetch(`${this.context.remoteFunctionUrl}/${id}`, {
359
- method: "POST",
360
- headers: {
361
- "Content-Type": "application/json"
362
- },
363
- body: JSON.stringify(body)
364
- });
365
- const result = await response.text();
366
- log2("function executed", {
367
- result
368
- }, {
369
- F: __dxlog_file3,
370
- L: 74,
371
- S: this,
372
- C: (f, a) => f(...a)
373
- });
345
+ const result = runtime.runPromise(Effect.gen(function* () {
346
+ return yield* FunctionInvocationService.invokeFunction(functionDef, input);
347
+ }).pipe(Effect.provide(TracingService.layerNoop)));
374
348
  return result;
375
349
  };
376
350
  return this.runAsyncFunction(ast, state, handler(true), {
@@ -2807,30 +2781,19 @@ var defaultFunctions = [
2807
2781
  ];
2808
2782
 
2809
2783
  // src/compute-graph.ts
2784
+ import { effect as effect2 } from "@preact/signals-core";
2810
2785
  import { Event as Event2 } from "@dxos/async";
2811
- import { Filter as Filter2, fullyQualifiedId } from "@dxos/client/echo";
2786
+ import { Filter as Filter2 } from "@dxos/client/echo";
2812
2787
  import { FQ_ID_LENGTH } from "@dxos/client/echo";
2813
2788
  import { Resource as Resource2 } from "@dxos/context";
2814
- import { getTypename } from "@dxos/echo-schema";
2815
- import { FunctionType as FunctionType2 } from "@dxos/functions";
2789
+ import { Obj } from "@dxos/echo";
2790
+ import { getTypename } from "@dxos/echo/internal";
2791
+ import { Function as Function2 } from "@dxos/functions";
2816
2792
  import { invariant as invariant2 } from "@dxos/invariant";
2817
2793
  import { PublicKey } from "@dxos/keys";
2818
2794
  import { log as log3 } from "@dxos/log";
2819
2795
  import { isNonNullable as isNonNullable2 } from "@dxos/util";
2820
2796
  import { ExportedCellChange as ExportedCellChange2 } from "@dxos/vendor-hyperformula";
2821
- function _define_property3(obj, key, value) {
2822
- if (key in obj) {
2823
- Object.defineProperty(obj, key, {
2824
- value,
2825
- enumerable: true,
2826
- configurable: true,
2827
- writable: true
2828
- });
2829
- } else {
2830
- obj[key] = value;
2831
- }
2832
- return obj;
2833
- }
2834
2797
  var __dxlog_file4 = "/__w/dxos/dxos/packages/core/compute/src/compute-graph.ts";
2835
2798
  var UNKNOWN_BINDING = "__UNKNOWN__";
2836
2799
  var createSheetName = ({ type, id }) => `${type}@${id}`;
@@ -2844,6 +2807,49 @@ var parseSheetName = (name) => {
2844
2807
  };
2845
2808
  };
2846
2809
  var ComputeGraph = class extends Resource2 {
2810
+ _hf;
2811
+ _runtime;
2812
+ _space;
2813
+ _options;
2814
+ id = `graph-${PublicKey.random().truncate()}`;
2815
+ // Map of nodes indexed by sheet number.
2816
+ _nodes = /* @__PURE__ */ new Map();
2817
+ // Cached function objects.
2818
+ _remoteFunctions = [];
2819
+ update = new Event2();
2820
+ // The context is passed to all functions.
2821
+ context;
2822
+ constructor(_hf, _runtime, _space, _options) {
2823
+ super(), this._hf = _hf, this._runtime = _runtime, this._space = _space, this._options = _options;
2824
+ this.context = new FunctionContext(this._hf, this._runtime, this._space, {
2825
+ ...this._options,
2826
+ onUpdate: (update) => {
2827
+ this._options?.onUpdate?.(update);
2828
+ this.update.emit({
2829
+ type: "valuesUpdated"
2830
+ });
2831
+ }
2832
+ });
2833
+ this._hf.updateConfig({
2834
+ context: this.context
2835
+ });
2836
+ const onValuesUpdate = (changes) => {
2837
+ for (const change of changes) {
2838
+ if (change instanceof ExportedCellChange2) {
2839
+ const { sheet } = change;
2840
+ const node = this._nodes.get(sheet);
2841
+ if (node) {
2842
+ node.update.emit({
2843
+ type: "valuesUpdated",
2844
+ change
2845
+ });
2846
+ }
2847
+ }
2848
+ }
2849
+ };
2850
+ this._hf.on("valuesUpdated", onValuesUpdate);
2851
+ this._ctx.onDispose(() => this._hf.off("valuesUpdated", onValuesUpdate));
2852
+ }
2847
2853
  get hf() {
2848
2854
  return this._hf;
2849
2855
  }
@@ -2871,7 +2877,7 @@ var ComputeGraph = class extends Resource2 {
2871
2877
  getOrCreateNode(name) {
2872
2878
  invariant2(name.length, void 0, {
2873
2879
  F: __dxlog_file4,
2874
- L: 127,
2880
+ L: 135,
2875
2881
  S: this,
2876
2882
  A: [
2877
2883
  "name.length",
@@ -2884,7 +2890,7 @@ var ComputeGraph = class extends Resource2 {
2884
2890
  sheet: name
2885
2891
  }, {
2886
2892
  F: __dxlog_file4,
2887
- L: 129,
2893
+ L: 137,
2888
2894
  S: this,
2889
2895
  C: (f, a) => f(...a)
2890
2896
  });
@@ -2893,7 +2899,7 @@ var ComputeGraph = class extends Resource2 {
2893
2899
  const sheetId = this._hf.getSheetId(name);
2894
2900
  invariant2(sheetId !== void 0, void 0, {
2895
2901
  F: __dxlog_file4,
2896
- L: 134,
2902
+ L: 142,
2897
2903
  S: this,
2898
2904
  A: [
2899
2905
  "sheetId !== undefined",
@@ -2949,7 +2955,7 @@ var ComputeGraph = class extends Resource2 {
2949
2955
  }
2950
2956
  const fn = this._remoteFunctions.find((fn2) => fn2.binding === binding);
2951
2957
  if (fn) {
2952
- const id = fullyQualifiedId(fn);
2958
+ const id = Obj.getDXN(fn).toString();
2953
2959
  return `${id}(${args})`;
2954
2960
  } else {
2955
2961
  return match;
@@ -2966,7 +2972,7 @@ var ComputeGraph = class extends Resource2 {
2966
2972
  if (id.length !== FQ_ID_LENGTH) {
2967
2973
  return match;
2968
2974
  }
2969
- const fn = this._remoteFunctions.find((fn2) => fullyQualifiedId(fn2) === id);
2975
+ const fn = this._remoteFunctions.find((fn2) => Obj.getDXN(fn2).toString() === id);
2970
2976
  if (fn?.binding) {
2971
2977
  return `${fn.binding}(${args})`;
2972
2978
  } else {
@@ -2981,14 +2987,18 @@ var ComputeGraph = class extends Resource2 {
2981
2987
  }
2982
2988
  async _open() {
2983
2989
  if (this._space) {
2984
- const query = this._space.db.query(Filter2.type(FunctionType2));
2985
- const unsubscribe = query.subscribe(({ objects }) => {
2986
- this._remoteFunctions = objects.filter(({ binding }) => binding);
2990
+ const query = this._space.db.query(Filter2.type(Function2.Function));
2991
+ const unsubscribe = query.subscribe();
2992
+ const dispose = effect2(() => {
2993
+ this._remoteFunctions = query.objects.filter(({ binding }) => binding);
2987
2994
  this.update.emit({
2988
2995
  type: "functionsUpdated"
2989
2996
  });
2990
2997
  });
2991
- this._ctx.onDispose(unsubscribe);
2998
+ this._ctx.onDispose(() => {
2999
+ unsubscribe();
3000
+ dispose();
3001
+ });
2992
3002
  }
2993
3003
  }
2994
3004
  async _close() {
@@ -2996,40 +3006,6 @@ var ComputeGraph = class extends Resource2 {
2996
3006
  await node.close();
2997
3007
  }
2998
3008
  }
2999
- constructor(_hf, _space, _options) {
3000
- super(), _define_property3(this, "_hf", void 0), _define_property3(this, "_space", void 0), _define_property3(this, "_options", void 0), _define_property3(this, "id", void 0), // Map of nodes indexed by sheet number.
3001
- _define_property3(this, "_nodes", void 0), // Cached function objects.
3002
- _define_property3(this, "_remoteFunctions", void 0), _define_property3(this, "update", void 0), // The context is passed to all functions.
3003
- _define_property3(this, "context", void 0), this._hf = _hf, this._space = _space, this._options = _options, this.id = `graph-${PublicKey.random().truncate()}`, this._nodes = /* @__PURE__ */ new Map(), this._remoteFunctions = [], this.update = new Event2();
3004
- this.context = new FunctionContext(this._hf, this._space, {
3005
- ...this._options,
3006
- onUpdate: (update) => {
3007
- this._options?.onUpdate?.(update);
3008
- this.update.emit({
3009
- type: "valuesUpdated"
3010
- });
3011
- }
3012
- });
3013
- this._hf.updateConfig({
3014
- context: this.context
3015
- });
3016
- const onValuesUpdate = (changes) => {
3017
- for (const change of changes) {
3018
- if (change instanceof ExportedCellChange2) {
3019
- const { sheet } = change;
3020
- const node = this._nodes.get(sheet);
3021
- if (node) {
3022
- node.update.emit({
3023
- type: "valuesUpdated",
3024
- change
3025
- });
3026
- }
3027
- }
3028
- }
3029
- };
3030
- this._hf.on("valuesUpdated", onValuesUpdate);
3031
- this._ctx.onDispose(() => this._hf.off("valuesUpdated", onValuesUpdate));
3032
- }
3033
3009
  };
3034
3010
 
3035
3011
  // src/compute-graph-registry.ts
@@ -3038,30 +3014,27 @@ import { Resource as Resource3 } from "@dxos/context";
3038
3014
  import { invariant as invariant3 } from "@dxos/invariant";
3039
3015
  import { log as log4 } from "@dxos/log";
3040
3016
  import { HyperFormula } from "@dxos/vendor-hyperformula";
3041
- function _define_property4(obj, key, value) {
3042
- if (key in obj) {
3043
- Object.defineProperty(obj, key, {
3044
- value,
3045
- enumerable: true,
3046
- configurable: true,
3047
- writable: true
3048
- });
3049
- } else {
3050
- obj[key] = value;
3051
- }
3052
- return obj;
3053
- }
3054
3017
  var __dxlog_file5 = "/__w/dxos/dxos/packages/core/compute/src/compute-graph-registry.ts";
3055
- var defaultOptions = {
3056
- licenseKey: "gpl-v3"
3057
- };
3058
3018
  var defaultPlugins = [
3059
3019
  {
3060
3020
  plugin: EdgeFunctionPlugin,
3061
3021
  translations: EdgeFunctionPluginTranslations
3062
3022
  }
3063
3023
  ];
3024
+ var defaultOptions = {
3025
+ licenseKey: "gpl-v3"
3026
+ };
3064
3027
  var ComputeGraphRegistry = class extends Resource3 {
3028
+ _graphs = /* @__PURE__ */ new Map();
3029
+ _options;
3030
+ constructor(options) {
3031
+ super();
3032
+ this._options = defaultsDeep2({}, options, defaultOptions);
3033
+ this._options.plugins = this._options.plugins ?? defaultPlugins;
3034
+ this._options.plugins?.forEach(({ plugin, translations }) => {
3035
+ HyperFormula.registerFunctionPlugin(plugin, translations);
3036
+ });
3037
+ }
3065
3038
  getGraph(spaceId) {
3066
3039
  return this._graphs.get(spaceId);
3067
3040
  }
@@ -3072,7 +3045,7 @@ var ComputeGraphRegistry = class extends Resource3 {
3072
3045
  space: space.id
3073
3046
  }, {
3074
3047
  F: __dxlog_file5,
3075
- L: 67,
3048
+ L: 73,
3076
3049
  S: this,
3077
3050
  C: (f, a) => f(...a)
3078
3051
  });
@@ -3083,7 +3056,7 @@ var ComputeGraphRegistry = class extends Resource3 {
3083
3056
  createGraph(space) {
3084
3057
  invariant3(!this._graphs.has(space.id), `ComputeGraph already exists for space: ${space.id}`, {
3085
3058
  F: __dxlog_file5,
3086
- L: 75,
3059
+ L: 81,
3087
3060
  S: this,
3088
3061
  A: [
3089
3062
  "!this._graphs.has(space.id)",
@@ -3091,7 +3064,17 @@ var ComputeGraphRegistry = class extends Resource3 {
3091
3064
  ]
3092
3065
  });
3093
3066
  const hf = HyperFormula.buildEmpty(this._options);
3094
- const graph = new ComputeGraph(hf, space, this._options);
3067
+ invariant3(this._options.computeRuntime, "ComputeRuntime is required", {
3068
+ F: __dxlog_file5,
3069
+ L: 83,
3070
+ S: this,
3071
+ A: [
3072
+ "this._options.computeRuntime",
3073
+ "'ComputeRuntime is required'"
3074
+ ]
3075
+ });
3076
+ const runtime = this._options.computeRuntime.getRuntime(space.id);
3077
+ const graph = new ComputeGraph(hf, runtime, space, this._options);
3095
3078
  this._graphs.set(space.id, graph);
3096
3079
  return graph;
3097
3080
  }
@@ -3101,15 +3084,6 @@ var ComputeGraphRegistry = class extends Resource3 {
3101
3084
  }
3102
3085
  this._graphs.clear();
3103
3086
  }
3104
- constructor(options = {
3105
- plugins: defaultPlugins
3106
- }) {
3107
- super(), _define_property4(this, "_graphs", /* @__PURE__ */ new Map()), _define_property4(this, "_options", void 0);
3108
- this._options = defaultsDeep2({}, options, defaultOptions);
3109
- this._options.plugins?.forEach(({ plugin, translations }) => {
3110
- HyperFormula.registerFunctionPlugin(plugin, translations);
3111
- });
3112
- }
3113
3087
  };
3114
3088
 
3115
3089
  export {
@@ -3135,8 +3109,8 @@ export {
3135
3109
  createSheetName,
3136
3110
  parseSheetName,
3137
3111
  ComputeGraph,
3138
- defaultOptions,
3139
3112
  defaultPlugins,
3113
+ defaultOptions,
3140
3114
  ComputeGraphRegistry
3141
3115
  };
3142
- //# sourceMappingURL=chunk-2XWWSGAU.mjs.map
3116
+ //# sourceMappingURL=chunk-D3RM3FQW.mjs.map