@dxos/echo-pipeline 0.3.2 → 0.3.3-main.1b7ca63

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.
@@ -8,7 +8,7 @@ var valueEncoding = createCodecEncoding(codec);
8
8
 
9
9
  // packages/core/echo/echo-pipeline/src/common/feeds.ts
10
10
  import { invariant } from "@dxos/invariant";
11
- var __dxlog_file = "/mnt/ramdisk/work/packages/core/echo/echo-pipeline/src/common/feeds.ts";
11
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/common/feeds.ts";
12
12
  var createMappedFeedWriter = (mapper, writer) => {
13
13
  invariant(mapper, void 0, {
14
14
  F: __dxlog_file,
@@ -34,6 +34,7 @@ var createMappedFeedWriter = (mapper, writer) => {
34
34
  };
35
35
 
36
36
  // packages/core/echo/echo-pipeline/src/db-host/data-service-host.ts
37
+ import { UpdateScheduler } from "@dxos/async";
37
38
  import { Stream } from "@dxos/codec-protobuf";
38
39
  import { Context } from "@dxos/context";
39
40
  import { tagMutationsInBatch, setMetadataOnObject } from "@dxos/echo-db";
@@ -41,13 +42,15 @@ import { invariant as invariant2 } from "@dxos/invariant";
41
42
  import { log } from "@dxos/log";
42
43
  import { EchoEvent } from "@dxos/protocols/proto/dxos/echo/service";
43
44
  import { ComplexMap } from "@dxos/util";
44
- var __dxlog_file2 = "/mnt/ramdisk/work/packages/core/echo/echo-pipeline/src/db-host/data-service-host.ts";
45
+ var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/db-host/data-service-host.ts";
46
+ var MUTATION_LIMIT_PER_OBJECT = 10;
45
47
  var DataServiceHost = class {
46
- constructor(_itemManager, _itemDemuxer, _flush, _writeStream) {
48
+ constructor(_itemManager, _itemDemuxer, _flush, _writeStream, _opts = {}) {
47
49
  this._itemManager = _itemManager;
48
50
  this._itemDemuxer = _itemDemuxer;
49
51
  this._flush = _flush;
50
52
  this._writeStream = _writeStream;
53
+ this._opts = _opts;
51
54
  this._ctx = new Context();
52
55
  this._clientTagMap = new ComplexMap(([feedKey, seq]) => `${feedKey.toHex()}:${seq}`);
53
56
  }
@@ -56,6 +59,9 @@ var DataServiceHost = class {
56
59
  async close() {
57
60
  await this._ctx.dispose();
58
61
  }
62
+ get _deferEvents() {
63
+ return this._opts.deferEvents ?? true;
64
+ }
59
65
  /**
60
66
  * Real-time subscription to data objects in a space.
61
67
  */
@@ -68,7 +74,43 @@ var DataServiceHost = class {
68
74
  objects
69
75
  }
70
76
  });
77
+ const updateScheduler = new UpdateScheduler(ctx, async () => {
78
+ flushPendingUpdate();
79
+ }, {
80
+ maxFrequency: 10
81
+ });
82
+ const pendingUpdates = [];
83
+ const mutationsPerObject = /* @__PURE__ */ new Map();
84
+ const clearPendingUpdates = () => {
85
+ pendingUpdates.length = 0;
86
+ mutationsPerObject.clear();
87
+ };
88
+ const flushPendingUpdate = () => {
89
+ const stagedEvents = [];
90
+ const objectsWithSnapshots = /* @__PURE__ */ new Set();
91
+ for (const [id, count] of mutationsPerObject) {
92
+ if (count >= MUTATION_LIMIT_PER_OBJECT) {
93
+ objectsWithSnapshots.add(id);
94
+ const entity = this._itemManager.entities.get(id);
95
+ if (entity) {
96
+ stagedEvents.push(entity.createSnapshot());
97
+ }
98
+ }
99
+ }
100
+ for (const obj of pendingUpdates) {
101
+ if (!objectsWithSnapshots.has(obj.objectId)) {
102
+ stagedEvents.push(obj);
103
+ }
104
+ }
105
+ next({
106
+ batch: {
107
+ objects: stagedEvents
108
+ }
109
+ });
110
+ clearPendingUpdates();
111
+ };
71
112
  this._itemDemuxer.snapshot.on(ctx, (snapshot) => {
113
+ clearPendingUpdates();
72
114
  next({
73
115
  action: EchoEvent.DatabaseAction.RESET,
74
116
  batch: {
@@ -80,7 +122,7 @@ var DataServiceHost = class {
80
122
  const { batch, meta } = message;
81
123
  invariant2(!meta.clientTag, "Unexpected client tag in mutation message", {
82
124
  F: __dxlog_file2,
83
- L: 69,
125
+ L: 131,
84
126
  S: this,
85
127
  A: [
86
128
  "!(meta as any).clientTag",
@@ -92,7 +134,7 @@ var DataServiceHost = class {
92
134
  meta
93
135
  }, {
94
136
  F: __dxlog_file2,
95
- L: 70,
137
+ L: 132,
96
138
  S: this,
97
139
  C: (f, a) => f(...a)
98
140
  });
@@ -106,21 +148,37 @@ var DataServiceHost = class {
106
148
  });
107
149
  });
108
150
  if (clientTag) {
151
+ flushPendingUpdate();
109
152
  tagMutationsInBatch(batch, clientTag, 0);
153
+ next({
154
+ clientTag,
155
+ feedKey: message.meta.feedKey,
156
+ seq: message.meta.seq,
157
+ batch
158
+ });
159
+ } else {
160
+ for (const obj of batch.objects ?? []) {
161
+ const newCount = (mutationsPerObject.get(obj.objectId) ?? 0) + 1;
162
+ mutationsPerObject.set(obj.objectId, newCount);
163
+ }
164
+ for (const obj of batch.objects ?? []) {
165
+ if ((mutationsPerObject.get(obj.objectId) ?? 0) < MUTATION_LIMIT_PER_OBJECT) {
166
+ pendingUpdates.push(obj);
167
+ }
168
+ }
169
+ if (this._deferEvents) {
170
+ updateScheduler.trigger();
171
+ } else {
172
+ flushPendingUpdate();
173
+ }
110
174
  }
111
- next({
112
- clientTag,
113
- feedKey: message.meta.feedKey,
114
- seq: message.meta.seq,
115
- batch
116
- });
117
175
  });
118
176
  });
119
177
  }
120
178
  async write(request) {
121
179
  invariant2(!this._ctx.disposed, "Cannot write to closed DataServiceHost", {
122
180
  F: __dxlog_file2,
123
- L: 96,
181
+ L: 177,
124
182
  S: this,
125
183
  A: [
126
184
  "!this._ctx.disposed",
@@ -129,7 +187,7 @@ var DataServiceHost = class {
129
187
  });
130
188
  invariant2(this._writeStream, "Cannot write mutations in readonly mode", {
131
189
  F: __dxlog_file2,
132
- L: 97,
190
+ L: 178,
133
191
  S: this,
134
192
  A: [
135
193
  "this._writeStream",
@@ -141,7 +199,7 @@ var DataServiceHost = class {
141
199
  objectCount: request.batch.objects?.length ?? 0
142
200
  }, {
143
201
  F: __dxlog_file2,
144
- L: 99,
202
+ L: 180,
145
203
  S: this,
146
204
  C: (f, a) => f(...a)
147
205
  });
@@ -155,7 +213,7 @@ var DataServiceHost = class {
155
213
  seq: receipt2.seq
156
214
  }, {
157
215
  F: __dxlog_file2,
158
- L: 108,
216
+ L: 189,
159
217
  S: this,
160
218
  C: (f, a) => f(...a)
161
219
  });
@@ -212,8 +270,8 @@ var DatabaseHost = class {
212
270
  createSnapshot() {
213
271
  return this._itemDemuxer.createSnapshot();
214
272
  }
215
- createDataServiceHost() {
216
- return new DataServiceHost(this._itemManager, this._itemDemuxer, this._flush, this._outboundStream ?? void 0);
273
+ createDataServiceHost(opts = {}) {
274
+ return new DataServiceHost(this._itemManager, this._itemDemuxer, this._flush, this._outboundStream ?? void 0, opts);
217
275
  }
218
276
  };
219
277
 
@@ -304,7 +362,7 @@ import { invariant as invariant3 } from "@dxos/invariant";
304
362
  import { PublicKey as PublicKey2 } from "@dxos/keys";
305
363
  import { log as log2 } from "@dxos/log";
306
364
  import { ComplexMap as ComplexMap2 } from "@dxos/util";
307
- var __dxlog_file3 = "/mnt/ramdisk/work/packages/core/echo/echo-pipeline/src/db-host/data-service.ts";
365
+ var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/db-host/data-service.ts";
308
366
  var DataServiceSubscriptions = class {
309
367
  constructor() {
310
368
  this._spaces = new ComplexMap2(PublicKey2.hash);
@@ -423,7 +481,7 @@ function _ts_decorate(decorators, target, key, desc) {
423
481
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
424
482
  return c > 3 && r && Object.defineProperty(target, key, r), r;
425
483
  }
426
- var __dxlog_file4 = "/mnt/ramdisk/work/packages/core/echo/echo-pipeline/src/metadata/metadata-store.ts";
484
+ var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/metadata/metadata-store.ts";
427
485
  var emptyEchoMetadata = () => ({
428
486
  version: STORAGE_VERSION,
429
487
  spaces: [],
@@ -723,7 +781,7 @@ function _ts_decorate2(decorators, target, key, desc) {
723
781
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
724
782
  return c > 3 && r && Object.defineProperty(target, key, r), r;
725
783
  }
726
- var __dxlog_file5 = "/mnt/ramdisk/work/packages/core/echo/echo-pipeline/src/pipeline/timeframe-clock.ts";
784
+ var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/pipeline/timeframe-clock.ts";
727
785
  var mapTimeframeToFeedIndexes = (timeframe) => timeframe.frames().map(([feedKey, index]) => ({
728
786
  feedKey,
729
787
  index
@@ -819,7 +877,7 @@ import { ComplexMap as ComplexMap4 } from "@dxos/util";
819
877
  // packages/core/echo/echo-pipeline/src/pipeline/message-selector.ts
820
878
  import { invariant as invariant5 } from "@dxos/invariant";
821
879
  import { log as log5 } from "@dxos/log";
822
- var __dxlog_file6 = "/mnt/ramdisk/work/packages/core/echo/echo-pipeline/src/pipeline/message-selector.ts";
880
+ var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/pipeline/message-selector.ts";
823
881
  var createMessageSelector = (timeframeClock) => {
824
882
  return (messages) => {
825
883
  for (let i = 0; i < messages.length; i++) {
@@ -857,7 +915,7 @@ function _ts_decorate3(decorators, target, key, desc) {
857
915
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
858
916
  return c > 3 && r && Object.defineProperty(target, key, r), r;
859
917
  }
860
- var __dxlog_file7 = "/mnt/ramdisk/work/packages/core/echo/echo-pipeline/src/pipeline/pipeline.ts";
918
+ var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/pipeline/pipeline.ts";
861
919
  var PipelineState = class {
862
920
  constructor(_feeds, _timeframeClock) {
863
921
  this._feeds = _feeds;
@@ -1269,7 +1327,7 @@ import { invariant as invariant7 } from "@dxos/invariant";
1269
1327
  import { log as log7 } from "@dxos/log";
1270
1328
  import { schema as schema5 } from "@dxos/protocols";
1271
1329
  import { RpcExtension } from "@dxos/teleport";
1272
- var __dxlog_file8 = "/mnt/ramdisk/work/packages/core/echo/echo-pipeline/src/space/auth.ts";
1330
+ var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/space/auth.ts";
1273
1331
  var AuthExtension = class extends RpcExtension {
1274
1332
  constructor(_authParams) {
1275
1333
  super({
@@ -1389,7 +1447,7 @@ function _ts_decorate4(decorators, target, key, desc) {
1389
1447
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1390
1448
  return c > 3 && r && Object.defineProperty(target, key, r), r;
1391
1449
  }
1392
- var __dxlog_file9 = "/mnt/ramdisk/work/packages/core/echo/echo-pipeline/src/space/data-pipeline.ts";
1450
+ var __dxlog_file9 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/space/data-pipeline.ts";
1393
1451
  var MESSAGES_PER_SNAPSHOT = 10;
1394
1452
  var AUTOMATIC_SNAPSHOT_DEBOUNCE_INTERVAL = 5e3;
1395
1453
  var TIMEFRAME_SAVE_DEBOUNCE_INTERVAL = 5e3;
@@ -1835,7 +1893,7 @@ function _ts_decorate5(decorators, target, key, desc) {
1835
1893
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1836
1894
  return c > 3 && r && Object.defineProperty(target, key, r), r;
1837
1895
  }
1838
- var __dxlog_file10 = "/mnt/ramdisk/work/packages/core/echo/echo-pipeline/src/space/control-pipeline.ts";
1896
+ var __dxlog_file10 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/space/control-pipeline.ts";
1839
1897
  var TIMEFRAME_SAVE_DEBOUNCE_INTERVAL2 = 500;
1840
1898
  var CONTROL_PIPELINE_SNAPSHOT_DELAY = 1e4;
1841
1899
  var USE_SNAPSHOTS = true;
@@ -2084,7 +2142,7 @@ function _ts_decorate6(decorators, target, key, desc) {
2084
2142
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
2085
2143
  return c > 3 && r && Object.defineProperty(target, key, r), r;
2086
2144
  }
2087
- var __dxlog_file11 = "/mnt/ramdisk/work/packages/core/echo/echo-pipeline/src/space/space.ts";
2145
+ var __dxlog_file11 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/space/space.ts";
2088
2146
  var Space = class Space2 {
2089
2147
  constructor(params) {
2090
2148
  this._addFeedLock = new Lock();
@@ -2341,7 +2399,7 @@ function _ts_decorate7(decorators, target, key, desc) {
2341
2399
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
2342
2400
  return c > 3 && r && Object.defineProperty(target, key, r), r;
2343
2401
  }
2344
- var __dxlog_file12 = "/mnt/ramdisk/work/packages/core/echo/echo-pipeline/src/space/space-protocol.ts";
2402
+ var __dxlog_file12 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/space/space-protocol.ts";
2345
2403
  var MOCK_AUTH_PROVIDER = async (nonce) => Buffer.from("mock");
2346
2404
  var MOCK_AUTH_VERIFIER = async (nonce, credential) => true;
2347
2405
  var SpaceProtocol = class {
@@ -2545,7 +2603,7 @@ function _ts_decorate8(decorators, target, key, desc) {
2545
2603
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
2546
2604
  return c > 3 && r && Object.defineProperty(target, key, r), r;
2547
2605
  }
2548
- var __dxlog_file13 = "/mnt/ramdisk/work/packages/core/echo/echo-pipeline/src/space/space-manager.ts";
2606
+ var __dxlog_file13 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/space/space-manager.ts";
2549
2607
  var SpaceManager = class SpaceManager2 {
2550
2608
  constructor({ feedStore, networkManager, modelFactory, metadataStore, snapshotStore, blobStore }) {
2551
2609
  this._spaces = new ComplexMap6(PublicKey7.hash);
@@ -2654,4 +2712,4 @@ export {
2654
2712
  SpaceProtocolSession,
2655
2713
  SpaceManager
2656
2714
  };
2657
- //# sourceMappingURL=chunk-QEYXVBEM.mjs.map
2715
+ //# sourceMappingURL=chunk-KD6OVLI6.mjs.map