@dxos/compute 0.8.4-main.b97322e → 0.8.4-main.bc674ce

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 (56) hide show
  1. package/dist/lib/browser/{chunk-AURNYRCC.mjs → chunk-KGBGT4NT.mjs} +104 -76
  2. package/dist/lib/browser/chunk-KGBGT4NT.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 -6
  6. package/dist/lib/browser/testing/index.mjs.map +4 -4
  7. package/dist/lib/node-esm/{chunk-DZMSWKOY.mjs → chunk-2MATJWLB.mjs} +104 -76
  8. package/dist/lib/node-esm/chunk-2MATJWLB.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 -6
  12. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  13. package/dist/types/src/compute-graph-registry.d.ts +10 -7
  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 +5 -2
  18. package/dist/types/src/compute-graph.d.ts.map +1 -1
  19. package/dist/types/src/compute-node.d.ts +1 -2
  20. package/dist/types/src/compute-node.d.ts.map +1 -1
  21. package/dist/types/src/functions/async-function.d.ts +13 -11
  22. package/dist/types/src/functions/async-function.d.ts.map +1 -1
  23. package/dist/types/src/functions/edge-function.d.ts +3 -3
  24. package/dist/types/src/functions/edge-function.d.ts.map +1 -1
  25. package/dist/types/src/index.d.ts.map +1 -1
  26. package/dist/types/src/testing/index.d.ts +1 -0
  27. package/dist/types/src/testing/index.d.ts.map +1 -1
  28. package/dist/types/src/testing/test-builder.d.ts +1 -1
  29. package/dist/types/src/testing/test-builder.d.ts.map +1 -1
  30. package/dist/types/src/testing/test-plugin.d.ts +4 -5
  31. package/dist/types/src/testing/test-plugin.d.ts.map +1 -1
  32. package/dist/types/src/testing/test-runtime.d.ts +10 -0
  33. package/dist/types/src/testing/test-runtime.d.ts.map +1 -0
  34. package/dist/types/src/types/hyperformula.d.ts +3 -6
  35. package/dist/types/src/types/hyperformula.d.ts.map +1 -1
  36. package/dist/types/tsconfig.tsbuildinfo +1 -1
  37. package/package.json +28 -29
  38. package/src/compute-graph-registry.test.ts +158 -0
  39. package/src/compute-graph-registry.ts +20 -14
  40. package/src/compute-graph.test.ts +31 -13
  41. package/src/compute-graph.ts +21 -17
  42. package/src/compute-node.ts +2 -5
  43. package/src/functions/async-function.ts +21 -16
  44. package/src/functions/edge-function.ts +33 -32
  45. package/src/hyperformula.test.ts +2 -2
  46. package/src/index.ts +0 -27
  47. package/src/testing/index.ts +1 -0
  48. package/src/testing/test-builder.ts +8 -2
  49. package/src/testing/test-plugin.ts +2 -5
  50. package/src/testing/test-runtime.ts +34 -0
  51. package/src/testing/util.ts +1 -1
  52. package/src/types/hyperformula.ts +8 -8
  53. package/src/types/types.test.ts +2 -2
  54. package/dist/lib/browser/chunk-AURNYRCC.mjs.map +0 -7
  55. package/dist/lib/node-esm/chunk-DZMSWKOY.mjs.map +0 -7
  56. package/dist/vendor/hyperformula.mjs +0 -36400
@@ -1,5 +1,5 @@
1
1
  // src/types/hyperformula.ts
2
- import { DetailedCellError, ExportedCellChange } from "#hyperformula";
2
+ import { DetailedCellError, ExportedCellChange } from "@dxos/vendor-hyperformula";
3
3
 
4
4
  // src/types/types.ts
5
5
  import { invariant } from "@dxos/invariant";
