@dxos/functions 0.5.3-main.79e0565 → 0.5.3-main.7e64682

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 (52) hide show
  1. package/dist/lib/browser/chunk-CMMH5BA6.mjs +86 -0
  2. package/dist/lib/browser/chunk-CMMH5BA6.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +211 -204
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/types.mjs +14 -0
  7. package/dist/lib/browser/types.mjs.map +7 -0
  8. package/dist/lib/node/chunk-3C2FP4J4.cjs +103 -0
  9. package/dist/lib/node/chunk-3C2FP4J4.cjs.map +7 -0
  10. package/dist/lib/node/index.cjs +218 -203
  11. package/dist/lib/node/index.cjs.map +4 -4
  12. package/dist/lib/node/meta.json +1 -1
  13. package/dist/lib/node/types.cjs +35 -0
  14. package/dist/lib/node/types.cjs.map +7 -0
  15. package/dist/types/src/browser/index.d.ts +2 -0
  16. package/dist/types/src/browser/index.d.ts.map +1 -0
  17. package/dist/types/src/function/function-registry.d.ts.map +1 -1
  18. package/dist/types/src/handler.d.ts.map +1 -1
  19. package/dist/types/src/runtime/dev-server.d.ts.map +1 -1
  20. package/dist/types/src/runtime/scheduler.d.ts +1 -1
  21. package/dist/types/src/runtime/scheduler.d.ts.map +1 -1
  22. package/dist/types/src/testing/setup.d.ts.map +1 -1
  23. package/dist/types/src/trigger/trigger-registry.d.ts +2 -5
  24. package/dist/types/src/trigger/trigger-registry.d.ts.map +1 -1
  25. package/dist/types/src/trigger/type/subscription-trigger.d.ts.map +1 -1
  26. package/dist/types/src/trigger/type/timer-trigger.d.ts.map +1 -1
  27. package/dist/types/src/trigger/type/webhook-trigger.d.ts.map +1 -1
  28. package/dist/types/src/trigger/type/websocket-trigger.d.ts.map +1 -1
  29. package/dist/types/src/types.d.ts +43 -33
  30. package/dist/types/src/types.d.ts.map +1 -1
  31. package/package.json +30 -16
  32. package/schema/functions.json +5 -0
  33. package/src/browser/index.ts +5 -0
  34. package/src/function/function-registry.ts +5 -5
  35. package/src/runtime/dev-server.ts +4 -4
  36. package/src/runtime/scheduler.test.ts +14 -9
  37. package/src/runtime/scheduler.ts +14 -9
  38. package/src/testing/functions-integration.test.ts +1 -0
  39. package/src/testing/setup.ts +8 -10
  40. package/src/trigger/trigger-registry.test.ts +30 -13
  41. package/src/trigger/trigger-registry.ts +59 -37
  42. package/src/trigger/type/subscription-trigger.ts +13 -7
  43. package/src/trigger/type/timer-trigger.ts +4 -3
  44. package/src/trigger/type/webhook-trigger.ts +3 -2
  45. package/src/trigger/type/websocket-trigger.ts +4 -3
  46. package/src/types.ts +39 -30
  47. package/dist/types/src/util.d.ts +0 -15
  48. package/dist/types/src/util.d.ts.map +0 -1
  49. package/dist/types/src/util.test.d.ts +0 -2
  50. package/dist/types/src/util.test.d.ts.map +0 -1
  51. package/src/util.test.ts +0 -43
  52. package/src/util.ts +0 -48
@@ -1,18 +1,11 @@
1
1
  import "@dxos/node-std/globals";
2
- var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
3
- get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
4
- }) : x)(function(x) {
5
- if (typeof require !== "undefined")
6
- return require.apply(this, arguments);
7
- throw Error('Dynamic require of "' + x + '" is not supported');
8
- });
9
-
10
- // inject-globals:@inject-globals
11
2
  import {
12
- global,
13
- Buffer as Buffer2,
14
- process
15
- } from "@dxos/node-std/inject-globals";
3
+ FUNCTION_SCHEMA,
4
+ FunctionDef,
5
+ FunctionManifestSchema,
6
+ FunctionTrigger,
7
+ __require
8
+ } from "./chunk-CMMH5BA6.mjs";
16
9
 
17
10
  // packages/core/functions/src/function/function-registry.ts
18
11
  import { Event } from "@dxos/async";
@@ -20,90 +13,7 @@ import { create, Filter } from "@dxos/client/echo";
20
13
  import { Resource } from "@dxos/context";
21
14
  import { PublicKey } from "@dxos/keys";
22
15
  import { log } from "@dxos/log";
