@dxos/functions-runtime-cloudflare 0.8.4-main.3c1ae3b → 0.8.4-main.69d29f4

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 (35) hide show
  1. package/dist/lib/browser/index.mjs +503 -118
  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 +503 -118
  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 +7 -6
  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.map +1 -1
  12. package/dist/types/src/internal/queue-service-impl.d.ts +4 -5
  13. package/dist/types/src/internal/queue-service-impl.d.ts.map +1 -1
  14. package/dist/types/src/internal/service-container.d.ts +5 -3
  15. package/dist/types/src/internal/service-container.d.ts.map +1 -1
  16. package/dist/types/src/internal/utils.d.ts +2 -0
  17. package/dist/types/src/internal/utils.d.ts.map +1 -0
  18. package/dist/types/src/logger.d.ts.map +1 -1
  19. package/dist/types/src/queues-api.d.ts +3 -3
  20. package/dist/types/src/queues-api.d.ts.map +1 -1
  21. package/dist/types/src/space-proxy.d.ts +3 -2
  22. package/dist/types/src/space-proxy.d.ts.map +1 -1
  23. package/dist/types/src/wrap-handler-for-cloudflare.d.ts.map +1 -1
  24. package/dist/types/tsconfig.tsbuildinfo +1 -1
  25. package/package.json +20 -16
  26. package/src/functions-client.ts +8 -1
  27. package/src/internal/data-service-impl.ts +27 -10
  28. package/src/internal/query-service-impl.ts +7 -3
  29. package/src/internal/queue-service-impl.ts +32 -14
  30. package/src/internal/service-container.ts +25 -6
  31. package/src/internal/utils.ts +5 -0
  32. package/src/logger.ts +2 -0
  33. package/src/queues-api.ts +3 -3
  34. package/src/space-proxy.ts +4 -3
  35. package/src/wrap-handler-for-cloudflare.ts +3 -3
@@ -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 invariant6 } 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
  });
@@ -217,6 +325,71 @@ var isSimpleSelectionQuery = (query) => {
217
325
  };
218
326
 
219
327
  // src/internal/query-service-impl.ts
328
+ function _ts_add_disposable_resource2(env, value, async) {
329
+ if (value !== null && value !== void 0) {
330
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
331
+ var dispose, inner;
332
+ if (async) {
333
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
334
+ dispose = value[Symbol.asyncDispose];
335
+ }
336
+ if (dispose === void 0) {
337
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
338
+ dispose = value[Symbol.dispose];
339
+ if (async) inner = dispose;
340
+ }
341
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
342
+ if (inner) dispose = function() {
343
+ try {
344
+ inner.call(this);
345
+ } catch (e) {
346
+ return Promise.reject(e);
347
+ }
348
+ };
349
+ env.stack.push({
350
+ value,
351
+ dispose,
352
+ async
353
+ });
354
+ } else if (async) {
355
+ env.stack.push({
356
+ async: true
357
+ });
358
+ }
359
+ return value;
360
+ }
361
+ function _ts_dispose_resources2(env) {
362
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
363
+ var e = new Error(message);
364
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
365
+ };
366
+ return (_ts_dispose_resources2 = function _ts_dispose_resources5(env2) {
367
+ function fail(e) {
368
+ env2.error = env2.hasError ? new _SuppressedError(e, env2.error, "An error was suppressed during disposal.") : e;
369
+ env2.hasError = true;
370
+ }
371
+ var r, s = 0;
372
+ function next() {
373
+ while (r = env2.stack.pop()) {
374
+ try {
375
+ if (!r.async && s === 1) return s = 0, env2.stack.push(r), Promise.resolve().then(next);
376
+ if (r.dispose) {
377
+ var result = r.dispose.call(r.value);
378
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
379
+ fail(e);
380
+ return next();
381
+ });
382
+ } else s |= 1;
383
+ } catch (e) {
384
+ fail(e);
385
+ }
386
+ }
387
+ if (s === 1) return env2.hasError ? Promise.reject(env2.error) : Promise.resolve();
388
+ if (env2.hasError) throw env2.error;
389
+ }
390
+ return next();
391
+ })(env);
392
+ }
220
393
  var __dxlog_file3 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/internal/query-service-impl.ts";
