@dxos/functions 0.5.3-main.a3ea5f1 → 0.5.3-main.ac34611
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.
- package/dist/lib/browser/{chunk-366QG6IX.mjs → chunk-HRU7VDYL.mjs} +14 -8
- package/dist/lib/browser/chunk-HRU7VDYL.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +85 -49
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/types.mjs +3 -1
- package/dist/lib/node/{chunk-3VSJ57ZZ.cjs → chunk-R5JUDLSN.cjs} +17 -10
- package/dist/lib/node/chunk-R5JUDLSN.cjs.map +7 -0
- package/dist/lib/node/index.cjs +100 -60
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/types.cjs +6 -4
- package/dist/lib/node/types.cjs.map +2 -2
- package/dist/types/src/browser/index.d.ts +2 -0
- package/dist/types/src/browser/index.d.ts.map +1 -0
- package/dist/types/src/function/function-registry.d.ts.map +1 -1
- package/dist/types/src/handler.d.ts.map +1 -1
- package/dist/types/src/runtime/scheduler.d.ts +1 -1
- package/dist/types/src/runtime/scheduler.d.ts.map +1 -1
- package/dist/types/src/trigger/trigger-registry.d.ts.map +1 -1
- package/dist/types/src/types.d.ts +34 -30
- package/dist/types/src/types.d.ts.map +1 -1
- package/package.json +14 -14
- package/src/browser/index.ts +5 -0
- package/src/function/function-registry.ts +5 -5
- package/src/runtime/scheduler.ts +7 -2
- package/src/trigger/trigger-registry.ts +23 -11
- package/src/types.ts +37 -27
- package/dist/lib/browser/chunk-366QG6IX.mjs.map +0 -7
- package/dist/lib/node/chunk-3VSJ57ZZ.cjs.map +0 -7
- package/dist/types/src/util.d.ts +0 -15
- package/dist/types/src/util.d.ts.map +0 -1
- package/dist/types/src/util.test.d.ts +0 -2
- package/dist/types/src/util.test.d.ts.map +0 -1
- package/src/util.test.ts +0 -43
- package/src/util.ts +0 -48
package/dist/lib/node/index.cjs
CHANGED
|
@@ -29,16 +29,17 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
29
29
|
var node_exports = {};
|
|
30
30
|
__export(node_exports, {
|
|
31
31
|
DevServer: () => DevServer,
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
FUNCTION_SCHEMA: () => import_chunk_R5JUDLSN.FUNCTION_SCHEMA,
|
|
33
|
+
FunctionDef: () => import_chunk_R5JUDLSN.FunctionDef,
|
|
34
|
+
FunctionManifestSchema: () => import_chunk_R5JUDLSN.FunctionManifestSchema,
|
|
34
35
|
FunctionRegistry: () => FunctionRegistry,
|
|
35
|
-
FunctionTrigger: () =>
|
|
36
|
+
FunctionTrigger: () => import_chunk_R5JUDLSN.FunctionTrigger,
|
|
36
37
|
Scheduler: () => Scheduler,
|
|
37
38
|
TriggerRegistry: () => TriggerRegistry,
|
|
38
39
|
subscriptionHandler: () => subscriptionHandler
|
|
39
40
|
});
|
|
40
41
|
module.exports = __toCommonJS(node_exports);
|
|
41
|
-
var
|
|
42
|
+
var import_chunk_R5JUDLSN = require("./chunk-R5JUDLSN.cjs");
|
|
42
43
|
var import_async = require("@dxos/async");
|
|
43
44
|
var import_echo = require("@dxos/client/echo");
|
|
44
45
|
var import_context = require("@dxos/context");
|
|
@@ -80,27 +81,6 @@ var import_log8 = require("@dxos/log");
|
|
|
80
81
|
var import_ws = __toESM(require("ws"));
|
|
81
82
|
var import_async7 = require("@dxos/async");
|
|
82
83
|
var import_log9 = require("@dxos/log");
|
|
83
|
-
var diff = (previous, next, comparator) => {
|
|
84
|
-
const remaining = [
|
|
85
|
-
...previous
|
|
86
|
-
];
|
|
87
|
-
const result = {
|
|
88
|
-
added: [],
|
|
89
|
-
updated: [],
|
|
90
|
-
removed: remaining
|
|
91
|
-
};
|
|
92
|
-
for (const object of next) {
|
|
93
|
-
const index = remaining.findIndex((item) => comparator(item, object));
|
|
94
|
-
if (index === -1) {
|
|
95
|
-
result.added.push(object);
|
|
96
|
-
} else {
|
|
97
|
-
result.updated.push(remaining[index]);
|
|
98
|
-
remaining.splice(index, 1);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
return result;
|
|
102
|
-
};
|
|
103
|
-
var intersection = (a, b, comparator) => a.filter((a2) => b.find((b2) => comparator(a2, b2)) !== void 0);
|
|
104
84
|
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/core/functions/src/function/function-registry.ts";
|
|
105
85
|
var FunctionRegistry = class extends import_context.Resource {
|
|
106
86
|
constructor(_client) {
|
|
@@ -122,22 +102,27 @@ var FunctionRegistry = class extends import_context.Resource {
|
|
|
122
102
|
functions: functions?.length ?? 0
|
|
123
103
|
}, {
|
|
124
104
|
F: __dxlog_file,
|
|
125
|
-
L:
|
|
105
|
+
L: 38,
|
|
126
106
|
S: this,
|
|
127
107
|
C: (f, a) => f(...a)
|
|
128
108
|
});
|
|
129
109
|
if (!functions?.length) {
|
|
130
110
|
return;
|
|
131
111
|
}
|
|
132
|
-
if (!space.db.graph.runtimeSchemaRegistry.hasSchema(
|
|
133
|
-
space.db.graph.runtimeSchemaRegistry.registerSchema(
|
|
112
|
+
if (!space.db.graph.runtimeSchemaRegistry.hasSchema(import_chunk_R5JUDLSN.FunctionDef)) {
|
|
113
|
+
space.db.graph.runtimeSchemaRegistry.registerSchema(import_chunk_R5JUDLSN.FunctionDef);
|
|
134
114
|
}
|
|
135
|
-
const { objects: existing } = await space.db.query(import_echo.Filter.schema(
|
|
136
|
-
const { added
|
|
137
|
-
added.forEach((def) => space.db.add((0, import_echo.create)(
|
|
138
|
-
removed.forEach((def) => space.db.remove(def));
|
|
115
|
+
const { objects: existing } = await space.db.query(import_echo.Filter.schema(import_chunk_R5JUDLSN.FunctionDef)).run();
|
|
116
|
+
const { added } = (0, import_util.diff)(existing, functions, (a, b) => a.uri === b.uri);
|
|
117
|
+
added.forEach((def) => space.db.add((0, import_echo.create)(import_chunk_R5JUDLSN.FunctionDef, def)));
|
|
139
118
|
}
|
|
140
119
|
async _open() {
|
|
120
|
+
import_log.log.info("opening...", void 0, {
|
|
121
|
+
F: __dxlog_file,
|
|
122
|
+
L: 54,
|
|
123
|
+
S: this,
|
|
124
|
+
C: (f, a) => f(...a)
|
|
125
|
+
});
|
|
141
126
|
const spacesSubscription = this._client.spaces.subscribe(async (spaces) => {
|
|
142
127
|
for (const space of spaces) {
|
|
143
128
|
if (this._functionBySpaceKey.has(space.key)) {
|
|
@@ -149,8 +134,8 @@ var FunctionRegistry = class extends import_context.Resource {
|
|
|
149
134
|
if (this._ctx.disposed) {
|
|
150
135
|
break;
|
|
151
136
|
}
|
|
152
|
-
this._ctx.onDispose(space.db.query(import_echo.Filter.schema(
|
|
153
|
-
const { added } = diff(registered, objects, (a, b) => a.uri === b.uri);
|
|
137
|
+
this._ctx.onDispose(space.db.query(import_echo.Filter.schema(import_chunk_R5JUDLSN.FunctionDef)).subscribe(({ objects }) => {
|
|
138
|
+
const { added } = (0, import_util.diff)(registered, objects, (a, b) => a.uri === b.uri);
|
|
154
139
|
if (added.length > 0) {
|
|
155
140
|
registered.push(...added);
|
|
156
141
|
this.registered.emit({
|
|
@@ -164,6 +149,12 @@ var FunctionRegistry = class extends import_context.Resource {
|
|
|
164
149
|
this._ctx.onDispose(() => spacesSubscription.unsubscribe());
|
|
165
150
|
}
|
|
166
151
|
async _close(_) {
|
|
152
|
+
import_log.log.info("closing...", void 0, {
|
|
153
|
+
F: __dxlog_file,
|
|
154
|
+
L: 87,
|
|
155
|
+
S: this,
|
|
156
|
+
C: (f, a) => f(...a)
|
|
157
|
+
});
|
|
167
158
|
this._functionBySpaceKey.clear();
|
|
168
159
|
}
|
|
169
160
|
};
|
|
@@ -416,11 +407,11 @@ var DevServer = class {
|
|
|
416
407
|
C: (f, a) => f(...a)
|
|
417
408
|
});
|
|
418
409
|
if (force) {
|
|
419
|
-
Object.keys(
|
|
420
|
-
delete
|
|
410
|
+
Object.keys(import_chunk_R5JUDLSN.__require.cache).filter((key) => key.startsWith(filePath)).forEach((key) => {
|
|
411
|
+
delete import_chunk_R5JUDLSN.__require.cache[key];
|
|
421
412
|
});
|
|
422
413
|
}
|
|
423
|
-
const module2 = (0,
|
|
414
|
+
const module2 = (0, import_chunk_R5JUDLSN.__require)(filePath);
|
|
424
415
|
if (typeof module2.default !== "function") {
|
|
425
416
|
throw new Error(`Handler must export default function: ${uri}`);
|
|
426
417
|
}
|
|
@@ -528,7 +519,7 @@ var Scheduler = class {
|
|
|
528
519
|
this.triggers = triggers;
|
|
529
520
|
this._options = _options;
|
|
530
521
|
this._ctx = createContext2();
|
|
531
|
-
this.
|
|
522
|
+
this._functionUriToCallMutex = /* @__PURE__ */ new Map();
|
|
532
523
|
this.functions.registered.on(async ({ space, added }) => {
|
|
533
524
|
await this._safeActivateTriggers(space, this.triggers.getInactiveTriggers(space), added);
|
|
534
525
|
});
|
|
@@ -574,7 +565,25 @@ var Scheduler = class {
|
|
|
574
565
|
await this.triggers.activate({
|
|
575
566
|
space
|
|
576
567
|
}, fnTrigger, async (args) => {
|
|
577
|
-
|
|
568
|
+
const mutex = this._functionUriToCallMutex.get(definition.uri) ?? new import_async3.Mutex();
|
|
569
|
+
this._functionUriToCallMutex.set(definition.uri, mutex);
|
|
570
|
+
import_log4.log.info("function triggered, waiting for mutex", {
|
|
571
|
+
uri: definition.uri
|
|
572
|
+
}, {
|
|
573
|
+
F: __dxlog_file4,
|
|
574
|
+
L: 86,
|
|
575
|
+
S: this,
|
|
576
|
+
C: (f, a) => f(...a)
|
|
577
|
+
});
|
|
578
|
+
return mutex.executeSynchronized(() => {
|
|
579
|
+
import_log4.log.info("mutex acquired", {
|
|
580
|
+
uri: definition.uri
|
|
581
|
+
}, {
|
|
582
|
+
F: __dxlog_file4,
|
|
583
|
+
L: 88,
|
|
584
|
+
S: this,
|
|
585
|
+
C: (f, a) => f(...a)
|
|
586
|
+
});
|
|
578
587
|
return this._execFunction(definition, fnTrigger, {
|
|
579
588
|
meta: fnTrigger.meta,
|
|
580
589
|
data: {
|
|
@@ -589,7 +598,7 @@ var Scheduler = class {
|
|
|
589
598
|
trigger: fnTrigger
|
|
590
599
|
}, {
|
|
591
600
|
F: __dxlog_file4,
|
|
592
|
-
L:
|
|
601
|
+
L: 96,
|
|
593
602
|
S: this,
|
|
594
603
|
C: (f, a) => f(...a)
|
|
595
604
|
});
|
|
@@ -609,7 +618,7 @@ var Scheduler = class {
|
|
|
609
618
|
triggerType: trigger.spec.type
|
|
610
619
|
}, {
|
|
611
620
|
F: __dxlog_file4,
|
|
612
|
-
L:
|
|
621
|
+
L: 113,
|
|
613
622
|
S: this,
|
|
614
623
|
C: (f, a) => f(...a)
|
|
615
624
|
});
|
|
@@ -626,7 +635,7 @@ var Scheduler = class {
|
|
|
626
635
|
function: def.uri
|
|
627
636
|
}, {
|
|
628
637
|
F: __dxlog_file4,
|
|
629
|
-
L:
|
|
638
|
+
L: 124,
|
|
630
639
|
S: this,
|
|
631
640
|
C: (f, a) => f(...a)
|
|
632
641
|
});
|
|
@@ -640,7 +649,7 @@ var Scheduler = class {
|
|
|
640
649
|
status
|
|
641
650
|
}, {
|
|
642
651
|
F: __dxlog_file4,
|
|
643
|
-
L:
|
|
652
|
+
L: 134,
|
|
644
653
|
S: this,
|
|
645
654
|
C: (f, a) => f(...a)
|
|
646
655
|
});
|
|
@@ -650,7 +659,7 @@ var Scheduler = class {
|
|
|
650
659
|
error: err.message
|
|
651
660
|
}, {
|
|
652
661
|
F: __dxlog_file4,
|
|
653
|
-
L:
|
|
662
|
+
L: 136,
|
|
654
663
|
S: this,
|
|
655
664
|
C: (f, a) => f(...a)
|
|
656
665
|
});
|
|
@@ -920,7 +929,7 @@ var TriggerRegistry = class extends import_context4.Resource {
|
|
|
920
929
|
trigger
|
|
921
930
|
}, {
|
|
922
931
|
F: __dxlog_file9,
|
|
923
|
-
L:
|
|
932
|
+
L: 74,
|
|
924
933
|
S: this,
|
|
925
934
|
C: (f, a) => f(...a)
|
|
926
935
|
});
|
|
@@ -931,7 +940,7 @@ var TriggerRegistry = class extends import_context4.Resource {
|
|
|
931
940
|
const registeredTrigger = this._triggersBySpaceKey.get(triggerCtx.space.key)?.find((reg) => reg.trigger.id === trigger.id);
|
|
932
941
|
(0, import_invariant2.invariant)(registeredTrigger, `Trigger is not registered: ${trigger.function}`, {
|
|
933
942
|
F: __dxlog_file9,
|
|
934
|
-
L:
|
|
943
|
+
L: 80,
|
|
935
944
|
S: this,
|
|
936
945
|
A: [
|
|
937
946
|
"registeredTrigger",
|
|
@@ -955,33 +964,38 @@ var TriggerRegistry = class extends import_context4.Resource {
|
|
|
955
964
|
space: space.key
|
|
956
965
|
}, {
|
|
957
966
|
F: __dxlog_file9,
|
|
958
|
-
L:
|
|
967
|
+
L: 96,
|
|
959
968
|
S: this,
|
|
960
969
|
C: (f, a) => f(...a)
|
|
961
970
|
});
|
|
962
971
|
if (!manifest.triggers?.length) {
|
|
963
972
|
return;
|
|
964
973
|
}
|
|
965
|
-
if (!space.db.graph.runtimeSchemaRegistry.hasSchema(
|
|
966
|
-
space.db.graph.runtimeSchemaRegistry.registerSchema(
|
|
974
|
+
if (!space.db.graph.runtimeSchemaRegistry.hasSchema(import_chunk_R5JUDLSN.FunctionTrigger)) {
|
|
975
|
+
space.db.graph.runtimeSchemaRegistry.registerSchema(import_chunk_R5JUDLSN.FunctionTrigger);
|
|
967
976
|
}
|
|
968
|
-
const { objects: existing } = await space.db.query(import_echo2.Filter.schema(
|
|
969
|
-
const { added
|
|
977
|
+
const { objects: existing } = await space.db.query(import_echo2.Filter.schema(import_chunk_R5JUDLSN.FunctionTrigger)).run();
|
|
978
|
+
const { added } = (0, import_util3.diff)(existing, manifest.triggers, (a, b) => {
|
|
970
979
|
const keys = b[import_echo_schema.ECHO_ATTR_META]?.keys ?? [
|
|
971
980
|
(0, import_echo_schema.foreignKey)("manifest", [
|
|
972
981
|
b.function,
|
|
973
982
|
b.spec.type
|
|
974
983
|
].join("-"))
|
|
975
984
|
];
|
|
976
|
-
return intersection((0, import_echo2.getMeta)(a)?.keys ?? [], keys, import_echo_schema.foreignKeyEquals).length > 0;
|
|
985
|
+
return (0, import_util3.intersection)((0, import_echo2.getMeta)(a)?.keys ?? [], keys, import_echo_schema.foreignKeyEquals).length > 0;
|
|
977
986
|
});
|
|
978
987
|
added.forEach((trigger) => {
|
|
979
988
|
const { meta, object } = (0, import_echo_schema.splitMeta)(trigger);
|
|
980
|
-
space.db.add((0, import_echo2.create)(
|
|
989
|
+
space.db.add((0, import_echo2.create)(import_chunk_R5JUDLSN.FunctionTrigger, object, meta));
|
|
981
990
|
});
|
|
982
|
-
removed.forEach((trigger) => space.db.remove(trigger));
|
|
983
991
|
}
|
|
984
992
|
async _open() {
|
|
993
|
+
import_log5.log.info("open...", void 0, {
|
|
994
|
+
F: __dxlog_file9,
|
|
995
|
+
L: 121,
|
|
996
|
+
S: this,
|
|
997
|
+
C: (f, a) => f(...a)
|
|
998
|
+
});
|
|
985
999
|
const spaceListSubscription = this._client.spaces.subscribe(async (spaces) => {
|
|
986
1000
|
for (const space of spaces) {
|
|
987
1001
|
if (this._triggersBySpaceKey.has(space.key)) {
|
|
@@ -993,16 +1007,30 @@ var TriggerRegistry = class extends import_context4.Resource {
|
|
|
993
1007
|
if (this._ctx.disposed) {
|
|
994
1008
|
break;
|
|
995
1009
|
}
|
|
996
|
-
|
|
1010
|
+
this._ctx.onDispose(space.db.query(import_echo2.Filter.schema(import_chunk_R5JUDLSN.FunctionTrigger)).subscribe(async (triggers) => {
|
|
1011
|
+
import_log5.log.info("update", {
|
|
1012
|
+
space: space.key,
|
|
1013
|
+
triggers: triggers.objects.length
|
|
1014
|
+
}, {
|
|
1015
|
+
F: __dxlog_file9,
|
|
1016
|
+
L: 138,
|
|
1017
|
+
S: this,
|
|
1018
|
+
C: (f, a) => f(...a)
|
|
1019
|
+
});
|
|
997
1020
|
await this._handleRemovedTriggers(space, triggers.objects, registered);
|
|
998
1021
|
this._handleNewTriggers(space, triggers.objects, registered);
|
|
999
|
-
});
|
|
1000
|
-
this._ctx.onDispose(functionsSubscription);
|
|
1022
|
+
}));
|
|
1001
1023
|
}
|
|
1002
1024
|
});
|
|
1003
1025
|
this._ctx.onDispose(() => spaceListSubscription.unsubscribe());
|
|
1004
1026
|
}
|
|
1005
1027
|
async _close(_) {
|
|
1028
|
+
import_log5.log.info("close...", void 0, {
|
|
1029
|
+
F: __dxlog_file9,
|
|
1030
|
+
L: 150,
|
|
1031
|
+
S: this,
|
|
1032
|
+
C: (f, a) => f(...a)
|
|
1033
|
+
});
|
|
1006
1034
|
this._triggersBySpaceKey.clear();
|
|
1007
1035
|
}
|
|
1008
1036
|
_handleNewTriggers(space, allTriggers, registered) {
|
|
@@ -1014,12 +1042,12 @@ var TriggerRegistry = class extends import_context4.Resource {
|
|
|
1014
1042
|
trigger
|
|
1015
1043
|
}));
|
|
1016
1044
|
registered.push(...newRegisteredTriggers);
|
|
1017
|
-
|
|
1045
|
+
import_log5.log.info("added", () => ({
|
|
1018
1046
|
spaceKey: space.key,
|
|
1019
|
-
|
|
1047
|
+
triggers: newTriggers.map((trigger) => trigger.function)
|
|
1020
1048
|
}), {
|
|
1021
1049
|
F: __dxlog_file9,
|
|
1022
|
-
L:
|
|
1050
|
+
L: 162,
|
|
1023
1051
|
S: this,
|
|
1024
1052
|
C: (f, a) => f(...a)
|
|
1025
1053
|
});
|
|
@@ -1034,6 +1062,17 @@ var TriggerRegistry = class extends import_context4.Resource {
|
|
|
1034
1062
|
for (let i = registered.length - 1; i >= 0; i--) {
|
|
1035
1063
|
const wasRemoved = allTriggers.find((trigger) => trigger.id === registered[i].trigger.id) == null;
|
|
1036
1064
|
if (wasRemoved) {
|
|
1065
|
+
if (removed.length) {
|
|
1066
|
+
import_log5.log.info("removed", () => ({
|
|
1067
|
+
spaceKey: space.key,
|
|
1068
|
+
triggers: removed.map((trigger) => trigger.function)
|
|
1069
|
+
}), {
|
|
1070
|
+
F: __dxlog_file9,
|
|
1071
|
+
L: 181,
|
|
1072
|
+
S: this,
|
|
1073
|
+
C: (f, a) => f(...a)
|
|
1074
|
+
});
|
|
1075
|
+
}
|
|
1037
1076
|
const unregistered = registered.splice(i, 1)[0];
|
|
1038
1077
|
await unregistered.activationCtx?.dispose();
|
|
1039
1078
|
removed.push(unregistered.trigger);
|
|
@@ -1054,6 +1093,7 @@ var TriggerRegistry = class extends import_context4.Resource {
|
|
|
1054
1093
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1055
1094
|
0 && (module.exports = {
|
|
1056
1095
|
DevServer,
|
|
1096
|
+
FUNCTION_SCHEMA,
|
|
1057
1097
|
FunctionDef,
|
|
1058
1098
|
FunctionManifestSchema,
|
|
1059
1099
|
FunctionRegistry,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../src/function/function-registry.ts", "../../../src/
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Event } from '@dxos/async';\nimport { type Client } from '@dxos/client';\nimport { create, Filter, type Space } from '@dxos/client/echo';\nimport { type Context, Resource } from '@dxos/context';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { ComplexMap } from '@dxos/util';\n\nimport { FunctionDef, type FunctionManifest } from '../types';\nimport { diff } from '../util';\n\nexport type FunctionsRegisteredEvent = {\n space: Space;\n added: FunctionDef[];\n};\n\nexport class FunctionRegistry extends Resource {\n private readonly _functionBySpaceKey = new ComplexMap<PublicKey, FunctionDef[]>(PublicKey.hash);\n\n public readonly registered = new Event<FunctionsRegisteredEvent>();\n\n constructor(private readonly _client: Client) {\n super();\n }\n\n public getFunctions(space: Space): FunctionDef[] {\n return this._functionBySpaceKey.get(space.key) ?? [];\n }\n\n /**\n * Loads function definitions from the manifest into the space.\n * We first load all the definitions from the space to deduplicate by functionId.\n */\n public async register(space: Space, functions: FunctionManifest['functions']): Promise<void> {\n log('register', { space: space.key, functions: functions?.length ?? 0 });\n if (!functions?.length) {\n return;\n }\n if (!space.db.graph.runtimeSchemaRegistry.hasSchema(FunctionDef)) {\n space.db.graph.runtimeSchemaRegistry.registerSchema(FunctionDef);\n }\n\n // Sync definitions.\n const { objects: existing } = await space.db.query(Filter.schema(FunctionDef)).run();\n const { added, removed } = diff(existing, functions, (a, b) => a.uri === b.uri);\n added.forEach((def) => space.db.add(create(FunctionDef, def)));\n // TODO(burdon): Update existing templates.\n removed.forEach((def) => space.db.remove(def));\n }\n\n protected override async _open(): Promise<void> {\n const spacesSubscription = this._client.spaces.subscribe(async (spaces) => {\n for (const space of spaces) {\n if (this._functionBySpaceKey.has(space.key)) {\n continue;\n }\n\n const registered: FunctionDef[] = [];\n this._functionBySpaceKey.set(space.key, registered);\n await space.waitUntilReady();\n if (this._ctx.disposed) {\n break;\n }\n\n // Subscribe to updates.\n this._ctx.onDispose(\n space.db.query(Filter.schema(FunctionDef)).subscribe(({ objects }) => {\n const { added } = diff(registered, objects, (a, b) => a.uri === b.uri);\n // TODO(burdon): Update and remove.\n if (added.length > 0) {\n registered.push(...added);\n this.registered.emit({ space, added });\n }\n }),\n );\n }\n });\n\n // TODO(burdon): API: Normalize unsubscribe methods.\n this._ctx.onDispose(() => spacesSubscription.unsubscribe());\n }\n\n protected override async _close(_: Context): Promise<void> {\n this._functionBySpaceKey.clear();\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nexport type Comparator<A, B = A> = (a: A, b: B) => boolean;\n\nexport type DiffResult<A, B = A> = {\n added: B[];\n updated: A[];\n removed: A[];\n};\n\n/**\n *\n * @param previous\n * @param next\n * @param comparator\n */\n// TODO(burdon): Factor out.\nexport const diff = <A, B = A>(\n previous: readonly A[],\n next: readonly B[],\n comparator: Comparator<A, B>,\n): DiffResult<A, B> => {\n const remaining = [...previous];\n const result: DiffResult<A, B> = {\n added: [],\n updated: [],\n removed: remaining,\n };\n\n // TODO(burdon): Mark and sweep.\n for (const object of next) {\n const index = remaining.findIndex((item) => comparator(item, object));\n if (index === -1) {\n result.added.push(object);\n } else {\n result.updated.push(remaining[index]);\n remaining.splice(index, 1);\n }\n }\n\n return result;\n};\n\n// TODO(burdon): Factor out.\nexport const intersection = <A, B = A>(a: A[], b: B[], comparator: Comparator<A, B>): A[] =>\n a.filter((a) => b.find((b) => comparator(a, b)) !== undefined);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Client, PublicKey } from '@dxos/client';\nimport { type Space } from '@dxos/client/echo';\nimport { type EchoReactiveObject } from '@dxos/echo-schema';\nimport { log } from '@dxos/log';\nimport { nonNullable } from '@dxos/util';\n\n// TODO(burdon): Model after http request. Ref Lambda/OpenFaaS.\n// https://docs.aws.amazon.com/lambda/latest/dg/typescript-handler.html\n// https://www.serverless.com/framework/docs/providers/aws/guide/serverless.yml/#functions\n// https://www.npmjs.com/package/aws-lambda\n\n/**\n * Function handler.\n */\nexport type FunctionHandler<TData = {}, TMeta = {}> = (params: {\n context: FunctionContext;\n event: FunctionEvent<TData, TMeta>;\n response: FunctionResponse;\n}) => Promise<FunctionResponse | void>;\n\n/**\n * Function context.\n */\nexport interface FunctionContext {\n // TODO(burdon): Limit access to individual space.\n client: Client;\n // TODO(burdon): Replace with storage service abstraction.\n dataDir?: string;\n}\n\n/**\n * Event payload.\n */\nexport type FunctionEvent<TData = {}, TMeta = {}> = {\n data: FunctionEventMeta<TMeta> & TData;\n};\n\n/**\n * Metadata from trigger.\n */\nexport type FunctionEventMeta<TMeta = {}> = {\n meta: TMeta;\n};\n\n/**\n * Function response.\n */\nexport interface FunctionResponse {\n status(code: number): FunctionResponse;\n}\n\n//\n// Subscription utils.\n//\n\nexport type RawSubscriptionData = {\n spaceKey?: string;\n objects?: string[];\n};\n\nexport type SubscriptionData = {\n space?: Space;\n objects?: EchoReactiveObject<any>[];\n};\n\n/**\n * Handler wrapper for subscription events; extracts space and objects.\n *\n * To test:\n * ```\n * curl -s -X POST -H \"Content-Type: application/json\" --data '{\"space\": \"0446...1cbb\"}' http://localhost:7100/dev/email-extractor\n * ```\n *\n * NOTE: Get space key from devtools or `dx space list --json`\n */\nexport const subscriptionHandler = <TMeta>(\n handler: FunctionHandler<SubscriptionData, TMeta>,\n): FunctionHandler<RawSubscriptionData, TMeta> => {\n return ({ event: { data }, context, ...rest }) => {\n const { client } = context;\n const space = data.spaceKey ? client.spaces.get(PublicKey.from(data.spaceKey)) : undefined;\n const objects = space\n ? data.objects?.map<EchoReactiveObject<any> | undefined>((id) => space!.db.getObjectById(id)).filter(nonNullable)\n : [];\n\n if (!!data.spaceKey && !space) {\n log.warn('invalid space', { data });\n } else {\n log.info('handler', { space: space?.key.truncate(), objects: objects?.length });\n }\n\n return handler({ event: { data: { ...data, space, objects } }, context, ...rest });\n };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport express from 'express';\nimport { getPort } from 'get-port-please';\nimport type http from 'http';\nimport { join } from 'node:path';\n\nimport { Event, Trigger } from '@dxos/async';\nimport { type Client } from '@dxos/client';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\n\nimport { type FunctionRegistry } from '../function';\nimport { type FunctionContext, type FunctionEvent, type FunctionHandler, type FunctionResponse } from '../handler';\nimport { type FunctionDef } from '../types';\n\nexport type DevServerOptions = {\n baseDir: string;\n port?: number;\n reload?: boolean;\n dataDir?: string;\n};\n\n/**\n * Functions dev server provides a local HTTP server for testing functions.\n */\nexport class DevServer {\n private _ctx = createContext();\n\n // Function handlers indexed by name (URL path).\n private readonly _handlers: Record<string, { def: FunctionDef; handler: FunctionHandler<any> }> = {};\n\n private _server?: http.Server;\n private _port?: number;\n private _functionServiceRegistration?: string;\n private _proxy?: string;\n private _seq = 0;\n\n public readonly update = new Event<number>();\n\n constructor(\n private readonly _client: Client,\n private readonly _functionsRegistry: FunctionRegistry,\n private readonly _options: DevServerOptions,\n ) {\n this._functionsRegistry.registered.on(async ({ added }) => {\n added.forEach((def) => this._load(def));\n await this._safeUpdateRegistration();\n log('new functions loaded', { added });\n });\n }\n\n get stats() {\n return {\n seq: this._seq,\n };\n }\n\n get endpoint() {\n invariant(this._port);\n return `http://localhost:${this._port}`;\n }\n\n get proxy() {\n return this._proxy;\n }\n\n get functions() {\n return Object.values(this._handlers);\n }\n\n async start() {\n invariant(!this._server);\n log.info('starting...');\n this._ctx = createContext();\n\n // TODO(burdon): Move to hono.\n const app = express();\n app.use(express.json());\n\n app.post('/:path', async (req, res) => {\n const { path } = req.params;\n try {\n log.info('calling', { path });\n if (this._options.reload) {\n const { def } = this._handlers['/' + path];\n await this._load(def, true);\n }\n\n // TODO(burdon): Get function context.\n res.statusCode = await this.invoke('/' + path, req.body);\n res.end();\n } catch (err: any) {\n log.catch(err);\n res.statusCode = 500;\n res.end();\n }\n });\n\n this._port = await getPort({ host: 'localhost', port: 7200, portRange: [7200, 7299] });\n this._server = app.listen(this._port);\n\n try {\n // Register functions.\n const { registrationId, endpoint } = await this._client.services.services.FunctionRegistryService!.register({\n endpoint: this.endpoint,\n });\n\n log.info('registered', { endpoint });\n this._proxy = endpoint;\n this._functionServiceRegistration = registrationId;\n\n // Open after registration, so that it can be updated with the list of function definitions.\n await this._functionsRegistry.open(this._ctx);\n } catch (err: any) {\n await this.stop();\n throw new Error('FunctionRegistryService not available (check plugin is configured).');\n }\n\n log.info('started', { port: this._port });\n }\n\n async stop() {\n invariant(this._server);\n log.info('stopping...');\n\n const trigger = new Trigger();\n this._server.close(async () => {\n log.info('server stopped');\n try {\n if (this._functionServiceRegistration) {\n invariant(this._client.services.services.FunctionRegistryService);\n await this._client.services.services.FunctionRegistryService.unregister({\n registrationId: this._functionServiceRegistration,\n });\n\n log.info('unregistered', { registrationId: this._functionServiceRegistration });\n this._functionServiceRegistration = undefined;\n this._proxy = undefined;\n }\n\n trigger.wake();\n } catch (err) {\n trigger.throw(err as Error);\n }\n });\n\n await trigger.wait();\n this._port = undefined;\n this._server = undefined;\n log.info('stopped');\n }\n\n /**\n * Load function.\n */\n private async _load(def: FunctionDef, force?: boolean | undefined) {\n const { uri, route, handler } = def;\n const filePath = join(this._options.baseDir, handler);\n log.info('loading', { uri, force });\n\n // Remove from cache.\n if (force) {\n Object.keys(require.cache)\n .filter((key) => key.startsWith(filePath))\n .forEach((key) => {\n delete require.cache[key];\n });\n }\n\n // TODO(burdon): Import types.\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const module = require(filePath);\n if (typeof module.default !== 'function') {\n throw new Error(`Handler must export default function: ${uri}`);\n }\n\n this._handlers[route] = { def, handler: module.default };\n }\n\n private async _safeUpdateRegistration(): Promise<void> {\n invariant(this._functionServiceRegistration);\n try {\n await this._client.services.services.FunctionRegistryService!.updateRegistration({\n registrationId: this._functionServiceRegistration,\n functions: this.functions.map(({ def: { id, route } }) => ({ id, route })),\n });\n } catch (e) {\n log.catch(e);\n }\n }\n\n /**\n * Invoke function.\n */\n public async invoke(path: string, data: any): Promise<number> {\n const seq = ++this._seq;\n const now = Date.now();\n\n log.info('req', { seq, path });\n const statusCode = await this._invoke(path, { data });\n\n log.info('res', { seq, path, statusCode, duration: Date.now() - now });\n this.update.emit(statusCode);\n return statusCode;\n }\n\n private async _invoke(path: string, event: FunctionEvent) {\n const { handler } = this._handlers[path] ?? {};\n invariant(handler, `invalid path: ${path}`);\n\n const context: FunctionContext = {\n client: this._client,\n dataDir: this._options.dataDir,\n };\n\n let statusCode = 200;\n const response: FunctionResponse = {\n status: (code: number) => {\n statusCode = code;\n return response;\n },\n };\n\n await handler({ context, event, response });\n return statusCode;\n }\n}\n\nconst createContext = () => new Context({ name: 'DevServer' });\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport path from 'node:path';\n\nimport { Mutex } from '@dxos/async';\nimport { type Space } from '@dxos/client/echo';\nimport { Context } from '@dxos/context';\nimport { log } from '@dxos/log';\n\nimport { type FunctionRegistry } from '../function';\nimport { type FunctionEventMeta } from '../handler';\nimport { type TriggerRegistry } from '../trigger';\nimport { type FunctionDef, type FunctionManifest, type FunctionTrigger } from '../types';\n\nexport type Callback = (data: any) => Promise<void | number>;\n\nexport type SchedulerOptions = {\n endpoint?: string;\n callback?: Callback;\n};\n\n/**\n * The scheduler triggers function execution based on various triggers.\n */\nexport class Scheduler {\n private _ctx = createContext();\n\n private readonly _callMutex = new Mutex();\n\n constructor(\n public readonly functions: FunctionRegistry,\n public readonly triggers: TriggerRegistry,\n private readonly _options: SchedulerOptions = {},\n ) {\n this.functions.registered.on(async ({ space, added }) => {\n await this._safeActivateTriggers(space, this.triggers.getInactiveTriggers(space), added);\n });\n this.triggers.registered.on(async ({ space, triggers }) => {\n await this._safeActivateTriggers(space, triggers, this.functions.getFunctions(space));\n });\n }\n\n async start() {\n await this._ctx.dispose();\n this._ctx = createContext();\n await this.functions.open(this._ctx);\n await this.triggers.open(this._ctx);\n }\n\n async stop() {\n await this._ctx.dispose();\n await this.functions.close();\n await this.triggers.close();\n }\n\n // TODO(burdon): Remove and update registries directly.\n public async register(space: Space, manifest: FunctionManifest) {\n await this.functions.register(space, manifest.functions);\n await this.triggers.register(space, manifest);\n }\n\n private async _safeActivateTriggers(\n space: Space,\n triggers: FunctionTrigger[],\n functions: FunctionDef[],\n ): Promise<void> {\n const mountTasks = triggers.map((trigger) => {\n return this.activate(space, functions, trigger);\n });\n await Promise.all(mountTasks).catch(log.catch);\n }\n\n private async activate(space: Space, functions: FunctionDef[], fnTrigger: FunctionTrigger) {\n const definition = functions.find((def) => def.uri === fnTrigger.function);\n if (!definition) {\n log.info('function is not found for trigger', { fnTrigger });\n return;\n }\n\n await this.triggers.activate({ space }, fnTrigger, async (args) => {\n return this._callMutex.executeSynchronized(() => {\n return this._execFunction(definition, fnTrigger, {\n meta: fnTrigger.meta,\n data: { ...args, spaceKey: space.key },\n });\n });\n });\n\n log('activated trigger', { space: space.key, trigger: fnTrigger });\n }\n\n private async _execFunction<TData, TMeta>(\n def: FunctionDef,\n trigger: FunctionTrigger,\n { data, meta }: { data: TData; meta?: TMeta },\n ): Promise<number> {\n let status = 0;\n try {\n // TODO(burdon): Pass in Space key (common context)?\n const payload = Object.assign({}, meta && ({ meta } satisfies FunctionEventMeta<TMeta>), data);\n\n const { endpoint, callback } = this._options;\n if (endpoint) {\n // TODO(burdon): Move out of scheduler (generalize as callback).\n const url = path.join(endpoint, def.route);\n log.info('exec', { function: def.uri, url, triggerType: trigger.spec.type });\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n\n status = response.status;\n } else if (callback) {\n log.info('exec', { function: def.uri });\n status = (await callback(payload)) ?? 200;\n }\n\n // Check errors.\n if (status && status >= 400) {\n throw new Error(`Response: ${status}`);\n }\n\n // const result = await response.json();\n log.info('done', { function: def.uri, status });\n } catch (err: any) {\n log.error('error', { function: def.uri, error: err.message });\n status = 500;\n }\n\n return status;\n }\n}\n\nconst createContext = () => new Context({ name: 'FunctionScheduler' });\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Event } from '@dxos/async';\nimport { type Client } from '@dxos/client';\nimport { create, Filter, getMeta, type Space } from '@dxos/client/echo';\nimport { Context, Resource } from '@dxos/context';\nimport { ECHO_ATTR_META, foreignKey, foreignKeyEquals, splitMeta } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { ComplexMap } from '@dxos/util';\n\nimport { createSubscriptionTrigger, createTimerTrigger, createWebhookTrigger, createWebsocketTrigger } from './type';\nimport { type FunctionManifest, FunctionTrigger, type FunctionTriggerType, type TriggerSpec } from '../types';\nimport { diff, intersection } from '../util';\n\ntype ResponseCode = number;\n\nexport type TriggerCallback = (args: object) => Promise<ResponseCode>;\n\nexport type TriggerContext = { space: Space };\n\n// TODO(burdon): Make object?\nexport type TriggerFactory<Spec extends TriggerSpec, Options = any> = (\n ctx: Context,\n context: TriggerContext,\n spec: Spec,\n callback: TriggerCallback,\n options?: Options,\n) => Promise<void>;\n\nexport type TriggerHandlerMap = { [type in FunctionTriggerType]: TriggerFactory<any> };\n\nconst triggerHandlers: TriggerHandlerMap = {\n subscription: createSubscriptionTrigger,\n timer: createTimerTrigger,\n webhook: createWebhookTrigger,\n websocket: createWebsocketTrigger,\n};\n\nexport type TriggerEvent = {\n space: Space;\n triggers: FunctionTrigger[];\n};\n\ntype RegisteredTrigger = {\n activationCtx?: Context;\n trigger: FunctionTrigger;\n};\n\nexport class TriggerRegistry extends Resource {\n private readonly _triggersBySpaceKey = new ComplexMap<PublicKey, RegisteredTrigger[]>(PublicKey.hash);\n\n public readonly registered = new Event<TriggerEvent>();\n public readonly removed = new Event<TriggerEvent>();\n\n constructor(\n private readonly _client: Client,\n private readonly _options?: TriggerHandlerMap,\n ) {\n super();\n }\n\n public getActiveTriggers(space: Space): FunctionTrigger[] {\n return this._getTriggers(space, (t) => t.activationCtx != null);\n }\n\n public getInactiveTriggers(space: Space): FunctionTrigger[] {\n return this._getTriggers(space, (t) => t.activationCtx == null);\n }\n\n async activate(triggerCtx: TriggerContext, trigger: FunctionTrigger, callback: TriggerCallback): Promise<void> {\n log('activate', { space: triggerCtx.space.key, trigger });\n const activationCtx = new Context({ name: `trigger_${trigger.function}` });\n this._ctx.onDispose(() => activationCtx.dispose());\n const registeredTrigger = this._triggersBySpaceKey\n .get(triggerCtx.space.key)\n ?.find((reg) => reg.trigger.id === trigger.id);\n invariant(registeredTrigger, `Trigger is not registered: ${trigger.function}`);\n registeredTrigger.activationCtx = activationCtx;\n\n try {\n const options = this._options?.[trigger.spec.type];\n await triggerHandlers[trigger.spec.type](activationCtx, triggerCtx, trigger.spec, callback, options);\n } catch (err) {\n delete registeredTrigger.activationCtx;\n throw err;\n }\n }\n\n /**\n * Loads triggers from the manifest into the space.\n */\n public async register(space: Space, manifest: FunctionManifest): Promise<void> {\n log('register', { space: space.key });\n if (!manifest.triggers?.length) {\n return;\n }\n if (!space.db.graph.runtimeSchemaRegistry.hasSchema(FunctionTrigger)) {\n space.db.graph.runtimeSchemaRegistry.registerSchema(FunctionTrigger);\n }\n\n // Sync triggers.\n const { objects: existing } = await space.db.query(Filter.schema(FunctionTrigger)).run();\n const { added, removed } = diff(existing, manifest.triggers, (a, b) => {\n // Create FK to enable syncing if none are set.\n // TODO(burdon): Warn if not unique.\n const keys = b[ECHO_ATTR_META]?.keys ?? [foreignKey('manifest', [b.function, b.spec.type].join('-'))];\n return intersection(getMeta(a)?.keys ?? [], keys, foreignKeyEquals).length > 0;\n });\n\n added.forEach((trigger) => {\n const { meta, object } = splitMeta(trigger);\n space.db.add(create(FunctionTrigger, object, meta));\n });\n // TODO(burdon): Update existing triggers.\n removed.forEach((trigger) => space.db.remove(trigger));\n }\n\n protected override async _open(): Promise<void> {\n const spaceListSubscription = this._client.spaces.subscribe(async (spaces) => {\n for (const space of spaces) {\n if (this._triggersBySpaceKey.has(space.key)) {\n continue;\n }\n\n const registered: RegisteredTrigger[] = [];\n this._triggersBySpaceKey.set(space.key, registered);\n await space.waitUntilReady();\n if (this._ctx.disposed) {\n break;\n }\n const functionsSubscription = space.db.query(Filter.schema(FunctionTrigger)).subscribe(async (triggers) => {\n await this._handleRemovedTriggers(space, triggers.objects, registered);\n this._handleNewTriggers(space, triggers.objects, registered);\n });\n\n this._ctx.onDispose(functionsSubscription);\n }\n });\n\n this._ctx.onDispose(() => spaceListSubscription.unsubscribe());\n }\n\n protected override async _close(_: Context): Promise<void> {\n this._triggersBySpaceKey.clear();\n }\n\n private _handleNewTriggers(space: Space, allTriggers: FunctionTrigger[], registered: RegisteredTrigger[]) {\n const newTriggers = allTriggers.filter((candidate) => {\n return registered.find((reg) => reg.trigger.id === candidate.id) == null;\n });\n\n if (newTriggers.length > 0) {\n const newRegisteredTriggers: RegisteredTrigger[] = newTriggers.map((trigger) => ({ trigger }));\n registered.push(...newRegisteredTriggers);\n log('registered new triggers', () => ({ spaceKey: space.key, functions: newTriggers.map((t) => t.function) }));\n this.registered.emit({ space, triggers: newTriggers });\n }\n }\n\n private async _handleRemovedTriggers(\n space: Space,\n allTriggers: FunctionTrigger[],\n registered: RegisteredTrigger[],\n ): Promise<void> {\n const removed: FunctionTrigger[] = [];\n for (let i = registered.length - 1; i >= 0; i--) {\n const wasRemoved =\n allTriggers.find((trigger: FunctionTrigger) => trigger.id === registered[i].trigger.id) == null;\n if (wasRemoved) {\n const unregistered = registered.splice(i, 1)[0];\n await unregistered.activationCtx?.dispose();\n removed.push(unregistered.trigger);\n }\n }\n\n if (removed.length > 0) {\n this.removed.emit({ space, triggers: removed });\n }\n }\n\n private _getTriggers(space: Space, predicate: (trigger: RegisteredTrigger) => boolean): FunctionTrigger[] {\n const allSpaceTriggers = this._triggersBySpaceKey.get(space.key) ?? [];\n return allSpaceTriggers.filter(predicate).map((trigger) => trigger.trigger);\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { TextV0Type } from '@braneframe/types';\nimport { debounce, UpdateScheduler } from '@dxos/async';\nimport { type Context } from '@dxos/context';\nimport { createSubscription, Filter, getAutomergeObjectCore, type Query } from '@dxos/echo-db';\nimport { log } from '@dxos/log';\n\nimport type { SubscriptionTrigger } from '../../types';\nimport { type TriggerCallback, type TriggerContext, type TriggerFactory } from '../trigger-registry';\n\nexport const createSubscriptionTrigger: TriggerFactory<SubscriptionTrigger> = async (\n ctx: Context,\n triggerCtx: TriggerContext,\n spec: SubscriptionTrigger,\n callback: TriggerCallback,\n) => {\n const objectIds = new Set<string>();\n const task = new UpdateScheduler(\n ctx,\n async () => {\n if (objectIds.size > 0) {\n const objects = Array.from(objectIds);\n objectIds.clear();\n await callback({ objects });\n }\n },\n { maxFrequency: 4 },\n );\n\n // TODO(burdon): Don't fire initially?\n // TODO(burdon): Create queue. Only allow one invocation per trigger at a time?\n const subscriptions: (() => void)[] = [];\n const subscription = createSubscription(({ added, updated }) => {\n const sizeBefore = objectIds.size;\n for (const object of added) {\n objectIds.add(object.id);\n }\n for (const object of updated) {\n objectIds.add(object.id);\n }\n if (objectIds.size > sizeBefore) {\n log.info('updated', { added: added.length, updated: updated.length });\n task.trigger();\n }\n });\n\n subscriptions.push(() => subscription.unsubscribe());\n\n // TODO(burdon): Disable trigger if keeps failing.\n const { filter, options: { deep, delay } = {} } = spec;\n const update = ({ objects }: Query) => {\n subscription.update(objects);\n\n // TODO(burdon): Hack to monitor changes to Document's text object.\n if (deep) {\n log.info('update', { objects: objects.length });\n for (const object of objects) {\n const content = object.content;\n if (content instanceof TextV0Type) {\n subscriptions.push(\n getAutomergeObjectCore(content).updates.on(debounce(() => subscription.update([object]), 1_000)),\n );\n }\n }\n }\n };\n\n // TODO(burdon): Is Filter.or implemented?\n // TODO(burdon): [Bug]: all callbacks are fired on the first mutation.\n // TODO(burdon): [Bug]: not updated when document is deleted (either top or hierarchically).\n const query = triggerCtx.space.db.query(Filter.or(filter.map(({ type, props }) => Filter.typename(type, props))));\n subscriptions.push(query.subscribe(delay ? debounce(update, delay) : update));\n\n ctx.onDispose(() => {\n subscriptions.forEach((unsubscribe) => unsubscribe());\n });\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { CronJob } from 'cron';\n\nimport { DeferredTask } from '@dxos/async';\nimport { type Context } from '@dxos/context';\nimport { log } from '@dxos/log';\n\nimport type { TimerTrigger } from '../../types';\nimport { type TriggerCallback, type TriggerContext, type TriggerFactory } from '../trigger-registry';\n\nexport const createTimerTrigger: TriggerFactory<TimerTrigger> = async (\n ctx: Context,\n triggerContext: TriggerContext,\n spec: TimerTrigger,\n callback: TriggerCallback,\n) => {\n const task = new DeferredTask(ctx, async () => {\n await callback({});\n });\n\n let last = 0;\n let run = 0;\n // https://www.npmjs.com/package/cron#constructor\n const job = CronJob.from({\n cronTime: spec.cron,\n runOnInit: false,\n onTick: () => {\n // TODO(burdon): Check greater than 30s (use cron-parser).\n const now = Date.now();\n const delta = last ? now - last : 0;\n last = now;\n\n run++;\n log.info('tick', { space: triggerContext.space.key.truncate(), count: run, delta });\n task.schedule();\n },\n });\n\n job.start();\n ctx.onDispose(() => job.stop());\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { getPort } from 'get-port-please';\nimport http from 'node:http';\n\nimport { type Context } from '@dxos/context';\nimport { log } from '@dxos/log';\n\nimport type { WebhookTrigger } from '../../types';\nimport { type TriggerCallback, type TriggerContext, type TriggerFactory } from '../trigger-registry';\n\nexport const createWebhookTrigger: TriggerFactory<WebhookTrigger> = async (\n ctx: Context,\n _: TriggerContext,\n spec: WebhookTrigger,\n callback: TriggerCallback,\n) => {\n // TODO(burdon): Enable POST hook with payload.\n const server = http.createServer(async (req, res) => {\n if (req.method !== spec.method) {\n res.statusCode = 405;\n return res.end();\n }\n res.statusCode = await callback({});\n res.end();\n });\n\n // TODO(burdon): Not used.\n // const DEF_PORT_RANGE = { min: 7500, max: 7599 };\n // const portRange = Object.assign({}, trigger.port, DEF_PORT_RANGE) as WebhookTrigger['port'];\n const port = await getPort({\n random: true,\n // portRange: [portRange!.min, portRange!.max],\n });\n\n // TODO(burdon): Update trigger object with actual port.\n server.listen(port, () => {\n log.info('started webhook', { port });\n spec.port = port;\n });\n\n ctx.onDispose(() => {\n server.close();\n });\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport WebSocket from 'ws';\n\nimport { sleep, Trigger } from '@dxos/async';\nimport { type Context } from '@dxos/context';\nimport { log } from '@dxos/log';\n\nimport { type WebsocketTrigger } from '../../types';\nimport { type TriggerCallback, type TriggerContext, type TriggerFactory } from '../trigger-registry';\n\ninterface WebsocketTriggerOptions {\n retryDelay: number;\n maxAttempts: number;\n}\n\n/**\n * Websocket.\n * NOTE: The port must be unique, so the same hook cannot be used for multiple spaces.\n */\nexport const createWebsocketTrigger: TriggerFactory<WebsocketTrigger, WebsocketTriggerOptions> = async (\n ctx: Context,\n triggerCtx: TriggerContext,\n spec: WebsocketTrigger,\n callback: TriggerCallback,\n options: WebsocketTriggerOptions = { retryDelay: 2, maxAttempts: 5 },\n) => {\n const { url, init } = spec;\n\n let ws: WebSocket;\n for (let attempt = 1; attempt <= options.maxAttempts; attempt++) {\n const open = new Trigger<boolean>();\n\n ws = new WebSocket(url);\n Object.assign(ws, {\n onopen: () => {\n log.info('opened', { url });\n if (spec.init) {\n ws.send(new TextEncoder().encode(JSON.stringify(init)));\n }\n\n open.wake(true);\n },\n\n onclose: (event) => {\n log.info('closed', { url, code: event.code });\n // Reconnect if server closes (e.g., CF restart).\n // https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent/code\n if (event.code === 1006) {\n setTimeout(async () => {\n log.info(`reconnecting in ${options.retryDelay}s...`, { url });\n await createWebsocketTrigger(ctx, triggerCtx, spec, callback, options);\n }, options.retryDelay * 1_000);\n }\n\n open.wake(false);\n },\n\n onerror: (event) => {\n log.catch(event.error, { url });\n },\n\n onmessage: async (event) => {\n try {\n log.info('message');\n const data = JSON.parse(new TextDecoder().decode(event.data as Uint8Array));\n await callback({ data });\n } catch (err) {\n log.catch(err, { url });\n }\n },\n } satisfies Partial<WebSocket>);\n\n const isOpen = await open.wait();\n if (isOpen) {\n break;\n } else {\n const wait = Math.pow(attempt, 2) * options.retryDelay;\n if (attempt < options.maxAttempts) {\n log.warn(`failed to connect; trying again in ${wait}s`, { attempt });\n await sleep(wait * 1_000);\n }\n }\n }\n\n ctx.onDispose(() => {\n ws?.close();\n });\n};\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,mBAAsB;AAEtB,kBAA2C;AAC3C,qBAAuC;AACvC,kBAA0B;AAC1B,iBAAoB;AACpB,kBAA2B;AEN3B,oBAAuC;AAGvC,IAAAA,cAAoB;AACpB,IAAAC,eAA4B;ACJ5B,qBAAoB;AACpB,6BAAwB;AAExB,uBAAqB;AAErB,IAAAC,gBAA+B;AAE/B,IAAAC,kBAAwB;AACxB,uBAA0B;AAC1B,IAAAH,cAAoB;ACTpB,IAAAI,oBAAiB;AAEjB,IAAAF,gBAAsB;AAEtB,IAAAC,kBAAwB;AACxB,IAAAH,cAAoB;ACLpB,IAAAE,gBAAsB;AAEtB,IAAAG,eAAoD;AACpD,IAAAF,kBAAkC;AAClC,yBAAwE;AACxE,IAAAG,oBAA0B;AAC1B,IAAAC,eAA0B;AAC1B,IAAAP,cAAoB;AACpB,IAAAC,eAA2B;ACR3B,mBAA2B;AAC3B,IAAAC,gBAA0C;AAE1C,qBAA+E;AAC/E,IAAAF,cAAoB;ACJpB,kBAAwB;AAExB,IAAAE,gBAA6B;AAE7B,IAAAF,cAAoB;ACJpB,IAAAQ,0BAAwB;AACxB,uBAAiB;AAGjB,IAAAR,cAAoB;ACJpB,gBAAsB;AAEtB,IAAAE,gBAA+B;AAE/B,IAAAF,cAAoB;ARWb,IAAMS,OAAO,CAClBC,UACAC,MACAC,eAAAA;AAEA,QAAMC,YAAY;OAAIH;;AACtB,QAAMI,SAA2B;IAC/BC,OAAO,CAAA;IACPC,SAAS,CAAA;IACTC,SAASJ;EACX;AAGA,aAAWK,UAAUP,MAAM;AACzB,UAAMQ,QAAQN,UAAUO,UAAU,CAACC,SAAST,WAAWS,MAAMH,MAAAA,CAAAA;AAC7D,QAAIC,UAAU,IAAI;AAChBL,aAAOC,MAAMO,KAAKJ,MAAAA;IACpB,OAAO;AACLJ,aAAOE,QAAQM,KAAKT,UAAUM,KAAAA,CAAM;AACpCN,gBAAUU,OAAOJ,OAAO,CAAA;IAC1B;EACF;AAEA,SAAOL;AACT;AAGO,IAAMU,eAAe,CAAWC,GAAQC,GAAQd,eACrDa,EAAEE,OAAO,CAACF,OAAMC,EAAEE,KAAK,CAACF,OAAMd,WAAWa,IAAGC,EAAAA,CAAAA,MAAQG,MAAAA;;AD3B/C,IAAMC,mBAAN,cAA+BC,wBAAAA;EAKpCC,YAA6BC,SAAiB;AAC5C,UAAK;SADsBA,UAAAA;SAJZC,sBAAsB,IAAIC,uBAAqCC,sBAAUC,IAAI;SAE9EC,aAAa,IAAIC,mBAAAA;EAIjC;EAEOC,aAAaC,OAA6B;AAC/C,WAAO,KAAKP,oBAAoBQ,IAAID,MAAME,GAAG,KAAK,CAAA;EACpD;;;;;EAMA,MAAaC,SAASH,OAAcI,WAAyD;AAC3FC,wBAAI,YAAY;MAAEL,OAAOA,MAAME;MAAKE,WAAWA,WAAWE,UAAU;IAAE,GAAA;;;;;;AACtE,QAAI,CAACF,WAAWE,QAAQ;AACtB;IACF;AACA,QAAI,CAACN,MAAMO,GAAGC,MAAMC,sBAAsBC,UAAUC,iCAAAA,GAAc;AAChEX,YAAMO,GAAGC,MAAMC,sBAAsBG,eAAeD,iCAAAA;IACtD;AAGA,UAAM,EAAEE,SAASC,SAAQ,IAAK,MAAMd,MAAMO,GAAGQ,MAAMC,mBAAOC,OAAON,iCAAAA,CAAAA,EAAcO,IAAG;AAClF,UAAM,EAAE5C,OAAOE,QAAO,IAAKR,KAAK8C,UAAUV,WAAW,CAACpB,GAAGC,MAAMD,EAAEmC,QAAQlC,EAAEkC,GAAG;AAC9E7C,UAAM8C,QAAQ,CAACC,QAAQrB,MAAMO,GAAGe,QAAIC,oBAAOZ,mCAAaU,GAAAA,CAAAA,CAAAA;AAExD7C,YAAQ4C,QAAQ,CAACC,QAAQrB,MAAMO,GAAGiB,OAAOH,GAAAA,CAAAA;EAC3C;EAEA,MAAyBI,QAAuB;AAC9C,UAAMC,qBAAqB,KAAKlC,QAAQmC,OAAOC,UAAU,OAAOD,WAAAA;AAC9D,iBAAW3B,SAAS2B,QAAQ;AAC1B,YAAI,KAAKlC,oBAAoBoC,IAAI7B,MAAME,GAAG,GAAG;AAC3C;QACF;AAEA,cAAML,aAA4B,CAAA;AAClC,aAAKJ,oBAAoBqC,IAAI9B,MAAME,KAAKL,UAAAA;AACxC,cAAMG,MAAM+B,eAAc;AAC1B,YAAI,KAAKC,KAAKC,UAAU;AACtB;QACF;AAGA,aAAKD,KAAKE,UACRlC,MAAMO,GAAGQ,MAAMC,mBAAOC,OAAON,iCAAAA,CAAAA,EAAciB,UAAU,CAAC,EAAEf,QAAO,MAAE;AAC/D,gBAAM,EAAEvC,MAAK,IAAKN,KAAK6B,YAAYgB,SAAS,CAAC7B,GAAGC,MAAMD,EAAEmC,QAAQlC,EAAEkC,GAAG;AAErE,cAAI7C,MAAMgC,SAAS,GAAG;AACpBT,uBAAWhB,KAAI,GAAIP,KAAAA;AACnB,iBAAKuB,WAAWsC,KAAK;cAAEnC;cAAO1B;YAAM,CAAA;UACtC;QACF,CAAA,CAAA;MAEJ;IACF,CAAA;AAGA,SAAK0D,KAAKE,UAAU,MAAMR,mBAAmBU,YAAW,CAAA;EAC1D;EAEA,MAAyBC,OAAOC,GAA2B;AACzD,SAAK7C,oBAAoB8C,MAAK;EAChC;AACF;;AEVO,IAAMC,sBAAsB,CACjCC,YAAAA;AAEA,SAAO,CAAC,EAAEC,OAAO,EAAEC,KAAI,GAAIC,SAAS,GAAGC,KAAAA,MAAM;AAC3C,UAAM,EAAEC,OAAM,IAAKF;AACnB,UAAM5C,QAAQ2C,KAAKI,WAAWD,OAAOnB,OAAO1B,IAAIN,cAAAA,UAAUqD,KAAKL,KAAKI,QAAQ,CAAA,IAAK3D;AACjF,UAAMyB,UAAUb,QACZ2C,KAAK9B,SAASoC,IAAyC,CAACC,OAAOlD,MAAOO,GAAG4C,cAAcD,EAAAA,CAAAA,EAAKhE,OAAOkE,wBAAAA,IACnG,CAAA;AAEJ,QAAI,CAAC,CAACT,KAAKI,YAAY,CAAC/C,OAAO;AAC7BK,kBAAAA,IAAIgD,KAAK,iBAAiB;QAAEV;MAAK,GAAA;;;;;;IACnC,OAAO;AACLtC,kBAAAA,IAAIiD,KAAK,WAAW;QAAEtD,OAAOA,OAAOE,IAAIqD,SAAAA;QAAY1C,SAASA,SAASP;MAAO,GAAA;;;;;;IAC/E;AAEA,WAAOmC,QAAQ;MAAEC,OAAO;QAAEC,MAAM;UAAE,GAAGA;UAAM3C;UAAOa;QAAQ;MAAE;MAAG+B;MAAS,GAAGC;IAAK,CAAA;EAClF;AACF;;ACpEO,IAAMW,YAAN,MAAMA;EAcXjE,YACmBC,SACAiE,oBACAC,UACjB;SAHiBlE,UAAAA;SACAiE,qBAAAA;SACAC,WAAAA;SAhBX1B,OAAO2B,cAAAA;SAGEC,YAAiF,CAAC;SAM3FC,OAAO;SAECC,SAAS,IAAIhE,cAAAA,MAAAA;AAO3B,SAAK2D,mBAAmB5D,WAAWkE,GAAG,OAAO,EAAEzF,MAAK,MAAE;AACpDA,YAAM8C,QAAQ,CAACC,QAAQ,KAAK2C,MAAM3C,GAAAA,CAAAA;AAClC,YAAM,KAAK4C,wBAAuB;AAClC5D,sBAAAA,KAAI,wBAAwB;QAAE/B;MAAM,GAAA;;;;;;IACtC,CAAA;EACF;EAEA,IAAI4F,QAAQ;AACV,WAAO;MACLC,KAAK,KAAKN;IACZ;EACF;EAEA,IAAIO,WAAW;AACbC,oCAAU,KAAKC,OAAK,QAAA;;;;;;;;;AACpB,WAAO,oBAAoB,KAAKA,KAAK;EACvC;EAEA,IAAIC,QAAQ;AACV,WAAO,KAAKC;EACd;EAEA,IAAIpE,YAAY;AACd,WAAOqE,OAAOC,OAAO,KAAKd,SAAS;EACrC;EAEA,MAAMe,QAAQ;AACZN,oCAAU,CAAC,KAAKO,SAAO,QAAA;;;;;;;;;AACvBvE,gBAAAA,IAAIiD,KAAK,eAAA,QAAA;;;;;;AACT,SAAKtB,OAAO2B,cAAAA;AAGZ,UAAMkB,UAAMC,eAAAA,SAAAA;AACZD,QAAIE,IAAID,eAAAA,QAAQE,KAAI,CAAA;AAEpBH,QAAII,KAAK,UAAU,OAAOC,KAAKC,QAAAA;AAC7B,YAAM,EAAEC,MAAAA,MAAI,IAAKF,IAAIG;AACrB,UAAI;AACFhF,oBAAAA,IAAIiD,KAAK,WAAW;UAAE8B,MAAAA;QAAK,GAAA;;;;;;AAC3B,YAAI,KAAK1B,SAAS4B,QAAQ;AACxB,gBAAM,EAAEjE,IAAG,IAAK,KAAKuC,UAAU,MAAMwB,KAAAA;AACrC,gBAAM,KAAKpB,MAAM3C,KAAK,IAAA;QACxB;AAGA8D,YAAII,aAAa,MAAM,KAAKC,OAAO,MAAMJ,OAAMF,IAAIO,IAAI;AACvDN,YAAIO,IAAG;MACT,SAASC,KAAU;AACjBtF,oBAAAA,IAAIuF,MAAMD,KAAAA,QAAAA;;;;;;AACVR,YAAII,aAAa;AACjBJ,YAAIO,IAAG;MACT;IACF,CAAA;AAEA,SAAKpB,QAAQ,UAAMuB,gCAAQ;MAAEC,MAAM;MAAaC,MAAM;MAAMC,WAAW;QAAC;QAAM;;IAAM,CAAA;AACpF,SAAKpB,UAAUC,IAAIoB,OAAO,KAAK3B,KAAK;AAEpC,QAAI;AAEF,YAAM,EAAE4B,gBAAgB9B,SAAQ,IAAK,MAAM,KAAK5E,QAAQ2G,SAASA,SAASC,wBAAyBjG,SAAS;QAC1GiE,UAAU,KAAKA;MACjB,CAAA;AAEA/D,kBAAAA,IAAIiD,KAAK,cAAc;QAAEc;MAAS,GAAA;;;;;;AAClC,WAAKI,SAASJ;AACd,WAAKiC,+BAA+BH;AAGpC,YAAM,KAAKzC,mBAAmB6C,KAAK,KAAKtE,IAAI;IAC9C,SAAS2D,KAAU;AACjB,YAAM,KAAKY,KAAI;AACf,YAAM,IAAIC,MAAM,qEAAA;IAClB;AAEAnG,gBAAAA,IAAIiD,KAAK,WAAW;MAAEyC,MAAM,KAAKzB;IAAM,GAAA;;;;;;EACzC;EAEA,MAAMiC,OAAO;AACXlC,oCAAU,KAAKO,SAAO,QAAA;;;;;;;;;AACtBvE,gBAAAA,IAAIiD,KAAK,eAAA,QAAA;;;;;;AAET,UAAMmD,UAAU,IAAIC,sBAAAA;AACpB,SAAK9B,QAAQ+B,MAAM,YAAA;AACjBtG,kBAAAA,IAAIiD,KAAK,kBAAA,QAAA;;;;;;AACT,UAAI;AACF,YAAI,KAAK+C,8BAA8B;AACrChC,0CAAU,KAAK7E,QAAQ2G,SAASA,SAASC,yBAAuB,QAAA;;;;;;;;;AAChE,gBAAM,KAAK5G,QAAQ2G,SAASA,SAASC,wBAAwBQ,WAAW;YACtEV,gBAAgB,KAAKG;UACvB,CAAA;AAEAhG,sBAAAA,IAAIiD,KAAK,gBAAgB;YAAE4C,gBAAgB,KAAKG;UAA6B,GAAA;;;;;;AAC7E,eAAKA,+BAA+BjH;AACpC,eAAKoF,SAASpF;QAChB;AAEAqH,gBAAQI,KAAI;MACd,SAASlB,KAAK;AACZc,gBAAQK,MAAMnB,GAAAA;MAChB;IACF,CAAA;AAEA,UAAMc,QAAQM,KAAI;AAClB,SAAKzC,QAAQlF;AACb,SAAKwF,UAAUxF;AACfiB,gBAAAA,IAAIiD,KAAK,WAAA,QAAA;;;;;;EACX;;;;EAKA,MAAcU,MAAM3C,KAAkB2F,OAA6B;AACjE,UAAM,EAAE7F,KAAK8F,OAAOxE,QAAO,IAAKpB;AAChC,UAAM6F,eAAWC,uBAAK,KAAKzD,SAAS0D,SAAS3E,OAAAA;AAC7CpC,gBAAAA,IAAIiD,KAAK,WAAW;MAAEnC;MAAK6F;IAAM,GAAA;;;;;;AAGjC,QAAIA,OAAO;AACTvC,aAAO4C,KAAKC,gCAAQC,KAAK,EACtBrI,OAAO,CAACgB,QAAQA,IAAIsH,WAAWN,QAAAA,CAAAA,EAC/B9F,QAAQ,CAAClB,QAAAA;AACR,eAAOoH,gCAAQC,MAAMrH,GAAAA;MACvB,CAAA;IACJ;AAIA,UAAMuH,cAASH,iCAAQJ,QAAAA;AACvB,QAAI,OAAOO,QAAOC,YAAY,YAAY;AACxC,YAAM,IAAIlB,MAAM,yCAAyCrF,GAAAA,EAAK;IAChE;AAEA,SAAKyC,UAAUqD,KAAAA,IAAS;MAAE5F;MAAKoB,SAASgF,QAAOC;IAAQ;EACzD;EAEA,MAAczD,0BAAyC;AACrDI,oCAAU,KAAKgC,8BAA4B,QAAA;;;;;;;;;AAC3C,QAAI;AACF,YAAM,KAAK7G,QAAQ2G,SAASA,SAASC,wBAAyBuB,mBAAmB;QAC/EzB,gBAAgB,KAAKG;QACrBjG,WAAW,KAAKA,UAAU6C,IAAI,CAAC,EAAE5B,KAAK,EAAE6B,IAAI+D,MAAK,EAAE,OAAQ;UAAE/D;UAAI+D;QAAM,EAAA;MACzE,CAAA;IACF,SAASW,GAAG;AACVvH,kBAAAA,IAAIuF,MAAMgC,GAAAA,QAAAA;;;;;;IACZ;EACF;;;;EAKA,MAAapC,OAAOJ,OAAczC,MAA4B;AAC5D,UAAMwB,MAAM,EAAE,KAAKN;AACnB,UAAMgE,MAAMC,KAAKD,IAAG;AAEpBxH,gBAAAA,IAAIiD,KAAK,OAAO;MAAEa;MAAKiB,MAAAA;IAAK,GAAA;;;;;;AAC5B,UAAMG,aAAa,MAAM,KAAKwC,QAAQ3C,OAAM;MAAEzC;IAAK,CAAA;AAEnDtC,gBAAAA,IAAIiD,KAAK,OAAO;MAAEa;MAAKiB,MAAAA;MAAMG;MAAYyC,UAAUF,KAAKD,IAAG,IAAKA;IAAI,GAAA;;;;;;AACpE,SAAK/D,OAAO3B,KAAKoD,UAAAA;AACjB,WAAOA;EACT;EAEA,MAAcwC,QAAQ3C,OAAc1C,OAAsB;AACxD,UAAM,EAAED,QAAO,IAAK,KAAKmB,UAAUwB,KAAAA,KAAS,CAAC;AAC7Cf,oCAAU5B,SAAS,iBAAiB2C,KAAAA,IAAM;;;;;;;;;AAE1C,UAAMxC,UAA2B;MAC/BE,QAAQ,KAAKtD;MACbyI,SAAS,KAAKvE,SAASuE;IACzB;AAEA,QAAI1C,aAAa;AACjB,UAAM2C,WAA6B;MACjCC,QAAQ,CAACC,SAAAA;AACP7C,qBAAa6C;AACb,eAAOF;MACT;IACF;AAEA,UAAMzF,QAAQ;MAAEG;MAASF;MAAOwF;IAAS,CAAA;AACzC,WAAO3C;EACT;AACF;AAEA,IAAM5B,gBAAgB,MAAM,IAAI0E,wBAAQ;EAAEC,MAAM;AAAY,CAAA;;AC9MrD,IAAMC,YAAN,MAAMA;EAKXhJ,YACkBa,WACAoI,UACC9E,WAA6B,CAAC,GAC/C;SAHgBtD,YAAAA;SACAoI,WAAAA;SACC9E,WAAAA;SAPX1B,OAAO2B,eAAAA;SAEE8E,aAAa,IAAIC,oBAAAA;AAOhC,SAAKtI,UAAUP,WAAWkE,GAAG,OAAO,EAAE/D,OAAO1B,MAAK,MAAE;AAClD,YAAM,KAAKqK,sBAAsB3I,OAAO,KAAKwI,SAASI,oBAAoB5I,KAAAA,GAAQ1B,KAAAA;IACpF,CAAA;AACA,SAAKkK,SAAS3I,WAAWkE,GAAG,OAAO,EAAE/D,OAAOwI,UAAAA,UAAQ,MAAE;AACpD,YAAM,KAAKG,sBAAsB3I,OAAOwI,WAAU,KAAKpI,UAAUL,aAAaC,KAAAA,CAAAA;IAChF,CAAA;EACF;EAEA,MAAM2E,QAAQ;AACZ,UAAM,KAAK3C,KAAK6G,QAAO;AACvB,SAAK7G,OAAO2B,eAAAA;AACZ,UAAM,KAAKvD,UAAUkG,KAAK,KAAKtE,IAAI;AACnC,UAAM,KAAKwG,SAASlC,KAAK,KAAKtE,IAAI;EACpC;EAEA,MAAMuE,OAAO;AACX,UAAM,KAAKvE,KAAK6G,QAAO;AACvB,UAAM,KAAKzI,UAAUuG,MAAK;AAC1B,UAAM,KAAK6B,SAAS7B,MAAK;EAC3B;;EAGA,MAAaxG,SAASH,OAAc8I,UAA4B;AAC9D,UAAM,KAAK1I,UAAUD,SAASH,OAAO8I,SAAS1I,SAAS;AACvD,UAAM,KAAKoI,SAASrI,SAASH,OAAO8I,QAAAA;EACtC;EAEA,MAAcH,sBACZ3I,OACAwI,UACApI,WACe;AACf,UAAM2I,aAAaP,SAASvF,IAAI,CAACwD,YAAAA;AAC/B,aAAO,KAAKuC,SAAShJ,OAAOI,WAAWqG,OAAAA;IACzC,CAAA;AACA,UAAMwC,QAAQC,IAAIH,UAAAA,EAAYnD,MAAMvF,YAAAA,IAAIuF,KAAK;EAC/C;EAEA,MAAcoD,SAAShJ,OAAcI,WAA0B+I,WAA4B;AACzF,UAAMC,aAAahJ,UAAUjB,KAAK,CAACkC,QAAQA,IAAIF,QAAQgI,UAAUE,QAAQ;AACzE,QAAI,CAACD,YAAY;AACf/I,kBAAAA,IAAIiD,KAAK,qCAAqC;QAAE6F;MAAU,GAAA;;;;;;AAC1D;IACF;AAEA,UAAM,KAAKX,SAASQ,SAAS;MAAEhJ;IAAM,GAAGmJ,WAAW,OAAOG,SAAAA;AACxD,aAAO,KAAKb,WAAWc,oBAAoB,MAAA;AACzC,eAAO,KAAKC,cAAcJ,YAAYD,WAAW;UAC/CM,MAAMN,UAAUM;UAChB9G,MAAM;YAAE,GAAG2G;YAAMvG,UAAU/C,MAAME;UAAI;QACvC,CAAA;MACF,CAAA;IACF,CAAA;AAEAG,oBAAAA,KAAI,qBAAqB;MAAEL,OAAOA,MAAME;MAAKuG,SAAS0C;IAAU,GAAA;;;;;;EAClE;EAEA,MAAcK,cACZnI,KACAoF,SACA,EAAE9D,MAAM8G,KAAI,GACK;AACjB,QAAItB,SAAS;AACb,QAAI;AAEF,YAAMuB,UAAUjF,OAAOkF,OAAO,CAAC,GAAGF,QAAS;QAAEA;MAAK,GAAuC9G,IAAAA;AAEzF,YAAM,EAAEyB,UAAUwF,SAAQ,IAAK,KAAKlG;AACpC,UAAIU,UAAU;AAEZ,cAAMyF,MAAMzE,kBAAAA,QAAK+B,KAAK/C,UAAU/C,IAAI4F,KAAK;AACzC5G,oBAAAA,IAAIiD,KAAK,QAAQ;UAAE+F,UAAUhI,IAAIF;UAAK0I;UAAKC,aAAarD,QAAQsD,KAAKC;QAAK,GAAA;;;;;;AAC1E,cAAM9B,WAAW,MAAM+B,MAAMJ,KAAK;UAChCK,QAAQ;UACRC,SAAS;YACP,gBAAgB;UAClB;UACA1E,MAAM2E,KAAKC,UAAUX,OAAAA;QACvB,CAAA;AAEAvB,iBAASD,SAASC;MACpB,WAAWyB,UAAU;AACnBvJ,oBAAAA,IAAIiD,KAAK,QAAQ;UAAE+F,UAAUhI,IAAIF;QAAI,GAAA;;;;;;AACrCgH,iBAAU,MAAMyB,SAASF,OAAAA,KAAa;MACxC;AAGA,UAAIvB,UAAUA,UAAU,KAAK;AAC3B,cAAM,IAAI3B,MAAM,aAAa2B,MAAAA,EAAQ;MACvC;AAGA9H,kBAAAA,IAAIiD,KAAK,QAAQ;QAAE+F,UAAUhI,IAAIF;QAAKgH;MAAO,GAAA;;;;;;IAC/C,SAASxC,KAAU;AACjBtF,kBAAAA,IAAIiK,MAAM,SAAS;QAAEjB,UAAUhI,IAAIF;QAAKmJ,OAAO3E,IAAI4E;MAAQ,GAAA;;;;;;AAC3DpC,eAAS;IACX;AAEA,WAAOA;EACT;AACF;AAEA,IAAMxE,iBAAgB,MAAM,IAAI0E,gBAAAA,QAAQ;EAAEC,MAAM;AAAoB,CAAA;;AE7H7D,IAAMkC,4BAAiE,OAC5EC,KACAC,YACAX,MACAH,aAAAA;AAEA,QAAMe,YAAY,oBAAIC,IAAAA;AACtB,QAAMC,OAAO,IAAIC,8BACfL,KACA,YAAA;AACE,QAAIE,UAAUI,OAAO,GAAG;AACtB,YAAMlK,UAAUmK,MAAMhI,KAAK2H,SAAAA;AAC3BA,gBAAUpI,MAAK;AACf,YAAMqH,SAAS;QAAE/I;MAAQ,CAAA;IAC3B;EACF,GACA;IAAEoK,cAAc;EAAE,CAAA;AAKpB,QAAMC,gBAAgC,CAAA;AACtC,QAAMC,mBAAeC,mCAAmB,CAAC,EAAE9M,OAAOC,QAAO,MAAE;AACzD,UAAM8M,aAAaV,UAAUI;AAC7B,eAAWtM,UAAUH,OAAO;AAC1BqM,gBAAUrJ,IAAI7C,OAAOyE,EAAE;IACzB;AACA,eAAWzE,UAAUF,SAAS;AAC5BoM,gBAAUrJ,IAAI7C,OAAOyE,EAAE;IACzB;AACA,QAAIyH,UAAUI,OAAOM,YAAY;AAC/BhL,kBAAAA,IAAIiD,KAAK,WAAW;QAAEhF,OAAOA,MAAMgC;QAAQ/B,SAASA,QAAQ+B;MAAO,GAAA;;;;;;AACnEuK,WAAKpE,QAAO;IACd;EACF,CAAA;AAEAyE,gBAAcrM,KAAK,MAAMsM,aAAa/I,YAAW,CAAA;AAGjD,QAAM,EAAElD,QAAQoM,SAAS,EAAEC,MAAMC,MAAK,IAAK,CAAC,EAAC,IAAKzB;AAClD,QAAMjG,SAAS,CAAC,EAAEjD,QAAO,MAAS;AAChCsK,iBAAarH,OAAOjD,OAAAA;AAGpB,QAAI0K,MAAM;AACRlL,kBAAAA,IAAIiD,KAAK,UAAU;QAAEzC,SAASA,QAAQP;MAAO,GAAA;;;;;;AAC7C,iBAAW7B,UAAUoC,SAAS;AAC5B,cAAM4K,UAAUhN,OAAOgN;AACvB,YAAIA,mBAAmBC,yBAAY;AACjCR,wBAAcrM,SACZ8M,uCAAuBF,OAAAA,EAASG,QAAQ7H,OAAG8H,wBAAS,MAAMV,aAAarH,OAAO;YAACrF;WAAO,GAAG,GAAA,CAAA,CAAA;QAE7F;MACF;IACF;EACF;AAKA,QAAMsC,QAAQ2J,WAAW1K,MAAMO,GAAGQ,MAAMC,eAAAA,OAAO8K,GAAG5M,OAAO+D,IAAI,CAAC,EAAE+G,MAAM+B,MAAK,MAAO/K,eAAAA,OAAOgL,SAAShC,MAAM+B,KAAAA,CAAAA,CAAAA,CAAAA;AACxGb,gBAAcrM,KAAKkC,MAAMa,UAAU4J,YAAQK,wBAAS/H,QAAQ0H,KAAAA,IAAS1H,MAAAA,CAAAA;AAErE2G,MAAIvI,UAAU,MAAA;AACZgJ,kBAAc9J,QAAQ,CAACgB,gBAAgBA,YAAAA,CAAAA;EACzC,CAAA;AACF;;AClEO,IAAM6J,qBAAmD,OAC9DxB,KACAyB,gBACAnC,MACAH,aAAAA;AAEA,QAAMiB,OAAO,IAAIsB,2BAAa1B,KAAK,YAAA;AACjC,UAAMb,SAAS,CAAC,CAAA;EAClB,CAAA;AAEA,MAAIwC,OAAO;AACX,MAAIlL,MAAM;AAEV,QAAMmL,MAAMC,oBAAQtJ,KAAK;IACvBuJ,UAAUxC,KAAKyC;IACfC,WAAW;IACXC,QAAQ,MAAA;AAEN,YAAM7E,MAAMC,KAAKD,IAAG;AACpB,YAAM8E,QAAQP,OAAOvE,MAAMuE,OAAO;AAClCA,aAAOvE;AAEP3G;AACAb,kBAAAA,IAAIiD,KAAK,QAAQ;QAAEtD,OAAOkM,eAAelM,MAAME,IAAIqD,SAAQ;QAAIqJ,OAAO1L;QAAKyL;MAAM,GAAA;;;;;;AACjF9B,WAAKgC,SAAQ;IACf;EACF,CAAA;AAEAR,MAAI1H,MAAK;AACT8F,MAAIvI,UAAU,MAAMmK,IAAI9F,KAAI,CAAA;AAC9B;;AC9BO,IAAMuG,uBAAuD,OAClErC,KACAnI,GACAyH,MACAH,aAAAA;AAGA,QAAMmD,SAASC,iBAAAA,QAAKC,aAAa,OAAO/H,KAAKC,QAAAA;AAC3C,QAAID,IAAIgF,WAAWH,KAAKG,QAAQ;AAC9B/E,UAAII,aAAa;AACjB,aAAOJ,IAAIO,IAAG;IAChB;AACAP,QAAII,aAAa,MAAMqE,SAAS,CAAC,CAAA;AACjCzE,QAAIO,IAAG;EACT,CAAA;AAKA,QAAMK,OAAO,UAAMF,wBAAAA,SAAQ;IACzBqH,QAAQ;EAEV,CAAA;AAGAH,SAAO9G,OAAOF,MAAM,MAAA;AAClB1F,gBAAAA,IAAIiD,KAAK,mBAAmB;MAAEyC;IAAK,GAAA;;;;;;AACnCgE,SAAKhE,OAAOA;EACd,CAAA;AAEA0E,MAAIvI,UAAU,MAAA;AACZ6K,WAAOpG,MAAK;EACd,CAAA;AACF;;ACxBO,IAAMwG,yBAAoF,OAC/F1C,KACAC,YACAX,MACAH,UACA0B,UAAmC;EAAE8B,YAAY;EAAGC,aAAa;AAAE,MAAC;AAEpE,QAAM,EAAExD,KAAKyD,KAAI,IAAKvD;AAEtB,MAAIwD;AACJ,WAASC,UAAU,GAAGA,WAAWlC,QAAQ+B,aAAaG,WAAW;AAC/D,UAAMlH,OAAO,IAAII,cAAAA,QAAAA;AAEjB6G,SAAK,IAAIE,UAAAA,QAAU5D,GAAAA;AACnBpF,WAAOkF,OAAO4D,IAAI;MAChBG,QAAQ,MAAA;AACNrN,oBAAAA,IAAIiD,KAAK,UAAU;UAAEuG;QAAI,GAAA;;;;;;AACzB,YAAIE,KAAKuD,MAAM;AACbC,aAAGI,KAAK,IAAIC,YAAAA,EAAcC,OAAOzD,KAAKC,UAAUiD,IAAAA,CAAAA,CAAAA;QAClD;AAEAhH,aAAKO,KAAK,IAAA;MACZ;MAEAiH,SAAS,CAACpL,UAAAA;AACRrC,oBAAAA,IAAIiD,KAAK,UAAU;UAAEuG;UAAKzB,MAAM1F,MAAM0F;QAAK,GAAA;;;;;;AAG3C,YAAI1F,MAAM0F,SAAS,MAAM;AACvB2F,qBAAW,YAAA;AACT1N,wBAAAA,IAAIiD,KAAK,mBAAmBgI,QAAQ8B,UAAU,QAAQ;cAAEvD;YAAI,GAAA;;;;;;AAC5D,kBAAMsD,uBAAuB1C,KAAKC,YAAYX,MAAMH,UAAU0B,OAAAA;UAChE,GAAGA,QAAQ8B,aAAa,GAAA;QAC1B;AAEA9G,aAAKO,KAAK,KAAA;MACZ;MAEAmH,SAAS,CAACtL,UAAAA;AACRrC,oBAAAA,IAAIuF,MAAMlD,MAAM4H,OAAO;UAAET;QAAI,GAAA;;;;;;MAC/B;MAEAoE,WAAW,OAAOvL,UAAAA;AAChB,YAAI;AACFrC,sBAAAA,IAAIiD,KAAK,WAAA,QAAA;;;;;;AACT,gBAAMX,OAAOyH,KAAK8D,MAAM,IAAIC,YAAAA,EAAcC,OAAO1L,MAAMC,IAAI,CAAA;AAC3D,gBAAMiH,SAAS;YAAEjH;UAAK,CAAA;QACxB,SAASgD,KAAK;AACZtF,sBAAAA,IAAIuF,MAAMD,KAAK;YAAEkE;UAAI,GAAA;;;;;;QACvB;MACF;IACF,CAAA;AAEA,UAAMwE,SAAS,MAAM/H,KAAKS,KAAI;AAC9B,QAAIsH,QAAQ;AACV;IACF,OAAO;AACL,YAAMtH,OAAOuH,KAAKC,IAAIf,SAAS,CAAA,IAAKlC,QAAQ8B;AAC5C,UAAII,UAAUlC,QAAQ+B,aAAa;AACjChN,oBAAAA,IAAIgD,KAAK,sCAAsC0D,IAAAA,KAAS;UAAEyG;QAAQ,GAAA;;;;;;AAClE,kBAAMgB,qBAAMzH,OAAO,GAAA;MACrB;IACF;EACF;AAEA0D,MAAIvI,UAAU,MAAA;AACZqL,QAAI5G,MAAAA;EACN,CAAA;AACF;;AJvDA,IAAM8H,kBAAqC;EACzCtD,cAAcX;EACdkE,OAAOzC;EACP0C,SAAS7B;EACT8B,WAAWzB;AACb;AAYO,IAAM0B,kBAAN,cAA8BvP,gBAAAA,SAAAA;EAMnCC,YACmBC,SACAkE,UACjB;AACA,UAAK;SAHYlE,UAAAA;SACAkE,WAAAA;SAPFoL,sBAAsB,IAAIpP,aAAAA,WAA2CC,aAAAA,UAAUC,IAAI;SAEpFC,aAAa,IAAIC,cAAAA,MAAAA;SACjBtB,UAAU,IAAIsB,cAAAA,MAAAA;EAO9B;EAEOiP,kBAAkB/O,OAAiC;AACxD,WAAO,KAAKgP,aAAahP,OAAO,CAACiP,MAAMA,EAAEC,iBAAiB,IAAA;EAC5D;EAEOtG,oBAAoB5I,OAAiC;AAC1D,WAAO,KAAKgP,aAAahP,OAAO,CAACiP,MAAMA,EAAEC,iBAAiB,IAAA;EAC5D;EAEA,MAAMlG,SAAS0B,YAA4BjE,SAA0BmD,UAA0C;AAC7GvJ,oBAAAA,KAAI,YAAY;MAAEL,OAAO0K,WAAW1K,MAAME;MAAKuG;IAAQ,GAAA;;;;;;AACvD,UAAMyI,gBAAgB,IAAI7G,gBAAAA,QAAQ;MAAEC,MAAM,WAAW7B,QAAQ4C,QAAQ;IAAG,CAAA;AACxE,SAAKrH,KAAKE,UAAU,MAAMgN,cAAcrG,QAAO,CAAA;AAC/C,UAAMsG,oBAAoB,KAAKL,oBAC5B7O,IAAIyK,WAAW1K,MAAME,GAAG,GACvBf,KAAK,CAACiQ,QAAQA,IAAI3I,QAAQvD,OAAOuD,QAAQvD,EAAE;AAC/CmB,0BAAAA,WAAU8K,mBAAmB,8BAA8B1I,QAAQ4C,QAAQ,IAAE;;;;;;;;;AAC7E8F,sBAAkBD,gBAAgBA;AAElC,QAAI;AACF,YAAM5D,UAAU,KAAK5H,WAAW+C,QAAQsD,KAAKC,IAAI;AACjD,YAAMyE,gBAAgBhI,QAAQsD,KAAKC,IAAI,EAAEkF,eAAexE,YAAYjE,QAAQsD,MAAMH,UAAU0B,OAAAA;IAC9F,SAAS3F,KAAK;AACZ,aAAOwJ,kBAAkBD;AACzB,YAAMvJ;IACR;EACF;;;;EAKA,MAAaxF,SAASH,OAAc8I,UAA2C;AAC7EzI,oBAAAA,KAAI,YAAY;MAAEL,OAAOA,MAAME;IAAI,GAAA;;;;;;AACnC,QAAI,CAAC4I,SAASN,UAAUlI,QAAQ;AAC9B;IACF;AACA,QAAI,CAACN,MAAMO,GAAGC,MAAMC,sBAAsBC,UAAU2O,qCAAAA,GAAkB;AACpErP,YAAMO,GAAGC,MAAMC,sBAAsBG,eAAeyO,qCAAAA;IACtD;AAGA,UAAM,EAAExO,SAASC,SAAQ,IAAK,MAAMd,MAAMO,GAAGQ,MAAMC,aAAAA,OAAOC,OAAOoO,qCAAAA,CAAAA,EAAkBnO,IAAG;AACtF,UAAM,EAAE5C,OAAOE,QAAO,IAAKR,KAAK8C,UAAUgI,SAASN,UAAU,CAACxJ,GAAGC,MAAAA;AAG/D,YAAMoI,OAAOpI,EAAEqQ,iCAAAA,GAAiBjI,QAAQ;YAACkI,+BAAW,YAAY;UAACtQ,EAAEoK;UAAUpK,EAAE8K,KAAKC;UAAM7C,KAAK,GAAA,CAAA;;AAC/F,aAAOpI,iBAAayQ,sBAAQxQ,CAAAA,GAAIqI,QAAQ,CAAA,GAAIA,MAAMoI,mCAAAA,EAAkBnP,SAAS;IAC/E,CAAA;AAEAhC,UAAM8C,QAAQ,CAACqF,YAAAA;AACb,YAAM,EAAEgD,MAAMhL,OAAM,QAAKiR,8BAAUjJ,OAAAA;AACnCzG,YAAMO,GAAGe,QAAIC,aAAAA,QAAO8N,uCAAiB5Q,QAAQgL,IAAAA,CAAAA;IAC/C,CAAA;AAEAjL,YAAQ4C,QAAQ,CAACqF,YAAYzG,MAAMO,GAAGiB,OAAOiF,OAAAA,CAAAA;EAC/C;EAEA,MAAyBhF,QAAuB;AAC9C,UAAMkO,wBAAwB,KAAKnQ,QAAQmC,OAAOC,UAAU,OAAOD,WAAAA;AACjE,iBAAW3B,SAAS2B,QAAQ;AAC1B,YAAI,KAAKmN,oBAAoBjN,IAAI7B,MAAME,GAAG,GAAG;AAC3C;QACF;AAEA,cAAML,aAAkC,CAAA;AACxC,aAAKiP,oBAAoBhN,IAAI9B,MAAME,KAAKL,UAAAA;AACxC,cAAMG,MAAM+B,eAAc;AAC1B,YAAI,KAAKC,KAAKC,UAAU;AACtB;QACF;AACA,cAAM2N,wBAAwB5P,MAAMO,GAAGQ,MAAMC,aAAAA,OAAOC,OAAOoO,qCAAAA,CAAAA,EAAkBzN,UAAU,OAAO4G,aAAAA;AAC5F,gBAAM,KAAKqH,uBAAuB7P,OAAOwI,SAAS3H,SAAShB,UAAAA;AAC3D,eAAKiQ,mBAAmB9P,OAAOwI,SAAS3H,SAAShB,UAAAA;QACnD,CAAA;AAEA,aAAKmC,KAAKE,UAAU0N,qBAAAA;MACtB;IACF,CAAA;AAEA,SAAK5N,KAAKE,UAAU,MAAMyN,sBAAsBvN,YAAW,CAAA;EAC7D;EAEA,MAAyBC,OAAOC,GAA2B;AACzD,SAAKwM,oBAAoBvM,MAAK;EAChC;EAEQuN,mBAAmB9P,OAAc+P,aAAgClQ,YAAiC;AACxG,UAAMmQ,cAAcD,YAAY7Q,OAAO,CAAC+Q,cAAAA;AACtC,aAAOpQ,WAAWV,KAAK,CAACiQ,QAAQA,IAAI3I,QAAQvD,OAAO+M,UAAU/M,EAAE,KAAK;IACtE,CAAA;AAEA,QAAI8M,YAAY1P,SAAS,GAAG;AAC1B,YAAM4P,wBAA6CF,YAAY/M,IAAI,CAACwD,aAAa;QAAEA;MAAQ,EAAA;AAC3F5G,iBAAWhB,KAAI,GAAIqR,qBAAAA;AACnB7P,sBAAAA,KAAI,2BAA2B,OAAO;QAAE0C,UAAU/C,MAAME;QAAKE,WAAW4P,YAAY/M,IAAI,CAACgM,MAAMA,EAAE5F,QAAQ;MAAE,IAAA;;;;;;AAC3G,WAAKxJ,WAAWsC,KAAK;QAAEnC;QAAOwI,UAAUwH;MAAY,CAAA;IACtD;EACF;EAEA,MAAcH,uBACZ7P,OACA+P,aACAlQ,YACe;AACf,UAAMrB,UAA6B,CAAA;AACnC,aAAS2R,IAAItQ,WAAWS,SAAS,GAAG6P,KAAK,GAAGA,KAAK;AAC/C,YAAMC,aACJL,YAAY5Q,KAAK,CAACsH,YAA6BA,QAAQvD,OAAOrD,WAAWsQ,CAAAA,EAAG1J,QAAQvD,EAAE,KAAK;AAC7F,UAAIkN,YAAY;AACd,cAAMC,eAAexQ,WAAWf,OAAOqR,GAAG,CAAA,EAAG,CAAA;AAC7C,cAAME,aAAanB,eAAerG,QAAAA;AAClCrK,gBAAQK,KAAKwR,aAAa5J,OAAO;MACnC;IACF;AAEA,QAAIjI,QAAQ8B,SAAS,GAAG;AACtB,WAAK9B,QAAQ2D,KAAK;QAAEnC;QAAOwI,UAAUhK;MAAQ,CAAA;IAC/C;EACF;EAEQwQ,aAAahP,OAAcsQ,WAAuE;AACxG,UAAMC,mBAAmB,KAAKzB,oBAAoB7O,IAAID,MAAME,GAAG,KAAK,CAAA;AACpE,WAAOqQ,iBAAiBrR,OAAOoR,SAAAA,EAAWrN,IAAI,CAACwD,YAAYA,QAAQA,OAAO;EAC5E;AACF;",
|
|
6
|
-
"names": ["import_log", "import_util", "import_async", "import_context", "import_node_path", "import_echo", "import_invariant", "import_keys", "import_get_port_please", "
|
|
3
|
+
"sources": ["../../../src/function/function-registry.ts", "../../../src/handler.ts", "../../../src/runtime/dev-server.ts", "../../../src/runtime/scheduler.ts", "../../../src/trigger/trigger-registry.ts", "../../../src/trigger/type/subscription-trigger.ts", "../../../src/trigger/type/timer-trigger.ts", "../../../src/trigger/type/webhook-trigger.ts", "../../../src/trigger/type/websocket-trigger.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Event } from '@dxos/async';\nimport { type Client } from '@dxos/client';\nimport { create, Filter, type Space } from '@dxos/client/echo';\nimport { type Context, Resource } from '@dxos/context';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { ComplexMap, diff } from '@dxos/util';\n\nimport { FunctionDef, type FunctionManifest } from '../types';\n\nexport type FunctionsRegisteredEvent = {\n space: Space;\n added: FunctionDef[];\n};\n\nexport class FunctionRegistry extends Resource {\n private readonly _functionBySpaceKey = new ComplexMap<PublicKey, FunctionDef[]>(PublicKey.hash);\n\n public readonly registered = new Event<FunctionsRegisteredEvent>();\n\n constructor(private readonly _client: Client) {\n super();\n }\n\n public getFunctions(space: Space): FunctionDef[] {\n return this._functionBySpaceKey.get(space.key) ?? [];\n }\n\n /**\n * Loads function definitions from the manifest into the space.\n * We first load all the definitions from the space to deduplicate by functionId.\n */\n public async register(space: Space, functions: FunctionManifest['functions']): Promise<void> {\n log('register', { space: space.key, functions: functions?.length ?? 0 });\n if (!functions?.length) {\n return;\n }\n if (!space.db.graph.runtimeSchemaRegistry.hasSchema(FunctionDef)) {\n space.db.graph.runtimeSchemaRegistry.registerSchema(FunctionDef);\n }\n\n // Sync definitions.\n const { objects: existing } = await space.db.query(Filter.schema(FunctionDef)).run();\n const { added } = diff(existing, functions, (a, b) => a.uri === b.uri);\n // TODO(burdon): Update existing templates.\n added.forEach((def) => space.db.add(create(FunctionDef, def)));\n }\n\n protected override async _open(): Promise<void> {\n log.info('opening...');\n const spacesSubscription = this._client.spaces.subscribe(async (spaces) => {\n for (const space of spaces) {\n if (this._functionBySpaceKey.has(space.key)) {\n continue;\n }\n\n const registered: FunctionDef[] = [];\n this._functionBySpaceKey.set(space.key, registered);\n await space.waitUntilReady();\n if (this._ctx.disposed) {\n break;\n }\n\n // Subscribe to updates.\n this._ctx.onDispose(\n space.db.query(Filter.schema(FunctionDef)).subscribe(({ objects }) => {\n const { added } = diff(registered, objects, (a, b) => a.uri === b.uri);\n // TODO(burdon): Update and remove.\n if (added.length > 0) {\n registered.push(...added);\n this.registered.emit({ space, added });\n }\n }),\n );\n }\n });\n\n // TODO(burdon): API: Normalize unsubscribe methods.\n this._ctx.onDispose(() => spacesSubscription.unsubscribe());\n }\n\n protected override async _close(_: Context): Promise<void> {\n log.info('closing...');\n this._functionBySpaceKey.clear();\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Client, PublicKey } from '@dxos/client';\nimport { type Space } from '@dxos/client/echo';\nimport { type EchoReactiveObject } from '@dxos/echo-schema';\nimport { log } from '@dxos/log';\nimport { nonNullable } from '@dxos/util';\n\n// TODO(burdon): Model after http request. Ref Lambda/OpenFaaS.\n// https://docs.aws.amazon.com/lambda/latest/dg/typescript-handler.html\n// https://www.serverless.com/framework/docs/providers/aws/guide/serverless.yml/#functions\n// https://www.npmjs.com/package/aws-lambda\n\n/**\n * Function handler.\n */\nexport type FunctionHandler<TData = {}, TMeta = {}> = (params: {\n context: FunctionContext;\n event: FunctionEvent<TData, TMeta>;\n response: FunctionResponse;\n}) => Promise<FunctionResponse | void>;\n\n/**\n * Function context.\n */\nexport interface FunctionContext {\n // TODO(burdon): Limit access to individual space.\n client: Client;\n // TODO(burdon): Replace with storage service abstraction.\n dataDir?: string;\n}\n\n/**\n * Event payload.\n */\nexport type FunctionEvent<TData = {}, TMeta = {}> = {\n data: FunctionEventMeta<TMeta> & TData;\n};\n\n/**\n * Metadata from trigger.\n */\nexport type FunctionEventMeta<TMeta = {}> = {\n meta: TMeta;\n};\n\n/**\n * Function response.\n */\nexport interface FunctionResponse {\n status(code: number): FunctionResponse;\n}\n\n//\n// Subscription utils.\n//\n\nexport type RawSubscriptionData = {\n spaceKey?: string;\n objects?: string[];\n};\n\nexport type SubscriptionData = {\n space?: Space;\n objects?: EchoReactiveObject<any>[];\n};\n\n/**\n * Handler wrapper for subscription events; extracts space and objects.\n *\n * To test:\n * ```\n * curl -s -X POST -H \"Content-Type: application/json\" --data '{\"space\": \"0446...1cbb\"}' http://localhost:7100/dev/email-extractor\n * ```\n *\n * NOTE: Get space key from devtools or `dx space list --json`\n */\nexport const subscriptionHandler = <TMeta>(\n handler: FunctionHandler<SubscriptionData, TMeta>,\n): FunctionHandler<RawSubscriptionData, TMeta> => {\n return ({ event: { data }, context, ...rest }) => {\n const { client } = context;\n const space = data.spaceKey ? client.spaces.get(PublicKey.from(data.spaceKey)) : undefined;\n const objects = space\n ? data.objects?.map<EchoReactiveObject<any> | undefined>((id) => space!.db.getObjectById(id)).filter(nonNullable)\n : [];\n\n if (!!data.spaceKey && !space) {\n log.warn('invalid space', { data });\n } else {\n log.info('handler', { space: space?.key.truncate(), objects: objects?.length });\n }\n\n return handler({ event: { data: { ...data, space, objects } }, context, ...rest });\n };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport express from 'express';\nimport { getPort } from 'get-port-please';\nimport type http from 'http';\nimport { join } from 'node:path';\n\nimport { Event, Trigger } from '@dxos/async';\nimport { type Client } from '@dxos/client';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\n\nimport { type FunctionRegistry } from '../function';\nimport { type FunctionContext, type FunctionEvent, type FunctionHandler, type FunctionResponse } from '../handler';\nimport { type FunctionDef } from '../types';\n\nexport type DevServerOptions = {\n baseDir: string;\n port?: number;\n reload?: boolean;\n dataDir?: string;\n};\n\n/**\n * Functions dev server provides a local HTTP server for testing functions.\n */\nexport class DevServer {\n private _ctx = createContext();\n\n // Function handlers indexed by name (URL path).\n private readonly _handlers: Record<string, { def: FunctionDef; handler: FunctionHandler<any> }> = {};\n\n private _server?: http.Server;\n private _port?: number;\n private _functionServiceRegistration?: string;\n private _proxy?: string;\n private _seq = 0;\n\n public readonly update = new Event<number>();\n\n constructor(\n private readonly _client: Client,\n private readonly _functionsRegistry: FunctionRegistry,\n private readonly _options: DevServerOptions,\n ) {\n this._functionsRegistry.registered.on(async ({ added }) => {\n added.forEach((def) => this._load(def));\n await this._safeUpdateRegistration();\n log('new functions loaded', { added });\n });\n }\n\n get stats() {\n return {\n seq: this._seq,\n };\n }\n\n get endpoint() {\n invariant(this._port);\n return `http://localhost:${this._port}`;\n }\n\n get proxy() {\n return this._proxy;\n }\n\n get functions() {\n return Object.values(this._handlers);\n }\n\n async start() {\n invariant(!this._server);\n log.info('starting...');\n this._ctx = createContext();\n\n // TODO(burdon): Move to hono.\n const app = express();\n app.use(express.json());\n\n app.post('/:path', async (req, res) => {\n const { path } = req.params;\n try {\n log.info('calling', { path });\n if (this._options.reload) {\n const { def } = this._handlers['/' + path];\n await this._load(def, true);\n }\n\n // TODO(burdon): Get function context.\n res.statusCode = await this.invoke('/' + path, req.body);\n res.end();\n } catch (err: any) {\n log.catch(err);\n res.statusCode = 500;\n res.end();\n }\n });\n\n this._port = await getPort({ host: 'localhost', port: 7200, portRange: [7200, 7299] });\n this._server = app.listen(this._port);\n\n try {\n // Register functions.\n const { registrationId, endpoint } = await this._client.services.services.FunctionRegistryService!.register({\n endpoint: this.endpoint,\n });\n\n log.info('registered', { endpoint });\n this._proxy = endpoint;\n this._functionServiceRegistration = registrationId;\n\n // Open after registration, so that it can be updated with the list of function definitions.\n await this._functionsRegistry.open(this._ctx);\n } catch (err: any) {\n await this.stop();\n throw new Error('FunctionRegistryService not available (check plugin is configured).');\n }\n\n log.info('started', { port: this._port });\n }\n\n async stop() {\n invariant(this._server);\n log.info('stopping...');\n\n const trigger = new Trigger();\n this._server.close(async () => {\n log.info('server stopped');\n try {\n if (this._functionServiceRegistration) {\n invariant(this._client.services.services.FunctionRegistryService);\n await this._client.services.services.FunctionRegistryService.unregister({\n registrationId: this._functionServiceRegistration,\n });\n\n log.info('unregistered', { registrationId: this._functionServiceRegistration });\n this._functionServiceRegistration = undefined;\n this._proxy = undefined;\n }\n\n trigger.wake();\n } catch (err) {\n trigger.throw(err as Error);\n }\n });\n\n await trigger.wait();\n this._port = undefined;\n this._server = undefined;\n log.info('stopped');\n }\n\n /**\n * Load function.\n */\n private async _load(def: FunctionDef, force?: boolean | undefined) {\n const { uri, route, handler } = def;\n const filePath = join(this._options.baseDir, handler);\n log.info('loading', { uri, force });\n\n // Remove from cache.\n if (force) {\n Object.keys(require.cache)\n .filter((key) => key.startsWith(filePath))\n .forEach((key) => {\n delete require.cache[key];\n });\n }\n\n // TODO(burdon): Import types.\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const module = require(filePath);\n if (typeof module.default !== 'function') {\n throw new Error(`Handler must export default function: ${uri}`);\n }\n\n this._handlers[route] = { def, handler: module.default };\n }\n\n private async _safeUpdateRegistration(): Promise<void> {\n invariant(this._functionServiceRegistration);\n try {\n await this._client.services.services.FunctionRegistryService!.updateRegistration({\n registrationId: this._functionServiceRegistration,\n functions: this.functions.map(({ def: { id, route } }) => ({ id, route })),\n });\n } catch (e) {\n log.catch(e);\n }\n }\n\n /**\n * Invoke function.\n */\n public async invoke(path: string, data: any): Promise<number> {\n const seq = ++this._seq;\n const now = Date.now();\n\n log.info('req', { seq, path });\n const statusCode = await this._invoke(path, { data });\n\n log.info('res', { seq, path, statusCode, duration: Date.now() - now });\n this.update.emit(statusCode);\n return statusCode;\n }\n\n private async _invoke(path: string, event: FunctionEvent) {\n const { handler } = this._handlers[path] ?? {};\n invariant(handler, `invalid path: ${path}`);\n\n const context: FunctionContext = {\n client: this._client,\n dataDir: this._options.dataDir,\n };\n\n let statusCode = 200;\n const response: FunctionResponse = {\n status: (code: number) => {\n statusCode = code;\n return response;\n },\n };\n\n await handler({ context, event, response });\n return statusCode;\n }\n}\n\nconst createContext = () => new Context({ name: 'DevServer' });\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport path from 'node:path';\n\nimport { Mutex } from '@dxos/async';\nimport { type Space } from '@dxos/client/echo';\nimport { Context } from '@dxos/context';\nimport { log } from '@dxos/log';\n\nimport { type FunctionRegistry } from '../function';\nimport { type FunctionEventMeta } from '../handler';\nimport { type TriggerRegistry } from '../trigger';\nimport { type FunctionDef, type FunctionManifest, type FunctionTrigger } from '../types';\n\nexport type Callback = (data: any) => Promise<void | number>;\n\nexport type SchedulerOptions = {\n endpoint?: string;\n callback?: Callback;\n};\n\n/**\n * The scheduler triggers function execution based on various triggers.\n */\nexport class Scheduler {\n private _ctx = createContext();\n\n private readonly _functionUriToCallMutex = new Map<string, Mutex>();\n\n constructor(\n public readonly functions: FunctionRegistry,\n public readonly triggers: TriggerRegistry,\n private readonly _options: SchedulerOptions = {},\n ) {\n this.functions.registered.on(async ({ space, added }) => {\n await this._safeActivateTriggers(space, this.triggers.getInactiveTriggers(space), added);\n });\n this.triggers.registered.on(async ({ space, triggers }) => {\n await this._safeActivateTriggers(space, triggers, this.functions.getFunctions(space));\n });\n }\n\n async start() {\n await this._ctx.dispose();\n this._ctx = createContext();\n await this.functions.open(this._ctx);\n await this.triggers.open(this._ctx);\n }\n\n async stop() {\n await this._ctx.dispose();\n await this.functions.close();\n await this.triggers.close();\n }\n\n // TODO(burdon): Remove and update registries directly.\n public async register(space: Space, manifest: FunctionManifest) {\n await this.functions.register(space, manifest.functions);\n await this.triggers.register(space, manifest);\n }\n\n private async _safeActivateTriggers(\n space: Space,\n triggers: FunctionTrigger[],\n functions: FunctionDef[],\n ): Promise<void> {\n const mountTasks = triggers.map((trigger) => {\n return this.activate(space, functions, trigger);\n });\n await Promise.all(mountTasks).catch(log.catch);\n }\n\n private async activate(space: Space, functions: FunctionDef[], fnTrigger: FunctionTrigger) {\n const definition = functions.find((def) => def.uri === fnTrigger.function);\n if (!definition) {\n log.info('function is not found for trigger', { fnTrigger });\n return;\n }\n\n await this.triggers.activate({ space }, fnTrigger, async (args) => {\n const mutex = this._functionUriToCallMutex.get(definition.uri) ?? new Mutex();\n this._functionUriToCallMutex.set(definition.uri, mutex);\n\n log.info('function triggered, waiting for mutex', { uri: definition.uri });\n return mutex.executeSynchronized(() => {\n log.info('mutex acquired', { uri: definition.uri });\n return this._execFunction(definition, fnTrigger, {\n meta: fnTrigger.meta,\n data: { ...args, spaceKey: space.key },\n });\n });\n });\n\n log('activated trigger', { space: space.key, trigger: fnTrigger });\n }\n\n private async _execFunction<TData, TMeta>(\n def: FunctionDef,\n trigger: FunctionTrigger,\n { data, meta }: { data: TData; meta?: TMeta },\n ): Promise<number> {\n let status = 0;\n try {\n // TODO(burdon): Pass in Space key (common context)?\n const payload = Object.assign({}, meta && ({ meta } satisfies FunctionEventMeta<TMeta>), data);\n\n const { endpoint, callback } = this._options;\n if (endpoint) {\n // TODO(burdon): Move out of scheduler (generalize as callback).\n const url = path.join(endpoint, def.route);\n log.info('exec', { function: def.uri, url, triggerType: trigger.spec.type });\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n\n status = response.status;\n } else if (callback) {\n log.info('exec', { function: def.uri });\n status = (await callback(payload)) ?? 200;\n }\n\n // Check errors.\n if (status && status >= 400) {\n throw new Error(`Response: ${status}`);\n }\n\n // const result = await response.json();\n log.info('done', { function: def.uri, status });\n } catch (err: any) {\n log.error('error', { function: def.uri, error: err.message });\n status = 500;\n }\n\n return status;\n }\n}\n\nconst createContext = () => new Context({ name: 'FunctionScheduler' });\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Event } from '@dxos/async';\nimport { type Client } from '@dxos/client';\nimport { create, Filter, getMeta, type Space } from '@dxos/client/echo';\nimport { Context, Resource } from '@dxos/context';\nimport { ECHO_ATTR_META, foreignKey, foreignKeyEquals, splitMeta } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { ComplexMap, diff, intersection } from '@dxos/util';\n\nimport { createSubscriptionTrigger, createTimerTrigger, createWebhookTrigger, createWebsocketTrigger } from './type';\nimport { type FunctionManifest, FunctionTrigger, type FunctionTriggerType, type TriggerSpec } from '../types';\n\ntype ResponseCode = number;\n\nexport type TriggerCallback = (args: object) => Promise<ResponseCode>;\n\nexport type TriggerContext = { space: Space };\n\n// TODO(burdon): Make object?\nexport type TriggerFactory<Spec extends TriggerSpec, Options = any> = (\n ctx: Context,\n context: TriggerContext,\n spec: Spec,\n callback: TriggerCallback,\n options?: Options,\n) => Promise<void>;\n\nexport type TriggerHandlerMap = { [type in FunctionTriggerType]: TriggerFactory<any> };\n\nconst triggerHandlers: TriggerHandlerMap = {\n subscription: createSubscriptionTrigger,\n timer: createTimerTrigger,\n webhook: createWebhookTrigger,\n websocket: createWebsocketTrigger,\n};\n\nexport type TriggerEvent = {\n space: Space;\n triggers: FunctionTrigger[];\n};\n\ntype RegisteredTrigger = {\n activationCtx?: Context;\n trigger: FunctionTrigger;\n};\n\nexport class TriggerRegistry extends Resource {\n private readonly _triggersBySpaceKey = new ComplexMap<PublicKey, RegisteredTrigger[]>(PublicKey.hash);\n\n public readonly registered = new Event<TriggerEvent>();\n public readonly removed = new Event<TriggerEvent>();\n\n constructor(\n private readonly _client: Client,\n private readonly _options?: TriggerHandlerMap,\n ) {\n super();\n }\n\n public getActiveTriggers(space: Space): FunctionTrigger[] {\n return this._getTriggers(space, (t) => t.activationCtx != null);\n }\n\n public getInactiveTriggers(space: Space): FunctionTrigger[] {\n return this._getTriggers(space, (t) => t.activationCtx == null);\n }\n\n async activate(triggerCtx: TriggerContext, trigger: FunctionTrigger, callback: TriggerCallback): Promise<void> {\n log('activate', { space: triggerCtx.space.key, trigger });\n const activationCtx = new Context({ name: `trigger_${trigger.function}` });\n this._ctx.onDispose(() => activationCtx.dispose());\n const registeredTrigger = this._triggersBySpaceKey\n .get(triggerCtx.space.key)\n ?.find((reg) => reg.trigger.id === trigger.id);\n invariant(registeredTrigger, `Trigger is not registered: ${trigger.function}`);\n registeredTrigger.activationCtx = activationCtx;\n\n try {\n const options = this._options?.[trigger.spec.type];\n await triggerHandlers[trigger.spec.type](activationCtx, triggerCtx, trigger.spec, callback, options);\n } catch (err) {\n delete registeredTrigger.activationCtx;\n throw err;\n }\n }\n\n /**\n * Loads triggers from the manifest into the space.\n */\n public async register(space: Space, manifest: FunctionManifest): Promise<void> {\n log('register', { space: space.key });\n if (!manifest.triggers?.length) {\n return;\n }\n if (!space.db.graph.runtimeSchemaRegistry.hasSchema(FunctionTrigger)) {\n space.db.graph.runtimeSchemaRegistry.registerSchema(FunctionTrigger);\n }\n\n // Sync triggers.\n const { objects: existing } = await space.db.query(Filter.schema(FunctionTrigger)).run();\n const { added } = diff(existing, manifest.triggers, (a, b) => {\n // Create FK to enable syncing if none are set.\n // TODO(burdon): Warn if not unique.\n const keys = b[ECHO_ATTR_META]?.keys ?? [foreignKey('manifest', [b.function, b.spec.type].join('-'))];\n return intersection(getMeta(a)?.keys ?? [], keys, foreignKeyEquals).length > 0;\n });\n\n // TODO(burdon): Update existing.\n added.forEach((trigger) => {\n const { meta, object } = splitMeta(trigger);\n space.db.add(create(FunctionTrigger, object, meta));\n });\n }\n\n protected override async _open(): Promise<void> {\n log.info('open...');\n const spaceListSubscription = this._client.spaces.subscribe(async (spaces) => {\n for (const space of spaces) {\n if (this._triggersBySpaceKey.has(space.key)) {\n continue;\n }\n\n const registered: RegisteredTrigger[] = [];\n this._triggersBySpaceKey.set(space.key, registered);\n await space.waitUntilReady();\n if (this._ctx.disposed) {\n break;\n }\n\n // Subscribe to updates.\n this._ctx.onDispose(\n space.db.query(Filter.schema(FunctionTrigger)).subscribe(async (triggers) => {\n log.info('update', { space: space.key, triggers: triggers.objects.length });\n await this._handleRemovedTriggers(space, triggers.objects, registered);\n this._handleNewTriggers(space, triggers.objects, registered);\n }),\n );\n }\n });\n\n this._ctx.onDispose(() => spaceListSubscription.unsubscribe());\n }\n\n protected override async _close(_: Context): Promise<void> {\n log.info('close...');\n this._triggersBySpaceKey.clear();\n }\n\n private _handleNewTriggers(space: Space, allTriggers: FunctionTrigger[], registered: RegisteredTrigger[]) {\n const newTriggers = allTriggers.filter((candidate) => {\n return registered.find((reg) => reg.trigger.id === candidate.id) == null;\n });\n\n if (newTriggers.length > 0) {\n const newRegisteredTriggers: RegisteredTrigger[] = newTriggers.map((trigger) => ({ trigger }));\n registered.push(...newRegisteredTriggers);\n log.info('added', () => ({\n spaceKey: space.key,\n triggers: newTriggers.map((trigger) => trigger.function),\n }));\n this.registered.emit({ space, triggers: newTriggers });\n }\n }\n\n private async _handleRemovedTriggers(\n space: Space,\n allTriggers: FunctionTrigger[],\n registered: RegisteredTrigger[],\n ): Promise<void> {\n const removed: FunctionTrigger[] = [];\n for (let i = registered.length - 1; i >= 0; i--) {\n const wasRemoved =\n allTriggers.find((trigger: FunctionTrigger) => trigger.id === registered[i].trigger.id) == null;\n if (wasRemoved) {\n if (removed.length) {\n log.info('removed', () => ({\n spaceKey: space.key,\n triggers: removed.map((trigger) => trigger.function),\n }));\n }\n const unregistered = registered.splice(i, 1)[0];\n await unregistered.activationCtx?.dispose();\n removed.push(unregistered.trigger);\n }\n }\n\n if (removed.length > 0) {\n this.removed.emit({ space, triggers: removed });\n }\n }\n\n private _getTriggers(space: Space, predicate: (trigger: RegisteredTrigger) => boolean): FunctionTrigger[] {\n const allSpaceTriggers = this._triggersBySpaceKey.get(space.key) ?? [];\n return allSpaceTriggers.filter(predicate).map((trigger) => trigger.trigger);\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { TextV0Type } from '@braneframe/types';\nimport { debounce, UpdateScheduler } from '@dxos/async';\nimport { type Context } from '@dxos/context';\nimport { createSubscription, Filter, getAutomergeObjectCore, type Query } from '@dxos/echo-db';\nimport { log } from '@dxos/log';\n\nimport type { SubscriptionTrigger } from '../../types';\nimport { type TriggerCallback, type TriggerContext, type TriggerFactory } from '../trigger-registry';\n\nexport const createSubscriptionTrigger: TriggerFactory<SubscriptionTrigger> = async (\n ctx: Context,\n triggerCtx: TriggerContext,\n spec: SubscriptionTrigger,\n callback: TriggerCallback,\n) => {\n const objectIds = new Set<string>();\n const task = new UpdateScheduler(\n ctx,\n async () => {\n if (objectIds.size > 0) {\n const objects = Array.from(objectIds);\n objectIds.clear();\n await callback({ objects });\n }\n },\n { maxFrequency: 4 },\n );\n\n // TODO(burdon): Don't fire initially?\n // TODO(burdon): Create queue. Only allow one invocation per trigger at a time?\n const subscriptions: (() => void)[] = [];\n const subscription = createSubscription(({ added, updated }) => {\n const sizeBefore = objectIds.size;\n for (const object of added) {\n objectIds.add(object.id);\n }\n for (const object of updated) {\n objectIds.add(object.id);\n }\n if (objectIds.size > sizeBefore) {\n log.info('updated', { added: added.length, updated: updated.length });\n task.trigger();\n }\n });\n\n subscriptions.push(() => subscription.unsubscribe());\n\n // TODO(burdon): Disable trigger if keeps failing.\n const { filter, options: { deep, delay } = {} } = spec;\n const update = ({ objects }: Query) => {\n subscription.update(objects);\n\n // TODO(burdon): Hack to monitor changes to Document's text object.\n if (deep) {\n log.info('update', { objects: objects.length });\n for (const object of objects) {\n const content = object.content;\n if (content instanceof TextV0Type) {\n subscriptions.push(\n getAutomergeObjectCore(content).updates.on(debounce(() => subscription.update([object]), 1_000)),\n );\n }\n }\n }\n };\n\n // TODO(burdon): Is Filter.or implemented?\n // TODO(burdon): [Bug]: all callbacks are fired on the first mutation.\n // TODO(burdon): [Bug]: not updated when document is deleted (either top or hierarchically).\n const query = triggerCtx.space.db.query(Filter.or(filter.map(({ type, props }) => Filter.typename(type, props))));\n subscriptions.push(query.subscribe(delay ? debounce(update, delay) : update));\n\n ctx.onDispose(() => {\n subscriptions.forEach((unsubscribe) => unsubscribe());\n });\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { CronJob } from 'cron';\n\nimport { DeferredTask } from '@dxos/async';\nimport { type Context } from '@dxos/context';\nimport { log } from '@dxos/log';\n\nimport type { TimerTrigger } from '../../types';\nimport { type TriggerCallback, type TriggerContext, type TriggerFactory } from '../trigger-registry';\n\nexport const createTimerTrigger: TriggerFactory<TimerTrigger> = async (\n ctx: Context,\n triggerContext: TriggerContext,\n spec: TimerTrigger,\n callback: TriggerCallback,\n) => {\n const task = new DeferredTask(ctx, async () => {\n await callback({});\n });\n\n let last = 0;\n let run = 0;\n // https://www.npmjs.com/package/cron#constructor\n const job = CronJob.from({\n cronTime: spec.cron,\n runOnInit: false,\n onTick: () => {\n // TODO(burdon): Check greater than 30s (use cron-parser).\n const now = Date.now();\n const delta = last ? now - last : 0;\n last = now;\n\n run++;\n log.info('tick', { space: triggerContext.space.key.truncate(), count: run, delta });\n task.schedule();\n },\n });\n\n job.start();\n ctx.onDispose(() => job.stop());\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { getPort } from 'get-port-please';\nimport http from 'node:http';\n\nimport { type Context } from '@dxos/context';\nimport { log } from '@dxos/log';\n\nimport type { WebhookTrigger } from '../../types';\nimport { type TriggerCallback, type TriggerContext, type TriggerFactory } from '../trigger-registry';\n\nexport const createWebhookTrigger: TriggerFactory<WebhookTrigger> = async (\n ctx: Context,\n _: TriggerContext,\n spec: WebhookTrigger,\n callback: TriggerCallback,\n) => {\n // TODO(burdon): Enable POST hook with payload.\n const server = http.createServer(async (req, res) => {\n if (req.method !== spec.method) {\n res.statusCode = 405;\n return res.end();\n }\n res.statusCode = await callback({});\n res.end();\n });\n\n // TODO(burdon): Not used.\n // const DEF_PORT_RANGE = { min: 7500, max: 7599 };\n // const portRange = Object.assign({}, trigger.port, DEF_PORT_RANGE) as WebhookTrigger['port'];\n const port = await getPort({\n random: true,\n // portRange: [portRange!.min, portRange!.max],\n });\n\n // TODO(burdon): Update trigger object with actual port.\n server.listen(port, () => {\n log.info('started webhook', { port });\n spec.port = port;\n });\n\n ctx.onDispose(() => {\n server.close();\n });\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport WebSocket from 'ws';\n\nimport { sleep, Trigger } from '@dxos/async';\nimport { type Context } from '@dxos/context';\nimport { log } from '@dxos/log';\n\nimport { type WebsocketTrigger } from '../../types';\nimport { type TriggerCallback, type TriggerContext, type TriggerFactory } from '../trigger-registry';\n\ninterface WebsocketTriggerOptions {\n retryDelay: number;\n maxAttempts: number;\n}\n\n/**\n * Websocket.\n * NOTE: The port must be unique, so the same hook cannot be used for multiple spaces.\n */\nexport const createWebsocketTrigger: TriggerFactory<WebsocketTrigger, WebsocketTriggerOptions> = async (\n ctx: Context,\n triggerCtx: TriggerContext,\n spec: WebsocketTrigger,\n callback: TriggerCallback,\n options: WebsocketTriggerOptions = { retryDelay: 2, maxAttempts: 5 },\n) => {\n const { url, init } = spec;\n\n let ws: WebSocket;\n for (let attempt = 1; attempt <= options.maxAttempts; attempt++) {\n const open = new Trigger<boolean>();\n\n ws = new WebSocket(url);\n Object.assign(ws, {\n onopen: () => {\n log.info('opened', { url });\n if (spec.init) {\n ws.send(new TextEncoder().encode(JSON.stringify(init)));\n }\n\n open.wake(true);\n },\n\n onclose: (event) => {\n log.info('closed', { url, code: event.code });\n // Reconnect if server closes (e.g., CF restart).\n // https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent/code\n if (event.code === 1006) {\n setTimeout(async () => {\n log.info(`reconnecting in ${options.retryDelay}s...`, { url });\n await createWebsocketTrigger(ctx, triggerCtx, spec, callback, options);\n }, options.retryDelay * 1_000);\n }\n\n open.wake(false);\n },\n\n onerror: (event) => {\n log.catch(event.error, { url });\n },\n\n onmessage: async (event) => {\n try {\n log.info('message');\n const data = JSON.parse(new TextDecoder().decode(event.data as Uint8Array));\n await callback({ data });\n } catch (err) {\n log.catch(err, { url });\n }\n },\n } satisfies Partial<WebSocket>);\n\n const isOpen = await open.wait();\n if (isOpen) {\n break;\n } else {\n const wait = Math.pow(attempt, 2) * options.retryDelay;\n if (attempt < options.maxAttempts) {\n log.warn(`failed to connect; trying again in ${wait}s`, { attempt });\n await sleep(wait * 1_000);\n }\n }\n }\n\n ctx.onDispose(() => {\n ws?.close();\n });\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_log", "import_util", "import_async", "import_context", "import_node_path", "import_echo", "import_invariant", "import_keys", "import_get_port_please", "FunctionRegistry", "Resource", "constructor", "_client", "_functionBySpaceKey", "ComplexMap", "PublicKey", "hash", "registered", "Event", "getFunctions", "space", "get", "key", "register", "functions", "log", "length", "db", "graph", "runtimeSchemaRegistry", "hasSchema", "FunctionDef", "registerSchema", "objects", "existing", "query", "Filter", "schema", "run", "added", "diff", "a", "b", "uri", "forEach", "def", "add", "create", "_open", "info", "spacesSubscription", "spaces", "subscribe", "has", "set", "waitUntilReady", "_ctx", "disposed", "onDispose", "push", "emit", "unsubscribe", "_close", "_", "clear", "subscriptionHandler", "handler", "event", "data", "context", "rest", "client", "spaceKey", "from", "undefined", "map", "id", "getObjectById", "filter", "nonNullable", "warn", "truncate", "DevServer", "_functionsRegistry", "_options", "createContext", "_handlers", "_seq", "update", "on", "_load", "_safeUpdateRegistration", "stats", "seq", "endpoint", "invariant", "_port", "proxy", "_proxy", "Object", "values", "start", "_server", "app", "express", "use", "json", "post", "req", "res", "path", "params", "reload", "statusCode", "invoke", "body", "end", "err", "catch", "getPort", "host", "port", "portRange", "listen", "registrationId", "services", "FunctionRegistryService", "_functionServiceRegistration", "open", "stop", "Error", "trigger", "Trigger", "close", "unregister", "wake", "throw", "wait", "force", "route", "filePath", "join", "baseDir", "keys", "require", "cache", "startsWith", "module", "default", "updateRegistration", "e", "now", "Date", "_invoke", "duration", "dataDir", "response", "status", "code", "Context", "name", "Scheduler", "triggers", "_functionUriToCallMutex", "Map", "_safeActivateTriggers", "getInactiveTriggers", "dispose", "manifest", "mountTasks", "activate", "Promise", "all", "fnTrigger", "definition", "find", "function", "args", "mutex", "Mutex", "executeSynchronized", "_execFunction", "meta", "payload", "assign", "callback", "url", "triggerType", "spec", "type", "fetch", "method", "headers", "JSON", "stringify", "error", "message", "createSubscriptionTrigger", "ctx", "triggerCtx", "objectIds", "Set", "task", "UpdateScheduler", "size", "Array", "maxFrequency", "subscriptions", "subscription", "createSubscription", "updated", "sizeBefore", "object", "options", "deep", "delay", "content", "TextV0Type", "getAutomergeObjectCore", "updates", "debounce", "or", "props", "typename", "createTimerTrigger", "triggerContext", "DeferredTask", "last", "job", "CronJob", "cronTime", "cron", "runOnInit", "onTick", "delta", "count", "schedule", "createWebhookTrigger", "server", "http", "createServer", "random", "createWebsocketTrigger", "retryDelay", "maxAttempts", "init", "ws", "attempt", "WebSocket", "onopen", "send", "TextEncoder", "encode", "onclose", "setTimeout", "onerror", "onmessage", "parse", "TextDecoder", "decode", "isOpen", "Math", "pow", "sleep", "triggerHandlers", "timer", "webhook", "websocket", "TriggerRegistry", "_triggersBySpaceKey", "removed", "getActiveTriggers", "_getTriggers", "t", "activationCtx", "registeredTrigger", "reg", "FunctionTrigger", "ECHO_ATTR_META", "foreignKey", "intersection", "getMeta", "foreignKeyEquals", "splitMeta", "spaceListSubscription", "_handleRemovedTriggers", "_handleNewTriggers", "allTriggers", "newTriggers", "candidate", "newRegisteredTriggers", "i", "wasRemoved", "unregistered", "splice", "predicate", "allSpaceTriggers"]
|
|
7
7
|
}
|