23
- import { ComplexMap } from "@dxos/util";
24
-
25
- // packages/core/functions/src/types.ts
26
- import { RawObject, S, TypedObject } from "@dxos/echo-schema";
27
- var SubscriptionTriggerSchema = S.struct({
28
- type: S.literal("subscription"),
29
- // TODO(burdon): Define query DSL (from ECHO).
30
- filter: S.array(S.struct({
31
- type: S.string,
32
- props: S.optional(S.record(S.string, S.any))
33
- })),
34
- options: S.optional(S.struct({
35
- // Watch changes to object (not just creation).
36
- deep: S.optional(S.boolean),
37
- // Debounce changes (delay in ms).
38
- delay: S.optional(S.number)
39
- }))
40
- });
41
- var TimerTriggerSchema = S.struct({
42
- type: S.literal("timer"),
43
- cron: S.string
44
- });
45
- var WebhookTriggerSchema = S.mutable(S.struct({
46
- type: S.literal("webhook"),
47
- method: S.string,
48
- // Assigned port.
49
- port: S.optional(S.number)
50
- }));
51
- var WebsocketTriggerSchema = S.struct({
52
- type: S.literal("websocket"),
53
- url: S.string,
54
- init: S.optional(S.record(S.string, S.any))
55
- });
56
- var TriggerSpecSchema = S.union(TimerTriggerSchema, WebhookTriggerSchema, WebsocketTriggerSchema, SubscriptionTriggerSchema);
57
- var FunctionDef = class extends TypedObject({
58
- typename: "dxos.org/type/FunctionDef",
59
- version: "0.1.0"
60
- })({
61
- uri: S.string,
62
- description: S.optional(S.string),
63
- route: S.string,
64
- // TODO(burdon): NPM/GitHub/Docker/CF URL?
65
- handler: S.string
66
- }) {
67
- };
68
- var FunctionTrigger = class extends TypedObject({
69
- typename: "dxos.org/type/FunctionTrigger",
70
- version: "0.1.0"
71
- })({
72
- function: S.string.pipe(S.description("Function URI.")),
73
- // Context is merged into the event data passed to the function.
74
- meta: S.optional(S.object),
75
- spec: TriggerSpecSchema
76
- }) {
77
- };
78
- var FunctionManifestSchema = S.struct({
79
- functions: S.optional(S.mutable(S.array(RawObject(FunctionDef)))),
80
- triggers: S.optional(S.mutable(S.array(RawObject(FunctionTrigger))))
81
- });
82
-
83
- // packages/core/functions/src/util.ts
84
- var diff = (previous, next, comparator) => {
85
- const remaining = [
86
- ...previous
87
- ];
88
- const result = {
89
- added: [],
90
- updated: [],
91
- removed: remaining
92
- };
93
- for (const object of next) {
94
- const index = remaining.findIndex((item) => comparator(item, object));
95
- if (index === -1) {
96
- result.added.push(object);
97
- } else {
98
- result.updated.push(remaining[index]);
99
- remaining.splice(index, 1);
100
- }
101
- }
102
- return result;
103
- };
104
- var intersection = (a, b, comparator) => a.filter((a2) => b.find((b2) => comparator(a2, b2)) !== void 0);
105
-
106
- // packages/core/functions/src/function/function-registry.ts
16
+ import { ComplexMap, diff } from "@dxos/util";
107
17
  var __dxlog_file = "/home/runner/work/dxos/dxos/packages/core/functions/src/function/function-registry.ts";
108
18
  var FunctionRegistry = class extends Resource {
109
19
  constructor(_client) {
@@ -125,7 +35,7 @@ var FunctionRegistry = class extends Resource {
125
35
  functions: functions?.length ?? 0
126
36
  }, {
127
37
  F: __dxlog_file,
128
- L: 39,
38
+ L: 38,
129
39
  S: this,
130
40
  C: (f, a) => f(...a)
131
41
  });
@@ -136,11 +46,16 @@ var FunctionRegistry = class extends Resource {
136
46
  space.db.graph.runtimeSchemaRegistry.registerSchema(FunctionDef);
137
47
  }
138
48
  const { objects: existing } = await space.db.query(Filter.schema(FunctionDef)).run();
139
- const { added, removed } = diff(existing, functions, (a, b) => a.uri === b.uri);
49
+ const { added } = diff(existing, functions, (a, b) => a.uri === b.uri);
140
50
  added.forEach((def) => space.db.add(create(FunctionDef, def)));
141
- removed.forEach((def) => space.db.remove(def));
142
51
  }
