@dxos/functions 0.5.3-next.57eca40 → 0.5.3-next.63cdcad

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 (53) hide show
  1. package/dist/lib/browser/{chunk-366QG6IX.mjs → chunk-4D4I3YMJ.mjs} +16 -11
  2. package/dist/lib/browser/chunk-4D4I3YMJ.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +206 -133
  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 +3 -1
  7. package/dist/lib/node/{chunk-3VSJ57ZZ.cjs → chunk-3UYUR5N5.cjs} +19 -13
  8. package/dist/lib/node/chunk-3UYUR5N5.cjs.map +7 -0
  9. package/dist/lib/node/index.cjs +216 -139
  10. package/dist/lib/node/index.cjs.map +4 -4
  11. package/dist/lib/node/meta.json +1 -1
  12. package/dist/lib/node/types.cjs +6 -4
  13. package/dist/lib/node/types.cjs.map +2 -2
  14. package/dist/types/src/browser/index.d.ts +2 -0
  15. package/dist/types/src/browser/index.d.ts.map +1 -0
  16. package/dist/types/src/function/function-registry.d.ts.map +1 -1
  17. package/dist/types/src/handler.d.ts.map +1 -1
  18. package/dist/types/src/runtime/dev-server.d.ts.map +1 -1
  19. package/dist/types/src/runtime/scheduler.d.ts +1 -1
  20. package/dist/types/src/runtime/scheduler.d.ts.map +1 -1
  21. package/dist/types/src/testing/setup.d.ts.map +1 -1
  22. package/dist/types/src/trigger/trigger-registry.d.ts +2 -5
  23. package/dist/types/src/trigger/trigger-registry.d.ts.map +1 -1
  24. package/dist/types/src/trigger/type/subscription-trigger.d.ts.map +1 -1
  25. package/dist/types/src/trigger/type/timer-trigger.d.ts.map +1 -1
  26. package/dist/types/src/trigger/type/webhook-trigger.d.ts.map +1 -1
  27. package/dist/types/src/trigger/type/websocket-trigger.d.ts.map +1 -1
  28. package/dist/types/src/types.d.ts +46 -33
  29. package/dist/types/src/types.d.ts.map +1 -1
  30. package/package.json +14 -14
  31. package/schema/functions.json +5 -0
  32. package/src/browser/index.ts +5 -0
  33. package/src/function/function-registry.ts +5 -5
  34. package/src/runtime/dev-server.ts +3 -3
  35. package/src/runtime/scheduler.test.ts +14 -9
  36. package/src/runtime/scheduler.ts +14 -9
  37. package/src/testing/functions-integration.test.ts +1 -0
  38. package/src/testing/setup.ts +8 -10
  39. package/src/trigger/trigger-registry.test.ts +30 -13
  40. package/src/trigger/trigger-registry.ts +59 -37
  41. package/src/trigger/type/subscription-trigger.ts +13 -7
  42. package/src/trigger/type/timer-trigger.ts +4 -3
  43. package/src/trigger/type/webhook-trigger.ts +3 -2
  44. package/src/trigger/type/websocket-trigger.ts +4 -3
  45. package/src/types.ts +42 -30
  46. package/dist/lib/browser/chunk-366QG6IX.mjs.map +0 -7
  47. package/dist/lib/node/chunk-3VSJ57ZZ.cjs.map +0 -7
  48. package/dist/types/src/util.d.ts +0 -15
  49. package/dist/types/src/util.d.ts.map +0 -1
  50. package/dist/types/src/util.test.d.ts +0 -2
  51. package/dist/types/src/util.test.d.ts.map +0 -1
  52. package/src/util.test.ts +0 -43
  53. package/src/util.ts +0 -48
@@ -1,10 +1,11 @@
1
1
  import "@dxos/node-std/globals";