221
394
  var QueryServiceImpl = class {
222
395
  _executionContext;
@@ -231,7 +404,7 @@ var QueryServiceImpl = class {
231
404
  request
232
405
  }, {
233
406
  F: __dxlog_file3,
234
- L: 33,
407
+ L: 34,
235
408
  S: this,
236
409
  C: (f, a) => f(...a)
237
410
  });
@@ -239,7 +412,7 @@ var QueryServiceImpl = class {
239
412
  const requestedSpaceIds = getTargetSpacesForQuery(query);
240
413
  invariant3(requestedSpaceIds.length === 1, "Only one space is supported", {
241
414
  F: __dxlog_file3,
242
- L: 36,
415
+ L: 37,
243
416
  S: this,
244
417
  A: [
245
418
  "requestedSpaceIds.length === 1",
@@ -249,42 +422,57 @@ var QueryServiceImpl = class {
249
422
  const spaceId = requestedSpaceIds[0];
250
423
  return Stream2.fromPromise((async () => {
251
424
  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
- }))
425
+ const env = {
426
+ stack: [],
427
+ error: void 0,
428
+ hasError: false
281
429
  };
430
+ try {
431
+ this._queryCount++;
432
+ log2.info("begin query", {
433
+ spaceId
434
+ }, {
435
+ F: __dxlog_file3,
436
+ L: 44,
437
+ S: this,
438
+ C: (f, a) => f(...a)
439
+ });
440
+ const queryResponse = _ts_add_disposable_resource2(env, await this._dataService.queryDocuments(this._executionContext, queryToDataServiceRequest(query)), false);
441
+ log2.info("query response", {
442
+ spaceId,
443
+ filter: request.filter,
444
+ resultCount: queryResponse.results.length
445
+ }, {
446
+ F: __dxlog_file3,
447
+ L: 49,
448
+ S: this,
449
+ C: (f, a) => f(...a)
450
+ });
451
+ return {
452
+ results: queryResponse.results.map((object) => ({
453
+ id: object.objectId,
454
+ spaceId,
455
+ spaceKey: PublicKey.ZERO,
456
+ documentId: object.document.documentId,
457
+ // Rank 1 for predicate matches where ranking is not determined.
458
+ rank: 1,
459
+ // Copy returned object to avoid hanging RPC stub.
460
+ // See https://developers.cloudflare.com/workers/runtime-apis/rpc/lifecycle/
461
+ documentAutomerge: copyUint8Array(object.document.data)
462
+ }))
463
+ };
464
+ } catch (e) {
465
+ env.error = e;
466
+ env.hasError = true;
467
+ } finally {
468
+ _ts_dispose_resources2(env);
469
+ }
282
470
  } catch (error) {
283
471
  log2.error("query failed", {
284
472
  err: error
285
473
  }, {
286
474
  F: __dxlog_file3,
287
- L: 62,
475
+ L: 66,
288
476
  S: this,
289
477
  C: (f, a) => f(...a)
290
478
  });
@@ -330,6 +518,73 @@ var getTargetSpacesForQuery = (query) => {
330
518
 
331
519
  // src/internal/queue-service-impl.ts
332
520
  import { NotImplementedError as NotImplementedError3, RuntimeServiceError as RuntimeServiceError3 } from "@dxos/errors";
521
+ import { invariant as invariant4 } from "@dxos/invariant";
522
+ function _ts_add_disposable_resource3(env, value, async) {
523
+ if (value !== null && value !== void 0) {
524
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
525
+ var dispose, inner;
526
+ if (async) {
527
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
528
+ dispose = value[Symbol.asyncDispose];
529
+ }
530
+ if (dispose === void 0) {
531
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
532
+ dispose = value[Symbol.dispose];
533
+ if (async) inner = dispose;
534
+ }
535
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
536
+ if (inner) dispose = function() {
537
+ try {
538
+ inner.call(this);
539
+ } catch (e) {
540
+ return Promise.reject(e);
541
+ }
542
+ };
543
+ env.stack.push({
544
+ value,
545
+ dispose,
546
+ async
547
+ });
548
+ } else if (async) {
549
+ env.stack.push({
550
+ async: true
551
+ });
552
+ }
553
+ return value;
554
+ }
555
+ function _ts_dispose_resources3(env) {
556
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
557
+ var e = new Error(message);
558
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
559
+ };
560
+ return (_ts_dispose_resources3 = function _ts_dispose_resources5(env2) {
561
+ function fail(e) {
562
+ env2.error = env2.hasError ? new _SuppressedError(e, env2.error, "An error was suppressed during disposal.") : e;
563
+ env2.hasError = true;
564
+ }
565
+ var r, s = 0;
566
+ function next() {
567
+ while (r = env2.stack.pop()) {
568
+ try {
569
+ if (!r.async && s === 1) return s = 0, env2.stack.push(r), Promise.resolve().then(next);
570
+ if (r.dispose) {
571
+ var result = r.dispose.call(r.value);
572
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
573
+ fail(e);
574
+ return next();
575
+ });
576
+ } else s |= 1;
577
+ } catch (e) {
578
+ fail(e);
579
+ }
580
+ }
581
+ if (s === 1) return env2.hasError ? Promise.reject(env2.error) : Promise.resolve();
582
+ if (env2.hasError) throw env2.error;
583
+ }
584
+ return next();
585
+ })(env);
586
+ }
587
+ var __dxlog_file4 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/internal/queue-service-impl.ts";
333
588
  var QueueServiceImpl = class {
334
589
  _ctx;
335
590
  _queueService;
@@ -337,15 +592,46 @@ var QueueServiceImpl = class {
337
592
  this._ctx = _ctx;
338
593
  this._queueService = _queueService;
339
594
  }
340
- async queryQueue(subspaceTag, spaceId, { queueId, ...query }) {
595
+ async queryQueue(request) {
596
+ const { query } = request;
597
+ const { queueIds, ...filter } = query;
598
+ const spaceId = query.spaceId;
599
+ const queueId = queueIds?.[0];
600
+ invariant4(request.query.queuesNamespace, void 0, {
601
+ F: __dxlog_file4,
602
+ L: 26,
603
+ S: this,
604
+ A: [
605
+ "request.query.queuesNamespace",
606
+ ""
607
+ ]
608
+ });
341
609
  try {
342
- const result = await this._queueService.query(this._ctx, `dxn:queue:${subspaceTag}:${spaceId}:${queueId}`, query);
343
- return result;
610
+ const env = {
611
+ stack: [],
612
+ error: void 0,
613
+ hasError: false
614
+ };
615
+ try {
616
+ const result = _ts_add_disposable_resource3(env, await this._queueService.query(this._ctx, `dxn:queue:${request.query.queuesNamespace}:${spaceId}:${queueId}`, filter), false);
617
+ return {
618
+ // Copy returned object to avoid hanging RPC stub
619
+ // See https://developers.cloudflare.com/workers/runtime-apis/rpc/lifecycle/
620
+ objects: structuredClone(result.objects),
621
+ nextCursor: result.nextCursor,
622
+ prevCursor: result.prevCursor
623
+ };
624
+ } catch (e) {
625
+ env.error = e;
626
+ env.hasError = true;
627
+ } finally {
628
+ _ts_dispose_resources3(env);
629
+ }
344
630
  } catch (error) {
345
631
  throw RuntimeServiceError3.wrap({
346
632
  message: "Queue query failed.",
347
633
  context: {
348
- subspaceTag,
634
+ subspaceTag: request.query.queuesNamespace,
349
635
  spaceId,
350
636
  queueId
351
637
  },
@@ -353,10 +639,10 @@ var QueueServiceImpl = class {
353
639
  })(error);
354
640
  }
355
641
  }
356
- async insertIntoQueue(subspaceTag, spaceId, queueId, objects) {
642
+ async insertIntoQueue(request) {
643
+ const { subspaceTag, spaceId, queueId, objects } = request;
357
644
  try {
358
- const result = await this._queueService.append(this._ctx, `dxn:queue:${subspaceTag}:${spaceId}:${queueId}`, objects);
359
- return result;
645
+ await this._queueService.append(this._ctx, `dxn:queue:${subspaceTag}:${spaceId}:${queueId}`, objects ?? []);
360
646
  } catch (error) {
361
647
  throw RuntimeServiceError3.wrap({
362
648
  message: "Queue append failed.",
@@ -369,7 +655,8 @@ var QueueServiceImpl = class {
369
655
  })(error);
370
656
  }
371
657
  }
372
- deleteFromQueue(subspaceTag, spaceId, queueId, _objectIds) {
658
+ deleteFromQueue(request) {
659
+ const { subspaceTag, spaceId, queueId } = request;
373
660
  throw new NotImplementedError3({
374
661
  message: "Deleting from queue is not supported.",
375
662
  context: {
@@ -382,17 +669,100 @@ var QueueServiceImpl = class {
382
669
  };
383
670
 
384
671
  // src/internal/service-container.ts
672
+ function _ts_add_disposable_resource4(env, value, async) {
673
+ if (value !== null && value !== void 0) {
674
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
675
+ var dispose, inner;
676
+ if (async) {
677
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
678
+ dispose = value[Symbol.asyncDispose];
679
+ }
680
+ if (dispose === void 0) {
681
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
682
+ dispose = value[Symbol.dispose];
683
+ if (async) inner = dispose;
684
+ }
685
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
686
+ if (inner) dispose = function() {
687
+ try {
688
+ inner.call(this);
689
+ } catch (e) {
690
+ return Promise.reject(e);
691
+ }
692
+ };
693
+ env.stack.push({
694
+ value,
695
+ dispose,
696
+ async
697
+ });
698
+ } else if (async) {
699
+ env.stack.push({
700
+ async: true
701
+ });
702
+ }
703
+ return value;
704
+ }
705
+ function _ts_dispose_resources4(env) {
706
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
707
+ var e = new Error(message);
708
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
709
+ };
710
+ return (_ts_dispose_resources4 = function _ts_dispose_resources5(env2) {
711
+ function fail(e) {
712
+ env2.error = env2.hasError ? new _SuppressedError(e, env2.error, "An error was suppressed during disposal.") : e;
713
+ env2.hasError = true;
714
+ }
715
+ var r, s = 0;
716
+ function next() {
717
+ while (r = env2.stack.pop()) {
718
+ try {
719
+ if (!r.async && s === 1) return s = 0, env2.stack.push(r), Promise.resolve().then(next);
720
+ if (r.dispose) {
721
+ var result = r.dispose.call(r.value);
722
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
723
+ fail(e);
724
+ return next();
725
+ });
726
+ } else s |= 1;
727
+ } catch (e) {
728
+ fail(e);
729
+ }
730
+ }
731
+ if (s === 1) return env2.hasError ? Promise.reject(env2.error) : Promise.resolve();
732
+ if (env2.hasError) throw env2.error;
733
+ }
734
+ return next();
735
+ })(env);
736
+ }
385
737
  var ServiceContainer = class {
386
738
  _executionContext;
387
739
  _dataService;
388
740
  _queueService;
389
- constructor(_executionContext, _dataService, _queueService) {
741
+ _functionsService;
742
+ constructor(_executionContext, _dataService, _queueService, _functionsService) {
390
743
  this._executionContext = _executionContext;
391
744
  this._dataService = _dataService;
392
745
  this._queueService = _queueService;
746
+ this._functionsService = _functionsService;
393
747
  }
394
748
  async getSpaceMeta(spaceId) {
395
- return this._dataService.getSpaceMeta(this._executionContext, spaceId);
749
+ const env = {
750
+ stack: [],
751
+ error: void 0,
752
+ hasError: false
753
+ };
754
+ try {
755
+ const result = _ts_add_disposable_resource4(env, await this._dataService.getSpaceMeta(this._executionContext, spaceId), false);
756
+ return result ? {
757
+ spaceKey: result.spaceKey,
758
+ rootDocumentId: result.rootDocumentId
759
+ } : void 0;
760
+ } catch (e) {
761
+ env.error = e;
762
+ env.hasError = true;
763
+ } finally {
764
+ _ts_dispose_resources4(env);
765
+ }
396
766
  }
397
767
  async createServices() {
398
768
  const dataService = new DataServiceImpl(this._executionContext, this._dataService);
@@ -401,20 +771,41 @@ var ServiceContainer = class {
401
771
  return {
402
772
  dataService,
403
773
  queryService,
404
- queueService
774
+ queueService,
775
+ functionsAiService: this._functionsService
405
776
  };
406
777
  }
407
- queryQueue(queue) {
408
- return this._queueService.query({}, queue.toString(), {});
778
+ async queryQueue(queue) {
779
+ const env = {
780
+ stack: [],
781
+ error: void 0,
782
+ hasError: false
783
+ };
784
+ try {
785
+ const { spaceId } = queue.asQueueDXN() ?? {};
786
+ const result = _ts_add_disposable_resource4(env, await this._queueService.query({}, queue.toString(), {
787
+ spaceId
788
+ }), false);
789
+ return {
790
+ objects: structuredClone(result.objects),
791
+ nextCursor: result.nextCursor ?? null,
792
+ prevCursor: result.prevCursor ?? null
793
+ };
794
+ } catch (e) {
795
+ env.error = e;
796
+ env.hasError = true;
797
+ } finally {
798
+ _ts_dispose_resources4(env);
799
+ }
409
800
  }
410
- insertIntoQueue(queue, objects) {
411
- return this._queueService.append({}, queue.toString(), objects);
801
+ async insertIntoQueue(queue, objects) {
802
+ await this._queueService.append({}, queue.toString(), objects);
412
803
  }
413
804
  };
414
805
 
415
806
  // src/space-proxy.ts
416
807
  import { Resource } from "@dxos/context";
417
- import { invariant as invariant4 } from "@dxos/invariant";
808
+ import { invariant as invariant5 } from "@dxos/invariant";
418
809
  import { PublicKey as PublicKey2 } from "@dxos/keys";
419
810
 
420
811
  // src/queues-api.ts
@@ -434,7 +825,7 @@ var QueuesAPIImpl = class {
434
825
  };
435
826
 
436
827
  // src/space-proxy.ts
437
- var __dxlog_file4 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/space-proxy.ts";
828
+ var __dxlog_file5 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/space-proxy.ts";
438
829
  var SpaceProxy = class extends Resource {
439
830
  _serviceContainer;
440
831
  _echoClient;
@@ -449,9 +840,9 @@ var SpaceProxy = class extends Resource {
449
840
  return this._id;
450
841
  }
451
842
  get db() {
452
- invariant4(this._db, void 0, {
453
- F: __dxlog_file4,
454
- L: 34,
843
+ invariant5(this._db, void 0, {
844
+ F: __dxlog_file5,
845
+ L: 35,
455
846
  S: this,
456
847
  A: [
457
848
  "this._db",
@@ -464,9 +855,9 @@ var SpaceProxy = class extends Resource {
464
855
  * @deprecated Use db API.
465
856
  */
466
857
  get crud() {
467
- invariant4(this._db, void 0, {
468
- F: __dxlog_file4,
469
- L: 42,
858
+ invariant5(this._db, void 0, {
859
+ F: __dxlog_file5,
860
+ L: 43,
470
861
  S: this,
471
862
  A: [
472
863
  "this._db",
@@ -496,7 +887,7 @@ var SpaceProxy = class extends Resource {
496
887
  };
497
888
 
498
889
  // src/functions-client.ts
499
- var __dxlog_file5 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/functions-client.ts";
890
+ var __dxlog_file6 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/functions-client.ts";
500
891
  var FunctionsClient = class extends Resource2 {
501
892
  _serviceContainer;
502
893
  _echoClient;
@@ -504,25 +895,25 @@ var FunctionsClient = class extends Resource2 {
504
895
  _spaces = /* @__PURE__ */ new Map();
505
896
  constructor(services) {
506
897
  super();
507
- invariant5(typeof services.dataService !== "undefined", "DataService is required", {
508
- F: __dxlog_file5,
509
- L: 32,
898
+ invariant6(typeof services.dataService !== "undefined", "DataService is required", {
899
+ F: __dxlog_file6,
900
+ L: 33,
510
901
  S: this,
511
902
  A: [
512
903
  "typeof services.dataService !== 'undefined'",
513
904
  "'DataService is required'"
514
905
  ]
515
906
  });
516
- invariant5(typeof services.queueService !== "undefined", "QueueService is required", {
517
- F: __dxlog_file5,
518
- L: 33,
907
+ invariant6(typeof services.queueService !== "undefined", "QueueService is required", {
908
+ F: __dxlog_file6,
909
+ L: 34,
519
910
  S: this,
520
911
  A: [
521
912
  "typeof services.queueService !== 'undefined'",
522
913
  "'QueueService is required'"
523
914
  ]
524
915
  });
525
- this._serviceContainer = new ServiceContainer(this._executionContext, services.dataService, services.queueService);
916
+ this._serviceContainer = new ServiceContainer(this._executionContext, services.dataService, services.queueService, services.functionsAiService);
526
917
  this._echoClient = new EchoClient({});
527
918
  }
528
919
  get echo() {
@@ -556,7 +947,8 @@ var FunctionsClient = class extends Resource2 {
556
947
  var createClientFromEnv = async (env) => {
557
948
  const client = new FunctionsClient({
558
949
  dataService: env.DATA_SERVICE,
559
- queueService: env.QUEUE_SERVICE
950
+ queueService: env.QUEUE_SERVICE,
951
+ functionsAiService: env.FUNCTIONS_AI_SERVICE
560
952
  });
561
953
  await client.open();
562
954
  return client;
@@ -570,22 +962,14 @@ var FunctionRouteValue = /* @__PURE__ */ (function(FunctionRouteValue2) {
570
962
  })({});
571
963
 
572
964
  // src/wrap-handler-for-cloudflare.ts
573
- import { invariant as invariant6 } from "@dxos/invariant";
965
+ import { invariant as invariant7 } from "@dxos/invariant";
574
966
  import { SpaceId as SpaceId4 } from "@dxos/keys";
575
967
  import { log as log3 } from "@dxos/log";
576
968
  import { EdgeResponse } from "@dxos/protocols";
577
- var __dxlog_file6 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/wrap-handler-for-cloudflare.ts";
969
+ var __dxlog_file7 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/wrap-handler-for-cloudflare.ts";
578
970
  var wrapHandlerForCloudflare = (func) => {
579
971
  return async (request, env) => {
580
972
  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
973
  return handleFunctionMetaCall(func, request);
590
974
  }
591
975
  try {
@@ -597,7 +981,7 @@ var wrapHandlerForCloudflare = (func) => {
597
981
  });
598
982
  }
599
983
  }
600
- const serviceContainer = new ServiceContainer({}, env.DATA_SERVICE, env.QUEUE_SERVICE);
984
+ const serviceContainer = new ServiceContainer({}, env.DATA_SERVICE, env.QUEUE_SERVICE, env.FUNCTIONS_AI_SERVICE);
601
985
  const context = await createFunctionContext({
602
986
  serviceContainer,
603
987
  contextSpaceId: spaceId
@@ -608,8 +992,8 @@ var wrapHandlerForCloudflare = (func) => {
608
992
  error,
609
993
  stack: error.stack
610
994
  }, {
611
- F: __dxlog_file6,
612
- L: 45,
995
+ F: __dxlog_file7,
996
+ L: 44,
613
997
  S: void 0,
614
998
  C: (f, a) => f(...a)
615
999
  });
@@ -646,8 +1030,8 @@ var decodeRequest = async (request) => {
646
1030
  };
647
1031
  } catch (err) {
648
1032
  log3.catch(err, void 0, {
649
- F: __dxlog_file6,
650
- L: 80,
1033
+ F: __dxlog_file7,
1034
+ L: 79,
651
1035
  S: void 0,
652
1036
  C: (f, a) => f(...a)
653
1037
  });
@@ -674,7 +1058,7 @@ var handleFunctionMetaCall = (functionDefinition, request) => {
674
1058
  });
675
1059
  };
676
1060
  var createFunctionContext = async ({ serviceContainer, contextSpaceId }) => {
677
- const { dataService, queryService, queueService } = await serviceContainer.createServices();
1061
+ const { dataService, queryService, queueService, functionsAiService } = await serviceContainer.createServices();
678
1062
  let spaceKey;
679
1063
  let rootUrl;
680
1064
  if (contextSpaceId) {
@@ -683,9 +1067,9 @@ var createFunctionContext = async ({ serviceContainer, contextSpaceId }) => {
683
1067
  throw new Error(`Space not found: ${contextSpaceId}`);
684
1068
  }
685
1069
  spaceKey = meta.spaceKey;
686
- invariant6(!meta.rootDocumentId.startsWith("automerge:"), void 0, {
687
- F: __dxlog_file6,
688
- L: 118,
1070
+ invariant7(!meta.rootDocumentId.startsWith("automerge:"), void 0, {
1071
+ F: __dxlog_file7,
1072
+ L: 117,
689
1073
  S: void 0,
690
1074
  A: [
691
1075
  "!meta.rootDocumentId.startsWith('automerge:')",
@@ -698,7 +1082,8 @@ var createFunctionContext = async ({ serviceContainer, contextSpaceId }) => {
698
1082
  services: {
699
1083
  dataService,
700
1084
  queryService,
701
- queueService
1085
+ queueService,
1086
+ functionsAiService
702
1087
  },
703
1088
  spaceId: contextSpaceId,
704
1089
  spaceKey,