@dxos/functions-runtime-cloudflare 0.8.4-main.3c1ae3b → 0.8.4-main.40e3dcdf1b

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/lib/browser/index.mjs +523 -233
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +523 -233
  5. package/dist/lib/node-esm/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/functions-client.d.ts +1 -0
  8. package/dist/types/src/functions-client.d.ts.map +1 -1
  9. package/dist/types/src/internal/data-service-impl.d.ts +8 -7
  10. package/dist/types/src/internal/data-service-impl.d.ts.map +1 -1
  11. package/dist/types/src/internal/query-service-impl.d.ts +3 -9
  12. package/dist/types/src/internal/query-service-impl.d.ts.map +1 -1
  13. package/dist/types/src/internal/queue-service-impl.d.ts +8 -9
  14. package/dist/types/src/internal/queue-service-impl.d.ts.map +1 -1
  15. package/dist/types/src/internal/service-container.d.ts +8 -8
  16. package/dist/types/src/internal/service-container.d.ts.map +1 -1
  17. package/dist/types/src/internal/utils.d.ts +2 -0
  18. package/dist/types/src/internal/utils.d.ts.map +1 -0
  19. package/dist/types/src/logger.d.ts.map +1 -1
  20. package/dist/types/src/queues-api.d.ts +6 -6
  21. package/dist/types/src/queues-api.d.ts.map +1 -1
  22. package/dist/types/src/space-proxy.d.ts +3 -2
  23. package/dist/types/src/space-proxy.d.ts.map +1 -1
  24. package/dist/types/src/wrap-handler-for-cloudflare.d.ts.map +1 -1
  25. package/dist/types/tsconfig.tsbuildinfo +1 -1
  26. package/package.json +20 -16
  27. package/src/functions-client.ts +9 -2
  28. package/src/internal/data-service-impl.ts +28 -11
  29. package/src/internal/query-service-impl.ts +8 -58
  30. package/src/internal/queue-service-impl.ts +37 -22
  31. package/src/internal/service-container.ts +46 -11
  32. package/src/internal/utils.ts +5 -0
  33. package/src/logger.ts +2 -0
  34. package/src/queues-api.ts +6 -6
  35. package/src/space-proxy.ts +4 -3
  36. package/src/wrap-handler-for-cloudflare.ts +3 -3
  37. package/dist/types/src/internal/adapter.d.ts +0 -12
  38. package/dist/types/src/internal/adapter.d.ts.map +0 -1
  39. package/src/internal/adapter.ts +0 -48
@@ -1,7 +1,7 @@
1
1
  // src/functions-client.ts
2
2
  import { Resource as Resource2 } from "@dxos/context";
3
3
  import { EchoClient } from "@dxos/echo-db";
4
- import { invariant as invariant5 } from "@dxos/invariant";
4
+ import { invariant as invariant3 } from "@dxos/invariant";
5
5
 
6
6
  // src/internal/data-service-impl.ts
7
7
  import { Stream } from "@dxos/codec-protobuf/stream";
@@ -10,6 +10,76 @@ import { NotImplementedError, RuntimeServiceError } from "@dxos/errors";
10
10
  import { invariant } from "@dxos/invariant";
11
11
  import { SpaceId } from "@dxos/keys";
12
12
  import { log } from "@dxos/log";
13
+
14
+ // src/internal/utils.ts
15
+ var copyUint8Array = (value) => new Uint8Array(value);
16
+
17
+ // src/internal/data-service-impl.ts
18
+ function _ts_add_disposable_resource(env, value, async) {
19
+ if (value !== null && value !== void 0) {
20
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
21
+ var dispose, inner;
22
+ if (async) {
23
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
24
+ dispose = value[Symbol.asyncDispose];
25
+ }
26
+ if (dispose === void 0) {
27
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
28
+ dispose = value[Symbol.dispose];
29
+ if (async) inner = dispose;
30
+ }
31
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
32
+ if (inner) dispose = function() {
33
+ try {
34
+ inner.call(this);
35
+ } catch (e) {
36
+ return Promise.reject(e);
37
+ }
38
+ };
39
+ env.stack.push({
40
+ value,
41
+ dispose,
42
+ async
43
+ });
44
+ } else if (async) {
45
+ env.stack.push({
46
+ async: true
47
+ });
48
+ }
49
+ return value;
50
+ }
51
+ function _ts_dispose_resources(env) {
52
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
53
+ var e = new Error(message);
54
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
55
+ };
56
+ return (_ts_dispose_resources = function _ts_dispose_resources5(env2) {
57
+ function fail(e) {
58
+ env2.error = env2.hasError ? new _SuppressedError(e, env2.error, "An error was suppressed during disposal.") : e;
59
+ env2.hasError = true;
60
+ }
61
+ var r, s = 0;
62
+ function next() {
63
+ while (r = env2.stack.pop()) {
64
+ try {
65
+ if (!r.async && s === 1) return s = 0, env2.stack.push(r), Promise.resolve().then(next);
66
+ if (r.dispose) {
67
+ var result = r.dispose.call(r.value);
68
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
69
+ fail(e);
70
+ return next();
71
+ });
72
+ } else s |= 1;
73
+ } catch (e) {
74
+ fail(e);
75
+ }
76
+ }
77
+ if (s === 1) return env2.hasError ? Promise.reject(env2.error) : Promise.resolve();
78
+ if (env2.hasError) throw env2.error;
79
+ }
80
+ return next();
81
+ })(env);
82
+ }
13
83
  var __dxlog_file = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/internal/data-service-impl.ts";