2
2
  import {
3
+ FUNCTION_SCHEMA,
3
4
  FunctionDef,
4
5
  FunctionManifestSchema,
5
6
  FunctionTrigger,
6
7
  __require
7
- } from "./chunk-366QG6IX.mjs";
8
+ } from "./chunk-4D4I3YMJ.mjs";
8
9
 
9
10
  // packages/core/functions/src/function/function-registry.ts
10
11
  import { Event } from "@dxos/async";
@@ -12,32 +13,7 @@ import { create, Filter } from "@dxos/client/echo";
12
13
  import { Resource } from "@dxos/context";
13
14
  import { PublicKey } from "@dxos/keys";
14
15
  import { log } from "@dxos/log";
15
- import { ComplexMap } from "@dxos/util";
16
-
17
- // packages/core/functions/src/util.ts
18
- var diff = (previous, next, comparator) => {
19
- const remaining = [
20
- ...previous
21
- ];
22
- const result = {
23
- added: [],
24
- updated: [],
25
- removed: remaining
26
- };
27
- for (const object of next) {
28
- const index = remaining.findIndex((item) => comparator(item, object));
29
- if (index === -1) {
30
- result.added.push(object);
31
- } else {
32
- result.updated.push(remaining[index]);
33
- remaining.splice(index, 1);
34
- }
35
- }
36
- return result;
37
- };
38
- var intersection = (a, b, comparator) => a.filter((a2) => b.find((b2) => comparator(a2, b2)) !== void 0);
39
-
40
- // packages/core/functions/src/function/function-registry.ts
16
+ import { ComplexMap, diff } from "@dxos/util";
41
17
  var __dxlog_file = "/home/runner/work/dxos/dxos/packages/core/functions/src/function/function-registry.ts";
42
18
  var FunctionRegistry = class extends Resource {
43
19
  constructor(_client) {
@@ -59,7 +35,7 @@ var FunctionRegistry = class extends Resource {
59
35
  functions: functions?.length ?? 0
60
36
  }, {
61
37
  F: __dxlog_file,
62
- L: 39,
38
+ L: 38,
63
39
  S: this,
64
40
  C: (f, a) => f(...a)
65
41
  });
@@ -70,11 +46,16 @@ var FunctionRegistry = class extends Resource {
70
46
  space.db.graph.runtimeSchemaRegistry.registerSchema(FunctionDef);
71
47
  }
72
48
  const { objects: existing } = await space.db.query(Filter.schema(FunctionDef)).run();
73
- const { added, removed } = diff(existing, functions, (a, b) => a.uri === b.uri);
49
+ const { added } = diff(existing, functions, (a, b) => a.uri === b.uri);
74
50
  added.forEach((def) => space.db.add(create(FunctionDef, def)));
75
- removed.forEach((def) => space.db.remove(def));
76
51
  }
77
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
+ });
78
59
  const spacesSubscription = this._client.spaces.subscribe(async (spaces) => {
79
60
  for (const space of spaces) {
80
61
  if (this._functionBySpaceKey.has(space.key)) {
@@ -101,6 +82,12 @@ var FunctionRegistry = class extends Resource {
101
82
  this._ctx.onDispose(() => spacesSubscription.unsubscribe());
102
83
  }
103
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
+ });
104
91
  this._functionBySpaceKey.clear();
105
92
  }
106
93
  };
@@ -174,7 +161,7 @@ var DevServer = class {
174
161
  added
175
162
  }, {
176
163
  F: __dxlog_file3,
177
- L: 52,
164
+ L: 53,
178
165
  S: this,
179
166
  C: (f, a) => f(...a)
180
167
  });
