@rocicorp/zero 0.7.2024120400 → 0.7.2024120701

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 (188) hide show
  1. package/out/{chunk-WJCWI5I4.js → chunk-BT5PSTTW.js} +259 -202
  2. package/out/{chunk-WJCWI5I4.js.map → chunk-BT5PSTTW.js.map} +4 -4
  3. package/out/otel/src/noop-span-exporter.d.ts +8 -0
  4. package/out/otel/src/noop-span-exporter.d.ts.map +1 -0
  5. package/out/otel/src/noop-span-exporter.js +14 -0
  6. package/out/otel/src/noop-span-exporter.js.map +1 -0
  7. package/out/otel/src/span.d.ts +5 -0
  8. package/out/otel/src/span.d.ts.map +1 -0
  9. package/out/otel/src/span.js +30 -0
  10. package/out/otel/src/span.js.map +1 -0
  11. package/out/otel/src/version.d.ts +2 -0
  12. package/out/otel/src/version.d.ts.map +1 -0
  13. package/out/otel/src/version.js +2 -0
  14. package/out/otel/src/version.js.map +1 -0
  15. package/out/react.js +12 -6
  16. package/out/react.js.map +2 -2
  17. package/out/solid.js +1 -1
  18. package/out/zero-cache/src/auth/write-authorizer.d.ts.map +1 -1
  19. package/out/zero-cache/src/auth/write-authorizer.js +3 -4
  20. package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
  21. package/out/zero-cache/src/config/zero-config.d.ts +11 -7
  22. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  23. package/out/zero-cache/src/config/zero-config.js +11 -7
  24. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  25. package/out/zero-cache/src/server/change-streamer.d.ts +1 -1
  26. package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
  27. package/out/zero-cache/src/server/change-streamer.js +3 -3
  28. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  29. package/out/zero-cache/src/server/main.js +6 -11
  30. package/out/zero-cache/src/server/main.js.map +1 -1
  31. package/out/zero-cache/src/server/replicator.d.ts +1 -1
  32. package/out/zero-cache/src/server/replicator.d.ts.map +1 -1
  33. package/out/zero-cache/src/server/replicator.js +3 -3
  34. package/out/zero-cache/src/server/replicator.js.map +1 -1
  35. package/out/zero-cache/src/server/syncer.d.ts +1 -1
  36. package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
  37. package/out/zero-cache/src/server/syncer.js +34 -5
  38. package/out/zero-cache/src/server/syncer.js.map +1 -1
  39. package/out/zero-cache/src/services/change-streamer/pg/change-source.d.ts.map +1 -1
  40. package/out/zero-cache/src/services/change-streamer/pg/change-source.js +31 -21
  41. package/out/zero-cache/src/services/change-streamer/pg/change-source.js.map +1 -1
  42. package/out/zero-cache/src/services/dispatcher/connect-params.d.ts +2 -1
  43. package/out/zero-cache/src/services/dispatcher/connect-params.d.ts.map +1 -1
  44. package/out/zero-cache/src/services/dispatcher/connect-params.js +3 -2
  45. package/out/zero-cache/src/services/dispatcher/connect-params.js.map +1 -1
  46. package/out/zero-cache/src/services/dispatcher/dispatcher.d.ts.map +1 -1
  47. package/out/zero-cache/src/services/dispatcher/dispatcher.js +5 -5
  48. package/out/zero-cache/src/services/dispatcher/dispatcher.js.map +1 -1
  49. package/out/zero-cache/src/services/mutagen/mutagen.d.ts +1 -1
  50. package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
  51. package/out/zero-cache/src/services/mutagen/mutagen.js +28 -20
  52. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  53. package/out/zero-cache/src/services/runner.js +1 -4
  54. package/out/zero-cache/src/services/runner.js.map +1 -1
  55. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +1 -1
  56. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts.map +1 -1
  57. package/out/zero-cache/src/services/view-syncer/client-handler.js +3 -2
  58. package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
  59. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +2 -2
  60. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
  61. package/out/zero-cache/src/services/view-syncer/cvr-store.js +41 -32
  62. package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
  63. package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
  64. package/out/zero-cache/src/services/view-syncer/cvr.js +2 -2
  65. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
  66. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +11 -1
  67. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  68. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +5 -5
  69. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  70. package/out/zero-cache/src/services/view-syncer/view-syncer.js +384 -357
  71. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  72. package/out/zero-cache/src/types/error-for-client.d.ts +10 -3
  73. package/out/zero-cache/src/types/error-for-client.d.ts.map +1 -1
  74. package/out/zero-cache/src/types/error-for-client.js +4 -4
  75. package/out/zero-cache/src/types/error-for-client.js.map +1 -1
  76. package/out/zero-cache/src/types/lite.d.ts.map +1 -1
  77. package/out/zero-cache/src/types/lite.js +1 -0
  78. package/out/zero-cache/src/types/lite.js.map +1 -1
  79. package/out/zero-cache/src/types/pg.d.ts +1 -1
  80. package/out/zero-cache/src/types/pg.d.ts.map +1 -1
  81. package/out/zero-cache/src/types/pg.js +33 -7
  82. package/out/zero-cache/src/types/pg.js.map +1 -1
  83. package/out/zero-cache/src/types/processes.d.ts +5 -1
  84. package/out/zero-cache/src/types/processes.d.ts.map +1 -1
  85. package/out/zero-cache/src/types/processes.js +12 -2
  86. package/out/zero-cache/src/types/processes.js.map +1 -1
  87. package/out/zero-cache/src/types/schema-versions.d.ts.map +1 -1
  88. package/out/zero-cache/src/types/schema-versions.js +4 -5
  89. package/out/zero-cache/src/types/schema-versions.js.map +1 -1
  90. package/out/zero-cache/src/workers/connection.d.ts +14 -6
  91. package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
  92. package/out/zero-cache/src/workers/connection.js +78 -70
  93. package/out/zero-cache/src/workers/connection.js.map +1 -1
  94. package/out/zero-cache/src/workers/syncer.d.ts.map +1 -1
  95. package/out/zero-cache/src/workers/syncer.js +8 -10
  96. package/out/zero-cache/src/workers/syncer.js.map +1 -1
  97. package/out/zero-client/src/client/options.d.ts +10 -6
  98. package/out/zero-client/src/client/options.d.ts.map +1 -1
  99. package/out/zero-client/src/client/query-manager.d.ts.map +1 -1
  100. package/out/zero-client/src/client/server-error.d.ts +5 -3
  101. package/out/zero-client/src/client/server-error.d.ts.map +1 -1
  102. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  103. package/out/zero-client/src/mod.d.ts +2 -2
  104. package/out/zero-client/src/mod.d.ts.map +1 -1
  105. package/out/zero-protocol/src/ast.d.ts +3 -0
  106. package/out/zero-protocol/src/ast.d.ts.map +1 -1
  107. package/out/zero-protocol/src/ast.js +2 -0
  108. package/out/zero-protocol/src/ast.js.map +1 -1
  109. package/out/zero-protocol/src/error.d.ts +18 -1
  110. package/out/zero-protocol/src/error.d.ts.map +1 -1
  111. package/out/zero-protocol/src/error.js +12 -2
  112. package/out/zero-protocol/src/error.js.map +1 -1
  113. package/out/zero-protocol/src/protocol-version.d.ts +20 -0
  114. package/out/zero-protocol/src/protocol-version.d.ts.map +1 -0
  115. package/out/zero-protocol/src/protocol-version.js +20 -0
  116. package/out/zero-protocol/src/protocol-version.js.map +1 -0
  117. package/out/zero-react/src/use-query.d.ts +9 -1
  118. package/out/zero-react/src/use-query.d.ts.map +1 -1
  119. package/out/zero-schema/src/compiled-permissions.d.ts +3 -3
  120. package/out/zero-schema/src/compiled-permissions.js +1 -1
  121. package/out/zero-schema/src/compiled-permissions.js.map +1 -1
  122. package/out/zero-schema/src/mod.d.ts +1 -1
  123. package/out/zero-schema/src/mod.d.ts.map +1 -1
  124. package/out/zero-schema/src/permissions.d.ts +1 -1
  125. package/out/zero-schema/src/permissions.d.ts.map +1 -1
  126. package/out/zero-schema/src/table-schema.d.ts +0 -3
  127. package/out/zero-schema/src/table-schema.d.ts.map +1 -1
  128. package/out/zero-schema/src/table-schema.js.map +1 -1
  129. package/out/zero.js +1 -1
  130. package/out/zql/src/builder/builder.d.ts.map +1 -1
  131. package/out/zql/src/builder/builder.js +9 -11
  132. package/out/zql/src/builder/builder.js.map +1 -1
  133. package/out/zql/src/ivm/array-view.d.ts +1 -1
  134. package/out/zql/src/ivm/array-view.d.ts.map +1 -1
  135. package/out/zql/src/ivm/array-view.js +16 -3
  136. package/out/zql/src/ivm/array-view.js.map +1 -1
  137. package/out/zql/src/ivm/data.d.ts +1 -1
  138. package/out/zql/src/ivm/data.d.ts.map +1 -1
  139. package/out/zql/src/ivm/data.js +3 -2
  140. package/out/zql/src/ivm/data.js.map +1 -1
  141. package/out/zql/src/ivm/exists.d.ts.map +1 -1
  142. package/out/zql/src/ivm/exists.js +13 -2
  143. package/out/zql/src/ivm/exists.js.map +1 -1
  144. package/out/zql/src/ivm/join.d.ts +3 -2
  145. package/out/zql/src/ivm/join.d.ts.map +1 -1
  146. package/out/zql/src/ivm/join.js +5 -2
  147. package/out/zql/src/ivm/join.js.map +1 -1
  148. package/out/zql/src/ivm/memory-source.d.ts +2 -12
  149. package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
  150. package/out/zql/src/ivm/memory-source.js +29 -63
  151. package/out/zql/src/ivm/memory-source.js.map +1 -1
  152. package/out/zql/src/ivm/operator.d.ts +3 -1
  153. package/out/zql/src/ivm/operator.d.ts.map +1 -1
  154. package/out/zql/src/ivm/schema.d.ts +2 -1
  155. package/out/zql/src/ivm/schema.d.ts.map +1 -1
  156. package/out/zql/src/ivm/skip.d.ts.map +1 -1
  157. package/out/zql/src/ivm/skip.js +60 -54
  158. package/out/zql/src/ivm/skip.js.map +1 -1
  159. package/out/zql/src/ivm/take.d.ts.map +1 -1
  160. package/out/zql/src/ivm/take.js +47 -35
  161. package/out/zql/src/ivm/take.js.map +1 -1
  162. package/out/zql/src/ivm/view.d.ts +1 -1
  163. package/out/zql/src/ivm/view.d.ts.map +1 -1
  164. package/out/zql/src/query/auth-query.d.ts +1 -0
  165. package/out/zql/src/query/auth-query.d.ts.map +1 -1
  166. package/out/zql/src/query/auth-query.js +1 -0
  167. package/out/zql/src/query/auth-query.js.map +1 -1
  168. package/out/zql/src/query/query-impl.d.ts +6 -4
  169. package/out/zql/src/query/query-impl.d.ts.map +1 -1
  170. package/out/zql/src/query/query-impl.js +18 -4
  171. package/out/zql/src/query/query-impl.js.map +1 -1
  172. package/out/zql/src/query/query.d.ts +9 -5
  173. package/out/zql/src/query/query.d.ts.map +1 -1
  174. package/out/zql/src/query/typed-view.d.ts +2 -1
  175. package/out/zql/src/query/typed-view.d.ts.map +1 -1
  176. package/out/zqlite/src/db.js +1 -1
  177. package/out/zqlite/src/table-source.d.ts.map +1 -1
  178. package/out/zqlite/src/table-source.js +31 -67
  179. package/out/zqlite/src/table-source.js.map +1 -1
  180. package/package.json +5 -1
  181. package/out/shared/src/random-values.js +0 -22
  182. package/out/shared/src/random-values.js.map +0 -1
  183. package/out/zero-client/src/client/protocol-version.d.ts +0 -2
  184. package/out/zero-client/src/client/protocol-version.d.ts.map +0 -1
  185. package/out/zql/src/ivm/lookahead-iterator.d.ts +0 -13
  186. package/out/zql/src/ivm/lookahead-iterator.d.ts.map +0 -1
  187. package/out/zql/src/ivm/lookahead-iterator.js +0 -45
  188. package/out/zql/src/ivm/lookahead-iterator.js.map +0 -1