14
84
  var DataServiceImpl = class {
15
85
  _executionContext;
@@ -23,7 +93,7 @@ var DataServiceImpl = class {
23
93
  return new Stream(({ next }) => {
24
94
  invariant(SpaceId.isValid(spaceId), void 0, {
25
95
  F: __dxlog_file,
26
- L: 35,
96
+ L: 39,
27
97
  S: this,
28
98
  A: [
29
99
  "SpaceId.isValid(spaceId)",
@@ -39,7 +109,7 @@ var DataServiceImpl = class {
39
109
  };
40
110
  });
41
111
  }
42
- async updateSubscription({ subscriptionId, addIds, removeIds }) {
112
+ async updateSubscription({ subscriptionId, addIds }) {
43
113
  const sub = this.dataSubscriptions.get(subscriptionId) ?? raise(new RuntimeServiceError({
44
114
  message: "Subscription not found.",
45
115
  context: {
@@ -51,44 +121,79 @@ var DataServiceImpl = class {
51
121
  count: addIds.length
52
122
  }, {
53
123
  F: __dxlog_file,
54
- L: 55,
124
+ L: 59,
55
125
  S: this,
56
126
  C: (f, a) => f(...a)
57
127
  });
58
128
  for (const documentId of addIds) {
59
- const document = await this._dataService.getDocument(this._executionContext, sub.spaceId, documentId);
60
- log.info("document loaded", {
61
- documentId,
62
- spaceId: sub.spaceId,
63
- found: !!document
64
- }, {
65
- F: __dxlog_file,
66
- L: 59,
67
- S: this,
68
- C: (f, a) => f(...a)
69
- });
70
- if (!document) {
71
- log.warn("not found", {
72
- documentId
129
+ const env = {
130
+ stack: [],
131
+ error: void 0,
132
+ hasError: false
133
+ };
134
+ try {
135
+ const document = _ts_add_disposable_resource(env, await this._dataService.getDocument(this._executionContext, sub.spaceId, documentId), false);
136
+ log.info("document loaded", {
137
+ documentId,
138
+ spaceId: sub.spaceId,
139
+ found: !!document
73
140
  }, {
74
141
  F: __dxlog_file,
75
- L: 61,
142
+ L: 63,
76
143
  S: this,
77
144
  C: (f, a) => f(...a)
78
145
  });
79
- continue;
146
+ if (!document) {
147
+ log.warn("not found", {
148
+ documentId
149
+ }, {
150
+ F: __dxlog_file,
151
+ L: 65,
152
+ S: this,
153
+ C: (f, a) => f(...a)
154
+ });
155
+ continue;
156
+ }
157
+ sub.next({
158
+ updates: [
159
+ {
160
+ documentId,
161
+ // Copy returned object to avoid hanging RPC stub
162
+ // See https://developers.cloudflare.com/workers/runtime-apis/rpc/lifecycle/
163
+ mutation: copyUint8Array(document.data)
164
+ }
165
+ ]
166
+ });
167
+ } catch (e) {
168
+ env.error = e;
169
+ env.hasError = true;
170
+ } finally {
171
+ _ts_dispose_resources(env);
80
172
  }
81
- sub.next({
82
- updates: [
83
- {
84
- documentId,
85
- mutation: document.data
86
- }
87
- ]
88
- });
89
173
  }
90
174
  }
91
175
  }
176
+ async createDocument({ spaceId, initialValue }) {
177
+ const env = {
178
+ stack: [],
179
+ error: void 0,
180
+ hasError: false
181
+ };
182
+ try {
183
+ const response = _ts_add_disposable_resource(env, await this._dataService.createDocument(this._executionContext, {
184
+ spaceId,
185
+ initialValue
186
+ }), false);
187
+ return {
188
+ documentId: response.documentId
189
+ };
190
+ } catch (e) {
191
+ env.error = e;
192
+ env.hasError = true;
193
+ } finally {
194
+ _ts_dispose_resources(env);
195
+ }
196
+ }
92
197
  async update({ updates, subscriptionId }) {
93
198
  const sub = this.dataSubscriptions.get(subscriptionId) ?? raise(new RuntimeServiceError({
94
199
  message: "Subscription not found.",
@@ -112,27 +217,30 @@ var DataServiceImpl = class {
112
217
  }
113
218
  async flush() {
114
219
  }
115
- subscribeSpaceSyncState(request, options) {
220
+ subscribeSpaceSyncState(_request, _options) {
116
221
  throw new NotImplementedError({
117
222
  message: "subscribeSpaceSyncState is not implemented."
118
223
  });
119
224
  }
120
- async getDocumentHeads({ documentIds }) {
225
+ async getDocumentHeads({ documentIds: _documentIds }) {
121
226
  throw new NotImplementedError({
122
227
  message: "getDocumentHeads is not implemented."
123
228
  });
124
229
  }
125
- async reIndexHeads({ documentIds }) {
230
+ async reIndexHeads({ documentIds: _documentIds }) {
126
231
  throw new NotImplementedError({
127
232
  message: "reIndexHeads is not implemented."
128
233
  });
129
234
  }
130
235
  async updateIndexes() {
131
- throw new NotImplementedError({
132
- message: "updateIndexes is not implemented."
236
+ log.error("updateIndexes is not available in EDGE env.", void 0, {
237
+ F: __dxlog_file,
238
+ L: 133,
239
+ S: this,
240
+ C: (f, a) => f(...a)
133
241
  });
134
242
  }
135
- async waitUntilHeadsReplicated({ heads }) {
243
+ async waitUntilHeadsReplicated({ heads: _heads }) {
136
244
  throw new NotImplementedError({
137
245
  message: "waitUntilHeadsReplicated is not implemented."
138
246
  });
@@ -140,84 +248,75 @@ var DataServiceImpl = class {
140
248
  };
141
249
 
142
250
  // src/internal/query-service-impl.ts
143
- import * as Schema from "effect/Schema";
144
251
  import { Stream as Stream2 } from "@dxos/codec-protobuf/stream";
145
- import { QueryAST } from "@dxos/echo-protocol";
146
252
  import { NotImplementedError as NotImplementedError2, RuntimeServiceError as RuntimeServiceError2 } from "@dxos/errors";
147
- import { invariant as invariant3 } from "@dxos/invariant";
148
- import { PublicKey } from "@dxos/keys";
149
- import { SpaceId as SpaceId3 } from "@dxos/keys";
150
253
  import { log as log2 } from "@dxos/log";
151
-
152
- // src/internal/adapter.ts
153
- import { failUndefined } from "@dxos/debug";
154
- import { invariant as invariant2 } from "@dxos/invariant";
155
- import { SpaceId as SpaceId2 } from "@dxos/keys";
156
- var __dxlog_file2 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/internal/adapter.ts";
157
- var queryToDataServiceRequest = (query) => {
158
- const { filter, options } = isSimpleSelectionQuery(query) ?? failUndefined();
159
- invariant2(options?.spaceIds?.length === 1, "Only one space is supported", {
160
- F: __dxlog_file2,
161
- L: 13,
162
- S: void 0,
163
- A: [
164
- "options?.spaceIds?.length === 1",
165
- "'Only one space is supported'"
166
- ]
167
- });
168
- invariant2(filter.type === "object", "Only object filters are supported", {
169
- F: __dxlog_file2,
170
- L: 14,
171
- S: void 0,
172
- A: [
173
- "filter.type === 'object'",
174
- "'Only object filters are supported'"
175
- ]
176
- });
177
- const spaceId = options.spaceIds[0];
178
- invariant2(SpaceId2.isValid(spaceId), void 0, {
179
- F: __dxlog_file2,
180
- L: 17,
181
- S: void 0,
182
- A: [
183
- "SpaceId.isValid(spaceId)",
184
- ""
185
- ]
186
- });
187
- return {
188
- spaceId,
189
- type: filter.typename ?? void 0,
190
- objectIds: [
191
- ...filter.id ?? []
192
- ]
193
- };
194
- };
195
- var isSimpleSelectionQuery = (query) => {
196
- switch (query.type) {
197
- case "options": {
198
- const maybeFilter = isSimpleSelectionQuery(query.query);
199
- if (!maybeFilter) {
200
- return null;
201
- }
202
- return {
203
- filter: maybeFilter.filter,
204
- options: query.options
205
- };
206
- }
207
- case "select": {
208
- return {
209
- filter: query.filter,
210
- options: void 0
211
- };
254
+ function _ts_add_disposable_resource2(env, value, async) {
255
+ if (value !== null && value !== void 0) {
256
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
257
+ var dispose, inner;
258
+ if (async) {
259
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
260
+ dispose = value[Symbol.asyncDispose];
212
261
  }
213
- default: {
214
- return null;
262
+ if (dispose === void 0) {
263
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
264
+ dispose = value[Symbol.dispose];
265
+ if (async) inner = dispose;
215
266
  }
267
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
268
+ if (inner) dispose = function() {
269
+ try {
270
+ inner.call(this);
271
+ } catch (e) {
272
+ return Promise.reject(e);
273
+ }
274
+ };
275
+ env.stack.push({
276
+ value,
277
+ dispose,
278
+ async
279
+ });
280
+ } else if (async) {
281
+ env.stack.push({
282
+ async: true
283
+ });
216
284
  }
217
- };
218
-
219
- // src/internal/query-service-impl.ts
220
- var __dxlog_file3 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/internal/query-service-impl.ts";
285
+ return value;
286
+ }
287
+ function _ts_dispose_resources2(env) {
288
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
289
+ var e = new Error(message);
290
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
291
+ };
292
+ return (_ts_dispose_resources2 = function _ts_dispose_resources5(env2) {
293
+ function fail(e) {
294
+ env2.error = env2.hasError ? new _SuppressedError(e, env2.error, "An error was suppressed during disposal.") : e;
295
+ env2.hasError = true;
296
+ }
297
+ var r, s = 0;
298
+ function next() {
299
+ while (r = env2.stack.pop()) {
300
+ try {
301
+ if (!r.async && s === 1) return s = 0, env2.stack.push(r), Promise.resolve().then(next);
302
+ if (r.dispose) {
303
+ var result = r.dispose.call(r.value);
304
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
305
+ fail(e);
306
+ return next();
307
+ });
308
+ } else s |= 1;
309
+ } catch (e) {
310
+ fail(e);
311
+ }
312
+ }
313
+ if (s === 1) return env2.hasError ? Promise.reject(env2.error) : Promise.resolve();
314
+ if (env2.hasError) throw env2.error;
315
+ }
316
+ return next();
317
+ })(env);
318
+ }
319
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/internal/query-service-impl.ts";
221
320
  var QueryServiceImpl = class {
222
321
  _executionContext;
223
322
  _dataService;
@@ -230,69 +329,56 @@ var QueryServiceImpl = class {
230
329
  log2.info("execQuery", {
231
330
  request
232
331
  }, {
233
- F: __dxlog_file3,
234
- L: 33,
332
+ F: __dxlog_file2,
333
+ L: 20,
235
334
  S: this,
236
335
  C: (f, a) => f(...a)
237
336
  });
238
- const query = QueryAST.Query.pipe(Schema.decodeUnknownSync)(JSON.parse(request.query));
239
- const requestedSpaceIds = getTargetSpacesForQuery(query);
240
- invariant3(requestedSpaceIds.length === 1, "Only one space is supported", {
241
- F: __dxlog_file3,
242
- L: 36,
243
- S: this,
244
- A: [
245
- "requestedSpaceIds.length === 1",
246
- "'Only one space is supported'"
247
- ]
248
- });
249
- const spaceId = requestedSpaceIds[0];
250
337
  return Stream2.fromPromise((async () => {
251
338
  try {
252
- this._queryCount++;
253
- log2.info("begin query", {
254
- spaceId
255
- }, {
256
- F: __dxlog_file3,
257
- L: 43,
258
- S: this,
259
- C: (f, a) => f(...a)
260
- });
261
- const queryResponse = await this._dataService.queryDocuments(this._executionContext, queryToDataServiceRequest(query));
262
- log2.info("query response", {
263
- spaceId,
264
- filter: request.filter,
265
- resultCount: queryResponse.results.length
266
- }, {
267
- F: __dxlog_file3,
268
- L: 48,
269
- S: this,
270
- C: (f, a) => f(...a)
271
- });
272
- return {
273
- results: queryResponse.results.map((object) => ({
274
- id: object.objectId,
275
- spaceId,
276
- spaceKey: PublicKey.ZERO,
277
- documentId: object.document.documentId,
278
- rank: 0,
279
- documentAutomerge: object.document.data
280
- }))
339
+ const env = {
340
+ stack: [],
341
+ error: void 0,
342
+ hasError: false
281
343
  };
344
+ try {
345
+ this._queryCount++;
346
+ log2.info("begin query", {
347
+ request
348
+ }, {
349
+ F: __dxlog_file2,
350
+ L: 26,
351
+ S: this,
352
+ C: (f, a) => f(...a)
353
+ });
354
+ const queryResponse = _ts_add_disposable_resource2(env, await this._dataService.execQuery(this._executionContext, request), false);
355
+ log2.info("query response", {
356
+ resultCount: queryResponse.results?.length
357
+ }, {
358
+ F: __dxlog_file2,
359
+ L: 28,
360
+ S: this,
361
+ C: (f, a) => f(...a)
362
+ });
363
+ return structuredClone(queryResponse);
364
+ } catch (e) {
365
+ env.error = e;
366
+ env.hasError = true;
367
+ } finally {
368
+ _ts_dispose_resources2(env);
369
+ }
282
370
  } catch (error) {
283
371
  log2.error("query failed", {
284
372
  err: error
285
373
  }, {
286
- F: __dxlog_file3,
287
- L: 62,
374
+ F: __dxlog_file2,
375
+ L: 31,
288
376
  S: this,
289
377
  C: (f, a) => f(...a)
290
378
  });
291
379
  throw new RuntimeServiceError2({
292
380
  message: `Query execution failed (queryCount=${this._queryCount})`,
293
381
  context: {
294
- spaceId,
295
- filter: request.filter,
296
382
  queryCount: this._queryCount
297
383
  },
298
384
  cause: error
@@ -311,25 +397,74 @@ var QueryServiceImpl = class {
311
397
  });
312
398
  }
313
399
  };
314
- var getTargetSpacesForQuery = (query) => {
315
- const spaces = /* @__PURE__ */ new Set();
316
- const visitor = (node) => {
317
- if (node.type === "options") {
318
- if (node.options.spaceIds) {
319
- for (const spaceId of node.options.spaceIds) {
320
- spaces.add(SpaceId3.make(spaceId));
400
+
401
+ // src/internal/queue-service-impl.ts
402
+ import { RuntimeServiceError as RuntimeServiceError3 } from "@dxos/errors";
403
+ function _ts_add_disposable_resource3(env, value, async) {
404
+ if (value !== null && value !== void 0) {
405
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
406
+ var dispose, inner;
407
+ if (async) {
408
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
409
+ dispose = value[Symbol.asyncDispose];
410
+ }
411
+ if (dispose === void 0) {
412
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
413
+ dispose = value[Symbol.dispose];
414
+ if (async) inner = dispose;
415
+ }
416
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
417
+ if (inner) dispose = function() {
418
+ try {
419
+ inner.call(this);
420
+ } catch (e) {
421
+ return Promise.reject(e);
422
+ }
423
+ };
424
+ env.stack.push({
425
+ value,
426
+ dispose,
427
+ async
428
+ });
429
+ } else if (async) {
430
+ env.stack.push({
431
+ async: true
432
+ });
433
+ }
434
+ return value;
435
+ }
436
+ function _ts_dispose_resources3(env) {
437
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
438
+ var e = new Error(message);
439
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
440
+ };
441
+ return (_ts_dispose_resources3 = function _ts_dispose_resources5(env2) {
442
+ function fail(e) {
443
+ env2.error = env2.hasError ? new _SuppressedError(e, env2.error, "An error was suppressed during disposal.") : e;
444
+ env2.hasError = true;
445
+ }
446
+ var r, s = 0;
447
+ function next() {
448
+ while (r = env2.stack.pop()) {
449
+ try {
450
+ if (!r.async && s === 1) return s = 0, env2.stack.push(r), Promise.resolve().then(next);
451
+ if (r.dispose) {
452
+ var result = r.dispose.call(r.value);
453
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
454
+ fail(e);
455
+ return next();
456
+ });
457
+ } else s |= 1;
458
+ } catch (e) {
459
+ fail(e);
321
460
  }
322
461
  }
462
+ if (s === 1) return env2.hasError ? Promise.reject(env2.error) : Promise.resolve();
463
+ if (env2.hasError) throw env2.error;
323
464
  }
324
- };
325
- QueryAST.visit(query, visitor);
326
- return [
327
- ...spaces
328
- ];
329
- };
330
-
331
- // src/internal/queue-service-impl.ts
332
- import { NotImplementedError as NotImplementedError3, RuntimeServiceError as RuntimeServiceError3 } from "@dxos/errors";
465
+ return next();
466
+ })(env);
467
+ }
333
468
  var QueueServiceImpl = class {
334
469
  _ctx;
335
470
  _queueService;
@@ -337,13 +472,58 @@ var QueueServiceImpl = class {
337
472
  this._ctx = _ctx;
338
473
  this._queueService = _queueService;
339
474
  }
340
- async queryQueue(subspaceTag, spaceId, { queueId, ...query }) {
475
+ async queryQueue(request) {
341
476
  try {
342
- const result = await this._queueService.query(this._ctx, `dxn:queue:${subspaceTag}:${spaceId}:${queueId}`, query);
343
- return result;
477
+ const env = {
478
+ stack: [],
479
+ error: void 0,
480
+ hasError: false
481
+ };
482
+ try {
483
+ const result = _ts_add_disposable_resource3(env, await this._queueService.queryQueue(this._ctx, request), false);
484
+ return {
485
+ objects: structuredClone(result.objects),
486
+ nextCursor: result.nextCursor,
487
+ prevCursor: result.prevCursor
488
+ };
489
+ } catch (e) {
490
+ env.error = e;
491
+ env.hasError = true;
492
+ } finally {
493
+ _ts_dispose_resources3(env);
494
+ }
344
495
  } catch (error) {
496
+ const { query } = request;
345
497
  throw RuntimeServiceError3.wrap({
346
498
  message: "Queue query failed.",
499
+ context: {
500
+ subspaceTag: query?.queuesNamespace,
501
+ spaceId: query?.spaceId,
502
+ queueId: query?.queueIds?.[0]
503
+ },
504
+ ifTypeDiffers: true
505
+ })(error);
506
+ }
507
+ }
508
+ async insertIntoQueue(request) {
509
+ try {
510
+ const env = {
511
+ stack: [],
512
+ error: void 0,
513
+ hasError: false
514
+ };
515
+ try {
516
+ const _ = _ts_add_disposable_resource3(env, await this._queueService.insertIntoQueue(this._ctx, request), false);
517
+ } catch (e) {
518
+ env.error = e;
519
+ env.hasError = true;
520
+ } finally {
521
+ _ts_dispose_resources3(env);
522
+ }
523
+ } catch (error) {
524
+ const { subspaceTag, spaceId, queueId } = request;
525
+ throw RuntimeServiceError3.wrap({
526
+ message: "Queue append failed.",
347
527
  context: {
348
528
  subspaceTag,
349
529
  spaceId,
@@ -353,13 +533,25 @@ var QueueServiceImpl = class {
353
533
  })(error);
354
534
  }
355
535
  }
356
- async insertIntoQueue(subspaceTag, spaceId, queueId, objects) {
536
+ async deleteFromQueue(request) {
357
537
  try {
358
- const result = await this._queueService.append(this._ctx, `dxn:queue:${subspaceTag}:${spaceId}:${queueId}`, objects);
359
- return result;
538
+ const env = {
539
+ stack: [],
540
+ error: void 0,
541
+ hasError: false
542
+ };
543
+ try {
544
+ const _ = _ts_add_disposable_resource3(env, await this._queueService.deleteFromQueue(this._ctx, request), false);
545
+ } catch (e) {
546
+ env.error = e;
547
+ env.hasError = true;
548
+ } finally {
549
+ _ts_dispose_resources3(env);
550
+ }
360
551
  } catch (error) {
552
+ const { subspaceTag, spaceId, queueId } = request;
361
553
  throw RuntimeServiceError3.wrap({
362
- message: "Queue append failed.",
554
+ message: "Queue delete failed.",
363
555
  context: {
364
556
  subspaceTag,
365
557
  spaceId,
@@ -369,30 +561,105 @@ var QueueServiceImpl = class {
369
561
  })(error);
370
562
  }
371
563
  }
372
- deleteFromQueue(subspaceTag, spaceId, queueId, _objectIds) {
373
- throw new NotImplementedError3({
374
- message: "Deleting from queue is not supported.",
375
- context: {
376
- subspaceTag,
377
- spaceId,
378
- queueId
379
- }
380
- });
564
+ async syncQueue(_) {
381
565
  }
382
566
  };
383
567
 
384
568
  // src/internal/service-container.ts
569
+ function _ts_add_disposable_resource4(env, value, async) {
570
+ if (value !== null && value !== void 0) {
571
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
572
+ var dispose, inner;
573
+ if (async) {
574
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
575
+ dispose = value[Symbol.asyncDispose];
576
+ }
577
+ if (dispose === void 0) {
578
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
579
+ dispose = value[Symbol.dispose];
580
+ if (async) inner = dispose;
581
+ }
582
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
583
+ if (inner) dispose = function() {
584
+ try {
585
+ inner.call(this);
586
+ } catch (e) {
587
+ return Promise.reject(e);
588
+ }
589
+ };
590
+ env.stack.push({
591
+ value,
592
+ dispose,
593
+ async
594
+ });
595
+ } else if (async) {
596
+ env.stack.push({
597
+ async: true
598
+ });
599
+ }
600
+ return value;
601
+ }
602
+ function _ts_dispose_resources4(env) {
603
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
604
+ var e = new Error(message);
605
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
606
+ };
607
+ return (_ts_dispose_resources4 = function _ts_dispose_resources5(env2) {
608
+ function fail(e) {
609
+ env2.error = env2.hasError ? new _SuppressedError(e, env2.error, "An error was suppressed during disposal.") : e;
610
+ env2.hasError = true;
611
+ }
612
+ var r, s = 0;
613
+ function next() {
614
+ while (r = env2.stack.pop()) {
615
+ try {
616
+ if (!r.async && s === 1) return s = 0, env2.stack.push(r), Promise.resolve().then(next);
617
+ if (r.dispose) {
618
+ var result = r.dispose.call(r.value);
619
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
620
+ fail(e);
621
+ return next();
622
+ });
623
+ } else s |= 1;
624
+ } catch (e) {
625
+ fail(e);
626
+ }
627
+ }
628
+ if (s === 1) return env2.hasError ? Promise.reject(env2.error) : Promise.resolve();
629
+ if (env2.hasError) throw env2.error;
630
+ }
631
+ return next();
632
+ })(env);
633
+ }
385
634
  var ServiceContainer = class {
386
635
  _executionContext;
387
636
  _dataService;
388
637
  _queueService;
389
- constructor(_executionContext, _dataService, _queueService) {
638
+ _functionsService;
639
+ constructor(_executionContext, _dataService, _queueService, _functionsService) {
390
640
  this._executionContext = _executionContext;
391
641
  this._dataService = _dataService;
392
642
  this._queueService = _queueService;
643
+ this._functionsService = _functionsService;
393
644
  }
394
645
  async getSpaceMeta(spaceId) {
395
- return this._dataService.getSpaceMeta(this._executionContext, spaceId);
646
+ const env = {
647
+ stack: [],
648
+ error: void 0,
649
+ hasError: false
650
+ };
651
+ try {
652
+ const result = _ts_add_disposable_resource4(env, await this._dataService.getSpaceMeta(this._executionContext, spaceId), false);
653
+ return result ? {
654
+ spaceKey: result.spaceKey,
655
+ rootDocumentId: result.rootDocumentId
656
+ } : void 0;
657
+ } catch (e) {
658
+ env.error = e;
659
+ env.hasError = true;
660
+ } finally {
661
+ _ts_dispose_resources4(env);
662
+ }
396
663
  }
397
664
  async createServices() {
398
665
  const dataService = new DataServiceImpl(this._executionContext, this._dataService);
@@ -401,21 +668,50 @@ var ServiceContainer = class {
401
668
  return {
402
669
  dataService,
403
670
  queryService,
404
- queueService
671
+ queueService,
672
+ functionsAiService: this._functionsService
405
673
  };
406
674
  }
407
- queryQueue(queue) {
408
- return this._queueService.query({}, queue.toString(), {});
675
+ async queryQueue(queue) {
676
+ const parts = queue.asQueueDXN();
677
+ if (!parts) {
678
+ throw new Error("Invalid queue DXN");
679
+ }
680
+ const { subspaceTag, spaceId, queueId } = parts;
681
+ const result = await this._queueService.queryQueue(this._executionContext, {
682
+ query: {
683
+ spaceId,
684
+ queuesNamespace: subspaceTag,
685
+ queueIds: [
686
+ queueId
687
+ ]
688
+ }
689
+ });
690
+ return {
691
+ objects: structuredClone(result.objects),
692
+ nextCursor: result.nextCursor ?? null,
693
+ prevCursor: result.prevCursor ?? null
694
+ };
409
695
  }
410
- insertIntoQueue(queue, objects) {
411
- return this._queueService.append({}, queue.toString(), objects);
696
+ async insertIntoQueue(queue, objects) {
697
+ const parts = queue.asQueueDXN();
698
+ if (!parts) {
699
+ throw new Error("Invalid queue DXN");
700
+ }
701
+ const { subspaceTag, spaceId, queueId } = parts;
702
+ await this._queueService.insertIntoQueue(this._executionContext, {
703
+ subspaceTag,
704
+ spaceId,
705
+ queueId,
706
+ objects
707
+ });
412
708
  }
413
709
  };
414
710
 
415
711
  // src/space-proxy.ts
416
712
  import { Resource } from "@dxos/context";
417
- import { invariant as invariant4 } from "@dxos/invariant";
418
- import { PublicKey as PublicKey2 } from "@dxos/keys";
713
+ import { invariant as invariant2 } from "@dxos/invariant";
714
+ import { PublicKey } from "@dxos/keys";
419
715
 
420
716
  // src/queues-api.ts
421
717
  var QueuesAPIImpl = class {
@@ -434,7 +730,7 @@ var QueuesAPIImpl = class {
434
730
  };
435
731
 
436
732
  // src/space-proxy.ts
437
- var __dxlog_file4 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/space-proxy.ts";
733
+ var __dxlog_file3 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/space-proxy.ts";
438
734
  var SpaceProxy = class extends Resource {
439
735
  _serviceContainer;
440
736
  _echoClient;
@@ -449,9 +745,9 @@ var SpaceProxy = class extends Resource {
449
745
  return this._id;
450
746
  }
451
747
  get db() {
452
- invariant4(this._db, void 0, {
453
- F: __dxlog_file4,
454
- L: 34,
748
+ invariant2(this._db, void 0, {
749
+ F: __dxlog_file3,
750
+ L: 35,
455
751
  S: this,
456
752
  A: [
457
753
  "this._db",
@@ -464,9 +760,9 @@ var SpaceProxy = class extends Resource {
464
760
  * @deprecated Use db API.
465
761
  */
466
762
  get crud() {
467
- invariant4(this._db, void 0, {
468
- F: __dxlog_file4,
469
- L: 42,
763
+ invariant2(this._db, void 0, {
764
+ F: __dxlog_file3,
765
+ L: 43,
470
766
  S: this,
471
767
  A: [
472
768
  "this._db",
@@ -485,7 +781,7 @@ var SpaceProxy = class extends Resource {
485
781
  }
486
782
  this._db = this._echoClient.constructDatabase({
487
783
  spaceId: this._id,
488
- spaceKey: PublicKey2.from(meta.spaceKey),
784
+ spaceKey: PublicKey.from(meta.spaceKey),
489
785
  reactiveSchemaQuery: false,
490
786
  owningObject: this
491
787
  });
@@ -496,7 +792,7 @@ var SpaceProxy = class extends Resource {
496
792
  };
497
793
 
498
794
  // src/functions-client.ts
499
- var __dxlog_file5 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/functions-client.ts";
795
+ var __dxlog_file4 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/functions-client.ts";
500
796
  var FunctionsClient = class extends Resource2 {
501
797
  _serviceContainer;
502
798
  _echoClient;
@@ -504,25 +800,25 @@ var FunctionsClient = class extends Resource2 {
504
800
  _spaces = /* @__PURE__ */ new Map();
505
801
  constructor(services) {
506
802
  super();
507
- invariant5(typeof services.dataService !== "undefined", "DataService is required", {
508
- F: __dxlog_file5,
509
- L: 32,
803
+ invariant3(typeof services.dataService !== "undefined", "DataService is required", {
804
+ F: __dxlog_file4,
805
+ L: 33,
510
806
  S: this,
511
807
  A: [
512
808
  "typeof services.dataService !== 'undefined'",
513
809
  "'DataService is required'"
514
810
  ]
515
811
  });
516
- invariant5(typeof services.queueService !== "undefined", "QueueService is required", {
517
- F: __dxlog_file5,
518
- L: 33,
812
+ invariant3(typeof services.queueService !== "undefined", "QueueService is required", {
813
+ F: __dxlog_file4,
814
+ L: 34,
519
815
  S: this,
520
816
  A: [
521
817
  "typeof services.queueService !== 'undefined'",
522
818
  "'QueueService is required'"
523
819
  ]
524
820
  });
525
- this._serviceContainer = new ServiceContainer(this._executionContext, services.dataService, services.queueService);
821
+ this._serviceContainer = new ServiceContainer(this._executionContext, services.dataService, services.queueService, services.functionsAiService);
526
822
  this._echoClient = new EchoClient({});
527
823
  }
528
824
  get echo() {
@@ -556,7 +852,8 @@ var FunctionsClient = class extends Resource2 {
556
852
  var createClientFromEnv = async (env) => {
557
853
  const client = new FunctionsClient({
558
854
  dataService: env.DATA_SERVICE,
559
- queueService: env.QUEUE_SERVICE
855
+ queueService: env.QUEUE_SERVICE,
856
+ functionsAiService: env.FUNCTIONS_AI_SERVICE
560
857
  });
561
858
  await client.open();
562
859
  return client;
@@ -570,34 +867,26 @@ var FunctionRouteValue = /* @__PURE__ */ (function(FunctionRouteValue2) {
570
867
  })({});
571
868
 
572
869
  // src/wrap-handler-for-cloudflare.ts
573
- import { invariant as invariant6 } from "@dxos/invariant";
574
- import { SpaceId as SpaceId4 } from "@dxos/keys";
870
+ import { invariant as invariant4 } from "@dxos/invariant";
871
+ import { SpaceId as SpaceId2 } from "@dxos/keys";
575
872
  import { log as log3 } from "@dxos/log";
576
873
  import { EdgeResponse } from "@dxos/protocols";
577
- var __dxlog_file6 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/wrap-handler-for-cloudflare.ts";
874
+ var __dxlog_file5 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/wrap-handler-for-cloudflare.ts";
578
875
  var wrapHandlerForCloudflare = (func) => {
579
876
  return async (request, env) => {
580
877
  if (request.headers.get(FUNCTION_ROUTE_HEADER) === FunctionRouteValue.Meta) {
581
- log3.info(">>> meta", {
582
- func
583
- }, {
584
- F: __dxlog_file6,
585
- L: 25,
586
- S: void 0,
587
- C: (f, a) => f(...a)
588
- });
589
878
  return handleFunctionMetaCall(func, request);
590
879
  }
591
880
  try {
592
881
  const spaceId = new URL(request.url).searchParams.get("spaceId");
593
882
  if (spaceId) {
594
- if (!SpaceId4.isValid(spaceId)) {
883
+ if (!SpaceId2.isValid(spaceId)) {
595
884
  return new Response("Invalid spaceId", {
596
885
  status: 400
597
886
  });
598
887
  }
599
888
  }
600
- const serviceContainer = new ServiceContainer({}, env.DATA_SERVICE, env.QUEUE_SERVICE);
889
+ const serviceContainer = new ServiceContainer({}, env.DATA_SERVICE, env.QUEUE_SERVICE, env.FUNCTIONS_AI_SERVICE);
601
890
  const context = await createFunctionContext({
602
891
  serviceContainer,
603
892
  contextSpaceId: spaceId
@@ -608,8 +897,8 @@ var wrapHandlerForCloudflare = (func) => {
608
897
  error,
609
898
  stack: error.stack
610
899
  }, {
611
- F: __dxlog_file6,
612
- L: 45,
900
+ F: __dxlog_file5,
901
+ L: 44,
613
902
  S: void 0,
614
903
  C: (f, a) => f(...a)
615
904
  });
@@ -646,8 +935,8 @@ var decodeRequest = async (request) => {
646
935
  };
647
936
  } catch (err) {
648
937
  log3.catch(err, void 0, {
649
- F: __dxlog_file6,
650
- L: 80,
938
+ F: __dxlog_file5,
939
+ L: 79,
651
940
  S: void 0,
652
941
  C: (f, a) => f(...a)
653
942
  });
@@ -674,7 +963,7 @@ var handleFunctionMetaCall = (functionDefinition, request) => {
674
963
  });
675
964
  };
676
965
  var createFunctionContext = async ({ serviceContainer, contextSpaceId }) => {
677
- const { dataService, queryService, queueService } = await serviceContainer.createServices();
966
+ const { dataService, queryService, queueService, functionsAiService } = await serviceContainer.createServices();
678
967
  let spaceKey;
679
968
  let rootUrl;
680
969
  if (contextSpaceId) {
@@ -683,9 +972,9 @@ var createFunctionContext = async ({ serviceContainer, contextSpaceId }) => {
683
972
  throw new Error(`Space not found: ${contextSpaceId}`);
684
973
  }
685
974
  spaceKey = meta.spaceKey;
686
- invariant6(!meta.rootDocumentId.startsWith("automerge:"), void 0, {
687
- F: __dxlog_file6,
688
- L: 118,
975
+ invariant4(!meta.rootDocumentId.startsWith("automerge:"), void 0, {
976
+ F: __dxlog_file5,
977
+ L: 117,
689
978
  S: void 0,
690
979
  A: [
691
980
  "!meta.rootDocumentId.startsWith('automerge:')",
@@ -698,7 +987,8 @@ var createFunctionContext = async ({ serviceContainer, contextSpaceId }) => {
698
987
  services: {
699
988
  dataService,
700
989
  queryService,
701
- queueService
990
+ queueService,
991
+ functionsAiService
702
992
  },
703
993
  spaceId: contextSpaceId,
704
994
  spaceKey,