@@ -188,7 +175,7 @@ var DevServer = class {
188
175
  get endpoint() {
189
176
  invariant(this._port, void 0, {
190
177
  F: __dxlog_file3,
191
- L: 63,
178
+ L: 64,
192
179
  S: this,
193
180
  A: [
194
181
  "this._port",
@@ -206,7 +193,7 @@ var DevServer = class {
206
193
  async start() {
207
194
  invariant(!this._server, void 0, {
208
195
  F: __dxlog_file3,
209
- L: 76,
196
+ L: 77,
210
197
  S: this,
211
198
  A: [
212
199
  "!this._server",
@@ -215,7 +202,7 @@ var DevServer = class {
215
202
  });
216
203
  log3.info("starting...", void 0, {
217
204
  F: __dxlog_file3,
218
- L: 77,
205
+ L: 78,
219
206
  S: this,
220
207
  C: (f, a) => f(...a)
221
208
  });
@@ -229,7 +216,7 @@ var DevServer = class {
229
216
  path: path2
230
217
  }, {
231
218
  F: __dxlog_file3,
232
- L: 87,
219
+ L: 88,
233
220
  S: this,
234
221
  C: (f, a) => f(...a)
235
222
  });
@@ -242,7 +229,7 @@ var DevServer = class {
242
229
  } catch (err) {
243
230
  log3.catch(err, void 0, {
244
231
  F: __dxlog_file3,
245
- L: 97,
232
+ L: 98,
246
233
  S: this,
247
234
  C: (f, a) => f(...a)
248
235
  });
@@ -267,7 +254,7 @@ var DevServer = class {
267
254
  endpoint
268
255
  }, {
269
256
  F: __dxlog_file3,
270
- L: 112,
257
+ L: 113,
271
258
  S: this,
272
259
  C: (f, a) => f(...a)
273
260
  });
@@ -282,7 +269,7 @@ var DevServer = class {
282
269
  port: this._port
283
270
  }, {
284
271
  F: __dxlog_file3,
285
- L: 123,
272
+ L: 124,
286
273
  S: this,
287
274
  C: (f, a) => f(...a)
288
275
  });
@@ -290,7 +277,7 @@ var DevServer = class {
290
277
  async stop() {
291
278
  invariant(this._server, void 0, {
292
279
  F: __dxlog_file3,
293
- L: 127,
280
+ L: 128,
294
281
  S: this,
295
282
  A: [
296
283
  "this._server",
@@ -299,7 +286,7 @@ var DevServer = class {
299
286
  });
300
287
  log3.info("stopping...", void 0, {
301
288
  F: __dxlog_file3,
302
- L: 128,
289
+ L: 129,
303
290
  S: this,
304
291
  C: (f, a) => f(...a)
305
292
  });
@@ -307,7 +294,7 @@ var DevServer = class {
307
294
  this._server.close(async () => {
308
295
  log3.info("server stopped", void 0, {
309
296
  F: __dxlog_file3,
310
- L: 132,
297
+ L: 133,
311
298
  S: this,
312
299
  C: (f, a) => f(...a)
313
300
  });
@@ -315,7 +302,7 @@ var DevServer = class {
315
302
  if (this._functionServiceRegistration) {
316
303
  invariant(this._client.services.services.FunctionRegistryService, void 0, {
317
304
  F: __dxlog_file3,
318
- L: 135,
305
+ L: 136,
319
306
  S: this,
320
307
  A: [
321
308
  "this._client.services.services.FunctionRegistryService",
@@ -329,7 +316,7 @@ var DevServer = class {
329
316
  registrationId: this._functionServiceRegistration
330
317
  }, {
331
318
  F: __dxlog_file3,
332
- L: 140,
319
+ L: 141,
333
320
  S: this,
334
321
  C: (f, a) => f(...a)
335
322
  });
@@ -346,7 +333,7 @@ var DevServer = class {
346
333
  this._server = void 0;
347
334
  log3.info("stopped", void 0, {
348
335
  F: __dxlog_file3,
349
- L: 154,
336
+ L: 155,
350
337
  S: this,
351
338
  C: (f, a) => f(...a)
352
339
  });
@@ -362,7 +349,7 @@ var DevServer = class {
362
349
  force
363
350
  }, {
364
351
  F: __dxlog_file3,
365
- L: 163,
352
+ L: 164,
366
353
  S: this,
367
354
  C: (f, a) => f(...a)
368
355
  });
@@ -383,7 +370,7 @@ var DevServer = class {
383
370
  async _safeUpdateRegistration() {
384
371
  invariant(this._functionServiceRegistration, void 0, {
385
372
  F: __dxlog_file3,
386
- L: 185,
373
+ L: 186,
387
374
  S: this,
388
375
  A: [
389
376
  "this._functionServiceRegistration",
@@ -398,10 +385,10 @@ var DevServer = class {
398
385
  route
399
386
  }))
400
387
  });
401
- } catch (e) {
402
- log3.catch(e, void 0, {
388
+ } catch (err) {
389
+ log3.catch(err, void 0, {
403
390
  F: __dxlog_file3,
404
- L: 192,
391
+ L: 193,
405
392
  S: this,
406
393
  C: (f, a) => f(...a)
407
394
  });
@@ -418,7 +405,7 @@ var DevServer = class {
418
405
  path: path2
419
406
  }, {
420
407
  F: __dxlog_file3,
421
- L: 203,
408
+ L: 204,
422
409
  S: this,
423
410
  C: (f, a) => f(...a)
424
411
  });
@@ -432,7 +419,7 @@ var DevServer = class {
432
419
  duration: Date.now() - now
433
420
  }, {
434
421
  F: __dxlog_file3,
435
- L: 206,
422
+ L: 207,
436
423
  S: this,
437
424
  C: (f, a) => f(...a)
438
425
  });
@@ -443,7 +430,7 @@ var DevServer = class {
443
430
  const { handler } = this._handlers[path2] ?? {};
444
431
  invariant(handler, `invalid path: ${path2}`, {
445
432
  F: __dxlog_file3,
446
- L: 213,
433
+ L: 214,
447
434
  S: this,
448
435
  A: [
449
436
  "handler",
@@ -485,7 +472,7 @@ var Scheduler = class {
485
472
  this.triggers = triggers;
486
473
  this._options = _options;
487
474
  this._ctx = createContext2();
488
- this._callMutex = new Mutex();
475
+ this._functionUriToCallMutex = /* @__PURE__ */ new Map();
489
476
  this.functions.registered.on(async ({ space, added }) => {
490
477
  await this._safeActivateTriggers(space, this.triggers.getInactiveTriggers(space), added);
491
478
  });
@@ -515,11 +502,11 @@ var Scheduler = class {
515
502
  });
516
503
  await Promise.all(mountTasks).catch(log4.catch);
517
504
  }
518
- async activate(space, functions, fnTrigger) {
519
- 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);
520
507
  if (!definition) {
521
508
  log4.info("function is not found for trigger", {
522
- fnTrigger
509
+ trigger
523
510
  }, {
524
511
  F: __dxlog_file4,
525
512
  L: 78,
@@ -528,12 +515,28 @@ var Scheduler = class {
528
515
  });
529
516
  return;
530
517
  }
531
- await this.triggers.activate({
532
- space
533
- }, fnTrigger, async (args) => {
534
- return this._callMutex.executeSynchronized(() => {
535
- return this._execFunction(definition, fnTrigger, {
536
- 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 ?? {},
537
540
  data: {
538
541
  ...args,
539
542
  spaceKey: space.key
@@ -543,10 +546,10 @@ var Scheduler = class {
543
546
  });
544
547
  log4("activated trigger", {
545
548
  space: space.key,
546
- trigger: fnTrigger
549
+ trigger
547
550
  }, {
548
551
  F: __dxlog_file4,
549
- L: 91,
552
+ L: 96,
550
553
  S: this,
551
554
  C: (f, a) => f(...a)
552
555
  });
@@ -566,7 +569,7 @@ var Scheduler = class {
566
569
  triggerType: trigger.spec.type
567
570
  }, {
568
571
  F: __dxlog_file4,
569
- L: 108,
572
+ L: 113,
570
573
  S: this,
571
574
  C: (f, a) => f(...a)
572
575
  });
@@ -583,7 +586,7 @@ var Scheduler = class {
583
586
  function: def.uri
584
587
  }, {
585
588
  F: __dxlog_file4,
586
- L: 119,
589
+ L: 124,
587
590
  S: this,
588
591
  C: (f, a) => f(...a)
589
592
  });
@@ -597,7 +600,7 @@ var Scheduler = class {
597
600
  status
598
601
  }, {
599
602
  F: __dxlog_file4,
600
- L: 129,
603
+ L: 134,
601
604
  S: this,
602
605
  C: (f, a) => f(...a)
603
606
  });
@@ -607,7 +610,7 @@ var Scheduler = class {
607
610
  error: err.message
608
611
  }, {
609
612
  F: __dxlog_file4,
610
- L: 131,
613
+ L: 136,
611
614
  S: this,
612
615
  C: (f, a) => f(...a)
613
616
  });
@@ -624,19 +627,20 @@ var createContext2 = () => new Context2({
624
627
  import { Event as Event3 } from "@dxos/async";
625
628
  import { create as create2, Filter as Filter3, getMeta } from "@dxos/client/echo";
626
629
  import { Context as Context3, Resource as Resource2 } from "@dxos/context";
627
- import { ECHO_ATTR_META, foreignKey, foreignKeyEquals, splitMeta } from "@dxos/echo-schema";
630
+ import { compareForeignKeys, ECHO_ATTR_META, foreignKey } from "@dxos/echo-schema";
628
631
  import { invariant as invariant2 } from "@dxos/invariant";
629
632
  import { PublicKey as PublicKey3 } from "@dxos/keys";
630
633
  import { log as log9 } from "@dxos/log";
631
- import { ComplexMap as ComplexMap2 } from "@dxos/util";
634
+ import { ComplexMap as ComplexMap2, diff as diff2 } from "@dxos/util";
632
635
 
633
636
  // packages/core/functions/src/trigger/type/subscription-trigger.ts
634
637
  import { TextV0Type } from "@braneframe/types";
635
638
  import { debounce, UpdateScheduler } from "@dxos/async";
636
- 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";
637
641
  import { log as log5 } from "@dxos/log";
638
642
  var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/core/functions/src/trigger/type/subscription-trigger.ts";
639
- var createSubscriptionTrigger = async (ctx, triggerCtx, spec, callback) => {
643
+ var createSubscriptionTrigger = async (ctx, space, spec, callback) => {
640
644
  const objectIds = /* @__PURE__ */ new Set();
641
645
  const task = new UpdateScheduler(ctx, async () => {
642
646
  if (objectIds.size > 0) {
@@ -664,7 +668,7 @@ var createSubscriptionTrigger = async (ctx, triggerCtx, spec, callback) => {
664
668
  updated: updated.length
665
669
  }, {
666
670
  F: __dxlog_file5,
667
- L: 45,
671
+ L: 47,
668
672
  S: void 0,
669
673
  C: (f, a) => f(...a)
670
674
  });
@@ -674,16 +678,16 @@ var createSubscriptionTrigger = async (ctx, triggerCtx, spec, callback) => {
674
678
  subscriptions.push(() => subscription.unsubscribe());
675
679
  const { filter, options: { deep, delay } = {} } = spec;
676
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
+ });
677
689
  subscription.update(objects);
678
690
  if (deep) {
679
- log5.info("update", {
680
- objects: objects.length
681
- }, {
682
- F: __dxlog_file5,
683
- L: 59,
684
- S: void 0,
685
- C: (f, a) => f(...a)
686
- });
687
691
  for (const object of objects) {
688
692
  const content = object.content;
689
693
  if (content instanceof TextV0Type) {
@@ -694,8 +698,18 @@ var createSubscriptionTrigger = async (ctx, triggerCtx, spec, callback) => {
694
698
  }
695
699
  }
696
700
  };
697
- const query = triggerCtx.space.db.query(Filter2.or(filter.map(({ type, props }) => Filter2.typename(type, props))));
698
- 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
+ }
699
713
  ctx.onDispose(() => {
700
714
  subscriptions.forEach((unsubscribe) => unsubscribe());
701
715
  });
@@ -706,7 +720,7 @@ import { CronJob } from "cron";
706
720
  import { DeferredTask } from "@dxos/async";
707
721
  import { log as log6 } from "@dxos/log";
708
722
  var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/core/functions/src/trigger/type/timer-trigger.ts";
709
- var createTimerTrigger = async (ctx, triggerContext, spec, callback) => {
723
+ var createTimerTrigger = async (ctx, space, spec, callback) => {
710
724
  const task = new DeferredTask(ctx, async () => {
711
725
  await callback({});
712
726
  });
@@ -721,12 +735,12 @@ var createTimerTrigger = async (ctx, triggerContext, spec, callback) => {
721
735
  last = now;
722
736
  run++;
723
737
  log6.info("tick", {
724
- space: triggerContext.space.key.truncate(),
738
+ space: space.key.truncate(),
725
739
  count: run,
726
740
  delta
727
741
  }, {
728
742
  F: __dxlog_file6,
729
- L: 37,
743
+ L: 38,
730
744
  S: void 0,
731
745
  C: (f, a) => f(...a)
732
746
  });
@@ -742,7 +756,7 @@ import { getPort as getPort2 } from "get-port-please";
742
756
  import http from "@dxos/node-std/http";
743
757
  import { log as log7 } from "@dxos/log";
744
758
  var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/core/functions/src/trigger/type/webhook-trigger.ts";
745
- var createWebhookTrigger = async (ctx, _, spec, callback) => {
759
+ var createWebhookTrigger = async (ctx, space, spec, callback) => {
746
760
  const server = http.createServer(async (req, res) => {
747
761
  if (req.method !== spec.method) {
748
762
  res.statusCode = 405;
@@ -759,7 +773,7 @@ var createWebhookTrigger = async (ctx, _, spec, callback) => {
759
773
  port
760
774
  }, {
761
775
  F: __dxlog_file7,
762
- L: 40,
776
+ L: 41,
763
777
  S: void 0,
764
778
  C: (f, a) => f(...a)
765
779
  });
@@ -775,7 +789,7 @@ import WebSocket from "ws";
775
789
  import { sleep, Trigger as Trigger2 } from "@dxos/async";
776
790
  import { log as log8 } from "@dxos/log";
777
791
  var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/core/functions/src/trigger/type/websocket-trigger.ts";
778
- var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
792
+ var createWebsocketTrigger = async (ctx, space, spec, callback, options = {
779
793
  retryDelay: 2,
780
794
  maxAttempts: 5
781
795
  }) => {
@@ -790,7 +804,7 @@ var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
790
804
  url
791
805
  }, {
792
806
  F: __dxlog_file8,
793
- L: 39,
807
+ L: 40,
794
808
  S: void 0,
795
809
  C: (f, a) => f(...a)
796
810
  });
@@ -805,7 +819,7 @@ var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
805
819
  code: event.code
806
820
  }, {
807
821
  F: __dxlog_file8,
808
- L: 48,
822
+ L: 49,
809
823
  S: void 0,
810
824
  C: (f, a) => f(...a)
811
825
  });
@@ -815,11 +829,11 @@ var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
815
829
  url
816
830
  }, {
817
831
  F: __dxlog_file8,
818
- L: 53,
832
+ L: 54,
819
833
  S: void 0,
820
834
  C: (f, a) => f(...a)
821
835
  });
822
- await createWebsocketTrigger(ctx, triggerCtx, spec, callback, options);
836
+ await createWebsocketTrigger(ctx, space, spec, callback, options);
823
837
  }, options.retryDelay * 1e3);
824
838
  }
825
839
  open.wake(false);
@@ -829,7 +843,7 @@ var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
829
843
  url
830
844
  }, {
831
845
  F: __dxlog_file8,
832
- L: 62,
846
+ L: 63,
833
847
  S: void 0,
834
848
  C: (f, a) => f(...a)
835
849
  });
@@ -838,7 +852,7 @@ var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
838
852
  try {
839
853
  log8.info("message", void 0, {
840
854
  F: __dxlog_file8,
841
- L: 67,
855
+ L: 68,
842
856
  S: void 0,
843
857
  C: (f, a) => f(...a)
844
858
  });
@@ -851,7 +865,7 @@ var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
851
865
  url
852
866
  }, {
853
867
  F: __dxlog_file8,
854
- L: 71,
868
+ L: 72,
855
869
  S: void 0,
856
870
  C: (f, a) => f(...a)
857
871
  });
@@ -868,7 +882,7 @@ var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
868
882
  attempt
869
883
  }, {
870
884
  F: __dxlog_file8,
871
- L: 82,
885
+ L: 83,
872
886
  S: void 0,
873
887
  C: (f, a) => f(...a)
874
888
  });
@@ -904,24 +918,24 @@ var TriggerRegistry = class extends Resource2 {
904
918
  getInactiveTriggers(space) {
905
919
  return this._getTriggers(space, (t) => t.activationCtx == null);
906
920
  }
907
- async activate(triggerCtx, trigger, callback) {
921
+ async activate(space, trigger, callback) {
908
922
  log9("activate", {
909
- space: triggerCtx.space.key,
923
+ space: space.key,
910
924
  trigger
911
925
  }, {
912
926
  F: __dxlog_file9,
913
- L: 75,
927
+ L: 72,
914
928
  S: this,
915
929
  C: (f, a) => f(...a)
916
930
  });
917
931
  const activationCtx = new Context3({
918
- name: `trigger_${trigger.function}`
932
+ name: `FunctionTrigger-${trigger.function}`
919
933
  });
920
934
  this._ctx.onDispose(() => activationCtx.dispose());
921
- 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);
922
936
  invariant2(registeredTrigger, `Trigger is not registered: ${trigger.function}`, {
923
937
  F: __dxlog_file9,
924
- L: 81,
938
+ L: 77,
925
939
  S: this,
926
940
  A: [
927
941
  "registeredTrigger",
@@ -931,7 +945,7 @@ var TriggerRegistry = class extends Resource2 {
931
945
  registeredTrigger.activationCtx = activationCtx;
932
946
  try {
933
947
  const options = this._options?.[trigger.spec.type];
934
- await triggerHandlers[trigger.spec.type](activationCtx, triggerCtx, trigger.spec, callback, options);
948
+ await triggerHandlers[trigger.spec.type](activationCtx, space, trigger.spec, callback, options);
935
949
  } catch (err) {
936
950
  delete registeredTrigger.activationCtx;
937
951
  throw err;
@@ -945,7 +959,7 @@ var TriggerRegistry = class extends Resource2 {
945
959
  space: space.key
946
960
  }, {
947
961
  F: __dxlog_file9,
948
- L: 97,
962
+ L: 93,
949
963
  S: this,
950
964
  C: (f, a) => f(...a)
951
965
  });
@@ -955,23 +969,45 @@ var TriggerRegistry = class extends Resource2 {
955
969
  if (!space.db.graph.runtimeSchemaRegistry.hasSchema(FunctionTrigger)) {
956
970
  space.db.graph.runtimeSchemaRegistry.registerSchema(FunctionTrigger);
957
971
  }
958
- const { objects: existing } = await space.db.query(Filter3.schema(FunctionTrigger)).run();
959
- const { added, removed } = diff(existing, manifest.triggers, (a, b) => {
960
- const keys = b[ECHO_ATTR_META]?.keys ?? [
961
- foreignKey("manifest", [
962
- b.function,
963
- b.spec.type
964
- ].join("-"))
965
- ];
966
- 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
+ });
967
986
  });
987
+ const { objects: existing } = await space.db.query(Filter3.schema(FunctionTrigger)).run();
988
+ const { added } = diff2(existing, manifestTriggers, compareForeignKeys);
968
989
  added.forEach((trigger) => {
969
- const { meta, object } = splitMeta(trigger);
970
- 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
+ });
971
999
  });
972
- removed.forEach((trigger) => space.db.remove(trigger));
1000
+ if (added.length > 0) {
1001
+ await space.db.flush();
1002
+ }
973
1003
  }
974
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
+ });
975
1011
  const spaceListSubscription = this._client.spaces.subscribe(async (spaces) => {
976
1012
  for (const space of spaces) {
977
1013
  if (this._triggersBySpaceKey.has(space.key)) {
@@ -983,46 +1019,73 @@ var TriggerRegistry = class extends Resource2 {
983
1019
  if (this._ctx.disposed) {
984
1020
  break;
985
1021
  }
986
- const functionsSubscription = space.db.query(Filter3.schema(FunctionTrigger)).subscribe(async (triggers) => {
987
- await this._handleRemovedTriggers(space, triggers.objects, registered);
988
- this._handleNewTriggers(space, triggers.objects, registered);
989
- });
990
- 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
+ }));
991
1036
  }
992
1037
  });
993
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
+ });
994
1045
  }
995
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
+ });
996
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
+ });
997
1060
  }
998
- _handleNewTriggers(space, allTriggers, registered) {
999
- const newTriggers = allTriggers.filter((candidate) => {
1000
- 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;
1001
1064
  });
1002
- if (newTriggers.length > 0) {
1003
- const newRegisteredTriggers = newTriggers.map((trigger) => ({
1065
+ if (added.length > 0) {
1066
+ const newRegisteredTriggers = added.map((trigger) => ({
1004
1067
  trigger
1005
1068
  }));
1006
1069
  registered.push(...newRegisteredTriggers);
1007
- log9("registered new triggers", () => ({
1070
+ log9.info("added", () => ({
1008
1071
  spaceKey: space.key,
1009
- functions: newTriggers.map((t) => t.function)
1072
+ triggers: added.map((trigger) => trigger.function)
1010
1073
  }), {
1011
1074
  F: __dxlog_file9,
1012
- L: 159,
1075
+ L: 172,
1013
1076
  S: this,
1014
1077
  C: (f, a) => f(...a)
1015
1078
  });
1016
1079
  this.registered.emit({
1017
1080
  space,
1018
- triggers: newTriggers
1081
+ triggers: added
1019
1082
  });
1020
1083
  }
1021
1084
  }
1022
- async _handleRemovedTriggers(space, allTriggers, registered) {
1085
+ async _handleRemovedTriggers(space, current, registered) {
1023
1086
  const removed = [];
1024
1087
  for (let i = registered.length - 1; i >= 0; i--) {
1025
- 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;
1026
1089
  if (wasRemoved) {
1027
1090
  const unregistered = registered.splice(i, 1)[0];
1028
1091
  await unregistered.activationCtx?.dispose();
@@ -1030,6 +1093,15 @@ var TriggerRegistry = class extends Resource2 {
1030
1093
  }
1031
1094
  }
1032
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
+ });
1033
1105
  this.removed.emit({
1034
1106
  space,
1035
1107
  triggers: removed
@@ -1043,6 +1115,7 @@ var TriggerRegistry = class extends Resource2 {
1043
1115
  };
1044
1116
  export {
1045
1117
  DevServer,
1118
+ FUNCTION_SCHEMA,
1046
1119
  FunctionDef,
1047
1120
  FunctionManifestSchema,
1048
1121
  FunctionRegistry,