@@ -77,10 +77,13 @@ var inRange = (range, cell) => {
77
77
  // src/compute-node.ts
78
78
  import { Event } from "@dxos/async";
79
79
  import { Resource } from "@dxos/context";
80
- import { DetailedCellError as DetailedCellError2 } from "#hyperformula";
80
+ import { DetailedCellError as DetailedCellError2 } from "@dxos/vendor-hyperformula";
81
81
  var ComputeNode = class extends Resource {
82
+ _graph;
83
+ sheetId;
84
+ update = new Event();
82
85
  constructor(_graph, sheetId) {
83
- super(), this._graph = _graph, this.sheetId = sheetId, this.update = new Event();
86
+ super(), this._graph = _graph, this.sheetId = sheetId;
84
87
  }
85
88
  get graph() {
86
89
  return this._graph;
@@ -120,14 +123,16 @@ var ComputeNode = class extends Resource {
120
123
  import defaultsDeep from "lodash.defaultsdeep";
121
124
  import { debounce } from "@dxos/async";
122
125
  import { log } from "@dxos/log";
123
- import { CellError, ErrorType, EmptyValue, FunctionPlugin } from "#hyperformula";
126
+ import { CellError, EmptyValue, ErrorType, FunctionPlugin } from "@dxos/vendor-hyperformula";
124
127
  var __dxlog_file2 = "/__w/dxos/dxos/packages/core/compute/src/functions/async-function.ts";
125
128
  var defaultFunctionContextOptions = {
126
129
  defaultTtl: 5e3,
127
- debounceDelay: 200,
128
- remoteFunctionUrl: "https://edge.dxos.workers.dev/functions"
130
+ debounceDelay: 200
129
131
  };
130
132
  var FunctionContext = class _FunctionContext {
133
+ _hf;
134
+ _runtime;
135
+ _space;
131
136
  // Mangle name with params.
132
137
  static createInvocationKey(name, ...args) {
133
138
  return JSON.stringify({
@@ -135,13 +140,22 @@ var FunctionContext = class _FunctionContext {
135
140
  ...args
136
141
  });
137
142
  }
138
- constructor(_hf, _space, _options) {
143
+ // TODO(wittjosiah): Persist cached values.
144
+ // Cached values for cell.
145
+ _cache = /* @__PURE__ */ new Map();
146
+ // Active requests.
147
+ _pending = /* @__PURE__ */ new Map();
148
+ // Query subscriptions.
149
+ _subscriptions = /* @__PURE__ */ new Map();
150
+ // Invocation count.
151
+ _invocations = {};
152
+ _options;
153
+ // Debounced update handler.
154
+ _onUpdate;
155
+ constructor(_hf, _runtime, _space, _options) {
139
156
  this._hf = _hf;
157
+ this._runtime = _runtime;
140
158
  this._space = _space;
141
- this._cache = /* @__PURE__ */ new Map();
142
- this._pending = /* @__PURE__ */ new Map();
143
- this._subscriptions = /* @__PURE__ */ new Map();
144
- this._invocations = {};
145
159
  this._options = defaultsDeep(_options ?? {}, defaultFunctionContextOptions);
146
160
  this._onUpdate = debounce((update) => {
147
161
  log("update", update, {
@@ -157,15 +171,15 @@ var FunctionContext = class _FunctionContext {
157
171
  get space() {
158
172
  return this._space;
159
173
  }
160
- get remoteFunctionUrl() {
161
- return this._options.remoteFunctionUrl;
162
- }
163
174
  get info() {
164
175
  return {
165
176
  cache: this._cache.size,
166
177
  invocations: this._invocations
167
178
  };
168
179
  }
180
+ get runtime() {
181
+ return this._runtime;
182
+ }
169
183
  flush() {
170
184
  this._cache.clear();
171
185
  this._invocations = {};
@@ -260,14 +274,15 @@ var AsyncFunctionPlugin = class extends FunctionPlugin {
260
274
  };
261
275
 
262
276
  // src/functions/edge-function.ts
263
- import { effect } from "@preact/signals-core";
264
- import { SchemaAST } from "effect";
265
- import { Filter, getMeta } from "@dxos/client/echo";
266
- import { toEffectSchema } from "@dxos/echo-schema";
267
- import { FunctionType, getUserFunctionUrlInMetadata } from "@dxos/functions";
277
+ import * as Effect from "effect/Effect";
278
+ import * as SchemaAST from "effect/SchemaAST";
279
+ import { Filter } from "@dxos/client/echo";
280
+ import { JsonSchema, Obj } from "@dxos/echo";
281
+ import { Function, FunctionInvocationService, TracingService } from "@dxos/functions";
282
+ import { FunctionDefinition } from "@dxos/functions";
268
283
  import { log as log2 } from "@dxos/log";
269
284
  import { isNonNullable } from "@dxos/util";
270
- import { CellError as CellError2, ErrorType as ErrorType2, FunctionArgumentType } from "#hyperformula";
285
+ import { CellError as CellError2, ErrorType as ErrorType2, FunctionArgumentType } from "@dxos/vendor-hyperformula";
271
286
  var __dxlog_file3 = "/__w/dxos/dxos/packages/core/compute/src/functions/edge-function.ts";
272
287
  var EDGE_FUNCTION_NAME = "DX";
273
288
  var FUNCTION_TTL = 1e4;
@@ -278,7 +293,7 @@ var EdgeFunctionPlugin = class extends AsyncFunctionPlugin {
278
293
  if (!space) {
279
294
  return new CellError2(ErrorType2.REF, "Missing space");
280
295
  }
281
- const { objects: [fn] } = await space.db.query(Filter.type(FunctionType, {
296
+ const [fn] = await space.db.query(Filter.type(Function.Function, {
282
297
  binding
283
298
  })).run();
284
299
  if (!fn) {
@@ -286,55 +301,46 @@ var EdgeFunctionPlugin = class extends AsyncFunctionPlugin {
286
301
  binding
287
302
  }, {
288
303
  F: __dxlog_file3,
289
- L: 42,
304
+ L: 40,
290
305
  S: this,
291
306
  C: (f, a) => f(...a)
292
307
  });
293
308
  return new CellError2(ErrorType2.REF, "Function not found");
294
309
  }
295
310
  if (subscribe) {
296
- const unsubscribe = effect(() => {
311
+ const unsubscribe = Obj.subscribe(fn, () => {
297
312
  log2("function changed", {
298
313
  fn
299
314
  }, {
300
315
  F: __dxlog_file3,
301
- L: 48,
316
+ L: 46,
302
317
  S: this,
303
318
  C: (f, a) => f(...a)
304
319
  });
305
- const _ = fn?.version;
306
320
  this.runAsyncFunction(ast, state, handler(false), {
307
321
  ttl: FUNCTION_TTL
308
322
  });
309
323
  });
310
324
  this.context.createSubscription(ast.procedureName, unsubscribe);
311
325
  }
312
- const body = {};
326
+ const runtime = this.context.runtime;
327
+ const functionDef = FunctionDefinition.deserialize(fn);
328
+ let input;
313
329
  if (fn.inputSchema) {
314
- const schema = toEffectSchema(fn.inputSchema);
315
- SchemaAST.getPropertySignatures(schema.ast).forEach(({ name }, index) => {
316
- body[name.toString()] = args[index];
330
+ const schema = JsonSchema.toEffectSchema(fn.inputSchema);
331
+ const props = SchemaAST.getPropertySignatures(schema.ast);
332
+ input = {};
333
+ props.forEach(({ name }, index) => {
334
+ input[name.toString()] = args[index];
317
335
  });
318
336
  } else {
319
- body.args = args.filter(isNonNullable);
337
+ input = {
338
+ args: args.filter(isNonNullable)
339
+ };
320
340
  }
321
- const path = getUserFunctionUrlInMetadata(getMeta(fn));
322
- const response = await fetch(`${this.context.remoteFunctionUrl}${path}`, {
323
- method: "POST",
324
- headers: {
325
- "Content-Type": "application/json"
326
- },
327
- body: JSON.stringify(body)
328
- });
329
- const result = await response.text();
330
- log2("function executed", {
331
- result
332
- }, {
333
- F: __dxlog_file3,
334
- L: 75,
335
- S: this,
336
- C: (f, a) => f(...a)
337
- });
341
+ const result = runtime.runPromise(Effect.gen(function* () {
342
+ return yield* FunctionInvocationService.invokeFunction(functionDef, input);
343
+ }).pipe(Effect.provide(TracingService.layerNoop)));
338
344
  return result;
339
345
  };
340
346
  return this.runAsyncFunction(ast, state, handler(true), {
@@ -2772,16 +2778,16 @@ var defaultFunctions = [
2772
2778
 
2773
2779
  // src/compute-graph.ts
2774
2780
  import { Event as Event2 } from "@dxos/async";
2775
- import { Filter as Filter2, fullyQualifiedId } from "@dxos/client/echo";
2781
+ import { Filter as Filter2 } from "@dxos/client/echo";
2776
2782
  import { FQ_ID_LENGTH } from "@dxos/client/echo";
2777
2783
  import { Resource as Resource2 } from "@dxos/context";
2778
- import { getTypename } from "@dxos/echo-schema";
2779
- import { FunctionType as FunctionType2 } from "@dxos/functions";
2784
+ import { Obj as Obj2 } from "@dxos/echo";
2785
+ import { Function as Function2 } from "@dxos/functions";
2780
2786
  import { invariant as invariant2 } from "@dxos/invariant";
2781
2787
  import { PublicKey } from "@dxos/keys";
2782
2788
  import { log as log3 } from "@dxos/log";
2783
2789
  import { isNonNullable as isNonNullable2 } from "@dxos/util";
2784
- import { ExportedCellChange as ExportedCellChange2 } from "#hyperformula";
2790
+ import { ExportedCellChange as ExportedCellChange2 } from "@dxos/vendor-hyperformula";
2785
2791
  var __dxlog_file4 = "/__w/dxos/dxos/packages/core/compute/src/compute-graph.ts";
2786
2792
  var UNKNOWN_BINDING = "__UNKNOWN__";
2787
2793
  var createSheetName = ({ type, id }) => `${type}@${id}`;
@@ -2795,9 +2801,21 @@ var parseSheetName = (name) => {
2795
2801
  };
2796
2802
  };
2797
2803
  var ComputeGraph = class extends Resource2 {
2798
- constructor(_hf, _space, _options) {
2799
- super(), 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();
2800
- this.context = new FunctionContext(this._hf, this._space, {
2804
+ _hf;
2805
+ _runtime;
2806
+ _space;
2807
+ _options;
2808
+ id = `graph-${PublicKey.random().truncate()}`;
2809
+ // Map of nodes indexed by sheet number.
2810
+ _nodes = /* @__PURE__ */ new Map();
2811
+ // Cached function objects.
2812
+ _remoteFunctions = [];
2813
+ update = new Event2();
2814
+ // The context is passed to all functions.
2815
+ context;
2816
+ constructor(_hf, _runtime, _space, _options) {
2817
+ super(), this._hf = _hf, this._runtime = _runtime, this._space = _space, this._options = _options;
2818
+ this.context = new FunctionContext(this._hf, this._runtime, this._space, {
2801
2819
  ...this._options,
2802
2820
  onUpdate: (update) => {
2803
2821
  this._options?.onUpdate?.(update);
@@ -2853,7 +2871,7 @@ var ComputeGraph = class extends Resource2 {
2853
2871
  getOrCreateNode(name) {
2854
2872
  invariant2(name.length, void 0, {
2855
2873
  F: __dxlog_file4,
2856
- L: 129,
2874
+ L: 133,
2857
2875
  S: this,
2858
2876
  A: [
2859
2877
  "name.length",
@@ -2866,7 +2884,7 @@ var ComputeGraph = class extends Resource2 {
2866
2884
  sheet: name
2867
2885
  }, {
2868
2886
  F: __dxlog_file4,
2869
- L: 131,
2887
+ L: 135,
2870
2888
  S: this,
2871
2889
  C: (f, a) => f(...a)
2872
2890
  });
@@ -2875,7 +2893,7 @@ var ComputeGraph = class extends Resource2 {
2875
2893
  const sheetId = this._hf.getSheetId(name);
2876
2894
  invariant2(sheetId !== void 0, void 0, {
2877
2895
  F: __dxlog_file4,
2878
- L: 136,
2896
+ L: 140,
2879
2897
  S: this,
2880
2898
  A: [
2881
2899
  "sheetId !== undefined",
@@ -2899,7 +2917,7 @@ var ComputeGraph = class extends Resource2 {
2899
2917
  }).filter(isNonNullable2);
2900
2918
  for (const obj of objects) {
2901
2919
  if (obj.name === name) {
2902
- const type = getTypename(obj);
2920
+ const type = Obj2.getTypename(obj);
2903
2921
  return `'${createSheetName({
2904
2922
  type,
2905
2923
  id: obj.id
@@ -2931,7 +2949,7 @@ var ComputeGraph = class extends Resource2 {
2931
2949
  }
2932
2950
  const fn = this._remoteFunctions.find((fn2) => fn2.binding === binding);
2933
2951
  if (fn) {
2934
- const id = fullyQualifiedId(fn);
2952
+ const id = Obj2.getDXN(fn).toString();
2935
2953
  return `${id}(${args})`;
2936
2954
  } else {
2937
2955
  return match;
@@ -2948,7 +2966,7 @@ var ComputeGraph = class extends Resource2 {
2948
2966
  if (id.length !== FQ_ID_LENGTH) {
2949
2967
  return match;
2950
2968
  }
2951
- const fn = this._remoteFunctions.find((fn2) => fullyQualifiedId(fn2) === id);
2969
+ const fn = this._remoteFunctions.find((fn2) => Obj2.getDXN(fn2).toString() === id);
2952
2970
  if (fn?.binding) {
2953
2971
  return `${fn.binding}(${args})`;
2954
2972
  } else {
@@ -2963,9 +2981,9 @@ var ComputeGraph = class extends Resource2 {
2963
2981
  }
2964
2982
  async _open() {
2965
2983
  if (this._space) {
2966
- const query = this._space.db.query(Filter2.type(FunctionType2));
2967
- const unsubscribe = query.subscribe(({ objects }) => {
2968
- this._remoteFunctions = objects.filter(({ binding }) => binding);
2984
+ const query = this._space.db.query(Filter2.type(Function2.Function));
2985
+ const unsubscribe = query.subscribe(() => {
2986
+ this._remoteFunctions = query.results.filter((fn) => fn.binding);
2969
2987
  this.update.emit({
2970
2988
  type: "functionsUpdated"
2971
2989
  });
@@ -2985,24 +3003,24 @@ import defaultsDeep2 from "lodash.defaultsdeep";
2985
3003
  import { Resource as Resource3 } from "@dxos/context";
2986
3004
  import { invariant as invariant3 } from "@dxos/invariant";
2987
3005
  import { log as log4 } from "@dxos/log";
2988
- import { HyperFormula } from "#hyperformula";
3006
+ import { HyperFormula } from "@dxos/vendor-hyperformula";
2989
3007
  var __dxlog_file5 = "/__w/dxos/dxos/packages/core/compute/src/compute-graph-registry.ts";
2990
- var defaultOptions = {
2991
- licenseKey: "gpl-v3"
2992
- };
2993
3008
  var defaultPlugins = [
2994
3009
  {
2995
3010
  plugin: EdgeFunctionPlugin,
2996
3011
  translations: EdgeFunctionPluginTranslations
2997
3012
  }
2998
3013
  ];
3014
+ var defaultOptions = {
3015
+ licenseKey: "gpl-v3"
3016
+ };
2999
3017
  var ComputeGraphRegistry = class extends Resource3 {
3000
- constructor(options = {
3001
- plugins: defaultPlugins
3002
- }) {
3018
+ _graphs = /* @__PURE__ */ new Map();
3019
+ _options;
3020
+ constructor(options) {
3003
3021
  super();
3004
- this._graphs = /* @__PURE__ */ new Map();
3005
3022
  this._options = defaultsDeep2({}, options, defaultOptions);
3023
+ this._options.plugins = this._options.plugins ?? defaultPlugins;
3006
3024
  this._options.plugins?.forEach(({ plugin, translations }) => {
3007
3025
  HyperFormula.registerFunctionPlugin(plugin, translations);
3008
3026
  });
@@ -3017,7 +3035,7 @@ var ComputeGraphRegistry = class extends Resource3 {
3017
3035
  space: space.id
3018
3036
  }, {
3019
3037
  F: __dxlog_file5,
3020
- L: 70,
3038
+ L: 73,
3021
3039
  S: this,
3022
3040
  C: (f, a) => f(...a)
3023
3041
  });
@@ -3028,7 +3046,7 @@ var ComputeGraphRegistry = class extends Resource3 {
3028
3046
  createGraph(space) {
3029
3047
  invariant3(!this._graphs.has(space.id), `ComputeGraph already exists for space: ${space.id}`, {
3030
3048
  F: __dxlog_file5,
3031
- L: 78,
3049
+ L: 81,
3032
3050
  S: this,
3033
3051
  A: [
3034
3052
  "!this._graphs.has(space.id)",
@@ -3036,7 +3054,17 @@ var ComputeGraphRegistry = class extends Resource3 {
3036
3054
  ]
3037
3055
  });
3038
3056
  const hf = HyperFormula.buildEmpty(this._options);
3039
- const graph = new ComputeGraph(hf, space, this._options);
3057
+ invariant3(this._options.computeRuntime, "ComputeRuntime is required", {
3058
+ F: __dxlog_file5,
3059
+ L: 83,
3060
+ S: this,
3061
+ A: [
3062
+ "this._options.computeRuntime",
3063
+ "'ComputeRuntime is required'"
3064
+ ]
3065
+ });
3066
+ const runtime = this._options.computeRuntime.getRuntime(space.id);
3067
+ const graph = new ComputeGraph(hf, runtime, space, this._options);
3040
3068
  this._graphs.set(space.id, graph);
3041
3069
  return graph;
3042
3070
  }
@@ -3071,8 +3099,8 @@ export {
3071
3099
  createSheetName,
3072
3100
  parseSheetName,
3073
3101
  ComputeGraph,
3074
- defaultOptions,
3075
3102
  defaultPlugins,
3103
+ defaultOptions,
3076
3104
  ComputeGraphRegistry
3077
3105
  };
3078
- //# sourceMappingURL=chunk-AURNYRCC.mjs.map
3106
+ //# sourceMappingURL=chunk-KGBGT4NT.mjs.map