@dxos/functions 0.5.3-main.8b66fe2 → 0.5.3-main.8ffbbae
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/index.mjs +493 -692
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +486 -675
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/types/src/index.d.ts +0 -2
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/runtime/dev-server.d.ts +10 -7
- package/dist/types/src/runtime/dev-server.d.ts.map +1 -1
- package/dist/types/src/runtime/scheduler.d.ts +59 -11
- package/dist/types/src/runtime/scheduler.d.ts.map +1 -1
- package/dist/types/src/testing/test/handler.d.ts +0 -1
- package/dist/types/src/testing/test/handler.d.ts.map +1 -1
- package/dist/types/src/types.d.ts +111 -131
- package/dist/types/src/types.d.ts.map +1 -1
- package/package.json +14 -30
- package/schema/functions.json +116 -139
- package/src/index.ts +0 -2
- package/src/runtime/dev-server.test.ts +35 -15
- package/src/runtime/dev-server.ts +20 -37
- package/src/runtime/scheduler.test.ts +75 -54
- package/src/runtime/scheduler.ts +298 -66
- package/src/testing/test/handler.ts +2 -8
- package/src/types.ts +42 -58
- package/dist/lib/browser/chunk-366QG6IX.mjs +0 -81
- package/dist/lib/browser/chunk-366QG6IX.mjs.map +0 -7
- package/dist/lib/browser/types.mjs +0 -12
- package/dist/lib/browser/types.mjs.map +0 -7
- package/dist/lib/node/chunk-3VSJ57ZZ.cjs +0 -97
- package/dist/lib/node/chunk-3VSJ57ZZ.cjs.map +0 -7
- package/dist/lib/node/types.cjs +0 -33
- package/dist/lib/node/types.cjs.map +0 -7
- package/dist/types/src/function/function-registry.d.ts +0 -24
- package/dist/types/src/function/function-registry.d.ts.map +0 -1
- package/dist/types/src/function/function-registry.test.d.ts +0 -2
- package/dist/types/src/function/function-registry.test.d.ts.map +0 -1
- package/dist/types/src/function/index.d.ts +0 -2
- package/dist/types/src/function/index.d.ts.map +0 -1
- package/dist/types/src/testing/functions-integration.test.d.ts +0 -2
- package/dist/types/src/testing/functions-integration.test.d.ts.map +0 -1
- package/dist/types/src/testing/index.d.ts +0 -4
- package/dist/types/src/testing/index.d.ts.map +0 -1
- package/dist/types/src/testing/setup.d.ts +0 -5
- package/dist/types/src/testing/setup.d.ts.map +0 -1
- package/dist/types/src/testing/types.d.ts +0 -9
- package/dist/types/src/testing/types.d.ts.map +0 -1
- package/dist/types/src/testing/util.d.ts +0 -3
- package/dist/types/src/testing/util.d.ts.map +0 -1
- package/dist/types/src/trigger/index.d.ts +0 -2
- package/dist/types/src/trigger/index.d.ts.map +0 -1
- package/dist/types/src/trigger/trigger-registry.d.ts +0 -40
- package/dist/types/src/trigger/trigger-registry.d.ts.map +0 -1
- package/dist/types/src/trigger/trigger-registry.test.d.ts +0 -2
- package/dist/types/src/trigger/trigger-registry.test.d.ts.map +0 -1
- package/dist/types/src/trigger/type/index.d.ts +0 -5
- package/dist/types/src/trigger/type/index.d.ts.map +0 -1
- package/dist/types/src/trigger/type/subscription-trigger.d.ts +0 -4
- package/dist/types/src/trigger/type/subscription-trigger.d.ts.map +0 -1
- package/dist/types/src/trigger/type/timer-trigger.d.ts +0 -4
- package/dist/types/src/trigger/type/timer-trigger.d.ts.map +0 -1
- package/dist/types/src/trigger/type/webhook-trigger.d.ts +0 -4
- package/dist/types/src/trigger/type/webhook-trigger.d.ts.map +0 -1
- package/dist/types/src/trigger/type/websocket-trigger.d.ts +0 -13
- package/dist/types/src/trigger/type/websocket-trigger.d.ts.map +0 -1
- 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/function/function-registry.test.ts +0 -105
- package/src/function/function-registry.ts +0 -90
- package/src/function/index.ts +0 -5
- package/src/testing/functions-integration.test.ts +0 -99
- package/src/testing/index.ts +0 -7
- package/src/testing/setup.ts +0 -45
- package/src/testing/types.ts +0 -9
- package/src/testing/util.ts +0 -16
- package/src/trigger/index.ts +0 -5
- package/src/trigger/trigger-registry.test.ts +0 -255
- package/src/trigger/trigger-registry.ts +0 -189
- package/src/trigger/type/index.ts +0 -8
- package/src/trigger/type/subscription-trigger.ts +0 -80
- package/src/trigger/type/timer-trigger.ts +0 -44
- package/src/trigger/type/webhook-trigger.ts +0 -47
- package/src/trigger/type/websocket-trigger.ts +0 -91
- package/src/util.test.ts +0 -43
- package/src/util.ts +0 -48
package/dist/lib/node/index.cjs
CHANGED
|
@@ -29,165 +29,61 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
29
29
|
var node_exports = {};
|
|
30
30
|
__export(node_exports, {
|
|
31
31
|
DevServer: () => DevServer,
|
|
32
|
-
|
|
33
|
-
FunctionManifestSchema: () => import_chunk_3VSJ57ZZ.FunctionManifestSchema,
|
|
34
|
-
FunctionRegistry: () => FunctionRegistry,
|
|
35
|
-
FunctionTrigger: () => import_chunk_3VSJ57ZZ.FunctionTrigger,
|
|
32
|
+
FunctionManifestSchema: () => FunctionManifestSchema,
|
|
36
33
|
Scheduler: () => Scheduler,
|
|
37
|
-
TriggerRegistry: () => TriggerRegistry,
|
|
38
34
|
subscriptionHandler: () => subscriptionHandler
|
|
39
35
|
});
|
|
40
36
|
module.exports = __toCommonJS(node_exports);
|
|
41
|
-
var
|
|
42
|
-
var import_async = require("@dxos/async");
|
|
43
|
-
var import_echo = require("@dxos/client/echo");
|
|
44
|
-
var import_context = require("@dxos/context");
|
|
45
|
-
var import_keys = require("@dxos/keys");
|
|
37
|
+
var import_client = require("@dxos/client");
|
|
46
38
|
var import_log = require("@dxos/log");
|
|
47
39
|
var import_util = require("@dxos/util");
|
|
48
|
-
var import_client = require("@dxos/client");
|
|
49
|
-
var import_log2 = require("@dxos/log");
|
|
50
|
-
var import_util2 = require("@dxos/util");
|
|
51
40
|
var import_express = __toESM(require("express"));
|
|
52
41
|
var import_get_port_please = require("get-port-please");
|
|
53
42
|
var import_node_path = require("node:path");
|
|
54
|
-
var
|
|
55
|
-
var import_context2 = require("@dxos/context");
|
|
43
|
+
var import_async = require("@dxos/async");
|
|
56
44
|
var import_invariant = require("@dxos/invariant");
|
|
57
|
-
var
|
|
58
|
-
var import_node_path2 = __toESM(require("node:path"));
|
|
59
|
-
var import_async3 = require("@dxos/async");
|
|
60
|
-
var import_context3 = require("@dxos/context");
|
|
61
|
-
var import_log4 = require("@dxos/log");
|
|
62
|
-
var import_async4 = require("@dxos/async");
|
|
63
|
-
var import_echo2 = require("@dxos/client/echo");
|
|
64
|
-
var import_context4 = require("@dxos/context");
|
|
65
|
-
var import_echo_schema = require("@dxos/echo-schema");
|
|
66
|
-
var import_invariant2 = require("@dxos/invariant");
|
|
67
|
-
var import_keys2 = require("@dxos/keys");
|
|
68
|
-
var import_log5 = require("@dxos/log");
|
|
69
|
-
var import_util3 = require("@dxos/util");
|
|
70
|
-
var import_types = require("@braneframe/types");
|
|
71
|
-
var import_async5 = require("@dxos/async");
|
|
72
|
-
var import_echo_db = require("@dxos/echo-db");
|
|
73
|
-
var import_log6 = require("@dxos/log");
|
|
45
|
+
var import_log2 = require("@dxos/log");
|
|
74
46
|
var import_cron = require("cron");
|
|
75
|
-
var import_async6 = require("@dxos/async");
|
|
76
|
-
var import_log7 = require("@dxos/log");
|
|
77
47
|
var import_get_port_please2 = require("get-port-please");
|
|
78
48
|
var import_node_http = __toESM(require("node:http"));
|
|
79
|
-
var
|
|
49
|
+
var import_node_path2 = __toESM(require("node:path"));
|
|
80
50
|
var import_ws = __toESM(require("ws"));
|
|
81
|
-
var
|
|
82
|
-
var
|
|
83
|
-
var
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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
|
-
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/core/functions/src/function/function-registry.ts";
|
|
105
|
-
var FunctionRegistry = class extends import_context.Resource {
|
|
106
|
-
constructor(_client) {
|
|
107
|
-
super();
|
|
108
|
-
this._client = _client;
|
|
109
|
-
this._functionBySpaceKey = new import_util.ComplexMap(import_keys.PublicKey.hash);
|
|
110
|
-
this.registered = new import_async.Event();
|
|
111
|
-
}
|
|
112
|
-
getFunctions(space) {
|
|
113
|
-
return this._functionBySpaceKey.get(space.key) ?? [];
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Loads function definitions from the manifest into the space.
|
|
117
|
-
* We first load all the definitions from the space to deduplicate by functionId.
|
|
118
|
-
*/
|
|
119
|
-
async register(space, functions) {
|
|
120
|
-
(0, import_log.log)("register", {
|
|
121
|
-
space: space.key,
|
|
122
|
-
functions: functions?.length ?? 0
|
|
123
|
-
}, {
|
|
124
|
-
F: __dxlog_file,
|
|
125
|
-
L: 39,
|
|
126
|
-
S: this,
|
|
127
|
-
C: (f, a) => f(...a)
|
|
128
|
-
});
|
|
129
|
-
if (!functions?.length) {
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
if (!space.db.graph.runtimeSchemaRegistry.hasSchema(import_chunk_3VSJ57ZZ.FunctionDef)) {
|
|
133
|
-
space.db.graph.runtimeSchemaRegistry.registerSchema(import_chunk_3VSJ57ZZ.FunctionDef);
|
|
134
|
-
}
|
|
135
|
-
const { objects: existing } = await space.db.query(import_echo.Filter.schema(import_chunk_3VSJ57ZZ.FunctionDef)).run();
|
|
136
|
-
const { added, removed } = diff(existing, functions, (a, b) => a.uri === b.uri);
|
|
137
|
-
added.forEach((def) => space.db.add((0, import_echo.create)(import_chunk_3VSJ57ZZ.FunctionDef, def)));
|
|
138
|
-
removed.forEach((def) => space.db.remove(def));
|
|
139
|
-
}
|
|
140
|
-
async _open() {
|
|
141
|
-
const spacesSubscription = this._client.spaces.subscribe(async (spaces) => {
|
|
142
|
-
for (const space of spaces) {
|
|
143
|
-
if (this._functionBySpaceKey.has(space.key)) {
|
|
144
|
-
continue;
|
|
145
|
-
}
|
|
146
|
-
const registered = [];
|
|
147
|
-
this._functionBySpaceKey.set(space.key, registered);
|
|
148
|
-
await space.waitUntilReady();
|
|
149
|
-
if (this._ctx.disposed) {
|
|
150
|
-
break;
|
|
151
|
-
}
|
|
152
|
-
this._ctx.onDispose(space.db.query(import_echo.Filter.schema(import_chunk_3VSJ57ZZ.FunctionDef)).subscribe(({ objects }) => {
|
|
153
|
-
const { added } = diff(registered, objects, (a, b) => a.uri === b.uri);
|
|
154
|
-
if (added.length > 0) {
|
|
155
|
-
registered.push(...added);
|
|
156
|
-
this.registered.emit({
|
|
157
|
-
space,
|
|
158
|
-
added
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
}));
|
|
162
|
-
}
|
|
163
|
-
});
|
|
164
|
-
this._ctx.onDispose(() => spacesSubscription.unsubscribe());
|
|
165
|
-
}
|
|
166
|
-
async _close(_) {
|
|
167
|
-
this._functionBySpaceKey.clear();
|
|
168
|
-
}
|
|
169
|
-
};
|
|
170
|
-
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/core/functions/src/handler.ts";
|
|
51
|
+
var import_types = require("@braneframe/types");
|
|
52
|
+
var import_async2 = require("@dxos/async");
|
|
53
|
+
var import_echo = require("@dxos/client/echo");
|
|
54
|
+
var import_context = require("@dxos/context");
|
|
55
|
+
var import_invariant2 = require("@dxos/invariant");
|
|
56
|
+
var import_log3 = require("@dxos/log");
|
|
57
|
+
var import_util2 = require("@dxos/util");
|
|
58
|
+
var S = __toESM(require("@effect/schema/Schema"));
|
|
59
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
60
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
61
|
+
}) : x)(function(x) {
|
|
62
|
+
if (typeof require !== "undefined")
|
|
63
|
+
return require.apply(this, arguments);
|
|
64
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
65
|
+
});
|
|
66
|
+
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/core/functions/src/handler.ts";
|
|
171
67
|
var subscriptionHandler = (handler) => {
|
|
172
68
|
return ({ event: { data }, context, ...rest }) => {
|
|
173
69
|
const { client } = context;
|
|
174
70
|
const space = data.spaceKey ? client.spaces.get(import_client.PublicKey.from(data.spaceKey)) : void 0;
|
|
175
|
-
const objects = space ? data.objects?.map((id) => space.db.getObjectById(id)).filter(
|
|
71
|
+
const objects = space ? data.objects?.map((id) => space.db.getObjectById(id)).filter(import_util.nonNullable) : [];
|
|
176
72
|
if (!!data.spaceKey && !space) {
|
|
177
|
-
|
|
73
|
+
import_log.log.warn("invalid space", {
|
|
178
74
|
data
|
|
179
75
|
}, {
|
|
180
|
-
F:
|
|
76
|
+
F: __dxlog_file,
|
|
181
77
|
L: 91,
|
|
182
78
|
S: void 0,
|
|
183
79
|
C: (f, a) => f(...a)
|
|
184
80
|
});
|
|
185
81
|
} else {
|
|
186
|
-
|
|
82
|
+
import_log.log.info("handler", {
|
|
187
83
|
space: space?.key.truncate(),
|
|
188
84
|
objects: objects?.length
|
|
189
85
|
}, {
|
|
190
|
-
F:
|
|
86
|
+
F: __dxlog_file,
|
|
191
87
|
L: 93,
|
|
192
88
|
S: void 0,
|
|
193
89
|
C: (f, a) => f(...a)
|
|
@@ -206,28 +102,15 @@ var subscriptionHandler = (handler) => {
|
|
|
206
102
|
});
|
|
207
103
|
};
|
|
208
104
|
};
|
|
209
|
-
var
|
|
105
|
+
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/core/functions/src/runtime/dev-server.ts";
|
|
210
106
|
var DevServer = class {
|
|
211
|
-
|
|
107
|
+
// prettier-ignore
|
|
108
|
+
constructor(_client, _options) {
|
|
212
109
|
this._client = _client;
|
|
213
|
-
this._functionsRegistry = _functionsRegistry;
|
|
214
110
|
this._options = _options;
|
|
215
|
-
this._ctx = createContext();
|
|
216
111
|
this._handlers = {};
|
|
217
112
|
this._seq = 0;
|
|
218
|
-
this.update = new
|
|
219
|
-
this._functionsRegistry.registered.on(async ({ added }) => {
|
|
220
|
-
added.forEach((def) => this._load(def));
|
|
221
|
-
await this._safeUpdateRegistration();
|
|
222
|
-
(0, import_log3.log)("new functions loaded", {
|
|
223
|
-
added
|
|
224
|
-
}, {
|
|
225
|
-
F: __dxlog_file3,
|
|
226
|
-
L: 52,
|
|
227
|
-
S: this,
|
|
228
|
-
C: (f, a) => f(...a)
|
|
229
|
-
});
|
|
230
|
-
});
|
|
113
|
+
this.update = new import_async.Event();
|
|
231
114
|
}
|
|
232
115
|
get stats() {
|
|
233
116
|
return {
|
|
@@ -236,8 +119,8 @@ var DevServer = class {
|
|
|
236
119
|
}
|
|
237
120
|
get endpoint() {
|
|
238
121
|
(0, import_invariant.invariant)(this._port, void 0, {
|
|
239
|
-
F:
|
|
240
|
-
L:
|
|
122
|
+
F: __dxlog_file2,
|
|
123
|
+
L: 54,
|
|
241
124
|
S: this,
|
|
242
125
|
A: [
|
|
243
126
|
"this._port",
|
|
@@ -252,32 +135,45 @@ var DevServer = class {
|
|
|
252
135
|
get functions() {
|
|
253
136
|
return Object.values(this._handlers);
|
|
254
137
|
}
|
|
138
|
+
async initialize() {
|
|
139
|
+
for (const def of this._options.manifest.functions) {
|
|
140
|
+
try {
|
|
141
|
+
await this._load(def);
|
|
142
|
+
} catch (err) {
|
|
143
|
+
import_log2.log.error("parsing function (check manifest)", err, {
|
|
144
|
+
F: __dxlog_file2,
|
|
145
|
+
L: 71,
|
|
146
|
+
S: this,
|
|
147
|
+
C: (f, a) => f(...a)
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
255
152
|
async start() {
|
|
256
153
|
(0, import_invariant.invariant)(!this._server, void 0, {
|
|
257
|
-
F:
|
|
258
|
-
L:
|
|
154
|
+
F: __dxlog_file2,
|
|
155
|
+
L: 77,
|
|
259
156
|
S: this,
|
|
260
157
|
A: [
|
|
261
158
|
"!this._server",
|
|
262
159
|
""
|
|
263
160
|
]
|
|
264
161
|
});
|
|
265
|
-
|
|
266
|
-
F:
|
|
267
|
-
L:
|
|
162
|
+
import_log2.log.info("starting...", void 0, {
|
|
163
|
+
F: __dxlog_file2,
|
|
164
|
+
L: 78,
|
|
268
165
|
S: this,
|
|
269
166
|
C: (f, a) => f(...a)
|
|
270
167
|
});
|
|
271
|
-
this._ctx = createContext();
|
|
272
168
|
const app = (0, import_express.default)();
|
|
273
169
|
app.use(import_express.default.json());
|
|
274
170
|
app.post("/:path", async (req, res) => {
|
|
275
171
|
const { path: path2 } = req.params;
|
|
276
172
|
try {
|
|
277
|
-
|
|
173
|
+
import_log2.log.info("calling", {
|
|
278
174
|
path: path2
|
|
279
175
|
}, {
|
|
280
|
-
F:
|
|
176
|
+
F: __dxlog_file2,
|
|
281
177
|
L: 87,
|
|
282
178
|
S: this,
|
|
283
179
|
C: (f, a) => f(...a)
|
|
@@ -289,8 +185,8 @@ var DevServer = class {
|
|
|
289
185
|
res.statusCode = await this.invoke("/" + path2, req.body);
|
|
290
186
|
res.end();
|
|
291
187
|
} catch (err) {
|
|
292
|
-
|
|
293
|
-
F:
|
|
188
|
+
import_log2.log.catch(err, void 0, {
|
|
189
|
+
F: __dxlog_file2,
|
|
294
190
|
L: 97,
|
|
295
191
|
S: this,
|
|
296
192
|
C: (f, a) => f(...a)
|
|
@@ -310,61 +206,64 @@ var DevServer = class {
|
|
|
310
206
|
this._server = app.listen(this._port);
|
|
311
207
|
try {
|
|
312
208
|
const { registrationId, endpoint } = await this._client.services.services.FunctionRegistryService.register({
|
|
313
|
-
endpoint: this.endpoint
|
|
209
|
+
endpoint: this.endpoint,
|
|
210
|
+
functions: this.functions.map(({ def: { id, path: path2 } }) => ({
|
|
211
|
+
id,
|
|
212
|
+
path: path2
|
|
213
|
+
}))
|
|
314
214
|
});
|
|
315
|
-
|
|
215
|
+
import_log2.log.info("registered", {
|
|
316
216
|
endpoint
|
|
317
217
|
}, {
|
|
318
|
-
F:
|
|
319
|
-
L:
|
|
218
|
+
F: __dxlog_file2,
|
|
219
|
+
L: 113,
|
|
320
220
|
S: this,
|
|
321
221
|
C: (f, a) => f(...a)
|
|
322
222
|
});
|
|
323
223
|
this._proxy = endpoint;
|
|
324
224
|
this._functionServiceRegistration = registrationId;
|
|
325
|
-
await this._functionsRegistry.open(this._ctx);
|
|
326
225
|
} catch (err) {
|
|
327
226
|
await this.stop();
|
|
328
227
|
throw new Error("FunctionRegistryService not available (check plugin is configured).");
|
|
329
228
|
}
|
|
330
|
-
|
|
229
|
+
import_log2.log.info("started", {
|
|
331
230
|
port: this._port
|
|
332
231
|
}, {
|
|
333
|
-
F:
|
|
334
|
-
L:
|
|
232
|
+
F: __dxlog_file2,
|
|
233
|
+
L: 121,
|
|
335
234
|
S: this,
|
|
336
235
|
C: (f, a) => f(...a)
|
|
337
236
|
});
|
|
338
237
|
}
|
|
339
238
|
async stop() {
|
|
340
239
|
(0, import_invariant.invariant)(this._server, void 0, {
|
|
341
|
-
F:
|
|
342
|
-
L:
|
|
240
|
+
F: __dxlog_file2,
|
|
241
|
+
L: 125,
|
|
343
242
|
S: this,
|
|
344
243
|
A: [
|
|
345
244
|
"this._server",
|
|
346
245
|
""
|
|
347
246
|
]
|
|
348
247
|
});
|
|
349
|
-
|
|
350
|
-
F:
|
|
351
|
-
L:
|
|
248
|
+
import_log2.log.info("stopping...", void 0, {
|
|
249
|
+
F: __dxlog_file2,
|
|
250
|
+
L: 126,
|
|
352
251
|
S: this,
|
|
353
252
|
C: (f, a) => f(...a)
|
|
354
253
|
});
|
|
355
|
-
const trigger = new
|
|
254
|
+
const trigger = new import_async.Trigger();
|
|
356
255
|
this._server.close(async () => {
|
|
357
|
-
|
|
358
|
-
F:
|
|
359
|
-
L:
|
|
256
|
+
import_log2.log.info("server stopped", void 0, {
|
|
257
|
+
F: __dxlog_file2,
|
|
258
|
+
L: 130,
|
|
360
259
|
S: this,
|
|
361
260
|
C: (f, a) => f(...a)
|
|
362
261
|
});
|
|
363
262
|
try {
|
|
364
263
|
if (this._functionServiceRegistration) {
|
|
365
264
|
(0, import_invariant.invariant)(this._client.services.services.FunctionRegistryService, void 0, {
|
|
366
|
-
F:
|
|
367
|
-
L:
|
|
265
|
+
F: __dxlog_file2,
|
|
266
|
+
L: 133,
|
|
368
267
|
S: this,
|
|
369
268
|
A: [
|
|
370
269
|
"this._client.services.services.FunctionRegistryService",
|
|
@@ -374,11 +273,11 @@ var DevServer = class {
|
|
|
374
273
|
await this._client.services.services.FunctionRegistryService.unregister({
|
|
375
274
|
registrationId: this._functionServiceRegistration
|
|
376
275
|
});
|
|
377
|
-
|
|
276
|
+
import_log2.log.info("unregistered", {
|
|
378
277
|
registrationId: this._functionServiceRegistration
|
|
379
278
|
}, {
|
|
380
|
-
F:
|
|
381
|
-
L:
|
|
279
|
+
F: __dxlog_file2,
|
|
280
|
+
L: 138,
|
|
382
281
|
S: this,
|
|
383
282
|
C: (f, a) => f(...a)
|
|
384
283
|
});
|
|
@@ -393,9 +292,9 @@ var DevServer = class {
|
|
|
393
292
|
await trigger.wait();
|
|
394
293
|
this._port = void 0;
|
|
395
294
|
this._server = void 0;
|
|
396
|
-
|
|
397
|
-
F:
|
|
398
|
-
L:
|
|
295
|
+
import_log2.log.info("stopped", void 0, {
|
|
296
|
+
F: __dxlog_file2,
|
|
297
|
+
L: 152,
|
|
399
298
|
S: this,
|
|
400
299
|
C: (f, a) => f(...a)
|
|
401
300
|
});
|
|
@@ -403,85 +302,58 @@ var DevServer = class {
|
|
|
403
302
|
/**
|
|
404
303
|
* Load function.
|
|
405
304
|
*/
|
|
406
|
-
async _load(def, force) {
|
|
407
|
-
const {
|
|
305
|
+
async _load(def, force = false) {
|
|
306
|
+
const { id, path: path2, handler } = def;
|
|
408
307
|
const filePath = (0, import_node_path.join)(this._options.baseDir, handler);
|
|
409
|
-
|
|
410
|
-
|
|
308
|
+
import_log2.log.info("loading", {
|
|
309
|
+
id,
|
|
411
310
|
force
|
|
412
311
|
}, {
|
|
413
|
-
F:
|
|
414
|
-
L:
|
|
312
|
+
F: __dxlog_file2,
|
|
313
|
+
L: 161,
|
|
415
314
|
S: this,
|
|
416
315
|
C: (f, a) => f(...a)
|
|
417
316
|
});
|
|
418
317
|
if (force) {
|
|
419
|
-
Object.keys(
|
|
420
|
-
delete
|
|
318
|
+
Object.keys(__require.cache).filter((key) => key.startsWith(filePath)).forEach((key) => {
|
|
319
|
+
delete __require.cache[key];
|
|
421
320
|
});
|
|
422
321
|
}
|
|
423
|
-
const module2 =
|
|
322
|
+
const module2 = __require(filePath);
|
|
424
323
|
if (typeof module2.default !== "function") {
|
|
425
|
-
throw new Error(`Handler must export default function: ${
|
|
324
|
+
throw new Error(`Handler must export default function: ${id}`);
|
|
426
325
|
}
|
|
427
|
-
this._handlers[
|
|
326
|
+
this._handlers[path2] = {
|
|
428
327
|
def,
|
|
429
328
|
handler: module2.default
|
|
430
329
|
};
|
|
431
330
|
}
|
|
432
|
-
async _safeUpdateRegistration() {
|
|
433
|
-
(0, import_invariant.invariant)(this._functionServiceRegistration, void 0, {
|
|
434
|
-
F: __dxlog_file3,
|
|
435
|
-
L: 185,
|
|
436
|
-
S: this,
|
|
437
|
-
A: [
|
|
438
|
-
"this._functionServiceRegistration",
|
|
439
|
-
""
|
|
440
|
-
]
|
|
441
|
-
});
|
|
442
|
-
try {
|
|
443
|
-
await this._client.services.services.FunctionRegistryService.updateRegistration({
|
|
444
|
-
registrationId: this._functionServiceRegistration,
|
|
445
|
-
functions: this.functions.map(({ def: { id, route } }) => ({
|
|
446
|
-
id,
|
|
447
|
-
route
|
|
448
|
-
}))
|
|
449
|
-
});
|
|
450
|
-
} catch (e) {
|
|
451
|
-
import_log3.log.catch(e, void 0, {
|
|
452
|
-
F: __dxlog_file3,
|
|
453
|
-
L: 192,
|
|
454
|
-
S: this,
|
|
455
|
-
C: (f, a) => f(...a)
|
|
456
|
-
});
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
331
|
/**
|
|
460
332
|
* Invoke function.
|
|
461
333
|
*/
|
|
462
334
|
async invoke(path2, data) {
|
|
463
335
|
const seq = ++this._seq;
|
|
464
336
|
const now = Date.now();
|
|
465
|
-
|
|
337
|
+
import_log2.log.info("req", {
|
|
466
338
|
seq,
|
|
467
339
|
path: path2
|
|
468
340
|
}, {
|
|
469
|
-
F:
|
|
470
|
-
L:
|
|
341
|
+
F: __dxlog_file2,
|
|
342
|
+
L: 188,
|
|
471
343
|
S: this,
|
|
472
344
|
C: (f, a) => f(...a)
|
|
473
345
|
});
|
|
474
346
|
const statusCode = await this._invoke(path2, {
|
|
475
347
|
data
|
|
476
348
|
});
|
|
477
|
-
|
|
349
|
+
import_log2.log.info("res", {
|
|
478
350
|
seq,
|
|
479
351
|
path: path2,
|
|
480
352
|
statusCode,
|
|
481
353
|
duration: Date.now() - now
|
|
482
354
|
}, {
|
|
483
|
-
F:
|
|
484
|
-
L:
|
|
355
|
+
F: __dxlog_file2,
|
|
356
|
+
L: 191,
|
|
485
357
|
S: this,
|
|
486
358
|
C: (f, a) => f(...a)
|
|
487
359
|
});
|
|
@@ -491,8 +363,8 @@ var DevServer = class {
|
|
|
491
363
|
async _invoke(path2, event) {
|
|
492
364
|
const { handler } = this._handlers[path2] ?? {};
|
|
493
365
|
(0, import_invariant.invariant)(handler, `invalid path: ${path2}`, {
|
|
494
|
-
F:
|
|
495
|
-
L:
|
|
366
|
+
F: __dxlog_file2,
|
|
367
|
+
L: 198,
|
|
496
368
|
S: this,
|
|
497
369
|
A: [
|
|
498
370
|
"handler",
|
|
@@ -518,98 +390,111 @@ var DevServer = class {
|
|
|
518
390
|
return statusCode;
|
|
519
391
|
}
|
|
520
392
|
};
|
|
521
|
-
var
|
|
522
|
-
name: "DevServer"
|
|
523
|
-
});
|
|
524
|
-
var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/core/functions/src/runtime/scheduler.ts";
|
|
393
|
+
var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/core/functions/src/runtime/scheduler.ts";
|
|
525
394
|
var Scheduler = class {
|
|
526
|
-
constructor(
|
|
527
|
-
this.
|
|
528
|
-
this.
|
|
395
|
+
constructor(_client, _manifest, _options = {}) {
|
|
396
|
+
this._client = _client;
|
|
397
|
+
this._manifest = _manifest;
|
|
529
398
|
this._options = _options;
|
|
530
|
-
this.
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
});
|
|
399
|
+
this._mounts = new import_util2.ComplexMap(({ spaceKey, id }) => `${spaceKey.toHex()}:${id}`);
|
|
400
|
+
}
|
|
401
|
+
get mounts() {
|
|
402
|
+
return Array.from(this._mounts.values()).reduce((acc, { trigger }) => {
|
|
403
|
+
acc.push(trigger);
|
|
404
|
+
return acc;
|
|
405
|
+
}, []);
|
|
538
406
|
}
|
|
539
407
|
async start() {
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
408
|
+
this._client.spaces.subscribe(async (spaces) => {
|
|
409
|
+
for (const space of spaces) {
|
|
410
|
+
await space.waitUntilReady();
|
|
411
|
+
for (const trigger of this._manifest.triggers ?? []) {
|
|
412
|
+
await this.mount(new import_context.Context(), space, trigger);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
});
|
|
544
416
|
}
|
|
545
417
|
async stop() {
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
}
|
|
550
|
-
// TODO(burdon): Remove and update registries directly.
|
|
551
|
-
async register(space, manifest) {
|
|
552
|
-
await this.functions.register(space, manifest.functions);
|
|
553
|
-
await this.triggers.register(space, manifest);
|
|
418
|
+
for (const { id, spaceKey } of this._mounts.keys()) {
|
|
419
|
+
await this.unmount(id, spaceKey);
|
|
420
|
+
}
|
|
554
421
|
}
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
422
|
+
/**
|
|
423
|
+
* Mount trigger.
|
|
424
|
+
*/
|
|
425
|
+
async mount(ctx, space, trigger) {
|
|
426
|
+
const key = {
|
|
427
|
+
spaceKey: space.key,
|
|
428
|
+
id: trigger.function
|
|
429
|
+
};
|
|
430
|
+
const def = this._manifest.functions.find((config) => config.id === trigger.function);
|
|
431
|
+
(0, import_invariant2.invariant)(def, `Function not found: ${trigger.function}`, {
|
|
432
|
+
F: __dxlog_file3,
|
|
433
|
+
L: 76,
|
|
434
|
+
S: this,
|
|
435
|
+
A: [
|
|
436
|
+
"def",
|
|
437
|
+
"`Function not found: ${trigger.function}`"
|
|
438
|
+
]
|
|
558
439
|
});
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
440
|
+
const exists = this._mounts.get(key);
|
|
441
|
+
if (!exists) {
|
|
442
|
+
this._mounts.set(key, {
|
|
443
|
+
ctx,
|
|
444
|
+
trigger
|
|
445
|
+
});
|
|
446
|
+
(0, import_log3.log)("mount", {
|
|
447
|
+
space: space.key,
|
|
448
|
+
trigger
|
|
566
449
|
}, {
|
|
567
|
-
F:
|
|
568
|
-
L:
|
|
450
|
+
F: __dxlog_file3,
|
|
451
|
+
L: 82,
|
|
569
452
|
S: this,
|
|
570
453
|
C: (f, a) => f(...a)
|
|
571
454
|
});
|
|
572
|
-
|
|
455
|
+
if (ctx.disposed) {
|
|
456
|
+
return;
|
|
457
|
+
}
|
|
458
|
+
if (trigger.timer) {
|
|
459
|
+
await this._createTimer(ctx, space, def, trigger);
|
|
460
|
+
}
|
|
461
|
+
if (trigger.webhook) {
|
|
462
|
+
await this._createWebhook(ctx, space, def, trigger);
|
|
463
|
+
}
|
|
464
|
+
if (trigger.websocket) {
|
|
465
|
+
await this._createWebsocket(ctx, space, def, trigger);
|
|
466
|
+
}
|
|
467
|
+
if (trigger.subscription) {
|
|
468
|
+
await this._createSubscription(ctx, space, def, trigger);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
async unmount(id, spaceKey) {
|
|
473
|
+
const key = {
|
|
474
|
+
id,
|
|
475
|
+
spaceKey
|
|
476
|
+
};
|
|
477
|
+
const { ctx } = this._mounts.get(key) ?? {};
|
|
478
|
+
if (ctx) {
|
|
479
|
+
this._mounts.delete(key);
|
|
480
|
+
await ctx.dispose();
|
|
573
481
|
}
|
|
574
|
-
await this.triggers.activate({
|
|
575
|
-
space
|
|
576
|
-
}, fnTrigger, async (args) => {
|
|
577
|
-
return this._callMutex.executeSynchronized(() => {
|
|
578
|
-
return this._execFunction(definition, fnTrigger, {
|
|
579
|
-
meta: fnTrigger.meta,
|
|
580
|
-
data: {
|
|
581
|
-
...args,
|
|
582
|
-
spaceKey: space.key
|
|
583
|
-
}
|
|
584
|
-
});
|
|
585
|
-
});
|
|
586
|
-
});
|
|
587
|
-
(0, import_log4.log)("activated trigger", {
|
|
588
|
-
space: space.key,
|
|
589
|
-
trigger: fnTrigger
|
|
590
|
-
}, {
|
|
591
|
-
F: __dxlog_file4,
|
|
592
|
-
L: 91,
|
|
593
|
-
S: this,
|
|
594
|
-
C: (f, a) => f(...a)
|
|
595
|
-
});
|
|
596
482
|
}
|
|
597
|
-
async _execFunction(def, trigger,
|
|
483
|
+
async _execFunction(def, trigger, data) {
|
|
598
484
|
let status = 0;
|
|
599
485
|
try {
|
|
600
|
-
const payload = Object.assign({},
|
|
601
|
-
meta
|
|
486
|
+
const payload = Object.assign({}, {
|
|
487
|
+
meta: trigger.meta
|
|
602
488
|
}, data);
|
|
603
489
|
const { endpoint, callback } = this._options;
|
|
604
490
|
if (endpoint) {
|
|
605
|
-
const url = import_node_path2.default.join(endpoint, def.
|
|
606
|
-
|
|
607
|
-
function: def.
|
|
608
|
-
url
|
|
609
|
-
triggerType: trigger.spec.type
|
|
491
|
+
const url = import_node_path2.default.join(endpoint, def.path);
|
|
492
|
+
import_log3.log.info("exec", {
|
|
493
|
+
function: def.id,
|
|
494
|
+
url
|
|
610
495
|
}, {
|
|
611
|
-
F:
|
|
612
|
-
L:
|
|
496
|
+
F: __dxlog_file3,
|
|
497
|
+
L: 128,
|
|
613
498
|
S: this,
|
|
614
499
|
C: (f, a) => f(...a)
|
|
615
500
|
});
|
|
@@ -622,11 +507,11 @@ var Scheduler = class {
|
|
|
622
507
|
});
|
|
623
508
|
status = response.status;
|
|
624
509
|
} else if (callback) {
|
|
625
|
-
|
|
626
|
-
function: def.
|
|
510
|
+
import_log3.log.info("exec", {
|
|
511
|
+
function: def.id
|
|
627
512
|
}, {
|
|
628
|
-
F:
|
|
629
|
-
L:
|
|
513
|
+
F: __dxlog_file3,
|
|
514
|
+
L: 139,
|
|
630
515
|
S: this,
|
|
631
516
|
C: (f, a) => f(...a)
|
|
632
517
|
});
|
|
@@ -635,22 +520,22 @@ var Scheduler = class {
|
|
|
635
520
|
if (status && status >= 400) {
|
|
636
521
|
throw new Error(`Response: ${status}`);
|
|
637
522
|
}
|
|
638
|
-
|
|
639
|
-
function: def.
|
|
523
|
+
import_log3.log.info("done", {
|
|
524
|
+
function: def.id,
|
|
640
525
|
status
|
|
641
526
|
}, {
|
|
642
|
-
F:
|
|
643
|
-
L:
|
|
527
|
+
F: __dxlog_file3,
|
|
528
|
+
L: 149,
|
|
644
529
|
S: this,
|
|
645
530
|
C: (f, a) => f(...a)
|
|
646
531
|
});
|
|
647
532
|
} catch (err) {
|
|
648
|
-
|
|
649
|
-
function: def.
|
|
533
|
+
import_log3.log.error("error", {
|
|
534
|
+
function: def.id,
|
|
650
535
|
error: err.message
|
|
651
536
|
}, {
|
|
652
|
-
F:
|
|
653
|
-
L:
|
|
537
|
+
F: __dxlog_file3,
|
|
538
|
+
L: 151,
|
|
654
539
|
S: this,
|
|
655
540
|
C: (f, a) => f(...a)
|
|
656
541
|
});
|
|
@@ -658,408 +543,334 @@ var Scheduler = class {
|
|
|
658
543
|
}
|
|
659
544
|
return status;
|
|
660
545
|
}
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
objectIds.clear();
|
|
672
|
-
await callback({
|
|
673
|
-
objects
|
|
674
|
-
});
|
|
675
|
-
}
|
|
676
|
-
}, {
|
|
677
|
-
maxFrequency: 4
|
|
678
|
-
});
|
|
679
|
-
const subscriptions = [];
|
|
680
|
-
const subscription = (0, import_echo_db.createSubscription)(({ added, updated }) => {
|
|
681
|
-
const sizeBefore = objectIds.size;
|
|
682
|
-
for (const object of added) {
|
|
683
|
-
objectIds.add(object.id);
|
|
684
|
-
}
|
|
685
|
-
for (const object of updated) {
|
|
686
|
-
objectIds.add(object.id);
|
|
687
|
-
}
|
|
688
|
-
if (objectIds.size > sizeBefore) {
|
|
689
|
-
import_log6.log.info("updated", {
|
|
690
|
-
added: added.length,
|
|
691
|
-
updated: updated.length
|
|
692
|
-
}, {
|
|
693
|
-
F: __dxlog_file5,
|
|
694
|
-
L: 45,
|
|
695
|
-
S: void 0,
|
|
696
|
-
C: (f, a) => f(...a)
|
|
697
|
-
});
|
|
698
|
-
task.trigger();
|
|
699
|
-
}
|
|
700
|
-
});
|
|
701
|
-
subscriptions.push(() => subscription.unsubscribe());
|
|
702
|
-
const { filter, options: { deep, delay } = {} } = spec;
|
|
703
|
-
const update = ({ objects }) => {
|
|
704
|
-
subscription.update(objects);
|
|
705
|
-
if (deep) {
|
|
706
|
-
import_log6.log.info("update", {
|
|
707
|
-
objects: objects.length
|
|
708
|
-
}, {
|
|
709
|
-
F: __dxlog_file5,
|
|
710
|
-
L: 59,
|
|
711
|
-
S: void 0,
|
|
712
|
-
C: (f, a) => f(...a)
|
|
713
|
-
});
|
|
714
|
-
for (const object of objects) {
|
|
715
|
-
const content = object.content;
|
|
716
|
-
if (content instanceof import_types.TextV0Type) {
|
|
717
|
-
subscriptions.push((0, import_echo_db.getAutomergeObjectCore)(content).updates.on((0, import_async5.debounce)(() => subscription.update([
|
|
718
|
-
object
|
|
719
|
-
]), 1e3)));
|
|
720
|
-
}
|
|
721
|
-
}
|
|
722
|
-
}
|
|
723
|
-
};
|
|
724
|
-
const query = triggerCtx.space.db.query(import_echo_db.Filter.or(filter.map(({ type, props }) => import_echo_db.Filter.typename(type, props))));
|
|
725
|
-
subscriptions.push(query.subscribe(delay ? (0, import_async5.debounce)(update, delay) : update));
|
|
726
|
-
ctx.onDispose(() => {
|
|
727
|
-
subscriptions.forEach((unsubscribe) => unsubscribe());
|
|
728
|
-
});
|
|
729
|
-
};
|
|
730
|
-
var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/core/functions/src/trigger/type/timer-trigger.ts";
|
|
731
|
-
var createTimerTrigger = async (ctx, triggerContext, spec, callback) => {
|
|
732
|
-
const task = new import_async6.DeferredTask(ctx, async () => {
|
|
733
|
-
await callback({});
|
|
734
|
-
});
|
|
735
|
-
let last = 0;
|
|
736
|
-
let run = 0;
|
|
737
|
-
const job = import_cron.CronJob.from({
|
|
738
|
-
cronTime: spec.cron,
|
|
739
|
-
runOnInit: false,
|
|
740
|
-
onTick: () => {
|
|
741
|
-
const now = Date.now();
|
|
742
|
-
const delta = last ? now - last : 0;
|
|
743
|
-
last = now;
|
|
744
|
-
run++;
|
|
745
|
-
import_log7.log.info("tick", {
|
|
746
|
-
space: triggerContext.space.key.truncate(),
|
|
747
|
-
count: run,
|
|
748
|
-
delta
|
|
749
|
-
}, {
|
|
750
|
-
F: __dxlog_file6,
|
|
751
|
-
L: 37,
|
|
752
|
-
S: void 0,
|
|
753
|
-
C: (f, a) => f(...a)
|
|
754
|
-
});
|
|
755
|
-
task.schedule();
|
|
756
|
-
}
|
|
757
|
-
});
|
|
758
|
-
job.start();
|
|
759
|
-
ctx.onDispose(() => job.stop());
|
|
760
|
-
};
|
|
761
|
-
var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/core/functions/src/trigger/type/webhook-trigger.ts";
|
|
762
|
-
var createWebhookTrigger = async (ctx, _, spec, callback) => {
|
|
763
|
-
const server = import_node_http.default.createServer(async (req, res) => {
|
|
764
|
-
if (req.method !== spec.method) {
|
|
765
|
-
res.statusCode = 405;
|
|
766
|
-
return res.end();
|
|
767
|
-
}
|
|
768
|
-
res.statusCode = await callback({});
|
|
769
|
-
res.end();
|
|
770
|
-
});
|
|
771
|
-
const port = await (0, import_get_port_please2.getPort)({
|
|
772
|
-
random: true
|
|
773
|
-
});
|
|
774
|
-
server.listen(port, () => {
|
|
775
|
-
import_log8.log.info("started webhook", {
|
|
776
|
-
port
|
|
546
|
+
//
|
|
547
|
+
// Triggers
|
|
548
|
+
//
|
|
549
|
+
/**
|
|
550
|
+
* Cron timer.
|
|
551
|
+
*/
|
|
552
|
+
async _createTimer(ctx, space, def, trigger) {
|
|
553
|
+
import_log3.log.info("timer", {
|
|
554
|
+
space: space.key,
|
|
555
|
+
trigger
|
|
777
556
|
}, {
|
|
778
|
-
F:
|
|
779
|
-
L:
|
|
780
|
-
S:
|
|
557
|
+
F: __dxlog_file3,
|
|
558
|
+
L: 166,
|
|
559
|
+
S: this,
|
|
781
560
|
C: (f, a) => f(...a)
|
|
782
561
|
});
|
|
783
|
-
spec
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
};
|
|
789
|
-
var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/core/functions/src/trigger/type/websocket-trigger.ts";
|
|
790
|
-
var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
|
|
791
|
-
retryDelay: 2,
|
|
792
|
-
maxAttempts: 5
|
|
793
|
-
}) => {
|
|
794
|
-
const { url, init } = spec;
|
|
795
|
-
let ws;
|
|
796
|
-
for (let attempt = 1; attempt <= options.maxAttempts; attempt++) {
|
|
797
|
-
const open = new import_async7.Trigger();
|
|
798
|
-
ws = new import_ws.default(url);
|
|
799
|
-
Object.assign(ws, {
|
|
800
|
-
onopen: () => {
|
|
801
|
-
import_log9.log.info("opened", {
|
|
802
|
-
url
|
|
803
|
-
}, {
|
|
804
|
-
F: __dxlog_file8,
|
|
805
|
-
L: 39,
|
|
806
|
-
S: void 0,
|
|
807
|
-
C: (f, a) => f(...a)
|
|
808
|
-
});
|
|
809
|
-
if (spec.init) {
|
|
810
|
-
ws.send(new TextEncoder().encode(JSON.stringify(init)));
|
|
811
|
-
}
|
|
812
|
-
open.wake(true);
|
|
813
|
-
},
|
|
814
|
-
onclose: (event) => {
|
|
815
|
-
import_log9.log.info("closed", {
|
|
816
|
-
url,
|
|
817
|
-
code: event.code
|
|
818
|
-
}, {
|
|
819
|
-
F: __dxlog_file8,
|
|
820
|
-
L: 48,
|
|
821
|
-
S: void 0,
|
|
822
|
-
C: (f, a) => f(...a)
|
|
823
|
-
});
|
|
824
|
-
if (event.code === 1006) {
|
|
825
|
-
setTimeout(async () => {
|
|
826
|
-
import_log9.log.info(`reconnecting in ${options.retryDelay}s...`, {
|
|
827
|
-
url
|
|
828
|
-
}, {
|
|
829
|
-
F: __dxlog_file8,
|
|
830
|
-
L: 53,
|
|
831
|
-
S: void 0,
|
|
832
|
-
C: (f, a) => f(...a)
|
|
833
|
-
});
|
|
834
|
-
await createWebsocketTrigger(ctx, triggerCtx, spec, callback, options);
|
|
835
|
-
}, options.retryDelay * 1e3);
|
|
836
|
-
}
|
|
837
|
-
open.wake(false);
|
|
838
|
-
},
|
|
839
|
-
onerror: (event) => {
|
|
840
|
-
import_log9.log.catch(event.error, {
|
|
841
|
-
url
|
|
842
|
-
}, {
|
|
843
|
-
F: __dxlog_file8,
|
|
844
|
-
L: 62,
|
|
845
|
-
S: void 0,
|
|
846
|
-
C: (f, a) => f(...a)
|
|
847
|
-
});
|
|
848
|
-
},
|
|
849
|
-
onmessage: async (event) => {
|
|
850
|
-
try {
|
|
851
|
-
import_log9.log.info("message", void 0, {
|
|
852
|
-
F: __dxlog_file8,
|
|
853
|
-
L: 67,
|
|
854
|
-
S: void 0,
|
|
855
|
-
C: (f, a) => f(...a)
|
|
856
|
-
});
|
|
857
|
-
const data = JSON.parse(new TextDecoder().decode(event.data));
|
|
858
|
-
await callback({
|
|
859
|
-
data
|
|
860
|
-
});
|
|
861
|
-
} catch (err) {
|
|
862
|
-
import_log9.log.catch(err, {
|
|
863
|
-
url
|
|
864
|
-
}, {
|
|
865
|
-
F: __dxlog_file8,
|
|
866
|
-
L: 71,
|
|
867
|
-
S: void 0,
|
|
868
|
-
C: (f, a) => f(...a)
|
|
869
|
-
});
|
|
870
|
-
}
|
|
871
|
-
}
|
|
562
|
+
const spec = trigger.timer;
|
|
563
|
+
const task = new import_async2.DeferredTask(ctx, async () => {
|
|
564
|
+
await this._execFunction(def, trigger, {
|
|
565
|
+
spaceKey: space.key
|
|
566
|
+
});
|
|
872
567
|
});
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
568
|
+
let last = 0;
|
|
569
|
+
let run = 0;
|
|
570
|
+
const job = import_cron.CronJob.from({
|
|
571
|
+
cronTime: spec.cron,
|
|
572
|
+
runOnInit: false,
|
|
573
|
+
onTick: () => {
|
|
574
|
+
const now = Date.now();
|
|
575
|
+
const delta = last ? now - last : 0;
|
|
576
|
+
last = now;
|
|
577
|
+
run++;
|
|
578
|
+
import_log3.log.info("tick", {
|
|
579
|
+
space: space.key.truncate(),
|
|
580
|
+
count: run,
|
|
581
|
+
delta
|
|
881
582
|
}, {
|
|
882
|
-
F:
|
|
883
|
-
L:
|
|
884
|
-
S:
|
|
583
|
+
F: __dxlog_file3,
|
|
584
|
+
L: 186,
|
|
585
|
+
S: this,
|
|
885
586
|
C: (f, a) => f(...a)
|
|
886
587
|
});
|
|
887
|
-
|
|
588
|
+
task.schedule();
|
|
888
589
|
}
|
|
889
|
-
}
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
ws?.close();
|
|
893
|
-
});
|
|
894
|
-
};
|
|
895
|
-
var __dxlog_file9 = "/home/runner/work/dxos/dxos/packages/core/functions/src/trigger/trigger-registry.ts";
|
|
896
|
-
var triggerHandlers = {
|
|
897
|
-
subscription: createSubscriptionTrigger,
|
|
898
|
-
timer: createTimerTrigger,
|
|
899
|
-
webhook: createWebhookTrigger,
|
|
900
|
-
websocket: createWebsocketTrigger
|
|
901
|
-
};
|
|
902
|
-
var TriggerRegistry = class extends import_context4.Resource {
|
|
903
|
-
constructor(_client, _options) {
|
|
904
|
-
super();
|
|
905
|
-
this._client = _client;
|
|
906
|
-
this._options = _options;
|
|
907
|
-
this._triggersBySpaceKey = new import_util3.ComplexMap(import_keys2.PublicKey.hash);
|
|
908
|
-
this.registered = new import_async4.Event();
|
|
909
|
-
this.removed = new import_async4.Event();
|
|
910
|
-
}
|
|
911
|
-
getActiveTriggers(space) {
|
|
912
|
-
return this._getTriggers(space, (t) => t.activationCtx != null);
|
|
913
|
-
}
|
|
914
|
-
getInactiveTriggers(space) {
|
|
915
|
-
return this._getTriggers(space, (t) => t.activationCtx == null);
|
|
590
|
+
});
|
|
591
|
+
job.start();
|
|
592
|
+
ctx.onDispose(() => job.stop());
|
|
916
593
|
}
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
594
|
+
/**
|
|
595
|
+
* Webhook.
|
|
596
|
+
*/
|
|
597
|
+
async _createWebhook(ctx, space, def, trigger) {
|
|
598
|
+
import_log3.log.info("webhook", {
|
|
599
|
+
space: space.key,
|
|
920
600
|
trigger
|
|
921
601
|
}, {
|
|
922
|
-
F:
|
|
923
|
-
L:
|
|
602
|
+
F: __dxlog_file3,
|
|
603
|
+
L: 199,
|
|
924
604
|
S: this,
|
|
925
605
|
C: (f, a) => f(...a)
|
|
926
606
|
});
|
|
927
|
-
const
|
|
928
|
-
|
|
607
|
+
const spec = trigger.webhook;
|
|
608
|
+
const server = import_node_http.default.createServer(async (req, res) => {
|
|
609
|
+
if (req.method !== spec.method) {
|
|
610
|
+
res.statusCode = 405;
|
|
611
|
+
return res.end();
|
|
612
|
+
}
|
|
613
|
+
res.statusCode = await this._execFunction(def, trigger, {
|
|
614
|
+
spaceKey: space.key
|
|
615
|
+
});
|
|
616
|
+
res.end();
|
|
929
617
|
});
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
618
|
+
const port = await (0, import_get_port_please2.getPort)({
|
|
619
|
+
random: true
|
|
620
|
+
});
|
|
621
|
+
server.listen(port, () => {
|
|
622
|
+
import_log3.log.info("started webhook", {
|
|
623
|
+
port
|
|
624
|
+
}, {
|
|
625
|
+
F: __dxlog_file3,
|
|
626
|
+
L: 223,
|
|
627
|
+
S: this,
|
|
628
|
+
C: (f, a) => f(...a)
|
|
629
|
+
});
|
|
630
|
+
spec.port = port;
|
|
631
|
+
});
|
|
632
|
+
ctx.onDispose(() => {
|
|
633
|
+
server.close();
|
|
940
634
|
});
|
|
941
|
-
registeredTrigger.activationCtx = activationCtx;
|
|
942
|
-
try {
|
|
943
|
-
const options = this._options?.[trigger.spec.type];
|
|
944
|
-
await triggerHandlers[trigger.spec.type](activationCtx, triggerCtx, trigger.spec, callback, options);
|
|
945
|
-
} catch (err) {
|
|
946
|
-
delete registeredTrigger.activationCtx;
|
|
947
|
-
throw err;
|
|
948
|
-
}
|
|
949
635
|
}
|
|
950
636
|
/**
|
|
951
|
-
*
|
|
637
|
+
* Websocket.
|
|
638
|
+
* NOTE: The port must be unique, so the same hook cannot be used for multiple spaces.
|
|
952
639
|
*/
|
|
953
|
-
async
|
|
954
|
-
|
|
955
|
-
|
|
640
|
+
async _createWebsocket(ctx, space, def, trigger, options = {
|
|
641
|
+
retryDelay: 2,
|
|
642
|
+
maxAttempts: 5
|
|
643
|
+
}) {
|
|
644
|
+
import_log3.log.info("websocket", {
|
|
645
|
+
space: space.key,
|
|
646
|
+
trigger
|
|
956
647
|
}, {
|
|
957
|
-
F:
|
|
958
|
-
L:
|
|
648
|
+
F: __dxlog_file3,
|
|
649
|
+
L: 249,
|
|
959
650
|
S: this,
|
|
960
651
|
C: (f, a) => f(...a)
|
|
961
652
|
});
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
653
|
+
const spec = trigger.websocket;
|
|
654
|
+
const { url, init } = spec;
|
|
655
|
+
let ws;
|
|
656
|
+
for (let attempt = 1; attempt <= options.maxAttempts; attempt++) {
|
|
657
|
+
const open = new import_async2.Trigger();
|
|
658
|
+
ws = new import_ws.default(url);
|
|
659
|
+
Object.assign(ws, {
|
|
660
|
+
onopen: () => {
|
|
661
|
+
import_log3.log.info("opened", {
|
|
662
|
+
url
|
|
663
|
+
}, {
|
|
664
|
+
F: __dxlog_file3,
|
|
665
|
+
L: 260,
|
|
666
|
+
S: this,
|
|
667
|
+
C: (f, a) => f(...a)
|
|
668
|
+
});
|
|
669
|
+
if (spec.init) {
|
|
670
|
+
ws.send(new TextEncoder().encode(JSON.stringify(init)));
|
|
671
|
+
}
|
|
672
|
+
open.wake(true);
|
|
673
|
+
},
|
|
674
|
+
onclose: (event) => {
|
|
675
|
+
import_log3.log.info("closed", {
|
|
676
|
+
url,
|
|
677
|
+
code: event.code
|
|
678
|
+
}, {
|
|
679
|
+
F: __dxlog_file3,
|
|
680
|
+
L: 269,
|
|
681
|
+
S: this,
|
|
682
|
+
C: (f, a) => f(...a)
|
|
683
|
+
});
|
|
684
|
+
if (event.code === 1006) {
|
|
685
|
+
setTimeout(async () => {
|
|
686
|
+
import_log3.log.info(`reconnecting in ${options.retryDelay}s...`, {
|
|
687
|
+
url
|
|
688
|
+
}, {
|
|
689
|
+
F: __dxlog_file3,
|
|
690
|
+
L: 274,
|
|
691
|
+
S: this,
|
|
692
|
+
C: (f, a) => f(...a)
|
|
693
|
+
});
|
|
694
|
+
await this._createWebsocket(ctx, space, def, trigger, options);
|
|
695
|
+
}, options.retryDelay * 1e3);
|
|
696
|
+
}
|
|
697
|
+
open.wake(false);
|
|
698
|
+
},
|
|
699
|
+
onerror: (event) => {
|
|
700
|
+
import_log3.log.catch(event.error, {
|
|
701
|
+
url
|
|
702
|
+
}, {
|
|
703
|
+
F: __dxlog_file3,
|
|
704
|
+
L: 283,
|
|
705
|
+
S: this,
|
|
706
|
+
C: (f, a) => f(...a)
|
|
707
|
+
});
|
|
708
|
+
},
|
|
709
|
+
onmessage: async (event) => {
|
|
710
|
+
try {
|
|
711
|
+
const data = JSON.parse(new TextDecoder().decode(event.data));
|
|
712
|
+
await this._execFunction(def, trigger, {
|
|
713
|
+
spaceKey: space.key,
|
|
714
|
+
data
|
|
715
|
+
});
|
|
716
|
+
} catch (err) {
|
|
717
|
+
import_log3.log.catch(err, {
|
|
718
|
+
url
|
|
719
|
+
}, {
|
|
720
|
+
F: __dxlog_file3,
|
|
721
|
+
L: 291,
|
|
722
|
+
S: this,
|
|
723
|
+
C: (f, a) => f(...a)
|
|
724
|
+
});
|
|
725
|
+
}
|
|
989
726
|
}
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
727
|
+
});
|
|
728
|
+
const isOpen = await open.wait();
|
|
729
|
+
if (isOpen) {
|
|
730
|
+
break;
|
|
731
|
+
} else {
|
|
732
|
+
const wait = Math.pow(attempt, 2) * options.retryDelay;
|
|
733
|
+
if (attempt < options.maxAttempts) {
|
|
734
|
+
import_log3.log.warn(`failed to connect; trying again in ${wait}s`, {
|
|
735
|
+
attempt
|
|
736
|
+
}, {
|
|
737
|
+
F: __dxlog_file3,
|
|
738
|
+
L: 302,
|
|
739
|
+
S: this,
|
|
740
|
+
C: (f, a) => f(...a)
|
|
741
|
+
});
|
|
742
|
+
await (0, import_async2.sleep)(wait * 1e3);
|
|
995
743
|
}
|
|
996
|
-
const functionsSubscription = space.db.query(import_echo2.Filter.schema(import_chunk_3VSJ57ZZ.FunctionTrigger)).subscribe(async (triggers) => {
|
|
997
|
-
await this._handleRemovedTriggers(space, triggers.objects, registered);
|
|
998
|
-
this._handleNewTriggers(space, triggers.objects, registered);
|
|
999
|
-
});
|
|
1000
|
-
this._ctx.onDispose(functionsSubscription);
|
|
1001
744
|
}
|
|
745
|
+
}
|
|
746
|
+
ctx.onDispose(() => {
|
|
747
|
+
ws?.close();
|
|
1002
748
|
});
|
|
1003
|
-
this._ctx.onDispose(() => spaceListSubscription.unsubscribe());
|
|
1004
749
|
}
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
750
|
+
/**
|
|
751
|
+
* ECHO subscription.
|
|
752
|
+
*/
|
|
753
|
+
async _createSubscription(ctx, space, def, trigger) {
|
|
754
|
+
import_log3.log.info("subscription", {
|
|
755
|
+
space: space.key,
|
|
756
|
+
trigger
|
|
757
|
+
}, {
|
|
758
|
+
F: __dxlog_file3,
|
|
759
|
+
L: 317,
|
|
760
|
+
S: this,
|
|
761
|
+
C: (f, a) => f(...a)
|
|
1011
762
|
});
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
registered.push(...newRegisteredTriggers);
|
|
1017
|
-
(0, import_log5.log)("registered new triggers", () => ({
|
|
763
|
+
const spec = trigger.subscription;
|
|
764
|
+
const objectIds = /* @__PURE__ */ new Set();
|
|
765
|
+
const task = new import_async2.DeferredTask(ctx, async () => {
|
|
766
|
+
await this._execFunction(def, trigger, {
|
|
1018
767
|
spaceKey: space.key,
|
|
1019
|
-
|
|
1020
|
-
})
|
|
1021
|
-
|
|
1022
|
-
|
|
768
|
+
objects: Array.from(objectIds)
|
|
769
|
+
});
|
|
770
|
+
});
|
|
771
|
+
const subscriptions = [];
|
|
772
|
+
const subscription = (0, import_echo.createSubscription)(({ added, updated }) => {
|
|
773
|
+
import_log3.log.info("updated", {
|
|
774
|
+
added: added.length,
|
|
775
|
+
updated: updated.length
|
|
776
|
+
}, {
|
|
777
|
+
F: __dxlog_file3,
|
|
778
|
+
L: 329,
|
|
1023
779
|
S: this,
|
|
1024
780
|
C: (f, a) => f(...a)
|
|
1025
781
|
});
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
triggers: newTriggers
|
|
1029
|
-
});
|
|
1030
|
-
}
|
|
1031
|
-
}
|
|
1032
|
-
async _handleRemovedTriggers(space, allTriggers, registered) {
|
|
1033
|
-
const removed = [];
|
|
1034
|
-
for (let i = registered.length - 1; i >= 0; i--) {
|
|
1035
|
-
const wasRemoved = allTriggers.find((trigger) => trigger.id === registered[i].trigger.id) == null;
|
|
1036
|
-
if (wasRemoved) {
|
|
1037
|
-
const unregistered = registered.splice(i, 1)[0];
|
|
1038
|
-
await unregistered.activationCtx?.dispose();
|
|
1039
|
-
removed.push(unregistered.trigger);
|
|
782
|
+
for (const object of added) {
|
|
783
|
+
objectIds.add(object.id);
|
|
1040
784
|
}
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
}
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
785
|
+
for (const object of updated) {
|
|
786
|
+
objectIds.add(object.id);
|
|
787
|
+
}
|
|
788
|
+
task.schedule();
|
|
789
|
+
});
|
|
790
|
+
subscriptions.push(() => subscription.unsubscribe());
|
|
791
|
+
const { filter, options: { deep, delay } = {} } = spec;
|
|
792
|
+
const update = ({ objects }) => {
|
|
793
|
+
subscription.update(objects);
|
|
794
|
+
if (deep) {
|
|
795
|
+
import_log3.log.info("update", {
|
|
796
|
+
objects: objects.length
|
|
797
|
+
}, {
|
|
798
|
+
F: __dxlog_file3,
|
|
799
|
+
L: 349,
|
|
800
|
+
S: this,
|
|
801
|
+
C: (f, a) => f(...a)
|
|
802
|
+
});
|
|
803
|
+
for (const object of objects) {
|
|
804
|
+
const content = object.content;
|
|
805
|
+
if (content instanceof import_types.TextV0Type) {
|
|
806
|
+
subscriptions.push((0, import_echo.getAutomergeObjectCore)(content).updates.on((0, import_async2.debounce)(() => subscription.update([
|
|
807
|
+
object
|
|
808
|
+
]), 1e3)));
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
};
|
|
813
|
+
const query = space.db.query(import_echo.Filter.or(filter.map(({ type, props }) => import_echo.Filter.typename(type, props))));
|
|
814
|
+
subscriptions.push(query.subscribe(delay ? (0, import_async2.debounce)(update, delay) : update));
|
|
815
|
+
ctx.onDispose(() => {
|
|
816
|
+
subscriptions.forEach((unsubscribe) => unsubscribe());
|
|
817
|
+
});
|
|
1052
818
|
}
|
|
1053
819
|
};
|
|
820
|
+
var TimerTriggerSchema = S.struct({
|
|
821
|
+
cron: S.string
|
|
822
|
+
});
|
|
823
|
+
var WebhookTriggerSchema = S.mutable(S.struct({
|
|
824
|
+
method: S.string,
|
|
825
|
+
// Assigned port.
|
|
826
|
+
port: S.optional(S.number)
|
|
827
|
+
}));
|
|
828
|
+
var WebsocketTriggerSchema = S.struct({
|
|
829
|
+
url: S.string,
|
|
830
|
+
init: S.optional(S.record(S.string, S.any))
|
|
831
|
+
});
|
|
832
|
+
var SubscriptionTriggerSchema = S.struct({
|
|
833
|
+
spaceKey: S.optional(S.string),
|
|
834
|
+
// TODO(burdon): Define query DSL.
|
|
835
|
+
filter: S.array(S.struct({
|
|
836
|
+
type: S.string,
|
|
837
|
+
props: S.optional(S.record(S.string, S.any))
|
|
838
|
+
})),
|
|
839
|
+
options: S.optional(S.struct({
|
|
840
|
+
// Watch changes to object (not just creation).
|
|
841
|
+
deep: S.optional(S.boolean),
|
|
842
|
+
// Debounce changes (delay in ms).
|
|
843
|
+
delay: S.optional(S.number)
|
|
844
|
+
}))
|
|
845
|
+
});
|
|
846
|
+
var FunctionTriggerSchema = S.struct({
|
|
847
|
+
function: S.string.pipe(S.description("Function ID/URI.")),
|
|
848
|
+
// Context passed to function.
|
|
849
|
+
meta: S.optional(S.record(S.string, S.any)),
|
|
850
|
+
// Triggers.
|
|
851
|
+
timer: S.optional(TimerTriggerSchema),
|
|
852
|
+
webhook: S.optional(WebhookTriggerSchema),
|
|
853
|
+
websocket: S.optional(WebsocketTriggerSchema),
|
|
854
|
+
subscription: S.optional(SubscriptionTriggerSchema)
|
|
855
|
+
});
|
|
856
|
+
var FunctionDefSchema = S.struct({
|
|
857
|
+
id: S.string,
|
|
858
|
+
// name: S.string,
|
|
859
|
+
description: S.optional(S.string),
|
|
860
|
+
// TODO(burdon): Rename route?
|
|
861
|
+
path: S.string,
|
|
862
|
+
// TODO(burdon): NPM/GitHub/Docker/CF URL?
|
|
863
|
+
handler: S.string
|
|
864
|
+
});
|
|
865
|
+
var FunctionManifestSchema = S.struct({
|
|
866
|
+
functions: S.mutable(S.array(FunctionDefSchema)),
|
|
867
|
+
triggers: S.optional(S.mutable(S.array(FunctionTriggerSchema)))
|
|
868
|
+
});
|
|
1054
869
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1055
870
|
0 && (module.exports = {
|
|
1056
871
|
DevServer,
|
|
1057
|
-
FunctionDef,
|
|
1058
872
|
FunctionManifestSchema,
|
|
1059
|
-
FunctionRegistry,
|
|
1060
|
-
FunctionTrigger,
|
|
1061
873
|
Scheduler,
|
|
1062
|
-
TriggerRegistry,
|
|
1063
874
|
subscriptionHandler
|
|
1064
875
|
});
|
|
1065
876
|
//# sourceMappingURL=index.cjs.map
|