143
52
  async _open() {
53
+ log.info("opening...", void 0, {
54
+ F: __dxlog_file,
55
+ L: 54,
56
+ S: this,
57
+ C: (f, a) => f(...a)
58
+ });
144
59
  const spacesSubscription = this._client.spaces.subscribe(async (spaces) => {
145
60
  for (const space of spaces) {
146
61
  if (this._functionBySpaceKey.has(space.key)) {
@@ -167,6 +82,12 @@ var FunctionRegistry = class extends Resource {
167
82
  this._ctx.onDispose(() => spacesSubscription.unsubscribe());
168
83
  }
169
84
  async _close(_) {
85
+ log.info("closing...", void 0, {
86
+ F: __dxlog_file,
87
+ L: 87,
88
+ S: this,
89
+ C: (f, a) => f(...a)
90
+ });
170
91
  this._functionBySpaceKey.clear();
171
92
  }
172
93
  };
@@ -240,7 +161,7 @@ var DevServer = class {
240
161
  added
241
162
  }, {
242
163
  F: __dxlog_file3,
243
- L: 52,
164
+ L: 53,
244
165
  S: this,
245
166
  C: (f, a) => f(...a)
246
167
  });
@@ -254,7 +175,7 @@ var DevServer = class {
254
175
  get endpoint() {
255
176
  invariant(this._port, void 0, {
256
177
  F: __dxlog_file3,
257
- L: 63,
178
+ L: 64,
258
179
  S: this,
259
180
  A: [
260
181
  "this._port",
@@ -272,7 +193,7 @@ var DevServer = class {
272
193
  async start() {
273
194
  invariant(!this._server, void 0, {
274
195
  F: __dxlog_file3,
275
- L: 76,
196
+ L: 77,
276
197
  S: this,
277
198
  A: [
278
199
  "!this._server",
@@ -281,7 +202,7 @@ var DevServer = class {
281
202
  });
282
203
  log3.info("starting...", void 0, {
283
204
  F: __dxlog_file3,
284
- L: 77,
205
+ L: 78,
285
206
  S: this,
286
207
  C: (f, a) => f(...a)
287
208
  });
@@ -295,7 +216,7 @@ var DevServer = class {
295
216
  path: path2
296
217
  }, {
297
218
  F: __dxlog_file3,
298
- L: 87,
219
+ L: 88,
299
220
  S: this,
300
221
  C: (f, a) => f(...a)
301
222
  });
@@ -308,7 +229,7 @@ var DevServer = class {
308
229
  } catch (err) {
309
230
  log3.catch(err, void 0, {
310
231
  F: __dxlog_file3,
311
- L: 97,
232
+ L: 98,
312
233
  S: this,
313
234
  C: (f, a) => f(...a)
314
235
  });
@@ -333,7 +254,7 @@ var DevServer = class {
333
254
  endpoint
334
255
  }, {
335
256
  F: __dxlog_file3,
336
- L: 112,
257
+ L: 113,
337
258
  S: this,
338
259
  C: (f, a) => f(...a)
339
260
  });
@@ -348,7 +269,7 @@ var DevServer = class {
348
269
  port: this._port
349
270
  }, {
350
271
  F: __dxlog_file3,
351
- L: 123,
272
+ L: 124,
352
273
  S: this,
353
274
  C: (f, a) => f(...a)
354
275
  });
@@ -356,7 +277,7 @@ var DevServer = class {
356
277
  async stop() {
357
278
  invariant(this._server, void 0, {
358
279
  F: __dxlog_file3,
359
- L: 127,
280
+ L: 128,
360
281
  S: this,
361
282
  A: [
362
283
  "this._server",
@@ -365,7 +286,7 @@ var DevServer = class {
365
286
  });
366
287
  log3.info("stopping...", void 0, {
367
288
  F: __dxlog_file3,
368
- L: 128,
289
+ L: 129,
369
290
  S: this,
370
291
  C: (f, a) => f(...a)
371
292
  });
@@ -373,7 +294,7 @@ var DevServer = class {
373
294
  this._server.close(async () => {
374
295
  log3.info("server stopped", void 0, {
375
296
  F: __dxlog_file3,
376
- L: 132,
297
+ L: 133,
377
298
  S: this,
378
299
  C: (f, a) => f(...a)
379
300
  });
@@ -381,7 +302,7 @@ var DevServer = class {
381
302
  if (this._functionServiceRegistration) {
382
303
  invariant(this._client.services.services.FunctionRegistryService, void 0, {
383
304
  F: __dxlog_file3,
384
- L: 135,
305
+ L: 136,
385
306
  S: this,
386
307
  A: [
387
308
  "this._client.services.services.FunctionRegistryService",
@@ -395,7 +316,7 @@ var DevServer = class {
395
316
  registrationId: this._functionServiceRegistration
396
317
  }, {
397
318
  F: __dxlog_file3,
398
- L: 140,
319
+ L: 141,
399
320
  S: this,
400
321
  C: (f, a) => f(...a)
401
322
  });
@@ -412,7 +333,7 @@ var DevServer = class {
412
333
  this._server = void 0;
413
334
  log3.info("stopped", void 0, {
414
335
  F: __dxlog_file3,
415
- L: 154,
336
+ L: 155,
416
337
  S: this,
417
338
  C: (f, a) => f(...a)
418
339
  });
@@ -420,7 +341,7 @@ var DevServer = class {
420
341
  /**
421
342
  * Load function.
422
343
  */
423
- async _load(def, force = false) {
344
+ async _load(def, force) {
424
345
  const { uri, route, handler } = def;
425
346
  const filePath = join(this._options.baseDir, handler);
426
347
  log3.info("loading", {
@@ -428,7 +349,7 @@ var DevServer = class {
428
349
  force
429
350
  }, {
430
351
  F: __dxlog_file3,
431
- L: 163,
352
+ L: 164,
432
353
  S: this,
433
354
  C: (f, a) => f(...a)
434
355
  });
@@ -449,7 +370,7 @@ var DevServer = class {
449
370
  async _safeUpdateRegistration() {
450
371
  invariant(this._functionServiceRegistration, void 0, {
451
372
  F: __dxlog_file3,
452
- L: 185,
373
+ L: 186,
453
374
  S: this,
454
375
  A: [
455
376
  "this._functionServiceRegistration",
@@ -464,10 +385,10 @@ var DevServer = class {
464
385
  route
465
386
  }))
466
387
  });
467
- } catch (e) {
468
- log3.catch(e, void 0, {
388
+ } catch (err) {
389
+ log3.catch(err, void 0, {
469
390
  F: __dxlog_file3,
470
- L: 192,
391
+ L: 193,
471
392
  S: this,
472
393
  C: (f, a) => f(...a)
473
394
  });
@@ -484,7 +405,7 @@ var DevServer = class {
484
405
  path: path2
485
406
  }, {
486
407
  F: __dxlog_file3,
487
- L: 203,
408
+ L: 204,
488
409
  S: this,
489
410
  C: (f, a) => f(...a)
490
411
  });
@@ -498,7 +419,7 @@ var DevServer = class {
498
419
  duration: Date.now() - now
499
420
  }, {
500
421
  F: __dxlog_file3,
501
- L: 206,
422
+ L: 207,
502
423
  S: this,
503
424
  C: (f, a) => f(...a)
504
425
  });
@@ -509,7 +430,7 @@ var DevServer = class {
509
430
  const { handler } = this._handlers[path2] ?? {};
510
431
  invariant(handler, `invalid path: ${path2}`, {
511
432
  F: __dxlog_file3,
512
- L: 213,
433
+ L: 214,
513
434
  S: this,
514
435
  A: [
515
436
  "handler",
@@ -551,7 +472,7 @@ var Scheduler = class {
551
472
  this.triggers = triggers;
552
473
  this._options = _options;
553
474
  this._ctx = createContext2();
554
- this._callMutex = new Mutex();
475
+ this._functionUriToCallMutex = /* @__PURE__ */ new Map();
555
476
  this.functions.registered.on(async ({ space, added }) => {
556
477
  await this._safeActivateTriggers(space, this.triggers.getInactiveTriggers(space), added);
557
478
  });
@@ -581,11 +502,11 @@ var Scheduler = class {
581
502
  });
582
503
  await Promise.all(mountTasks).catch(log4.catch);
583
504
  }
584
- async activate(space, functions, fnTrigger) {
585
- const definition = functions.find((def) => def.uri === fnTrigger.function);
505
+ async activate(space, functions, trigger) {
506
+ const definition = functions.find((def) => def.uri === trigger.function);
586
507
  if (!definition) {
587
508
  log4.info("function is not found for trigger", {
588
- fnTrigger
509
+ trigger
589
510
  }, {
590
511
  F: __dxlog_file4,
591
512
  L: 78,
@@ -594,12 +515,28 @@ var Scheduler = class {
594
515
  });
595
516
  return;
596
517
  }
597
- await this.triggers.activate({
598
- space
599
- }, fnTrigger, async (args) => {
600
- return this._callMutex.executeSynchronized(() => {
601
- return this._execFunction(definition, fnTrigger, {
602
- meta: fnTrigger.meta,
518
+ await this.triggers.activate(space, trigger, async (args) => {
519
+ const mutex = this._functionUriToCallMutex.get(definition.uri) ?? new Mutex();
520
+ this._functionUriToCallMutex.set(definition.uri, mutex);
521
+ log4.info("function triggered, waiting for mutex", {
522
+ uri: definition.uri
523
+ }, {
524
+ F: __dxlog_file4,
525
+ L: 86,
526
+ S: this,
527
+ C: (f, a) => f(...a)
528
+ });
529
+ return mutex.executeSynchronized(() => {
530
+ log4.info("mutex acquired", {
531
+ uri: definition.uri
532
+ }, {
533
+ F: __dxlog_file4,
534
+ L: 88,
535
+ S: this,
536
+ C: (f, a) => f(...a)
537
+ });
538
+ return this._execFunction(definition, trigger, {
539
+ meta: trigger.meta ?? {},
603
540
  data: {
604
541
  ...args,
605
542
  spaceKey: space.key
@@ -609,10 +546,10 @@ var Scheduler = class {
609
546
  });
610
547
  log4("activated trigger", {
611
548
  space: space.key,
612
- trigger: fnTrigger
549
+ trigger
613
550
  }, {
614
551
  F: __dxlog_file4,
615
- L: 91,
552
+ L: 96,
616
553
  S: this,
617
554
  C: (f, a) => f(...a)
618
555
  });
@@ -632,7 +569,7 @@ var Scheduler = class {
632
569
  triggerType: trigger.spec.type
633
570
  }, {
634
571
  F: __dxlog_file4,
635
- L: 108,
572
+ L: 113,
636
573
  S: this,
637
574
  C: (f, a) => f(...a)
638
575
  });
@@ -649,7 +586,7 @@ var Scheduler = class {
649
586
  function: def.uri
650
587
  }, {
651
588
  F: __dxlog_file4,
652
- L: 119,
589
+ L: 124,
653
590
  S: this,
654
591
  C: (f, a) => f(...a)
655
592
  });
@@ -663,7 +600,7 @@ var Scheduler = class {
663
600
  status
664
601
  }, {
665
602
  F: __dxlog_file4,
666
- L: 129,
603
+ L: 134,
667
604
  S: this,
668
605
  C: (f, a) => f(...a)
669
606
  });
@@ -673,7 +610,7 @@ var Scheduler = class {
673
610
  error: err.message
674
611
  }, {
675
612
  F: __dxlog_file4,
676
- L: 131,
613
+ L: 136,
677
614
  S: this,
678
615
  C: (f, a) => f(...a)
679
616
  });
@@ -690,19 +627,20 @@ var createContext2 = () => new Context2({
690
627
  import { Event as Event3 } from "@dxos/async";
691
628
  import { create as create2, Filter as Filter3, getMeta } from "@dxos/client/echo";
692
629
  import { Context as Context3, Resource as Resource2 } from "@dxos/context";
693
- import { ECHO_ATTR_META, foreignKey, foreignKeyEquals, splitMeta } from "@dxos/echo-schema";
630
+ import { compareForeignKeys, ECHO_ATTR_META, foreignKey } from "@dxos/echo-schema";
694
631
  import { invariant as invariant2 } from "@dxos/invariant";
695
632
  import { PublicKey as PublicKey3 } from "@dxos/keys";
696
633
  import { log as log9 } from "@dxos/log";
697
- import { ComplexMap as ComplexMap2 } from "@dxos/util";
634
+ import { ComplexMap as ComplexMap2, diff as diff2 } from "@dxos/util";
698
635
 
699
636
  // packages/core/functions/src/trigger/type/subscription-trigger.ts
700
637
  import { TextV0Type } from "@braneframe/types";
701
638
  import { debounce, UpdateScheduler } from "@dxos/async";
702
- import { createSubscription, Filter as Filter2, getAutomergeObjectCore } from "@dxos/echo-db";
639
+ import { Filter as Filter2 } from "@dxos/client/echo";
640
+ import { createSubscription, getAutomergeObjectCore } from "@dxos/echo-db";
703
641
  import { log as log5 } from "@dxos/log";
704
642
  var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/core/functions/src/trigger/type/subscription-trigger.ts";
705
- var createSubscriptionTrigger = async (ctx, triggerCtx, spec, callback) => {
643
+ var createSubscriptionTrigger = async (ctx, space, spec, callback) => {
706
644
  const objectIds = /* @__PURE__ */ new Set();
707
645
  const task = new UpdateScheduler(ctx, async () => {
708
646
  if (objectIds.size > 0) {
@@ -730,7 +668,7 @@ var createSubscriptionTrigger = async (ctx, triggerCtx, spec, callback) => {
730
668
  updated: updated.length
731
669
  }, {
732
670
  F: __dxlog_file5,
733
- L: 45,
671
+ L: 47,
734
672
  S: void 0,
735
673
  C: (f, a) => f(...a)
736
674
  });
@@ -740,16 +678,16 @@ var createSubscriptionTrigger = async (ctx, triggerCtx, spec, callback) => {
740
678
  subscriptions.push(() => subscription.unsubscribe());
741
679
  const { filter, options: { deep, delay } = {} } = spec;
742
680
  const update = ({ objects }) => {
681
+ log5.info("update", {
682
+ objects: objects.length
683
+ }, {
684
+ F: __dxlog_file5,
685
+ L: 57,
686
+ S: void 0,
687
+ C: (f, a) => f(...a)
688
+ });
743
689
  subscription.update(objects);
744
690
  if (deep) {
745
- log5.info("update", {
746
- objects: objects.length
747
- }, {
748
- F: __dxlog_file5,
749
- L: 59,
750
- S: void 0,
751
- C: (f, a) => f(...a)
752
- });
753
691
  for (const object of objects) {
754
692
  const content = object.content;
755
693
  if (content instanceof TextV0Type) {
@@ -760,8 +698,18 @@ var createSubscriptionTrigger = async (ctx, triggerCtx, spec, callback) => {
760
698
  }
761
699
  }
762
700
  };
763
- const query = triggerCtx.space.db.query(Filter2.or(filter.map(({ type, props }) => Filter2.typename(type, props))));
764
- subscriptions.push(query.subscribe(delay ? debounce(update, delay) : update));
701
+ log5.info("subscription", {
702
+ filter
703
+ }, {
704
+ F: __dxlog_file5,
705
+ L: 76,
706
+ S: void 0,
707
+ C: (f, a) => f(...a)
708
+ });
709
+ if (filter) {
710
+ const query = space.db.query(Filter2.typename(filter[0].type, filter[0].props));
711
+ subscriptions.push(query.subscribe(delay ? debounce(update, delay) : update));
712
+ }
765
713
  ctx.onDispose(() => {
766
714
  subscriptions.forEach((unsubscribe) => unsubscribe());
767
715
  });
@@ -772,7 +720,7 @@ import { CronJob } from "cron";
772
720
  import { DeferredTask } from "@dxos/async";
773
721
  import { log as log6 } from "@dxos/log";
774
722
  var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/core/functions/src/trigger/type/timer-trigger.ts";
775
- var createTimerTrigger = async (ctx, triggerContext, spec, callback) => {
723
+ var createTimerTrigger = async (ctx, space, spec, callback) => {
776
724
  const task = new DeferredTask(ctx, async () => {
777
725
  await callback({});
778
726
  });
@@ -787,12 +735,12 @@ var createTimerTrigger = async (ctx, triggerContext, spec, callback) => {
787
735
  last = now;
788
736
  run++;
789
737
  log6.info("tick", {
790
- space: triggerContext.space.key.truncate(),
738
+ space: space.key.truncate(),
791
739
  count: run,
792
740
  delta
793
741
  }, {
794
742
  F: __dxlog_file6,
795
- L: 37,
743
+ L: 38,
796
744
  S: void 0,
797
745
  C: (f, a) => f(...a)
798
746
  });
@@ -808,7 +756,7 @@ import { getPort as getPort2 } from "get-port-please";
808
756
  import http from "@dxos/node-std/http";
809
757
  import { log as log7 } from "@dxos/log";
810
758
  var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/core/functions/src/trigger/type/webhook-trigger.ts";
811
- var createWebhookTrigger = async (ctx, _, spec, callback) => {
759
+ var createWebhookTrigger = async (ctx, space, spec, callback) => {
812
760
  const server = http.createServer(async (req, res) => {
813
761
  if (req.method !== spec.method) {
814
762
  res.statusCode = 405;
@@ -825,7 +773,7 @@ var createWebhookTrigger = async (ctx, _, spec, callback) => {
825
773
  port
826
774
  }, {
827
775
  F: __dxlog_file7,
828
- L: 40,
776
+ L: 41,
829
777
  S: void 0,
830
778
  C: (f, a) => f(...a)
831
779
  });
@@ -841,7 +789,7 @@ import WebSocket from "ws";
841
789
  import { sleep, Trigger as Trigger2 } from "@dxos/async";
842
790
  import { log as log8 } from "@dxos/log";
843
791
  var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/core/functions/src/trigger/type/websocket-trigger.ts";
844
- var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
792
+ var createWebsocketTrigger = async (ctx, space, spec, callback, options = {
845
793
  retryDelay: 2,
846
794
  maxAttempts: 5
847
795
  }) => {
@@ -856,7 +804,7 @@ var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
856
804
  url
857
805
  }, {
858
806
  F: __dxlog_file8,
859
- L: 39,
807
+ L: 40,
860
808
  S: void 0,
861
809
  C: (f, a) => f(...a)
862
810
  });
@@ -871,7 +819,7 @@ var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
871
819
  code: event.code
872
820
  }, {
873
821
  F: __dxlog_file8,
874
- L: 48,
822
+ L: 49,
875
823
  S: void 0,
876
824
  C: (f, a) => f(...a)
877
825
  });
@@ -881,11 +829,11 @@ var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
881
829
  url
882
830
  }, {
883
831
  F: __dxlog_file8,
884
- L: 53,
832
+ L: 54,
885
833
  S: void 0,
886
834
  C: (f, a) => f(...a)
887
835
  });
888
- await createWebsocketTrigger(ctx, triggerCtx, spec, callback, options);
836
+ await createWebsocketTrigger(ctx, space, spec, callback, options);
889
837
  }, options.retryDelay * 1e3);
890
838
  }
891
839
  open.wake(false);
@@ -895,7 +843,7 @@ var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
895
843
  url
896
844
  }, {
897
845
  F: __dxlog_file8,
898
- L: 62,
846
+ L: 63,
899
847
  S: void 0,
900
848
  C: (f, a) => f(...a)
901
849
  });
@@ -904,7 +852,7 @@ var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
904
852
  try {
905
853
  log8.info("message", void 0, {
906
854
  F: __dxlog_file8,
907
- L: 67,
855
+ L: 68,
908
856
  S: void 0,
909
857
  C: (f, a) => f(...a)
910
858
  });
@@ -917,7 +865,7 @@ var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
917
865
  url
918
866
  }, {
919
867
  F: __dxlog_file8,
920
- L: 71,
868
+ L: 72,
921
869
  S: void 0,
922
870
  C: (f, a) => f(...a)
923
871
  });
@@ -934,7 +882,7 @@ var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
934
882
  attempt
935
883
  }, {
936
884
  F: __dxlog_file8,
937
- L: 82,
885
+ L: 83,
938
886
  S: void 0,
939
887
  C: (f, a) => f(...a)
940
888
  });
@@ -970,24 +918,24 @@ var TriggerRegistry = class extends Resource2 {
970
918
  getInactiveTriggers(space) {
971
919
  return this._getTriggers(space, (t) => t.activationCtx == null);
972
920
  }
973
- async activate(triggerCtx, trigger, callback) {
921
+ async activate(space, trigger, callback) {
974
922
  log9("activate", {
975
- space: triggerCtx.space.key,
923
+ space: space.key,
976
924
  trigger
977
925
  }, {
978
926
  F: __dxlog_file9,
979
- L: 75,
927
+ L: 72,
980
928
  S: this,
981
929
  C: (f, a) => f(...a)
982
930
  });
983
931
  const activationCtx = new Context3({
984
- name: `trigger_${trigger.function}`
932
+ name: `FunctionTrigger-${trigger.function}`
985
933
  });
986
934
  this._ctx.onDispose(() => activationCtx.dispose());
987
- const registeredTrigger = this._triggersBySpaceKey.get(triggerCtx.space.key)?.find((reg) => reg.trigger.id === trigger.id);
935
+ const registeredTrigger = this._triggersBySpaceKey.get(space.key)?.find((reg) => reg.trigger.id === trigger.id);
988
936
  invariant2(registeredTrigger, `Trigger is not registered: ${trigger.function}`, {
989
937
  F: __dxlog_file9,
990
- L: 81,
938
+ L: 77,
991
939
  S: this,
992
940
  A: [
993
941
  "registeredTrigger",
@@ -997,7 +945,7 @@ var TriggerRegistry = class extends Resource2 {
997
945
  registeredTrigger.activationCtx = activationCtx;
998
946
  try {
999
947
  const options = this._options?.[trigger.spec.type];
1000
- await triggerHandlers[trigger.spec.type](activationCtx, triggerCtx, trigger.spec, callback, options);
948
+ await triggerHandlers[trigger.spec.type](activationCtx, space, trigger.spec, callback, options);
1001
949
  } catch (err) {
1002
950
  delete registeredTrigger.activationCtx;
1003
951
  throw err;
@@ -1011,7 +959,7 @@ var TriggerRegistry = class extends Resource2 {
1011
959
  space: space.key
1012
960
  }, {
1013
961
  F: __dxlog_file9,
1014
- L: 97,
962
+ L: 93,
1015
963
  S: this,
1016
964
  C: (f, a) => f(...a)
1017
965
  });
@@ -1021,23 +969,45 @@ var TriggerRegistry = class extends Resource2 {
1021
969
  if (!space.db.graph.runtimeSchemaRegistry.hasSchema(FunctionTrigger)) {
1022
970
  space.db.graph.runtimeSchemaRegistry.registerSchema(FunctionTrigger);
1023
971
  }
1024
- const { objects: existing } = await space.db.query(Filter3.schema(FunctionTrigger)).run();
1025
- const { added, removed } = diff(existing, manifest.triggers, (a, b) => {
1026
- const keys = b[ECHO_ATTR_META]?.keys ?? [
1027
- foreignKey("manifest", [
1028
- b.function,
1029
- b.spec.type
1030
- ].join("-"))
1031
- ];
1032
- return intersection(getMeta(a)?.keys ?? [], keys, foreignKeyEquals).length > 0;
972
+ const manifestTriggers = manifest.triggers.map((trigger) => {
973
+ let keys = trigger[ECHO_ATTR_META]?.keys;
974
+ delete trigger[ECHO_ATTR_META];
975
+ if (!keys?.length) {
976
+ keys = [
977
+ foreignKey("manifest", [
978
+ trigger.function,
979
+ trigger.spec.type
980
+ ].join(":"))
981
+ ];
982
+ }
983
+ return create2(FunctionTrigger, trigger, {
984
+ keys
985
+ });
1033
986
  });
987
+ const { objects: existing } = await space.db.query(Filter3.schema(FunctionTrigger)).run();
988
+ const { added } = diff2(existing, manifestTriggers, compareForeignKeys);
1034
989
  added.forEach((trigger) => {
1035
- const { meta, object } = splitMeta(trigger);
1036
- space.db.add(create2(FunctionTrigger, object, meta));
990
+ space.db.add(trigger);
991
+ log9.info("added", {
992
+ meta: getMeta(trigger)
993
+ }, {
994
+ F: __dxlog_file9,
995
+ L: 120,
996
+ S: this,
997
+ C: (f, a) => f(...a)
998
+ });
1037
999
  });
1038
- removed.forEach((trigger) => space.db.remove(trigger));
1000
+ if (added.length > 0) {
1001
+ await space.db.flush();
1002
+ }
1039
1003
  }
1040
1004
  async _open() {
1005
+ log9.info("open...", void 0, {
1006
+ F: __dxlog_file9,
1007
+ L: 129,
1008
+ S: this,
1009
+ C: (f, a) => f(...a)
1010
+ });
1041
1011
  const spaceListSubscription = this._client.spaces.subscribe(async (spaces) => {
1042
1012
  for (const space of spaces) {
1043
1013
  if (this._triggersBySpaceKey.has(space.key)) {
@@ -1049,46 +1019,73 @@ var TriggerRegistry = class extends Resource2 {
1049
1019
  if (this._ctx.disposed) {
1050
1020
  break;
1051
1021
  }
1052
- const functionsSubscription = space.db.query(Filter3.schema(FunctionTrigger)).subscribe(async (triggers) => {
1053
- await this._handleRemovedTriggers(space, triggers.objects, registered);
1054
- this._handleNewTriggers(space, triggers.objects, registered);
1055
- });
1056
- this._ctx.onDispose(functionsSubscription);
1022
+ this._ctx.onDispose(space.db.query(Filter3.schema(FunctionTrigger)).subscribe(async ({ objects: current }) => {
1023
+ log9.info("update", {
1024
+ space: space.key,
1025
+ registered: registered.length,
1026
+ current: current.length
1027
+ }, {
1028
+ F: __dxlog_file9,
1029
+ L: 146,
1030
+ S: this,
1031
+ C: (f, a) => f(...a)
1032
+ });
1033
+ await this._handleRemovedTriggers(space, current, registered);
1034
+ this._handleNewTriggers(space, current, registered);
1035
+ }));
1057
1036
  }
1058
1037
  });
1059
1038
  this._ctx.onDispose(() => spaceListSubscription.unsubscribe());
1039
+ log9.info("opened", void 0, {
1040
+ F: __dxlog_file9,
1041
+ L: 155,
1042
+ S: this,
1043
+ C: (f, a) => f(...a)
1044
+ });
1060
1045
  }
1061
1046
  async _close(_) {
1047
+ log9.info("close...", void 0, {
1048
+ F: __dxlog_file9,
1049
+ L: 159,
1050
+ S: this,
1051
+ C: (f, a) => f(...a)
1052
+ });
1062
1053
  this._triggersBySpaceKey.clear();
1054
+ log9.info("closed", void 0, {
1055
+ F: __dxlog_file9,
1056
+ L: 161,
1057
+ S: this,
1058
+ C: (f, a) => f(...a)
1059
+ });
1063
1060
  }
1064
- _handleNewTriggers(space, allTriggers, registered) {
1065
- const newTriggers = allTriggers.filter((candidate) => {
1066
- return registered.find((reg) => reg.trigger.id === candidate.id) == null;
1061
+ _handleNewTriggers(space, current, registered) {
1062
+ const added = current.filter((candidate) => {
1063
+ return candidate.enabled && registered.find((reg) => reg.trigger.id === candidate.id) == null;
1067
1064
  });
1068
- if (newTriggers.length > 0) {
1069
- const newRegisteredTriggers = newTriggers.map((trigger) => ({
1065
+ if (added.length > 0) {
1066
+ const newRegisteredTriggers = added.map((trigger) => ({
1070
1067
  trigger
1071
1068
  }));
1072
1069
  registered.push(...newRegisteredTriggers);
1073
- log9("registered new triggers", () => ({
1070
+ log9.info("added", () => ({
1074
1071
  spaceKey: space.key,
1075
- functions: newTriggers.map((t) => t.function)
1072
+ triggers: added.map((trigger) => trigger.function)
1076
1073
  }), {
1077
1074
  F: __dxlog_file9,
1078
- L: 159,
1075
+ L: 172,
1079
1076
  S: this,
1080
1077
  C: (f, a) => f(...a)
1081
1078
  });
1082
1079
  this.registered.emit({
1083
1080
  space,
1084
- triggers: newTriggers
1081
+ triggers: added
1085
1082
  });
1086
1083
  }
1087
1084
  }
1088
- async _handleRemovedTriggers(space, allTriggers, registered) {
1085
+ async _handleRemovedTriggers(space, current, registered) {
1089
1086
  const removed = [];
1090
1087
  for (let i = registered.length - 1; i >= 0; i--) {
1091
- const wasRemoved = allTriggers.find((trigger) => trigger.id === registered[i].trigger.id) == null;
1088
+ const wasRemoved = current.filter((trigger) => trigger.enabled).find((trigger) => trigger.id === registered[i].trigger.id) == null;
1092
1089
  if (wasRemoved) {
1093
1090
  const unregistered = registered.splice(i, 1)[0];
1094
1091
  await unregistered.activationCtx?.dispose();
@@ -1096,6 +1093,15 @@ var TriggerRegistry = class extends Resource2 {
1096
1093
  }
1097
1094
  }
1098
1095
  if (removed.length > 0) {
1096
+ log9.info("removed", () => ({
1097
+ spaceKey: space.key,
1098
+ triggers: removed.map((trigger) => trigger.function)
1099
+ }), {
1100
+ F: __dxlog_file9,
1101
+ L: 198,
1102
+ S: this,
1103
+ C: (f, a) => f(...a)
1104
+ });
1099
1105
  this.removed.emit({
1100
1106
  space,
1101
1107
  triggers: removed
@@ -1109,6 +1115,7 @@ var TriggerRegistry = class extends Resource2 {
1109
1115
  };
1110
1116
  export {
1111
1117
  DevServer,
1118
+ FUNCTION_SCHEMA,
1112
1119
  FunctionDef,
1113
1120
  FunctionManifestSchema,
1114
1121
  FunctionRegistry,