@@ -9291,8 +9291,8 @@ function isJunctionRelationship(relationship) {
9291
9291
  }
9292
9292
 
9293
9293
  // ../shared/src/sorted-entries.ts
9294
- function sortedEntries(object17) {
9295
- return Object.entries(object17).sort((a, b) => stringCompare(a[0], b[0]));
9294
+ function sortedEntries(object18) {
9295
+ return Object.entries(object18).sort((a, b) => stringCompare(a[0], b[0]));
9296
9296
  }
9297
9297
 
9298
9298
  // ../zero-schema/src/normalize-table-schema.ts
@@ -9742,7 +9742,8 @@ var correlationSchema = readonlyObject({
9742
9742
  });
9743
9743
  var correlatedSubquerySchemaOmitSubquery = readonlyObject({
9744
9744
  correlation: correlationSchema,
9745
- hidden: valita_exports.boolean().optional()
9745
+ hidden: valita_exports.boolean().optional(),
9746
+ system: valita_exports.union(valita_exports.literal("permissions"), valita_exports.literal("client")).optional()
9746
9747
  });
9747
9748
  var correlatedSubquerySchema = correlatedSubquerySchemaOmitSubquery.extend({
9748
9749
  subquery: valita_exports.lazy(() => astSchema)
@@ -9777,7 +9778,8 @@ function normalizeAST(ast) {
9777
9778
  (r) => ({
9778
9779
  correlation: r.correlation,
9779
9780
  hidden: r.hidden,
9780
- subquery: normalizeAST(r.subquery)
9781
+ subquery: normalizeAST(r.subquery),
9782
+ system: r.system
9781
9783
  })
9782
9784
  )
9783
9785
  ) : void 0,
@@ -9938,13 +9940,14 @@ function compareValues(a, b) {
9938
9940
  function normalizeUndefined(v2) {
9939
9941
  return v2 ?? null;
9940
9942
  }
9941
- function makeComparator(order) {
9943
+ function makeComparator(order, reverse) {
9942
9944
  return (a, b) => {
9943
9945
  for (const ord of order) {
9944
9946
  const field = ord[0];
9945
9947
  const comp = compareValues(a[field], b[field]);
9946
9948
  if (comp !== 0) {
9947
- return ord[1] === "asc" ? comp : -comp;
9949
+ const result = ord[1] === "asc" ? comp : -comp;
9950
+ return reverse ? -result : result;
9948
9951
  }
9949
9952
  }
9950
9953
  return 0;
@@ -10027,7 +10030,11 @@ var Exists = class {
10027
10030
  return;
10028
10031
  }
10029
10032
  case "remove": {
10030
- this.#pushWithFilter(change);
10033
+ const size = this.#getSize(change.node.row);
10034
+ if (size === void 0) {
10035
+ return;
10036
+ }
10037
+ this.#pushWithFilter(change, size);
10031
10038
  this.#delSize(change.node.row);
10032
10039
  return;
10033
10040
  }
@@ -10136,13 +10143,20 @@ var Exists = class {
10136
10143
  return size;
10137
10144
  }
10138
10145
  #fetchNodeForRow(row) {
10139
- return must(
10146
+ const fetched = must(
10140
10147
  first(
10141
10148
  this.#input.fetch({
10142
10149
  start: { row, basis: "at" }
10143
10150
  })
10144
10151
  )
10145
10152
  );
10153
+ assert(
10154
+ this.getSchema().compareRows(row, fetched.row) === 0,
10155
+ () => `fetchNodeForRow returned unexpected row, expected ${JSON.stringify(
10156
+ row
10157
+ )}, received ${JSON.stringify(fetched.row)}`
10158
+ );
10159
+ return fetched;
10146
10160
  }
10147
10161
  #makeSizeStorageKey(row) {
10148
10162
  const primaryKey = [];
@@ -10342,7 +10356,8 @@ var Join = class {
10342
10356
  parentKey,
10343
10357
  childKey,
10344
10358
  relationshipName,
10345
- hidden
10359
+ hidden,
10360
+ system
10346
10361
  }) {
10347
10362
  assert(parent !== child, "Parent and child must be different operators");
10348
10363
  assert(
@@ -10362,7 +10377,10 @@ var Join = class {
10362
10377
  isHidden: hidden,
10363
10378
  relationships: {
10364
10379
  ...parentSchema.relationships,
10365
- [relationshipName]: childSchema
10380
+ [relationshipName]: {
10381
+ ...childSchema,
10382
+ system
10383
+ }
10366
10384
  }
10367
10385
  };
10368
10386
  parent.setOutput({
@@ -10588,10 +10606,27 @@ var Skip = class {
10588
10606
  return this.#input.getSchema();
10589
10607
  }
10590
10608
  fetch(req) {
10591
- return this.#input.fetch({ ...req, start: this.#getStart(req) });
10609
+ return this.#fetchOrCleanup("fetch", req);
10592
10610
  }
10593
10611
  cleanup(req) {
10594
- return this.#input.cleanup({ ...req, start: this.#getStart(req) });
10612
+ return this.#fetchOrCleanup("fetch", req);
10613
+ }
10614
+ *#fetchOrCleanup(method, req) {
10615
+ const start = this.#getStart(req);
10616
+ if (start === "empty") {
10617
+ return;
10618
+ }
10619
+ const nodes = this.#input[method]({ ...req, start });
10620
+ if (!req.reverse) {
10621
+ yield* nodes;
10622
+ return;
10623
+ }
10624
+ for (const node of nodes) {
10625
+ if (!this.#shouldBePresent(node.row)) {
10626
+ return;
10627
+ }
10628
+ yield node;
10629
+ }
10595
10630
  }
10596
10631
  setOutput(output) {
10597
10632
  this.#output = output;
@@ -10599,12 +10634,13 @@ var Skip = class {
10599
10634
  destroy() {
10600
10635
  this.#input.destroy();
10601
10636
  }
10637
+ #shouldBePresent(row) {
10638
+ const cmp2 = this.#comparator(this.#bound.row, row);
10639
+ return cmp2 < 0 || cmp2 === 0 && !this.#bound.exclusive;
10640
+ }
10602
10641
  push(change) {
10603
10642
  assert(this.#output, "Output not set");
10604
- const shouldBePresent = (row) => {
10605
- const cmp2 = this.#comparator(this.#bound.row, row);
10606
- return cmp2 < 0 || cmp2 === 0 && !this.#bound.exclusive;
10607
- };
10643
+ const shouldBePresent = (row) => this.#shouldBePresent(row);
10608
10644
  if (change.type === "edit") {
10609
10645
  maybeSplitAndPushEditChange(change, shouldBePresent, this.#output);
10610
10646
  return;
@@ -10621,40 +10657,38 @@ var Skip = class {
10621
10657
  basis: this.#bound.exclusive ? "after" : "at"
10622
10658
  };
10623
10659
  if (!req.start) {
10660
+ if (req.reverse) {
10661
+ return void 0;
10662
+ }
10624
10663
  return boundStart;
10625
10664
  }
10626
10665
  const cmp2 = this.#comparator(this.#bound.row, req.start.row);
10627
- if (cmp2 > 0) {
10628
- return boundStart;
10629
- }
10630
- if (cmp2 === 0) {
10631
- if (this.#bound.exclusive || req.start.basis === "after") {
10632
- return {
10633
- row: this.#bound.row,
10634
- basis: "after"
10635
- };
10666
+ if (!req.reverse) {
10667
+ if (cmp2 > 0) {
10668
+ return boundStart;
10669
+ }
10670
+ if (cmp2 === 0) {
10671
+ if (this.#bound.exclusive || req.start.basis === "after") {
10672
+ return {
10673
+ row: this.#bound.row,
10674
+ basis: "after"
10675
+ };
10676
+ }
10677
+ return boundStart;
10636
10678
  }
10637
- return boundStart;
10638
- }
10639
- assert(cmp2 < 0);
10640
- if (req.start.basis === "at" || req.start.basis === "after") {
10641
10679
  return req.start;
10642
10680
  }
10643
- req.start.basis;
10644
- const [node] = this.#input.fetch(req);
10645
- if (!node) {
10646
- return {
10647
- row: req.start.row,
10648
- basis: "at"
10649
- };
10681
+ req.reverse;
10682
+ if (cmp2 > 0) {
10683
+ return "empty";
10650
10684
  }
10651
- if (this.#comparator(node.row, this.#bound.row) <= 0) {
10652
- return boundStart;
10685
+ if (cmp2 === 0) {
10686
+ if (!this.#bound.exclusive && req.start.basis === "at") {
10687
+ return boundStart;
10688
+ }
10689
+ return "empty";
10653
10690
  }
10654
- return {
10655
- row: node.row,
10656
- basis: "at"
10657
- };
10691
+ return req.start;
10658
10692
  }
10659
10693
  };
10660
10694
 
@@ -10722,10 +10756,8 @@ var Take = class {
10722
10756
  }
10723
10757
  *#initialFetch(req) {
10724
10758
  assert(req.start === void 0);
10725
- assert(
10726
- !this.#partitionKey || req.constraint && // TODO: Compound keys
10727
- constraintMatchesPartitionKey(req.constraint, this.#partitionKey)
10728
- );
10759
+ assert(!req.reverse);
10760
+ assert(constraintMatchesPartitionKey(req.constraint, this.#partitionKey));
10729
10761
  if (this.#limit === 0) {
10730
10762
  return;
10731
10763
  }
@@ -10759,24 +10791,15 @@ var Take = class {
10759
10791
  }
10760
10792
  *cleanup(req) {
10761
10793
  assert(req.start === void 0);
10762
- assert(
10763
- !this.#partitionKey || req.constraint && // TODO: Compound keys
10764
- constraintMatchesPartitionKey(req.constraint, this.#partitionKey)
10765
- );
10766
- let takeState;
10767
- if (this.#limit > 0) {
10768
- const takeStateKey = getTakeStateKey(this.#partitionKey, req.constraint);
10769
- takeState = this.#storage.get(takeStateKey);
10770
- assert(
10771
- takeState !== void 0,
10772
- "takeStateKey was: " + takeStateKey + ", partitionKey was: " + this.#partitionKey + ", constraint was: " + JSON.stringify(req.constraint)
10773
- );
10774
- this.#storage.del(takeStateKey);
10775
- }
10794
+ assert(constraintMatchesPartitionKey(req.constraint, this.#partitionKey));
10795
+ const takeStateKey = getTakeStateKey(this.#partitionKey, req.constraint);
10796
+ this.#storage.del(takeStateKey);
10797
+ let size = 0;
10776
10798
  for (const inputNode of this.#input.cleanup(req)) {
10777
- if (takeState?.bound === void 0 || this.getSchema().compareRows(takeState.bound, inputNode.row) < 0) {
10799
+ if (size === this.#limit) {
10778
10800
  return;
10779
10801
  }
10802
+ size++;
10780
10803
  yield inputNode;
10781
10804
  }
10782
10805
  }
@@ -10833,13 +10856,14 @@ var Take = class {
10833
10856
  )
10834
10857
  );
10835
10858
  } else {
10836
- [beforeBoundNode, boundNode] = take(
10859
+ [boundNode, beforeBoundNode] = take(
10837
10860
  this.#input.fetch({
10838
10861
  start: {
10839
10862
  row: takeState.bound,
10840
- basis: "before"
10863
+ basis: "at"
10841
10864
  },
10842
- constraint
10865
+ constraint,
10866
+ reverse: true
10843
10867
  }),
10844
10868
  2
10845
10869
  );
@@ -10864,21 +10888,41 @@ var Take = class {
10864
10888
  if (compToBound > 0) {
10865
10889
  return;
10866
10890
  }
10891
+ const [beforeBoundNode] = take(
10892
+ this.#input.fetch({
10893
+ start: {
10894
+ row: takeState.bound,
10895
+ basis: "after"
10896
+ },
10897
+ constraint,
10898
+ reverse: true
10899
+ }),
10900
+ 1
10901
+ );
10867
10902
  let newBound;
10868
- for (const node of this.#input.fetch({
10869
- start: {
10870
- row: takeState.bound,
10871
- basis: "before"
10872
- },
10873
- constraint
10874
- })) {
10875
- const push2 = compareRows(node.row, takeState.bound) > 0;
10903
+ if (beforeBoundNode) {
10904
+ const push2 = compareRows(beforeBoundNode.row, takeState.bound) > 0;
10876
10905
  newBound = {
10877
- node,
10906
+ node: beforeBoundNode,
10878
10907
  push: push2
10879
10908
  };
10880
- if (push2) {
10881
- break;
10909
+ }
10910
+ if (!newBound?.push) {
10911
+ for (const node of this.#input.fetch({
10912
+ start: {
10913
+ row: takeState.bound,
10914
+ basis: "at"
10915
+ },
10916
+ constraint
10917
+ })) {
10918
+ const push2 = compareRows(node.row, takeState.bound) > 0;
10919
+ newBound = {
10920
+ node,
10921
+ push: push2
10922
+ };
10923
+ if (push2) {
10924
+ break;
10925
+ }
10882
10926
  }
10883
10927
  }
10884
10928
  if (newBound?.push) {
@@ -10953,9 +10997,10 @@ var Take = class {
10953
10997
  this.#input.fetch({
10954
10998
  start: {
10955
10999
  row: takeState.bound,
10956
- basis: "before"
11000
+ basis: "after"
10957
11001
  },
10958
- constraint
11002
+ constraint,
11003
+ reverse: true
10959
11004
  })
10960
11005
  )
10961
11006
  );
@@ -11006,13 +11051,14 @@ var Take = class {
11006
11051
  return;
11007
11052
  }
11008
11053
  assert(newCmp < 0);
11009
- const [newBoundNode, oldBoundNode] = take(
11054
+ const [oldBoundNode, newBoundNode] = take(
11010
11055
  this.#input.fetch({
11011
11056
  start: {
11012
11057
  row: takeState.bound,
11013
- basis: "before"
11058
+ basis: "at"
11014
11059
  },
11015
- constraint
11060
+ constraint,
11061
+ reverse: true
11016
11062
  }),
11017
11063
  2
11018
11064
  );
@@ -11095,6 +11141,12 @@ function getTakeStateKey(partitionKey, rowOrConstraint) {
11095
11141
  return JSON.stringify(["take", ...partitionValues]);
11096
11142
  }
11097
11143
  function constraintMatchesPartitionKey(constraint, partitionKey) {
11144
+ if (constraint === void 0 || partitionKey === void 0) {
11145
+ return constraint === partitionKey;
11146
+ }
11147
+ if (partitionKey.length !== Object.keys(constraint).length) {
11148
+ return false;
11149
+ }
11098
11150
  for (const key of partitionKey) {
11099
11151
  if (!hasOwn(constraint, key)) {
11100
11152
  return false;
@@ -11405,7 +11457,8 @@ function applyCorrelatedSubQuery(sq, delegate, end) {
11405
11457
  parentKey: sq.correlation.parentField,
11406
11458
  childKey: sq.correlation.childField,
11407
11459
  relationshipName: sq.subquery.alias,
11408
- hidden: sq.hidden ?? false
11460
+ hidden: sq.hidden ?? false,
11461
+ system: sq.system ?? "client"
11409
11462
  });
11410
11463
  return end;
11411
11464
  }
@@ -11526,12 +11579,21 @@ var ArrayView = class {
11526
11579
  #root;
11527
11580
  onDestroy;
11528
11581
  #dirty = false;
11529
- constructor(input, format = { singular: false, relationships: {} }) {
11582
+ #complete = false;
11583
+ constructor(input, format = { singular: false, relationships: {} }, queryComplete = true) {
11530
11584
  this.#input = input;
11531
11585
  this.#schema = input.getSchema();
11532
11586
  this.#format = format;
11533
11587
  this.#root = { "": format.singular ? void 0 : [] };
11534
11588
  input.setOutput(this);
11589
+ if (queryComplete === true) {
11590
+ this.#complete = true;
11591
+ } else {
11592
+ void queryComplete.then(() => {
11593
+ this.#complete = true;
11594
+ this.#fireListeners();
11595
+ });
11596
+ }
11535
11597
  this.#hydrate();
11536
11598
  }
11537
11599
  get data() {
@@ -11540,16 +11602,22 @@ var ArrayView = class {
11540
11602
  addListener(listener) {
11541
11603
  assert(!this.#listeners.has(listener), "Listener already registered");
11542
11604
  this.#listeners.add(listener);
11543
- listener(this.data);
11605
+ this.#fireListener(listener);
11544
11606
  return () => {
11545
11607
  this.#listeners.delete(listener);
11546
11608
  };
11547
11609
  }
11548
11610
  #fireListeners() {
11549
11611
  for (const listener of this.#listeners) {
11550
- listener(this.data);
11612
+ this.#fireListener(listener);
11551
11613
  }
11552
11614
  }
11615
+ #fireListener(listener) {
11616
+ listener(
11617
+ this.data,
11618
+ this.#complete ? "complete" : "unknown"
11619
+ );
11620
+ }
11553
11621
  destroy() {
11554
11622
  this.onDestroy?.();
11555
11623
  }
@@ -11711,6 +11779,7 @@ var AbstractQuery = class {
11711
11779
  related: [
11712
11780
  ...this.#ast.related ?? [],
11713
11781
  {
11782
+ system: this._system,
11714
11783
  correlation: {
11715
11784
  parentField: related.sourceField,
11716
11785
  childField: related.destField
@@ -11750,6 +11819,7 @@ var AbstractQuery = class {
11750
11819
  related: [
11751
11820
  ...this.#ast.related ?? [],
11752
11821
  {
11822
+ system: this._system,
11753
11823
  correlation: {
11754
11824
  parentField: firstRelation.sourceField,
11755
11825
  childField: firstRelation.destField
@@ -11760,6 +11830,7 @@ var AbstractQuery = class {
11760
11830
  orderBy: addPrimaryKeys(junctionSchema, void 0),
11761
11831
  related: [
11762
11832
  {
11833
+ system: this._system,
11763
11834
  correlation: {
11764
11835
  parentField: secondRelation.sourceField,
11765
11836
  childField: secondRelation.destField
@@ -11861,6 +11932,7 @@ var AbstractQuery = class {
11861
11932
  return {
11862
11933
  type: "correlatedSubquery",
11863
11934
  related: {
11935
+ system: this._system,
11864
11936
  correlation: {
11865
11937
  parentField: related.sourceField,
11866
11938
  childField: related.destField
@@ -11888,6 +11960,7 @@ var AbstractQuery = class {
11888
11960
  return {
11889
11961
  type: "correlatedSubquery",
11890
11962
  related: {
11963
+ system: this._system,
11891
11964
  correlation: {
11892
11965
  parentField: firstRelation.sourceField,
11893
11966
  childField: firstRelation.destField
@@ -11899,6 +11972,7 @@ var AbstractQuery = class {
11899
11972
  where: {
11900
11973
  type: "correlatedSubquery",
11901
11974
  related: {
11975
+ system: this._system,
11902
11976
  correlation: {
11903
11977
  parentField: secondRelation.sourceField,
11904
11978
  childField: secondRelation.destField
@@ -11952,6 +12026,7 @@ var QueryImpl = class extends AbstractQuery {
11952
12026
  this.#delegate = delegate;
11953
12027
  this.#ast = ast;
11954
12028
  }
12029
+ _system = "client";
11955
12030
  // Not part of Query or QueryInternal interface
11956
12031
  get [astForTestingSymbol]() {
11957
12032
  return this.#ast;
@@ -11964,7 +12039,14 @@ var QueryImpl = class extends AbstractQuery {
11964
12039
  }
11965
12040
  materialize(factory) {
11966
12041
  const ast = this._completeAst();
11967
- const removeServerQuery = this.#delegate.addServerQuery(ast);
12042
+ const queryCompleteResolver = resolver7();
12043
+ let queryGot = false;
12044
+ const removeServerQuery = this.#delegate.addServerQuery(ast, (got) => {
12045
+ if (got) {
12046
+ queryGot = true;
12047
+ queryCompleteResolver.resolve(true);
12048
+ }
12049
+ });
11968
12050
  const input = buildPipeline(ast, this.#delegate);
11969
12051
  let removeCommitObserver;
11970
12052
  const onDestroy = () => {
@@ -11973,9 +12055,16 @@ var QueryImpl = class extends AbstractQuery {
11973
12055
  removeServerQuery();
11974
12056
  };
11975
12057
  const view = this.#delegate.batchViewUpdates(
11976
- () => (factory ?? arrayViewFactory)(this, input, this.format, onDestroy, (cb) => {
11977
- removeCommitObserver = this.#delegate.onTransactionCommit(cb);
11978
- })
12058
+ () => (factory ?? arrayViewFactory)(
12059
+ this,
12060
+ input,
12061
+ this.format,
12062
+ onDestroy,
12063
+ (cb) => {
12064
+ removeCommitObserver = this.#delegate.onTransactionCommit(cb);
12065
+ },
12066
+ queryGot || queryCompleteResolver.promise
12067
+ )
11979
12068
  );
11980
12069
  return view;
11981
12070
  }
@@ -12020,8 +12109,8 @@ function addPrimaryKeysToAst(schema, ast) {
12020
12109
  orderBy: addPrimaryKeys(schema, ast.orderBy)
12021
12110
  };
12022
12111
  }
12023
- function arrayViewFactory(_query, input, format, onDestroy, onTransactionCommit) {
12024
- const v2 = new ArrayView(input, format);
12112
+ function arrayViewFactory(_query, input, format, onDestroy, onTransactionCommit, queryComplete) {
12113
+ const v2 = new ArrayView(input, format, queryComplete);
12025
12114
  v2.onDestroy = onDestroy;
12026
12115
  onTransactionCommit(() => {
12027
12116
  v2.flush();
@@ -12037,6 +12126,7 @@ var AuthQuery = class _AuthQuery extends AbstractQuery {
12037
12126
  expressionBuilder() {
12038
12127
  return new ExpressionBuilder(this._exists);
12039
12128
  }
12129
+ _system = "permissions";
12040
12130
  _newQuery(schema, ast, format) {
12041
12131
  return new _AuthQuery(schema, ast, format);
12042
12132
  }
@@ -12089,8 +12179,8 @@ function compileRowConfig(rowRules, expressionBuilder) {
12089
12179
  rowRules.update?.preMutation,
12090
12180
  expressionBuilder
12091
12181
  ),
12092
- postProposedMutation: compileRules(
12093
- rowRules.update?.postProposedMutation,
12182
+ postMutation: compileRules(
12183
+ rowRules.update?.postMutation,
12094
12184
  expressionBuilder
12095
12185
  )
12096
12186
  },
@@ -12119,8 +12209,8 @@ function compileCellConfig(cellRules, expressionBuilder) {
12119
12209
  insert: compileRules(rules.insert, expressionBuilder),
12120
12210
  update: {
12121
12211
  preMutation: compileRules(rules.update?.preMutation, expressionBuilder),
12122
- postProposedMutation: compileRules(
12123
- rules.update?.postProposedMutation,
12212
+ postMutation: compileRules(
12213
+ rules.update?.postMutation,
12124
12214
  expressionBuilder
12125
12215
  )
12126
12216
  },
@@ -12241,10 +12331,22 @@ var errorKindSchema = valita_exports.union(
12241
12331
  valita_exports.literal("SchemaVersionNotSupported" /* SchemaVersionNotSupported */),
12242
12332
  valita_exports.literal("Internal" /* Internal */)
12243
12333
  );
12334
+ var basicErrorBodySchema = valita_exports.object({
12335
+ kind: errorKindSchema,
12336
+ message: valita_exports.string()
12337
+ });
12338
+ var serverOverloadedBodySchema = valita_exports.object({
12339
+ kind: valita_exports.literal("ServerOverloaded" /* ServerOverloaded */),
12340
+ message: valita_exports.string(),
12341
+ minBackoffMs: valita_exports.number().optional()
12342
+ });
12343
+ var errorBodySchema = valita_exports.union(
12344
+ basicErrorBodySchema,
12345
+ serverOverloadedBodySchema
12346
+ );
12244
12347
  var errorMessageSchema = valita_exports.tuple([
12245
12348
  valita_exports.literal("error"),
12246
- errorKindSchema,
12247
- valita_exports.string()
12349
+ errorBodySchema
12248
12350
  ]);
12249
12351
 
12250
12352
  // ../zero-protocol/src/primary-key.ts
@@ -12478,6 +12580,9 @@ var upstreamSchema = valita_exports.union(
12478
12580
  pushMessageSchema
12479
12581
  );
12480
12582
 
12583
+ // ../zero-protocol/src/protocol-version.ts
12584
+ var PROTOCOL_VERSION = 2;
12585
+
12481
12586
  // ../zero-client/src/util/nanoid.ts
12482
12587
  function nanoid(size = 21) {
12483
12588
  const randomBytes = getNonCryptoRandomValues(new Uint8Array(size));
@@ -14133,47 +14238,6 @@ function constraintMatchesPrimaryKey(constraint, primary) {
14133
14238
  return true;
14134
14239
  }
14135
14240
 
14136
- // ../zql/src/ivm/lookahead-iterator.ts
14137
- var LookaheadIterator = class {
14138
- #iter;
14139
- #buffer;
14140
- #initialized = false;
14141
- constructor(iter, size = 2) {
14142
- this.#iter = iter;
14143
- this.#buffer = new Array(size);
14144
- }
14145
- [Symbol.iterator]() {
14146
- return this;
14147
- }
14148
- next() {
14149
- if (!this.#initialized) {
14150
- for (let i = 0; i < this.#buffer.length; i++) {
14151
- const r = this.#iter.next();
14152
- this.#buffer[i] = r.done ? void 0 : r.value;
14153
- }
14154
- this.#initialized = true;
14155
- } else {
14156
- for (let i = 0; i < this.#buffer.length - 1; i++) {
14157
- this.#buffer[i] = this.#buffer[i + 1];
14158
- }
14159
- const r = this.#iter.next();
14160
- this.#buffer[this.#buffer.length - 1] = r.done ? void 0 : r.value;
14161
- }
14162
- if (this.#buffer[0] === void 0) {
14163
- return { done: true, value: void 0 };
14164
- }
14165
- return { done: false, value: this.#buffer };
14166
- }
14167
- return(value) {
14168
- this.#iter.return?.(value);
14169
- return { done: true, value: void 0 };
14170
- }
14171
- throw(e) {
14172
- this.#iter.throw?.(e);
14173
- return { done: true, value: void 0 };
14174
- }
14175
- };
14176
-
14177
14241
  // ../zql/src/ivm/memory-source.ts
14178
14242
  var MemorySource = class {
14179
14243
  #tableName;
@@ -14210,6 +14274,7 @@ var MemorySource = class {
14210
14274
  columns: this.#columns,
14211
14275
  primaryKey: this.#primaryKey,
14212
14276
  sort: connection.sort,
14277
+ system: "client",
14213
14278
  relationships: {},
14214
14279
  isHidden: false,
14215
14280
  compareRows: connection.compareRows
@@ -14301,7 +14366,8 @@ var MemorySource = class {
14301
14366
  indexSort.push(...requestedSort);
14302
14367
  }
14303
14368
  const index = this.#getOrCreateIndex(indexSort, from);
14304
- const { data, comparator } = index;
14369
+ const { data, comparator: compare } = index;
14370
+ const comparator = (r1, r2) => compare(r1, r2) * (req.reverse ? -1 : 1);
14305
14371
  if (this.#overlay) {
14306
14372
  if (callingConnectionNum <= this.#overlay.outputIndex) {
14307
14373
  overlay = this.#overlay;
@@ -14309,37 +14375,11 @@ var MemorySource = class {
14309
14375
  }
14310
14376
  const { constraint } = req;
14311
14377
  const matchesConstraint = constraint ? (row) => constraintMatchesRow(constraint, row) : (_) => true;
14312
- const predicate = conn.filters?.predicate;
14313
- const matchesConstraintAndFilters = predicate ? (row) => matchesConstraint(row) && predicate(row) : matchesConstraint;
14314
- const nextLowerKey = (row) => {
14315
- if (!row) {
14316
- return void 0;
14317
- }
14318
- let o = overlay;
14319
- if (o) {
14320
- if (comparator(o.change.row, row) >= 0) {
14321
- o = void 0;
14322
- }
14323
- }
14324
- while (row !== void 0) {
14325
- row = data.nextLowerKey(row);
14326
- if (row && matchesConstraintAndFilters(row)) {
14327
- if (o && comparator(o.change.row, row) >= 0) {
14328
- return o.change.row;
14329
- }
14330
- return row;
14331
- }
14332
- }
14333
- return o?.change.row;
14334
- };
14335
- let startAt = req.start?.row;
14378
+ const startAt = req.start?.row;
14336
14379
  if (startAt) {
14337
14380
  if (req.constraint) {
14338
14381
  assert(matchesConstraint(startAt), "Start row must match constraint");
14339
14382
  }
14340
- if (req.start.basis === "before") {
14341
- startAt = nextLowerKey(startAt);
14342
- }
14343
14383
  }
14344
14384
  let scanStart;
14345
14385
  if (req.constraint) {
@@ -14348,7 +14388,11 @@ var MemorySource = class {
14348
14388
  if (hasOwn(req.constraint, key)) {
14349
14389
  scanStart[key] = req.constraint[key];
14350
14390
  } else {
14351
- scanStart[key] = dir === "asc" ? minValue : maxValue;
14391
+ if (req.reverse) {
14392
+ scanStart[key] = dir === "asc" ? maxValue : minValue;
14393
+ } else {
14394
+ scanStart[key] = dir === "asc" ? minValue : maxValue;
14395
+ }
14352
14396
  }
14353
14397
  }
14354
14398
  } else {
@@ -14356,16 +14400,14 @@ var MemorySource = class {
14356
14400
  }
14357
14401
  const withOverlay = generateWithOverlay(
14358
14402
  startAt,
14359
- // 😬 - btree library doesn't support ideas like start "before" this
14360
- // key.
14361
- data.keys(scanStart),
14403
+ generateRows(data, scanStart, req.reverse),
14362
14404
  req.constraint,
14363
14405
  overlay,
14364
14406
  comparator,
14365
14407
  conn.filters?.predicate
14366
14408
  );
14367
14409
  const withConstraint = generateWithConstraint(
14368
- generateWithStart(withOverlay, req, comparator),
14410
+ generateWithStart(withOverlay, req.start, comparator),
14369
14411
  req.constraint
14370
14412
  );
14371
14413
  yield* conn.filters ? generateWithFilter(withConstraint, conn.filters.predicate) : withConstraint;
@@ -14466,28 +14508,26 @@ function* generateWithFilter(it, filter) {
14466
14508
  }
14467
14509
  }
14468
14510
  }
14469
- function* generateWithStart(it, req, compare) {
14470
- const cursor = new LookaheadIterator(it, 2);
14471
- let started = req.start === void 0 ? true : false;
14472
- for (const [curr, next] of cursor) {
14511
+ function* generateWithStart(nodes, start, compare) {
14512
+ if (!start) {
14513
+ yield* nodes;
14514
+ return;
14515
+ }
14516
+ let started = false;
14517
+ for (const node of nodes) {
14473
14518
  if (!started) {
14474
- assert(req.start);
14475
- if (req.start.basis === "before") {
14476
- if (next === void 0 || compare(next.row, req.start.row) >= 0) {
14477
- started = true;
14478
- }
14479
- } else if (req.start.basis === "at") {
14480
- if (compare(curr.row, req.start.row) >= 0) {
14519
+ if (start.basis === "at") {
14520
+ if (compare(node.row, start.row) >= 0) {
14481
14521
  started = true;
14482
14522
  }
14483
- } else if (req.start.basis === "after") {
14484
- if (compare(curr.row, req.start.row) > 0) {
14523
+ } else if (start.basis === "after") {
14524
+ if (compare(node.row, start.row) > 0) {
14485
14525
  started = true;
14486
14526
  }
14487
14527
  }
14488
14528
  }
14489
14529
  if (started) {
14490
- yield curr;
14530
+ yield node;
14491
14531
  }
14492
14532
  }
14493
14533
  }
@@ -14614,6 +14654,14 @@ function compareBounds(a, b) {
14614
14654
  }
14615
14655
  return compareValues(a, b);
14616
14656
  }
14657
+ function* generateRows(data, scanStart, reverse) {
14658
+ for (const entry of data[reverse ? "entriesReversed" : "entries"](
14659
+ scanStart,
14660
+ []
14661
+ )) {
14662
+ yield entry[0];
14663
+ }
14664
+ }
14617
14665
 
14618
14666
  // ../zql/src/ivm/memory-storage.ts
14619
14667
  var MemoryStorage = class {
@@ -15252,7 +15300,7 @@ function makeMessage(message, context, logLevel) {
15252
15300
  }
15253
15301
 
15254
15302
  // ../zero-client/src/client/version.ts
15255
- var version2 = "0.7.2024120400+c18ae6";
15303
+ var version2 = "0.7.2024120701+66c6a9";
15256
15304
 
15257
15305
  // ../zero-client/src/client/log-options.ts
15258
15306
  var LevelFilterLogSink = class {
@@ -15538,9 +15586,6 @@ var State = class {
15538
15586
  }
15539
15587
  };
15540
15588
 
15541
- // ../zero-client/src/client/protocol-version.ts
15542
- var PROTOCOL_VERSION = 1;
15543
-
15544
15589
  // ../zero-client/src/client/query-manager.ts
15545
15590
  var QueryManager = class {
15546
15591
  #clientID;
@@ -15649,9 +15694,7 @@ var QueryManager = class {
15649
15694
  }
15650
15695
  }
15651
15696
  if (gotCallback) {
15652
- queueMicrotask(() => {
15653
- gotCallback(this.#gotQueries.has(astHash));
15654
- });
15697
+ gotCallback(this.#gotQueries.has(astHash));
15655
15698
  }
15656
15699
  let removed = false;
15657
15700
  return () => {
@@ -15767,11 +15810,14 @@ function nextBackoff(lc, now) {
15767
15810
 
15768
15811
  // ../zero-client/src/client/server-error.ts
15769
15812
  var ServerError = class extends Error {
15770
- kind;
15771
15813
  name = "ServerError";
15772
- constructor(kind, message) {
15773
- super(kind + ": " + message);
15774
- this.kind = kind;
15814
+ errorBody;
15815
+ get kind() {
15816
+ return this.errorBody.kind;
15817
+ }
15818
+ constructor(errorBody) {
15819
+ super(errorBody.kind + ": " + errorBody.message);
15820
+ this.errorBody = errorBody;
15775
15821
  }
15776
15822
  };
15777
15823
  function isServerError(ex) {
@@ -15783,6 +15829,9 @@ function isAuthError(ex) {
15783
15829
  function isAuthErrorKind(kind) {
15784
15830
  return kind === "AuthInvalidated" /* AuthInvalidated */ || kind === "Unauthorized" /* Unauthorized */;
15785
15831
  }
15832
+ function isServerOverloadedError(ex) {
15833
+ return isServerError(ex) && ex.errorBody.kind === "ServerOverloaded" /* ServerOverloaded */ ? ex.errorBody : void 0;
15834
+ }
15786
15835
 
15787
15836
  // ../zero-client/src/client/server-option.ts
15788
15837
  function validateServerParam(paramName, server) {
@@ -16280,7 +16329,9 @@ var Zero = class {
16280
16329
  ["_zero_crud"]: makeCRUDMutator(normalizedSchema)
16281
16330
  };
16282
16331
  const replicacheOptions = {
16283
- schemaVersion: normalizedSchema.version.toString(),
16332
+ // The schema stored in IDB is dependent upon both the application schema
16333
+ // and the AST schema (i.e. PROTOCOL_VERSION).
16334
+ schemaVersion: `${normalizedSchema.version}.${PROTOCOL_VERSION}`,
16284
16335
  logLevel: logOptions.logLevel,
16285
16336
  logSinks: [logOptions.logSink],
16286
16337
  mutators: replicacheMutators,
@@ -16562,14 +16613,14 @@ var Zero = class {
16562
16613
  };
16563
16614
  // An error on the connection is fatal for the connection.
16564
16615
  async #handleErrorMessage(lc, downMessage) {
16565
- const [, kind, message] = downMessage;
16616
+ const [, { kind, message }] = downMessage;
16566
16617
  if (kind === "MutationRateLimited" /* MutationRateLimited */) {
16567
16618
  this.#lastMutationIDSent = NULL_LAST_MUTATION_ID_SENT;
16568
16619
  lc.error?.("Mutation rate limited", { message });
16569
16620
  return;
16570
16621
  }
16571
16622
  lc.info?.(`${kind}: ${message}}`);
16572
- const error = new ServerError(kind, message);
16623
+ const error = new ServerError(downMessage[1]);
16573
16624
  this.#rejectMessageError?.reject(error);
16574
16625
  lc.debug?.("Rejecting connect resolver due to error", error);
16575
16626
  this.#connectResolver.reject(error);
@@ -16906,7 +16957,7 @@ var Zero = class {
16906
16957
  }
16907
16958
  async #updateAuthToken(lc, error) {
16908
16959
  const { auth: authOption } = this.#options;
16909
- const auth = await authOption?.(error);
16960
+ const auth = await (typeof authOption === "function" ? authOption(error) : authOption);
16910
16961
  if (auth) {
16911
16962
  lc.debug?.("Got auth token");
16912
16963
  this.#rep.auth = auth;
@@ -16930,9 +16981,11 @@ var Zero = class {
16930
16981
  await this.#updateAuthToken(bareLogContext);
16931
16982
  let needsReauth = false;
16932
16983
  let gotError = false;
16984
+ let backoffMs = RUN_LOOP_INTERVAL_MS;
16933
16985
  while (!this.closed) {
16934
16986
  runLoopCounter++;
16935
16987
  let lc = getLogContext();
16988
+ backoffMs = RUN_LOOP_INTERVAL_MS;
16936
16989
  try {
16937
16990
  switch (this.#connectionState) {
16938
16991
  case 0 /* Disconnected */: {
@@ -17032,16 +17085,20 @@ var Zero = class {
17032
17085
  if (isServerError(ex) || ex instanceof TimedOutError || ex instanceof CloseError) {
17033
17086
  gotError = true;
17034
17087
  }
17088
+ const overloaded = isServerOverloadedError(ex);
17089
+ if (overloaded && overloaded.minBackoffMs) {
17090
+ backoffMs = Math.max(backoffMs, overloaded.minBackoffMs);
17091
+ }
17035
17092
  }
17036
17093
  if (gotError) {
17037
17094
  this.#setOnline(false);
17038
17095
  lc.debug?.(
17039
17096
  "Sleeping",
17040
- RUN_LOOP_INTERVAL_MS,
17097
+ backoffMs,
17041
17098
  "ms before reconnecting due to error, state:",
17042
17099
  this.#connectionState
17043
17100
  );
17044
- await sleep(RUN_LOOP_INTERVAL_MS);
17101
+ await sleep(backoffMs);
17045
17102
  }
17046
17103
  }
17047
17104
  }
@@ -17242,4 +17299,4 @@ export {
17242
17299
  escapeLike,
17243
17300
  Zero
17244
17301
  };
17245
- //# sourceMappingURL=chunk-WJCWI5I4.js.map
17302
+ //# sourceMappingURL=chunk-BT5PSTTW.js.map