velocious 1.0.502 → 1.0.504

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 (81) hide show
  1. package/build/application.js +4 -0
  2. package/build/configuration-types.js +8 -8
  3. package/build/configuration.js +2 -2
  4. package/build/src/application.d.ts.map +1 -1
  5. package/build/src/application.js +5 -1
  6. package/build/src/configuration-types.d.ts +17 -17
  7. package/build/src/configuration-types.d.ts.map +1 -1
  8. package/build/src/configuration-types.js +9 -9
  9. package/build/src/configuration.d.ts +4 -4
  10. package/build/src/configuration.d.ts.map +1 -1
  11. package/build/src/configuration.js +3 -3
  12. package/build/src/sync/sync-change-fanout.d.ts +71 -0
  13. package/build/src/sync/sync-change-fanout.d.ts.map +1 -0
  14. package/build/src/sync/sync-change-fanout.js +54 -0
  15. package/build/src/sync/sync-channel-name.d.ts +9 -0
  16. package/build/src/sync/sync-channel-name.d.ts.map +1 -0
  17. package/build/src/sync/sync-channel-name.js +10 -0
  18. package/build/src/sync/sync-client-types.d.ts +13 -6
  19. package/build/src/sync/sync-client-types.d.ts.map +1 -1
  20. package/build/src/sync/sync-client-types.js +1 -1
  21. package/build/src/sync/sync-client.d.ts +1 -1
  22. package/build/src/sync/sync-client.d.ts.map +1 -1
  23. package/build/src/sync/sync-client.js +8 -4
  24. package/build/src/sync/sync-envelope-replay-service.d.ts +15 -4
  25. package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
  26. package/build/src/sync/sync-envelope-replay-service.js +60 -42
  27. package/build/src/sync/sync-model-change-feed-service.d.ts +6 -1
  28. package/build/src/sync/sync-model-change-feed-service.d.ts.map +1 -1
  29. package/build/src/sync/sync-model-change-feed-service.js +15 -4
  30. package/build/src/sync/sync-publish-suppression.d.ts +31 -0
  31. package/build/src/sync/sync-publish-suppression.d.ts.map +1 -0
  32. package/build/src/sync/sync-publish-suppression.js +54 -0
  33. package/build/src/sync/sync-publisher-types.d.ts +178 -0
  34. package/build/src/sync/sync-publisher-types.d.ts.map +1 -0
  35. package/build/src/sync/sync-publisher-types.js +3 -0
  36. package/build/src/sync/sync-publisher.d.ts +160 -0
  37. package/build/src/sync/sync-publisher.d.ts.map +1 -0
  38. package/build/src/sync/sync-publisher.js +438 -0
  39. package/build/src/sync/sync-realtime-bridge.d.ts +33 -10
  40. package/build/src/sync/sync-realtime-bridge.d.ts.map +1 -1
  41. package/build/src/sync/sync-realtime-bridge.js +51 -12
  42. package/build/src/sync/sync-scope-attributes.d.ts +15 -0
  43. package/build/src/sync/sync-scope-attributes.d.ts.map +1 -0
  44. package/build/src/sync/sync-scope-attributes.js +24 -0
  45. package/build/src/sync/sync-websocket-channel.d.ts +58 -0
  46. package/build/src/sync/sync-websocket-channel.d.ts.map +1 -0
  47. package/build/src/sync/sync-websocket-channel.js +131 -0
  48. package/build/src/testing/test-runner.d.ts +8 -0
  49. package/build/src/testing/test-runner.d.ts.map +1 -1
  50. package/build/src/testing/test-runner.js +64 -2
  51. package/build/sync/sync-change-fanout.js +58 -0
  52. package/build/sync/sync-channel-name.js +10 -0
  53. package/build/sync/sync-client-types.js +12 -5
  54. package/build/sync/sync-client.js +8 -3
  55. package/build/sync/sync-envelope-replay-service.js +60 -41
  56. package/build/sync/sync-model-change-feed-service.js +17 -3
  57. package/build/sync/sync-publish-suppression.js +59 -0
  58. package/build/sync/sync-publisher-types.js +84 -0
  59. package/build/sync/sync-publisher.js +502 -0
  60. package/build/sync/sync-realtime-bridge.js +56 -11
  61. package/build/sync/sync-scope-attributes.js +26 -0
  62. package/build/sync/sync-websocket-channel.js +146 -0
  63. package/build/testing/test-runner.js +69 -1
  64. package/build/tsconfig.tsbuildinfo +1 -1
  65. package/package.json +1 -1
  66. package/src/application.js +4 -0
  67. package/src/configuration-types.js +8 -8
  68. package/src/configuration.js +2 -2
  69. package/src/sync/sync-change-fanout.js +58 -0
  70. package/src/sync/sync-channel-name.js +10 -0
  71. package/src/sync/sync-client-types.js +12 -5
  72. package/src/sync/sync-client.js +8 -3
  73. package/src/sync/sync-envelope-replay-service.js +60 -41
  74. package/src/sync/sync-model-change-feed-service.js +17 -3
  75. package/src/sync/sync-publish-suppression.js +59 -0
  76. package/src/sync/sync-publisher-types.js +84 -0
  77. package/src/sync/sync-publisher.js +502 -0
  78. package/src/sync/sync-realtime-bridge.js +56 -11
  79. package/src/sync/sync-scope-attributes.js +26 -0
  80. package/src/sync/sync-websocket-channel.js +146 -0
  81. package/src/testing/test-runner.js +69 -1
@@ -1,5 +1,6 @@
1
1
  // @ts-check
2
2
  import VelociousError from "../velocious-error.js";
3
+ import { declaredSyncScopeAttributes } from "./sync-scope-attributes.js";
3
4
  /**
4
5
  * Generic cursor-paginated change feed over an app-owned sync/change model.
5
6
  *
@@ -149,14 +150,20 @@ export default class SyncModelChangeFeedService {
149
150
  return { id: String(this.recordValue(record, "id")), serverSequence: Number(this.recordValue(record, "serverSequence")), updatedAt: this.isoDate(this.recordValue(record, "updatedAt")) };
150
151
  }
151
152
  /**
152
- * Serializes a record using the standard sync envelope shape.
153
+ * Serializes a record using the standard sync envelope shape plus the sync
154
+ * model's declared scope-partition attributes (`static syncScopeAttributes`),
155
+ * each emitted under its own attribute name. Models declaring no scope
156
+ * attributes keep the deprecated 1.0.503 wire and emit `eventId`. Keys are
157
+ * sorted so a declared `["eventId"]` partition stays byte-identical with the
158
+ * 1.0.503 wire.
153
159
  * @param {?} record - Sync/change record.
154
160
  * @returns {Record<string, unknown>} Default serialized row.
155
161
  */
156
162
  defaultSerializeRecord(record) {
157
- return {
163
+ const scopeAttributes = declaredSyncScopeAttributes(this.modelClass);
164
+ /** @type {Record<string, unknown>} */
165
+ const serialized = {
158
166
  data: this.recordData(record),
159
- eventId: this.recordValue(record, "eventId"),
160
167
  id: this.recordValue(record, "id"),
161
168
  resourceId: this.recordValue(record, "resourceId"),
162
169
  resourceType: this.recordValue(record, "resourceType"),
@@ -164,6 +171,10 @@ export default class SyncModelChangeFeedService {
164
171
  syncType: this.recordValue(record, "syncType"),
165
172
  updatedAt: this.isoDate(this.recordValue(record, "updatedAt"))
166
173
  };
174
+ for (const scopeAttribute of scopeAttributes || ["eventId"]) {
175
+ serialized[scopeAttribute] = this.recordValue(record, scopeAttribute);
176
+ }
177
+ return Object.fromEntries(Object.entries(serialized).sort(([leftKey], [rightKey]) => leftKey.localeCompare(rightKey)));
167
178
  }
168
179
  /**
169
180
  * Reads and parses the record data payload.
@@ -209,4 +220,4 @@ export default class SyncModelChangeFeedService {
209
220
  return date.toISOString();
210
221
  }
211
222
  }
212
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1tb2RlbC1jaGFuZ2UtZmVlZC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc3luYy1tb2RlbC1jaGFuZ2UtZmVlZC1zZXJ2aWNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQTtBQUVsRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLDBCQUEwQjtJQUM3Qzs7Ozs7Ozs7O09BU0c7SUFDSCxZQUFZLEVBQUMsWUFBWSxHQUFHLElBQUksRUFBRSxRQUFRLEdBQUcsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBQztRQUNqRyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQTtRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQTtRQUM1QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsSUFBSSxJQUFJLENBQUE7UUFDcEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7SUFDN0YsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3JELE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUE7UUFFakQsSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPLEVBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUs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QVcsRUFBRSxDQUFBO0lBQzNCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgVmVsb2Npb3VzRXJyb3IgZnJvbSBcIi4uL3ZlbG9jaW91cy1lcnJvci5qc1wiXG5cbi8qKlxuICogR2VuZXJpYyBjdXJzb3ItcGFnaW5hdGVkIGNoYW5nZSBmZWVkIG92ZXIgYW4gYXBwLW93bmVkIHN5bmMvY2hhbmdlIG1vZGVsLlxuICpcbiAqIEFwcHMgcHJvdmlkZSB0aGUgbW9kZWwgYW5kIG9wdGlvbmFsIHNjb3Bpbmcvc2VyaWFsaXphdGlvbiBob29rcy4gVmVsb2Npb3VzIG93bnNcbiAqIGN1cnNvciBwYXJzaW5nLCBzbmFwc2hvdCBoaWdoLXdhdGVyIHJlc29sdXRpb24sIHN0YWJsZSBvcmRlcmluZywgcGFnZSBsaW1pdHMsXG4gKiBhbmQgcmVzcG9uc2Ugc2hhcGUgZm9yIGAvdmVsb2Npb3VzL3N5bmMvY2hhbmdlc2Agc3R5bGUgZW5kcG9pbnRzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTeW5jTW9kZWxDaGFuZ2VGZWVkU2VydmljZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZ2VuZXJpYyBzeW5jLW1vZGVsIGNoYW5nZS1mZWVkIHNlcnZpY2UuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gU2VydmljZSBhcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLm1vZGVsQ2xhc3MgLSBTeW5jL2NoYW5nZSBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gYXJncy5wYXJhbXMgLSBSZXF1ZXN0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmRlZmF1bHRMaW1pdF0gLSBEZWZhdWx0IHBhZ2Ugc2l6ZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLm1heExpbWl0XSAtIE1heGltdW0gcGFnZSBzaXplLlxuICAgKiBAcGFyYW0geyhyZWNvcmQ6ID8pID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+fSBbYXJncy5zZXJpYWxpemVSZWNvcmRdIC0gUmVjb3JkIHNlcmlhbGl6ZXIuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oe3F1ZXJ5OiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSk6IHZvaWR9IFthcmdzLnNjb3BlUXVlcnldIC0gQXBwbGllcyBhcHAtb3duZWQgdmlzaWJpbGl0eSBzY29wZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtkZWZhdWx0TGltaXQgPSAxMDAwLCBtYXhMaW1pdCA9IDEwMDAsIG1vZGVsQ2xhc3MsIHBhcmFtcywgc2NvcGVRdWVyeSwgc2VyaWFsaXplUmVjb3JkfSkge1xuICAgIHRoaXMuZGVmYXVsdExpbWl0ID0gZGVmYXVsdExpbWl0XG4gICAgdGhpcy5tYXhMaW1pdCA9IG1heExpbWl0XG4gICAgdGhpcy5tb2RlbENsYXNzID0gbW9kZWxDbGFzc1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zXG4gICAgdGhpcy5zY29wZVF1ZXJ5ID0gc2NvcGVRdWVyeSB8fCBudWxsXG4gICAgdGhpcy5zZXJpYWxpemVSZWNvcmQgPSBzZXJpYWxpemVSZWNvcmQgfHwgKChyZWNvcmQpID0+IHRoaXMuZGVmYXVsdFNlcmlhbGl6ZVJlY29yZChyZWNvcmQpKVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHN0YWJsZSBjaGFuZ2UtZmVlZCBwYWdlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7c3RhdHVzOiBzdHJpbmcsIG5leHRDdXJzb3I6IHtpZDogc3RyaW5nLCBzZXJ2ZXJTZXF1ZW5jZTogbnVtYmVyLCB1cGRhdGVkQXQ6IHN0cmluZ30gfCBudWxsLCBzeW5jczogQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LCB1cFRvQ3Vyc29yOiB7aWQ6IHN0cmluZywgc2VydmVyU2VxdWVuY2U6IG51bWJlciwgdXBkYXRlZEF0OiBzdHJpbmd9IHwgbnVsbH0+fSBDaGFuZ2UtZmVlZCBwYWdlIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGNoYW5nZXMoKSB7XG4gICAgY29uc3QgbGltaXQgPSB0aGlzLm5vcm1hbGl6ZWRMaW1pdCh0aGlzLnBhcmFtcy5saW1pdClcbiAgICBjb25zdCB1cFRvQ3Vyc29yID0gYXdhaXQgdGhpcy5yZXNvbHZlVXBUb0N1cnNvcigpXG5cbiAgICBpZiAoIXVwVG9DdXJzb3IpIHJldHVybiB7c3RhdHVzOiBcInN1Y2Nlc3NcIiwgbmV4dEN1cnNvcjogbnVsbCwgc3luY3M6IFtdLCB1cFRvQ3Vyc29yOiBudWxsfVxuXG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnBhZ2VRdWVyeSh7bGltaXQsIHVwVG9DdXJzb3J9KVxuICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCBxdWVyeS50b0FycmF5KClcbiAgICBjb25zdCBuZXh0Q3Vyc29yID0gcmVjb3Jkcy5sZW5ndGggPiAwID8gdGhpcy5jdXJzb3JGb3JSZWNvcmQocmVjb3Jkc1tyZWNvcmRzLmxlbmd0aCAtIDFdKSA6IHVwVG9DdXJzb3JcblxuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IFwic3VjY2Vzc1wiLFxuICAgICAgbmV4dEN1cnNvcixcbiAgICAgIHN5bmNzOiByZWNvcmRzLm1hcCgocmVjb3JkKSA9PiB0aGlzLnNlcmlhbGl6ZVJlY29yZChyZWNvcmQpKSxcbiAgICAgIHVwVG9DdXJzb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyB0aGUgcmVxdWVzdGVkIHBhZ2UgbGltaXQuXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBSYXcgbGltaXQgcGFyYW0uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IE5vcm1hbGl6ZWQgcGFnZSBsaW1pdC5cbiAgICovXG4gIG5vcm1hbGl6ZWRMaW1pdCh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSBcIlwiKSByZXR1cm4gdGhpcy5kZWZhdWx0TGltaXRcblxuICAgIGNvbnN0IGxpbWl0ID0gTnVtYmVyKHZhbHVlKVxuXG4gICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihsaW1pdCkgfHwgbGltaXQgPD0gMCkge1xuICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShcIlN5bmMgY2hhbmdlcyBsaW1pdCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlci5cIiwge2NvZGU6IFwic3luYy1pbnZhbGlkLWNoYW5nZXMtbGltaXRcIn0pXG4gICAgfVxuXG4gICAgcmV0dXJuIE1hdGgubWluKGxpbWl0LCB0aGlzLm1heExpbWl0KVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhbiBvcHRpb25hbCBwb3NpdGl2ZSBpbnRlZ2VyIGN1cnNvciBmaWVsZC5cbiAgICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFJhdyBpbnRlZ2VyIHBhcmFtLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFBhcmFtIG5hbWUgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyIHwgbnVsbH0gUG9zaXRpdmUgaW50ZWdlciB2YWx1ZSwgb3IgbnVsbCB3aGVuIG9taXR0ZWQuXG4gICAqL1xuICBvcHRpb25hbFBvc2l0aXZlSW50ZWdlclBhcmFtKHZhbHVlLCBuYW1lKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IFwiXCIpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBpbnRlZ2VyID0gTnVtYmVyKHZhbHVlKVxuXG4gICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihpbnRlZ2VyKSB8fCBpbnRlZ2VyIDw9IDApIHtcbiAgICAgIHRocm93IFZlbG9jaW91c0Vycm9yLnNhZmUoYCR7bmFtZX0gbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuYCwge2NvZGU6IFwic3luYy1pbnZhbGlkLWNoYW5nZXMtY3Vyc29yXCJ9KVxuICAgIH1cblxuICAgIHJldHVybiBpbnRlZ2VyXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGhpZ2gtd2F0ZXIgY3Vyc29yIHRoYXQgYm91bmRzIHRoZSBjdXJyZW50IGZlZWQgcGFnZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8e2lkOiBzdHJpbmcsIHNlcnZlclNlcXVlbmNlOiBudW1iZXIsIHVwZGF0ZWRBdDogc3RyaW5nfSB8IG51bGw+fSBTbmFwc2hvdCB1cHBlci1ib3VuZCBjdXJzb3IuXG4gICAqL1xuICBhc3luYyByZXNvbHZlVXBUb0N1cnNvcigpIHtcbiAgICBjb25zdCB1cFRvU2VydmVyU2VxdWVuY2UgPSB0aGlzLm9wdGlvbmFsUG9zaXRpdmVJbnRlZ2VyUGFyYW0odGhpcy5wYXJhbXMudXBUb1NlcnZlclNlcXVlbmNlLCBcInVwVG9TZXJ2ZXJTZXF1ZW5jZVwiKVxuXG4gICAgaWYgKHVwVG9TZXJ2ZXJTZXF1ZW5jZSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5wYXJhbXMudXBUb1VwZGF0ZWRBdCA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgdGhpcy5wYXJhbXMudXBUb0lkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4ge2lkOiB0aGlzLnBhcmFtcy51cFRvSWQsIHNlcnZlclNlcXVlbmNlOiB1cFRvU2VydmVyU2VxdWVuY2UsIHVwZGF0ZWRBdDogdGhpcy5wYXJhbXMudXBUb1VwZGF0ZWRBdH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRoaXMucGFyYW1zLnVwVG9VcGRhdGVkQXQgPT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIHRoaXMucGFyYW1zLnVwVG9JZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc3QgdXBUb1JlY29yZCA9IGF3YWl0IHRoaXMubW9kZWxDbGFzcy5maW5kQnkoe2lkOiB0aGlzLnBhcmFtcy51cFRvSWR9KVxuXG4gICAgICBpZiAodXBUb1JlY29yZCkgcmV0dXJuIHRoaXMuY3Vyc29yRm9yUmVjb3JkKHVwVG9SZWNvcmQpXG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnNjb3BlZFF1ZXJ5KClcbiAgICBjb25zdCB0YWJsZSA9IHF1ZXJ5LmRyaXZlci5xdW90ZVRhYmxlKHRoaXMubW9kZWxDbGFzcy50YWJsZU5hbWUoKSlcbiAgICBjb25zdCBzZXJ2ZXJTZXF1ZW5jZUNvbHVtbiA9IHF1ZXJ5LmRyaXZlci5xdW90ZUNvbHVtbihcInNlcnZlcl9zZXF1ZW5jZVwiKVxuICAgIGNvbnN0IGxhdGVzdFJlY29yZHMgPSBhd2FpdCBxdWVyeVxuICAgICAgLm9yZGVyKGAke3RhYmxlfS4ke3NlcnZlclNlcXVlbmNlQ29sdW1ufSBERVNDYClcbiAgICAgIC5saW1pdCgxKVxuICAgICAgLnRvQXJyYXkoKVxuXG4gICAgaWYgKGxhdGVzdFJlY29yZHMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbFxuXG4gICAgcmV0dXJuIHRoaXMuY3Vyc29yRm9yUmVjb3JkKGxhdGVzdFJlY29yZHNbMF0pXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBvcmRlcmVkIGFuZCBjdXJzb3ItZmlsdGVyZWQgcGFnZSBxdWVyeS5cbiAgICogQHBhcmFtIHt7bGltaXQ6IG51bWJlciwgdXBUb0N1cnNvcjoge2lkOiBzdHJpbmcsIHNlcnZlclNlcXVlbmNlOiBudW1iZXIsIHVwZGF0ZWRBdDogc3RyaW5nfX19IGFyZ3MgLSBQYWdlIHF1ZXJ5IGFyZ3MuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSBQYWdlIHF1ZXJ5LlxuICAgKi9cbiAgcGFnZVF1ZXJ5KHtsaW1pdCwgdXBUb0N1cnNvcn0pIHtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuc2NvcGVkUXVlcnkoKVxuICAgIGNvbnN0IGRyaXZlciA9IHF1ZXJ5LmRyaXZlclxuICAgIGNvbnN0IHRhYmxlID0gZHJpdmVyLnF1b3RlVGFibGUodGhpcy5tb2RlbENsYXNzLnRhYmxlTmFtZSgpKVxuICAgIGNvbnN0IHNlcnZlclNlcXVlbmNlQ29sdW1uID0gYCR7dGFibGV9LiR7ZHJpdmVyLnF1b3RlQ29sdW1uKFwic2VydmVyX3NlcXVlbmNlXCIpfWBcbiAgICBjb25zdCB1cGRhdGVkQXRDb2x1bW4gPSBgJHt0YWJsZX0uJHtkcml2ZXIucXVvdGVDb2x1bW4oXCJ1cGRhdGVkX2F0XCIpfWBcbiAgICBjb25zdCBpZENvbHVtbiA9IGAke3RhYmxlfS4ke2RyaXZlci5xdW90ZUNvbHVtbihcImlkXCIpfWBcblxuICAgIHF1ZXJ5XG4gICAgICAud2hlcmUoYCR7c2VydmVyU2VxdWVuY2VDb2x1bW59IDw9ICR7ZHJpdmVyLnF1b3RlKHVwVG9DdXJzb3Iuc2VydmVyU2VxdWVuY2UpfWApXG4gICAgICAub3JkZXIoYCR7c2VydmVyU2VxdWVuY2VDb2x1bW59IEFTQ2ApXG4gICAgICAubGltaXQobGltaXQpXG5cbiAgICBjb25zdCBhZnRlclNlcnZlclNlcXVlbmNlID0gdGhpcy5vcHRpb25hbFBvc2l0aXZlSW50ZWdlclBhcmFtKHRoaXMucGFyYW1zLmFmdGVyU2VydmVyU2VxdWVuY2UsIFwiYWZ0ZXJTZXJ2ZXJTZXF1ZW5jZVwiKVxuXG4gICAgaWYgKGFmdGVyU2VydmVyU2VxdWVuY2UgIT09IG51bGwpIHtcbiAgICAgIHF1ZXJ5LndoZXJlKGAke3NlcnZlclNlcXVlbmNlQ29sdW1ufSA+ICR7ZHJpdmVyLnF1b3RlKGFmdGVyU2VydmVyU2VxdWVuY2UpfWApXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5wYXJhbXMuYWZ0ZXJVcGRhdGVkQXQgPT09IFwic3RyaW5nXCIgJiYgdGhpcy5wYXJhbXMuYWZ0ZXJVcGRhdGVkQXQgIT09IFwiXCIpIHtcbiAgICAgIGNvbnN0IGlzUGFnaW5nRXhpc3RpbmdTbmFwc2hvdCA9IHR5cGVvZiB0aGlzLnBhcmFtcy51cFRvVXBkYXRlZEF0ID09PSBcInN0cmluZ1wiICYmIHRoaXMucGFyYW1zLnVwVG9VcGRhdGVkQXQgIT09IFwiXCIgJiYgdHlwZW9mIHRoaXMucGFyYW1zLnVwVG9JZCA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLnBhcmFtcy51cFRvSWQgIT09IFwiXCJcblxuICAgICAgaWYgKGlzUGFnaW5nRXhpc3RpbmdTbmFwc2hvdCAmJiB0eXBlb2YgdGhpcy5wYXJhbXMuYWZ0ZXJJZCA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLnBhcmFtcy5hZnRlcklkICE9PSBcIlwiKSB7XG4gICAgICAgIHF1ZXJ5LndoZXJlKGAoJHt1cGRhdGVkQXRDb2x1bW59ID4gJHtkcml2ZXIucXVvdGUodGhpcy5wYXJhbXMuYWZ0ZXJVcGRhdGVkQXQpfSBPUiAoJHt1cGRhdGVkQXRDb2x1bW59ID0gJHtkcml2ZXIucXVvdGUodGhpcy5wYXJhbXMuYWZ0ZXJVcGRhdGVkQXQpfSBBTkQgJHtpZENvbHVtbn0gPiAke2RyaXZlci5xdW90ZSh0aGlzLnBhcmFtcy5hZnRlcklkKX0pKWApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWVyeS53aGVyZShgJHt1cGRhdGVkQXRDb2x1bW59ID49ICR7ZHJpdmVyLnF1b3RlKHRoaXMucGFyYW1zLmFmdGVyVXBkYXRlZEF0KX1gKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBxdWVyeVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIGJhc2UgcXVlcnkgd2l0aCBhcHAtb3duZWQgc2NvcGUgYXBwbGllZC5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IFNjb3BlZCBiYXNlIHF1ZXJ5LlxuICAgKi9cbiAgc2NvcGVkUXVlcnkoKSB7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLm1vZGVsQ2xhc3Mud2hlcmUoe30pXG5cbiAgICBpZiAodGhpcy5zY29wZVF1ZXJ5KSB0aGlzLnNjb3BlUXVlcnkoe3F1ZXJ5fSlcblxuICAgIHJldHVybiBxdWVyeVxuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSByZWNvcmQgaW50byBhIHRyYW5zcG9ydCBjdXJzb3IuXG4gICAqIEBwYXJhbSB7P30gcmVjb3JkIC0gU3luYy9jaGFuZ2UgcmVjb3JkLlxuICAgKiBAcmV0dXJucyB7e2lkOiBzdHJpbmcsIHNlcnZlclNlcXVlbmNlOiBudW1iZXIsIHVwZGF0ZWRBdDogc3RyaW5nfX0gQ3Vyc29yIGZvciByb3cuXG4gICAqL1xuICBjdXJzb3JGb3JSZWNvcmQocmVjb3JkKSB7XG4gICAgcmV0dXJuIHtpZDogU3RyaW5nKHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcImlkXCIpKSwgc2VydmVyU2VxdWVuY2U6IE51bWJlcih0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJzZXJ2ZXJTZXF1ZW5jZVwiKSksIHVwZGF0ZWRBdDogdGhpcy5pc29EYXRlKHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcInVwZGF0ZWRBdFwiKSl9XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIHJlY29yZCB1c2luZyB0aGUgc3RhbmRhcmQgc3luYyBlbnZlbG9wZSBzaGFwZS5cbiAgICogQHBhcmFtIHs/fSByZWNvcmQgLSBTeW5jL2NoYW5nZSByZWNvcmQuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gRGVmYXVsdCBzZXJpYWxpemVkIHJvdy5cbiAgICovXG4gIGRlZmF1bHRTZXJpYWxpemVSZWNvcmQocmVjb3JkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGE6IHRoaXMucmVjb3JkRGF0YShyZWNvcmQpLFxuICAgICAgZXZlbnRJZDogdGhpcy5yZWNvcmRWYWx1ZShyZWNvcmQsIFwiZXZlbnRJZFwiKSxcbiAgICAgIGlkOiB0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJpZFwiKSxcbiAgICAgIHJlc291cmNlSWQ6IHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcInJlc291cmNlSWRcIiksXG4gICAgICByZXNvdXJjZVR5cGU6IHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcInJlc291cmNlVHlwZVwiKSxcbiAgICAgIHNlcnZlclNlcXVlbmNlOiB0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJzZXJ2ZXJTZXF1ZW5jZVwiKSxcbiAgICAgIHN5bmNUeXBlOiB0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJzeW5jVHlwZVwiKSxcbiAgICAgIHVwZGF0ZWRBdDogdGhpcy5pc29EYXRlKHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcInVwZGF0ZWRBdFwiKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYW5kIHBhcnNlcyB0aGUgcmVjb3JkIGRhdGEgcGF5bG9hZC5cbiAgICogQHBhcmFtIHs/fSByZWNvcmQgLSBTeW5jL2NoYW5nZSByZWNvcmQuXG4gICAqIEByZXR1cm5zIHt1bmtub3dufSBQYXJzZWQgZGF0YSB2YWx1ZS5cbiAgICovXG4gIHJlY29yZERhdGEocmVjb3JkKSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcImRhdGFcIilcblxuICAgIGlmIChkYXRhID09PSBcIlwiIHx8IGRhdGEgPT09IG51bGwgfHwgZGF0YSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbFxuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIGRhdGFcblxuICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEpXG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYSB2YWx1ZSBmcm9tIGVpdGhlciBhIHJlY29yZCBhY2Nlc3NvciBtZXRob2Qgb3IgcGxhaW4gcHJvcGVydHkuXG4gICAqIEBwYXJhbSB7P30gcmVjb3JkIC0gU3luYy9jaGFuZ2UgcmVjb3JkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIENhbWVsLWNhc2VkIHZhbHVlL21ldGhvZCBuYW1lLlxuICAgKiBAcmV0dXJucyB7dW5rbm93bn0gUmVjb3JkIHZhbHVlLlxuICAgKi9cbiAgcmVjb3JkVmFsdWUocmVjb3JkLCBuYW1lKSB7XG4gICAgaWYgKCFyZWNvcmQgfHwgdHlwZW9mIHJlY29yZCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3luYyBjaGFuZ2VzIHJvdyBtdXN0IGJlIGFuIG9iamVjdC5cIilcbiAgICB9XG5cbiAgICBjb25zdCByZWNvcmRPYmplY3QgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAocmVjb3JkKVxuICAgIGNvbnN0IG1ldGhvZCA9IHJlY29yZE9iamVjdFtuYW1lXVxuICAgIGNvbnN0IHZhbHVlID0gdHlwZW9mIG1ldGhvZCA9PT0gXCJmdW5jdGlvblwiID8gbWV0aG9kLmNhbGwocmVjb3JkKSA6IG1ldGhvZFxuXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3luYyBjaGFuZ2VzIHJvdyBpcyBtaXNzaW5nICR7bmFtZX0uYClcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGRhdGUtbGlrZSB2YWx1ZSB0byBhbiBJU08gc3RyaW5nLlxuICAgKiBAcGFyYW0ge0RhdGUgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkIHwgdW5rbm93bn0gdmFsdWUgLSBEYXRlIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBJU08gZGF0ZS5cbiAgICovXG4gIGlzb0RhdGUodmFsdWUpIHtcbiAgICBjb25zdCBkYXRlID0gdmFsdWUgaW5zdGFuY2VvZiBEYXRlID8gdmFsdWUgOiBuZXcgRGF0ZSh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiID8gdmFsdWUgOiAwKVxuXG4gICAgaWYgKE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkpIHtcbiAgICAgIHRocm93IFZlbG9jaW91c0Vycm9yLnNhZmUoXCJTeW5jIGNoYW5nZXMgcm93IGhhcyBhbiBpbnZhbGlkIHVwZGF0ZWRfYXQgdmFsdWUuXCIsIHtjb2RlOiBcInN5bmMtaW52YWxpZC1jaGFuZ2VzLXJvd1wifSlcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpXG4gIH1cbn1cblxuIl19
223
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1tb2RlbC1jaGFuZ2UtZmVlZC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc3luYy1tb2RlbC1jaGFuZ2UtZmVlZC1zZXJ2aWNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQTtBQUVsRCxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQTtBQUV0RTs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLDBCQUEwQjtJQUM3Qzs7Ozs7Ozs7O09BU0c7SUFDSCxZQUFZLEVBQUMsWUFBWSxHQUFHLElBQUksRUFBRSxRQUFRLEdBQUcsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBQztRQUNqRyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQTtRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQTtRQUM1QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsSUFBSSxJQUFJLENBQUE7UUFDcEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7SUFDN0YsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3JELE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUE7UUFFakQsSUFBSSxDQUFDLFVBQVU7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ZCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE9BQU8sQ0FBQyxLQUFLO1FBQ1gsTUFBTSxJQUFJLEdBQUcsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBRXpILElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyxtREFBbUQsRUFBRSxFQUFDLElBQUksRUFBRSwwQkFBMEIsRUFBQyxDQUFDLENBQUE7UUFDcEgsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQzNCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgVmVsb2Npb3VzRXJyb3IgZnJvbSBcIi4uL3ZlbG9jaW91cy1lcnJvci5qc1wiXG5cbmltcG9ydCB7ZGVjbGFyZWRTeW5jU2NvcGVBdHRyaWJ1dGVzfSBmcm9tIFwiLi9zeW5jLXNjb3BlLWF0dHJpYnV0ZXMuanNcIlxuXG4vKipcbiAqIEdlbmVyaWMgY3Vyc29yLXBhZ2luYXRlZCBjaGFuZ2UgZmVlZCBvdmVyIGFuIGFwcC1vd25lZCBzeW5jL2NoYW5nZSBtb2RlbC5cbiAqXG4gKiBBcHBzIHByb3ZpZGUgdGhlIG1vZGVsIGFuZCBvcHRpb25hbCBzY29waW5nL3NlcmlhbGl6YXRpb24gaG9va3MuIFZlbG9jaW91cyBvd25zXG4gKiBjdXJzb3IgcGFyc2luZywgc25hcHNob3QgaGlnaC13YXRlciByZXNvbHV0aW9uLCBzdGFibGUgb3JkZXJpbmcsIHBhZ2UgbGltaXRzLFxuICogYW5kIHJlc3BvbnNlIHNoYXBlIGZvciBgL3ZlbG9jaW91cy9zeW5jL2NoYW5nZXNgIHN0eWxlIGVuZHBvaW50cy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3luY01vZGVsQ2hhbmdlRmVlZFNlcnZpY2Uge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGdlbmVyaWMgc3luYy1tb2RlbCBjaGFuZ2UtZmVlZCBzZXJ2aWNlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFNlcnZpY2UgYXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5tb2RlbENsYXNzIC0gU3luYy9jaGFuZ2UgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IGFyZ3MucGFyYW1zIC0gUmVxdWVzdCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5kZWZhdWx0TGltaXRdIC0gRGVmYXVsdCBwYWdlIHNpemUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5tYXhMaW1pdF0gLSBNYXhpbXVtIHBhZ2Ugc2l6ZS5cbiAgICogQHBhcmFtIHsocmVjb3JkOiA/KSA9PiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gW2FyZ3Muc2VyaWFsaXplUmVjb3JkXSAtIFJlY29yZCBzZXJpYWxpemVyLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHtxdWVyeTogaW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0pOiB2b2lkfSBbYXJncy5zY29wZVF1ZXJ5XSAtIEFwcGxpZXMgYXBwLW93bmVkIHZpc2liaWxpdHkgc2NvcGUuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7ZGVmYXVsdExpbWl0ID0gMTAwMCwgbWF4TGltaXQgPSAxMDAwLCBtb2RlbENsYXNzLCBwYXJhbXMsIHNjb3BlUXVlcnksIHNlcmlhbGl6ZVJlY29yZH0pIHtcbiAgICB0aGlzLmRlZmF1bHRMaW1pdCA9IGRlZmF1bHRMaW1pdFxuICAgIHRoaXMubWF4TGltaXQgPSBtYXhMaW1pdFxuICAgIHRoaXMubW9kZWxDbGFzcyA9IG1vZGVsQ2xhc3NcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtc1xuICAgIHRoaXMuc2NvcGVRdWVyeSA9IHNjb3BlUXVlcnkgfHwgbnVsbFxuICAgIHRoaXMuc2VyaWFsaXplUmVjb3JkID0gc2VyaWFsaXplUmVjb3JkIHx8ICgocmVjb3JkKSA9PiB0aGlzLmRlZmF1bHRTZXJpYWxpemVSZWNvcmQocmVjb3JkKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBzdGFibGUgY2hhbmdlLWZlZWQgcGFnZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8e3N0YXR1czogc3RyaW5nLCBuZXh0Q3Vyc29yOiB7aWQ6IHN0cmluZywgc2VydmVyU2VxdWVuY2U6IG51bWJlciwgdXBkYXRlZEF0OiBzdHJpbmd9IHwgbnVsbCwgc3luY3M6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiwgdXBUb0N1cnNvcjoge2lkOiBzdHJpbmcsIHNlcnZlclNlcXVlbmNlOiBudW1iZXIsIHVwZGF0ZWRBdDogc3RyaW5nfSB8IG51bGx9Pn0gQ2hhbmdlLWZlZWQgcGFnZSByZXN1bHQuXG4gICAqL1xuICBhc3luYyBjaGFuZ2VzKCkge1xuICAgIGNvbnN0IGxpbWl0ID0gdGhpcy5ub3JtYWxpemVkTGltaXQodGhpcy5wYXJhbXMubGltaXQpXG4gICAgY29uc3QgdXBUb0N1cnNvciA9IGF3YWl0IHRoaXMucmVzb2x2ZVVwVG9DdXJzb3IoKVxuXG4gICAgaWYgKCF1cFRvQ3Vyc29yKSByZXR1cm4ge3N0YXR1czogXCJzdWNjZXNzXCIsIG5leHRDdXJzb3I6IG51bGwsIHN5bmNzOiBbXSwgdXBUb0N1cnNvcjogbnVsbH1cblxuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5wYWdlUXVlcnkoe2xpbWl0LCB1cFRvQ3Vyc29yfSlcbiAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgcXVlcnkudG9BcnJheSgpXG4gICAgY29uc3QgbmV4dEN1cnNvciA9IHJlY29yZHMubGVuZ3RoID4gMCA/IHRoaXMuY3Vyc29yRm9yUmVjb3JkKHJlY29yZHNbcmVjb3Jkcy5sZW5ndGggLSAxXSkgOiB1cFRvQ3Vyc29yXG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiBcInN1Y2Nlc3NcIixcbiAgICAgIG5leHRDdXJzb3IsXG4gICAgICBzeW5jczogcmVjb3Jkcy5tYXAoKHJlY29yZCkgPT4gdGhpcy5zZXJpYWxpemVSZWNvcmQocmVjb3JkKSksXG4gICAgICB1cFRvQ3Vyc29yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgdGhlIHJlcXVlc3RlZCBwYWdlIGxpbWl0LlxuICAgKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gUmF3IGxpbWl0IHBhcmFtLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBOb3JtYWxpemVkIHBhZ2UgbGltaXQuXG4gICAqL1xuICBub3JtYWxpemVkTGltaXQodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gXCJcIikgcmV0dXJuIHRoaXMuZGVmYXVsdExpbWl0XG5cbiAgICBjb25zdCBsaW1pdCA9IE51bWJlcih2YWx1ZSlcblxuICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIobGltaXQpIHx8IGxpbWl0IDw9IDApIHtcbiAgICAgIHRocm93IFZlbG9jaW91c0Vycm9yLnNhZmUoXCJTeW5jIGNoYW5nZXMgbGltaXQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuXCIsIHtjb2RlOiBcInN5bmMtaW52YWxpZC1jaGFuZ2VzLWxpbWl0XCJ9KVxuICAgIH1cblxuICAgIHJldHVybiBNYXRoLm1pbihsaW1pdCwgdGhpcy5tYXhMaW1pdClcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYW4gb3B0aW9uYWwgcG9zaXRpdmUgaW50ZWdlciBjdXJzb3IgZmllbGQuXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBSYXcgaW50ZWdlciBwYXJhbS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBQYXJhbSBuYW1lIGZvciBlcnJvciBtZXNzYWdlcy5cbiAgICogQHJldHVybnMge251bWJlciB8IG51bGx9IFBvc2l0aXZlIGludGVnZXIgdmFsdWUsIG9yIG51bGwgd2hlbiBvbWl0dGVkLlxuICAgKi9cbiAgb3B0aW9uYWxQb3NpdGl2ZUludGVnZXJQYXJhbSh2YWx1ZSwgbmFtZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSBcIlwiKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgaW50ZWdlciA9IE51bWJlcih2YWx1ZSlcblxuICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIoaW50ZWdlcikgfHwgaW50ZWdlciA8PSAwKSB7XG4gICAgICB0aHJvdyBWZWxvY2lvdXNFcnJvci5zYWZlKGAke25hbWV9IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLmAsIHtjb2RlOiBcInN5bmMtaW52YWxpZC1jaGFuZ2VzLWN1cnNvclwifSlcbiAgICB9XG5cbiAgICByZXR1cm4gaW50ZWdlclxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBoaWdoLXdhdGVyIGN1cnNvciB0aGF0IGJvdW5kcyB0aGUgY3VycmVudCBmZWVkIHBhZ2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtpZDogc3RyaW5nLCBzZXJ2ZXJTZXF1ZW5jZTogbnVtYmVyLCB1cGRhdGVkQXQ6IHN0cmluZ30gfCBudWxsPn0gU25hcHNob3QgdXBwZXItYm91bmQgY3Vyc29yLlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZVVwVG9DdXJzb3IoKSB7XG4gICAgY29uc3QgdXBUb1NlcnZlclNlcXVlbmNlID0gdGhpcy5vcHRpb25hbFBvc2l0aXZlSW50ZWdlclBhcmFtKHRoaXMucGFyYW1zLnVwVG9TZXJ2ZXJTZXF1ZW5jZSwgXCJ1cFRvU2VydmVyU2VxdWVuY2VcIilcblxuICAgIGlmICh1cFRvU2VydmVyU2VxdWVuY2UgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMucGFyYW1zLnVwVG9VcGRhdGVkQXQgPT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIHRoaXMucGFyYW1zLnVwVG9JZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHtpZDogdGhpcy5wYXJhbXMudXBUb0lkLCBzZXJ2ZXJTZXF1ZW5jZTogdXBUb1NlcnZlclNlcXVlbmNlLCB1cGRhdGVkQXQ6IHRoaXMucGFyYW1zLnVwVG9VcGRhdGVkQXR9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLnBhcmFtcy51cFRvVXBkYXRlZEF0ID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiB0aGlzLnBhcmFtcy51cFRvSWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IHVwVG9SZWNvcmQgPSBhd2FpdCB0aGlzLm1vZGVsQ2xhc3MuZmluZEJ5KHtpZDogdGhpcy5wYXJhbXMudXBUb0lkfSlcblxuICAgICAgaWYgKHVwVG9SZWNvcmQpIHJldHVybiB0aGlzLmN1cnNvckZvclJlY29yZCh1cFRvUmVjb3JkKVxuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5zY29wZWRRdWVyeSgpXG4gICAgY29uc3QgdGFibGUgPSBxdWVyeS5kcml2ZXIucXVvdGVUYWJsZSh0aGlzLm1vZGVsQ2xhc3MudGFibGVOYW1lKCkpXG4gICAgY29uc3Qgc2VydmVyU2VxdWVuY2VDb2x1bW4gPSBxdWVyeS5kcml2ZXIucXVvdGVDb2x1bW4oXCJzZXJ2ZXJfc2VxdWVuY2VcIilcbiAgICBjb25zdCBsYXRlc3RSZWNvcmRzID0gYXdhaXQgcXVlcnlcbiAgICAgIC5vcmRlcihgJHt0YWJsZX0uJHtzZXJ2ZXJTZXF1ZW5jZUNvbHVtbn0gREVTQ2ApXG4gICAgICAubGltaXQoMSlcbiAgICAgIC50b0FycmF5KClcblxuICAgIGlmIChsYXRlc3RSZWNvcmRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGxcblxuICAgIHJldHVybiB0aGlzLmN1cnNvckZvclJlY29yZChsYXRlc3RSZWNvcmRzWzBdKVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgb3JkZXJlZCBhbmQgY3Vyc29yLWZpbHRlcmVkIHBhZ2UgcXVlcnkuXG4gICAqIEBwYXJhbSB7e2xpbWl0OiBudW1iZXIsIHVwVG9DdXJzb3I6IHtpZDogc3RyaW5nLCBzZXJ2ZXJTZXF1ZW5jZTogbnVtYmVyLCB1cGRhdGVkQXQ6IHN0cmluZ319fSBhcmdzIC0gUGFnZSBxdWVyeSBhcmdzLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0gUGFnZSBxdWVyeS5cbiAgICovXG4gIHBhZ2VRdWVyeSh7bGltaXQsIHVwVG9DdXJzb3J9KSB7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnNjb3BlZFF1ZXJ5KClcbiAgICBjb25zdCBkcml2ZXIgPSBxdWVyeS5kcml2ZXJcbiAgICBjb25zdCB0YWJsZSA9IGRyaXZlci5xdW90ZVRhYmxlKHRoaXMubW9kZWxDbGFzcy50YWJsZU5hbWUoKSlcbiAgICBjb25zdCBzZXJ2ZXJTZXF1ZW5jZUNvbHVtbiA9IGAke3RhYmxlfS4ke2RyaXZlci5xdW90ZUNvbHVtbihcInNlcnZlcl9zZXF1ZW5jZVwiKX1gXG4gICAgY29uc3QgdXBkYXRlZEF0Q29sdW1uID0gYCR7dGFibGV9LiR7ZHJpdmVyLnF1b3RlQ29sdW1uKFwidXBkYXRlZF9hdFwiKX1gXG4gICAgY29uc3QgaWRDb2x1bW4gPSBgJHt0YWJsZX0uJHtkcml2ZXIucXVvdGVDb2x1bW4oXCJpZFwiKX1gXG5cbiAgICBxdWVyeVxuICAgICAgLndoZXJlKGAke3NlcnZlclNlcXVlbmNlQ29sdW1ufSA8PSAke2RyaXZlci5xdW90ZSh1cFRvQ3Vyc29yLnNlcnZlclNlcXVlbmNlKX1gKVxuICAgICAgLm9yZGVyKGAke3NlcnZlclNlcXVlbmNlQ29sdW1ufSBBU0NgKVxuICAgICAgLmxpbWl0KGxpbWl0KVxuXG4gICAgY29uc3QgYWZ0ZXJTZXJ2ZXJTZXF1ZW5jZSA9IHRoaXMub3B0aW9uYWxQb3NpdGl2ZUludGVnZXJQYXJhbSh0aGlzLnBhcmFtcy5hZnRlclNlcnZlclNlcXVlbmNlLCBcImFmdGVyU2VydmVyU2VxdWVuY2VcIilcblxuICAgIGlmIChhZnRlclNlcnZlclNlcXVlbmNlICE9PSBudWxsKSB7XG4gICAgICBxdWVyeS53aGVyZShgJHtzZXJ2ZXJTZXF1ZW5jZUNvbHVtbn0gPiAke2RyaXZlci5xdW90ZShhZnRlclNlcnZlclNlcXVlbmNlKX1gKVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMucGFyYW1zLmFmdGVyVXBkYXRlZEF0ID09PSBcInN0cmluZ1wiICYmIHRoaXMucGFyYW1zLmFmdGVyVXBkYXRlZEF0ICE9PSBcIlwiKSB7XG4gICAgICBjb25zdCBpc1BhZ2luZ0V4aXN0aW5nU25hcHNob3QgPSB0eXBlb2YgdGhpcy5wYXJhbXMudXBUb1VwZGF0ZWRBdCA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLnBhcmFtcy51cFRvVXBkYXRlZEF0ICE9PSBcIlwiICYmIHR5cGVvZiB0aGlzLnBhcmFtcy51cFRvSWQgPT09IFwic3RyaW5nXCIgJiYgdGhpcy5wYXJhbXMudXBUb0lkICE9PSBcIlwiXG5cbiAgICAgIGlmIChpc1BhZ2luZ0V4aXN0aW5nU25hcHNob3QgJiYgdHlwZW9mIHRoaXMucGFyYW1zLmFmdGVySWQgPT09IFwic3RyaW5nXCIgJiYgdGhpcy5wYXJhbXMuYWZ0ZXJJZCAhPT0gXCJcIikge1xuICAgICAgICBxdWVyeS53aGVyZShgKCR7dXBkYXRlZEF0Q29sdW1ufSA+ICR7ZHJpdmVyLnF1b3RlKHRoaXMucGFyYW1zLmFmdGVyVXBkYXRlZEF0KX0gT1IgKCR7dXBkYXRlZEF0Q29sdW1ufSA9ICR7ZHJpdmVyLnF1b3RlKHRoaXMucGFyYW1zLmFmdGVyVXBkYXRlZEF0KX0gQU5EICR7aWRDb2x1bW59ID4gJHtkcml2ZXIucXVvdGUodGhpcy5wYXJhbXMuYWZ0ZXJJZCl9KSlgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVlcnkud2hlcmUoYCR7dXBkYXRlZEF0Q29sdW1ufSA+PSAke2RyaXZlci5xdW90ZSh0aGlzLnBhcmFtcy5hZnRlclVwZGF0ZWRBdCl9YClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcXVlcnlcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBiYXNlIHF1ZXJ5IHdpdGggYXBwLW93bmVkIHNjb3BlIGFwcGxpZWQuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSBTY29wZWQgYmFzZSBxdWVyeS5cbiAgICovXG4gIHNjb3BlZFF1ZXJ5KCkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5tb2RlbENsYXNzLndoZXJlKHt9KVxuXG4gICAgaWYgKHRoaXMuc2NvcGVRdWVyeSkgdGhpcy5zY29wZVF1ZXJ5KHtxdWVyeX0pXG5cbiAgICByZXR1cm4gcXVlcnlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgcmVjb3JkIGludG8gYSB0cmFuc3BvcnQgY3Vyc29yLlxuICAgKiBAcGFyYW0gez99IHJlY29yZCAtIFN5bmMvY2hhbmdlIHJlY29yZC5cbiAgICogQHJldHVybnMge3tpZDogc3RyaW5nLCBzZXJ2ZXJTZXF1ZW5jZTogbnVtYmVyLCB1cGRhdGVkQXQ6IHN0cmluZ319IEN1cnNvciBmb3Igcm93LlxuICAgKi9cbiAgY3Vyc29yRm9yUmVjb3JkKHJlY29yZCkge1xuICAgIHJldHVybiB7aWQ6IFN0cmluZyh0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJpZFwiKSksIHNlcnZlclNlcXVlbmNlOiBOdW1iZXIodGhpcy5yZWNvcmRWYWx1ZShyZWNvcmQsIFwic2VydmVyU2VxdWVuY2VcIikpLCB1cGRhdGVkQXQ6IHRoaXMuaXNvRGF0ZSh0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJ1cGRhdGVkQXRcIikpfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSByZWNvcmQgdXNpbmcgdGhlIHN0YW5kYXJkIHN5bmMgZW52ZWxvcGUgc2hhcGUgcGx1cyB0aGUgc3luY1xuICAgKiBtb2RlbCdzIGRlY2xhcmVkIHNjb3BlLXBhcnRpdGlvbiBhdHRyaWJ1dGVzIChgc3RhdGljIHN5bmNTY29wZUF0dHJpYnV0ZXNgKSxcbiAgICogZWFjaCBlbWl0dGVkIHVuZGVyIGl0cyBvd24gYXR0cmlidXRlIG5hbWUuIE1vZGVscyBkZWNsYXJpbmcgbm8gc2NvcGVcbiAgICogYXR0cmlidXRlcyBrZWVwIHRoZSBkZXByZWNhdGVkIDEuMC41MDMgd2lyZSBhbmQgZW1pdCBgZXZlbnRJZGAuIEtleXMgYXJlXG4gICAqIHNvcnRlZCBzbyBhIGRlY2xhcmVkIGBbXCJldmVudElkXCJdYCBwYXJ0aXRpb24gc3RheXMgYnl0ZS1pZGVudGljYWwgd2l0aCB0aGVcbiAgICogMS4wLjUwMyB3aXJlLlxuICAgKiBAcGFyYW0gez99IHJlY29yZCAtIFN5bmMvY2hhbmdlIHJlY29yZC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBEZWZhdWx0IHNlcmlhbGl6ZWQgcm93LlxuICAgKi9cbiAgZGVmYXVsdFNlcmlhbGl6ZVJlY29yZChyZWNvcmQpIHtcbiAgICBjb25zdCBzY29wZUF0dHJpYnV0ZXMgPSBkZWNsYXJlZFN5bmNTY29wZUF0dHJpYnV0ZXModGhpcy5tb2RlbENsYXNzKVxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovXG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IHtcbiAgICAgIGRhdGE6IHRoaXMucmVjb3JkRGF0YShyZWNvcmQpLFxuICAgICAgaWQ6IHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcImlkXCIpLFxuICAgICAgcmVzb3VyY2VJZDogdGhpcy5yZWNvcmRWYWx1ZShyZWNvcmQsIFwicmVzb3VyY2VJZFwiKSxcbiAgICAgIHJlc291cmNlVHlwZTogdGhpcy5yZWNvcmRWYWx1ZShyZWNvcmQsIFwicmVzb3VyY2VUeXBlXCIpLFxuICAgICAgc2VydmVyU2VxdWVuY2U6IHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcInNlcnZlclNlcXVlbmNlXCIpLFxuICAgICAgc3luY1R5cGU6IHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcInN5bmNUeXBlXCIpLFxuICAgICAgdXBkYXRlZEF0OiB0aGlzLmlzb0RhdGUodGhpcy5yZWNvcmRWYWx1ZShyZWNvcmQsIFwidXBkYXRlZEF0XCIpKVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc2NvcGVBdHRyaWJ1dGUgb2Ygc2NvcGVBdHRyaWJ1dGVzIHx8IFtcImV2ZW50SWRcIl0pIHtcbiAgICAgIHNlcmlhbGl6ZWRbc2NvcGVBdHRyaWJ1dGVdID0gdGhpcy5yZWNvcmRWYWx1ZShyZWNvcmQsIHNjb3BlQXR0cmlidXRlKVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoc2VyaWFsaXplZCkuc29ydCgoW2xlZnRLZXldLCBbcmlnaHRLZXldKSA9PiBsZWZ0S2V5LmxvY2FsZUNvbXBhcmUocmlnaHRLZXkpKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbmQgcGFyc2VzIHRoZSByZWNvcmQgZGF0YSBwYXlsb2FkLlxuICAgKiBAcGFyYW0gez99IHJlY29yZCAtIFN5bmMvY2hhbmdlIHJlY29yZC5cbiAgICogQHJldHVybnMge3Vua25vd259IFBhcnNlZCBkYXRhIHZhbHVlLlxuICAgKi9cbiAgcmVjb3JkRGF0YShyZWNvcmQpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5yZWNvcmRWYWx1ZShyZWNvcmQsIFwiZGF0YVwiKVxuXG4gICAgaWYgKGRhdGEgPT09IFwiXCIgfHwgZGF0YSA9PT0gbnVsbCB8fCBkYXRhID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsXG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiKSByZXR1cm4gZGF0YVxuXG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIHZhbHVlIGZyb20gZWl0aGVyIGEgcmVjb3JkIGFjY2Vzc29yIG1ldGhvZCBvciBwbGFpbiBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIHs/fSByZWNvcmQgLSBTeW5jL2NoYW5nZSByZWNvcmQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gQ2FtZWwtY2FzZWQgdmFsdWUvbWV0aG9kIG5hbWUuXG4gICAqIEByZXR1cm5zIHt1bmtub3dufSBSZWNvcmQgdmFsdWUuXG4gICAqL1xuICByZWNvcmRWYWx1ZShyZWNvcmQsIG5hbWUpIHtcbiAgICBpZiAoIXJlY29yZCB8fCB0eXBlb2YgcmVjb3JkICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jIGNoYW5nZXMgcm93IG11c3QgYmUgYW4gb2JqZWN0LlwiKVxuICAgIH1cblxuICAgIGNvbnN0IHJlY29yZE9iamVjdCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChyZWNvcmQpXG4gICAgY29uc3QgbWV0aG9kID0gcmVjb3JkT2JqZWN0W25hbWVdXG4gICAgY29uc3QgdmFsdWUgPSB0eXBlb2YgbWV0aG9kID09PSBcImZ1bmN0aW9uXCIgPyBtZXRob2QuY2FsbChyZWNvcmQpIDogbWV0aG9kXG5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTeW5jIGNoYW5nZXMgcm93IGlzIG1pc3NpbmcgJHtuYW1lfS5gKVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgZGF0ZS1saWtlIHZhbHVlIHRvIGFuIElTTyBzdHJpbmcuXG4gICAqIEBwYXJhbSB7RGF0ZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQgfCB1bmtub3dufSB2YWx1ZSAtIERhdGUgdmFsdWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IElTTyBkYXRlLlxuICAgKi9cbiAgaXNvRGF0ZSh2YWx1ZSkge1xuICAgIGNvbnN0IGRhdGUgPSB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPyB2YWx1ZSA6IG5ldyBEYXRlKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgPyB2YWx1ZSA6IDApXG5cbiAgICBpZiAoTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShcIlN5bmMgY2hhbmdlcyByb3cgaGFzIGFuIGludmFsaWQgdXBkYXRlZF9hdCB2YWx1ZS5cIiwge2NvZGU6IFwic3luYy1pbnZhbGlkLWNoYW5nZXMtcm93XCJ9KVxuICAgIH1cblxuICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKClcbiAgfVxufVxuXG4iXX0=
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Marks one record as being written from an already-synced source so server
3
+ * publish callbacks skip it (record-precise suppression). The framework's
4
+ * routed sync replay apply uses this internally around every applied write, so
5
+ * replayed device mutations never publish a second, server-origin sync change.
6
+ * @param {?} record - Server model record about to be written.
7
+ * @returns {() => void} Release callback re-enabling publishing for the record.
8
+ */
9
+ export function markServerApply(record: unknown): () => void;
10
+ /**
11
+ * Runs a callback with server publish callbacks suppressed - for code applying
12
+ * already-synced data outside the framework's replay apply (importers,
13
+ * backfills applying device-origin rows). Suppression covers the whole async
14
+ * duration of the callback (nested calls stack) and is process-wide while it
15
+ * runs: mutations from concurrently running requests are also suppressed for
16
+ * that window, so prefer `markServerApply(record)` when other flows can
17
+ * interleave.
18
+ * @template T
19
+ * @param {() => Promise<T> | T} callback - Work whose model writes should not publish sync changes.
20
+ * @returns {Promise<T>} The callback result.
21
+ */
22
+ export function withoutPublishing<T>(callback: () => Promise<T> | T): Promise<T>;
23
+ /**
24
+ * Whether server publishing is currently suppressed for a record: either the
25
+ * record was marked as a server apply (`markServerApply`) or a
26
+ * `withoutPublishing` callback is running.
27
+ * @param {?} record - Server model record being written.
28
+ * @returns {boolean} Whether publishing is suppressed for the record.
29
+ */
30
+ export function isPublishingSuppressed(record: unknown): boolean;
31
+ //# sourceMappingURL=sync-publish-suppression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-publish-suppression.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-publish-suppression.js"],"names":[],"mappings":"AAaA;;;;;;;GAOG;AACH,wCAHW,OAAC,GACC,MAAM,IAAI,CAMtB;AAED;;;;;;;;;;;GAWG;AACH,kCAJa,CAAC,YACH,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAClB,OAAO,CAAC,CAAC,CAAC,CAUtB;AAED;;;;;;GAMG;AACH,+CAHW,OAAC,GACC,OAAO,CAInB"}
@@ -0,0 +1,54 @@
1
+ // @ts-check
2
+ /**
3
+ * Records currently being written from an already-synced source (sync replay
4
+ * applies, importers applying device-origin data). Module-scoped so the
5
+ * framework's replay apply can mark records without holding a publisher
6
+ * instance.
7
+ * @type {WeakSet<object>}
8
+ */
9
+ const serverApplyRecords = new WeakSet();
10
+ let withoutPublishingDepth = 0;
11
+ /**
12
+ * Marks one record as being written from an already-synced source so server
13
+ * publish callbacks skip it (record-precise suppression). The framework's
14
+ * routed sync replay apply uses this internally around every applied write, so
15
+ * replayed device mutations never publish a second, server-origin sync change.
16
+ * @param {?} record - Server model record about to be written.
17
+ * @returns {() => void} Release callback re-enabling publishing for the record.
18
+ */
19
+ export function markServerApply(record) {
20
+ serverApplyRecords.add(record);
21
+ return () => serverApplyRecords.delete(record);
22
+ }
23
+ /**
24
+ * Runs a callback with server publish callbacks suppressed - for code applying
25
+ * already-synced data outside the framework's replay apply (importers,
26
+ * backfills applying device-origin rows). Suppression covers the whole async
27
+ * duration of the callback (nested calls stack) and is process-wide while it
28
+ * runs: mutations from concurrently running requests are also suppressed for
29
+ * that window, so prefer `markServerApply(record)` when other flows can
30
+ * interleave.
31
+ * @template T
32
+ * @param {() => Promise<T> | T} callback - Work whose model writes should not publish sync changes.
33
+ * @returns {Promise<T>} The callback result.
34
+ */
35
+ export async function withoutPublishing(callback) {
36
+ withoutPublishingDepth++;
37
+ try {
38
+ return await callback();
39
+ }
40
+ finally {
41
+ withoutPublishingDepth--;
42
+ }
43
+ }
44
+ /**
45
+ * Whether server publishing is currently suppressed for a record: either the
46
+ * record was marked as a server apply (`markServerApply`) or a
47
+ * `withoutPublishing` callback is running.
48
+ * @param {?} record - Server model record being written.
49
+ * @returns {boolean} Whether publishing is suppressed for the record.
50
+ */
51
+ export function isPublishingSuppressed(record) {
52
+ return withoutPublishingDepth > 0 || serverApplyRecords.has(record);
53
+ }
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1wdWJsaXNoLXN1cHByZXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc3luYy1wdWJsaXNoLXN1cHByZXNzaW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7Ozs7O0dBTUc7QUFDSCxNQUFNLGtCQUFrQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7QUFFeEMsSUFBSSxzQkFBc0IsR0FBRyxDQUFDLENBQUE7QUFFOUI7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsTUFBTTtJQUNwQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUE7SUFFOUIsT0FBTyxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7QUFDaEQsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxpQkFBaUIsQ0FBQyxRQUFRO0lBQzlDLHNCQUFzQixFQUFFLENBQUE7SUFFeEIsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLFFBQVEsRUFBRSxDQUFBO0lBQ3pCLENBQUM7WUFBUyxDQUFDO1FBQ1Qsc0JBQXNCLEVBQUUsQ0FBQTtJQUMxQixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxNQUFNO0lBQzNDLE9BQU8sc0JBQXNCLEdBQUcsQ0FBQyxJQUFJLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogUmVjb3JkcyBjdXJyZW50bHkgYmVpbmcgd3JpdHRlbiBmcm9tIGFuIGFscmVhZHktc3luY2VkIHNvdXJjZSAoc3luYyByZXBsYXlcbiAqIGFwcGxpZXMsIGltcG9ydGVycyBhcHBseWluZyBkZXZpY2Utb3JpZ2luIGRhdGEpLiBNb2R1bGUtc2NvcGVkIHNvIHRoZVxuICogZnJhbWV3b3JrJ3MgcmVwbGF5IGFwcGx5IGNhbiBtYXJrIHJlY29yZHMgd2l0aG91dCBob2xkaW5nIGEgcHVibGlzaGVyXG4gKiBpbnN0YW5jZS5cbiAqIEB0eXBlIHtXZWFrU2V0PG9iamVjdD59XG4gKi9cbmNvbnN0IHNlcnZlckFwcGx5UmVjb3JkcyA9IG5ldyBXZWFrU2V0KClcblxubGV0IHdpdGhvdXRQdWJsaXNoaW5nRGVwdGggPSAwXG5cbi8qKlxuICogTWFya3Mgb25lIHJlY29yZCBhcyBiZWluZyB3cml0dGVuIGZyb20gYW4gYWxyZWFkeS1zeW5jZWQgc291cmNlIHNvIHNlcnZlclxuICogcHVibGlzaCBjYWxsYmFja3Mgc2tpcCBpdCAocmVjb3JkLXByZWNpc2Ugc3VwcHJlc3Npb24pLiBUaGUgZnJhbWV3b3JrJ3NcbiAqIHJvdXRlZCBzeW5jIHJlcGxheSBhcHBseSB1c2VzIHRoaXMgaW50ZXJuYWxseSBhcm91bmQgZXZlcnkgYXBwbGllZCB3cml0ZSwgc29cbiAqIHJlcGxheWVkIGRldmljZSBtdXRhdGlvbnMgbmV2ZXIgcHVibGlzaCBhIHNlY29uZCwgc2VydmVyLW9yaWdpbiBzeW5jIGNoYW5nZS5cbiAqIEBwYXJhbSB7P30gcmVjb3JkIC0gU2VydmVyIG1vZGVsIHJlY29yZCBhYm91dCB0byBiZSB3cml0dGVuLlxuICogQHJldHVybnMgeygpID0+IHZvaWR9IFJlbGVhc2UgY2FsbGJhY2sgcmUtZW5hYmxpbmcgcHVibGlzaGluZyBmb3IgdGhlIHJlY29yZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtTZXJ2ZXJBcHBseShyZWNvcmQpIHtcbiAgc2VydmVyQXBwbHlSZWNvcmRzLmFkZChyZWNvcmQpXG5cbiAgcmV0dXJuICgpID0+IHNlcnZlckFwcGx5UmVjb3Jkcy5kZWxldGUocmVjb3JkKVxufVxuXG4vKipcbiAqIFJ1bnMgYSBjYWxsYmFjayB3aXRoIHNlcnZlciBwdWJsaXNoIGNhbGxiYWNrcyBzdXBwcmVzc2VkIC0gZm9yIGNvZGUgYXBwbHlpbmdcbiAqIGFscmVhZHktc3luY2VkIGRhdGEgb3V0c2lkZSB0aGUgZnJhbWV3b3JrJ3MgcmVwbGF5IGFwcGx5IChpbXBvcnRlcnMsXG4gKiBiYWNrZmlsbHMgYXBwbHlpbmcgZGV2aWNlLW9yaWdpbiByb3dzKS4gU3VwcHJlc3Npb24gY292ZXJzIHRoZSB3aG9sZSBhc3luY1xuICogZHVyYXRpb24gb2YgdGhlIGNhbGxiYWNrIChuZXN0ZWQgY2FsbHMgc3RhY2spIGFuZCBpcyBwcm9jZXNzLXdpZGUgd2hpbGUgaXRcbiAqIHJ1bnM6IG11dGF0aW9ucyBmcm9tIGNvbmN1cnJlbnRseSBydW5uaW5nIHJlcXVlc3RzIGFyZSBhbHNvIHN1cHByZXNzZWQgZm9yXG4gKiB0aGF0IHdpbmRvdywgc28gcHJlZmVyIGBtYXJrU2VydmVyQXBwbHkocmVjb3JkKWAgd2hlbiBvdGhlciBmbG93cyBjYW5cbiAqIGludGVybGVhdmUuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFQ+IHwgVH0gY2FsbGJhY2sgLSBXb3JrIHdob3NlIG1vZGVsIHdyaXRlcyBzaG91bGQgbm90IHB1Ymxpc2ggc3luYyBjaGFuZ2VzLlxuICogQHJldHVybnMge1Byb21pc2U8VD59IFRoZSBjYWxsYmFjayByZXN1bHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRob3V0UHVibGlzaGluZyhjYWxsYmFjaykge1xuICB3aXRob3V0UHVibGlzaGluZ0RlcHRoKytcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBjYWxsYmFjaygpXG4gIH0gZmluYWxseSB7XG4gICAgd2l0aG91dFB1Ymxpc2hpbmdEZXB0aC0tXG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIHNlcnZlciBwdWJsaXNoaW5nIGlzIGN1cnJlbnRseSBzdXBwcmVzc2VkIGZvciBhIHJlY29yZDogZWl0aGVyIHRoZVxuICogcmVjb3JkIHdhcyBtYXJrZWQgYXMgYSBzZXJ2ZXIgYXBwbHkgKGBtYXJrU2VydmVyQXBwbHlgKSBvciBhXG4gKiBgd2l0aG91dFB1Ymxpc2hpbmdgIGNhbGxiYWNrIGlzIHJ1bm5pbmcuXG4gKiBAcGFyYW0gez99IHJlY29yZCAtIFNlcnZlciBtb2RlbCByZWNvcmQgYmVpbmcgd3JpdHRlbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHB1Ymxpc2hpbmcgaXMgc3VwcHJlc3NlZCBmb3IgdGhlIHJlY29yZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUHVibGlzaGluZ1N1cHByZXNzZWQocmVjb3JkKSB7XG4gIHJldHVybiB3aXRob3V0UHVibGlzaGluZ0RlcHRoID4gMCB8fCBzZXJ2ZXJBcHBseVJlY29yZHMuaGFzKHJlY29yZClcbn1cbiJdfQ==
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Args resolved against a publish declaration's deprecated broadcasts after a
3
+ * published server-side mutation commits.
4
+ */
5
+ export type SyncPublishBroadcastArgs = {
6
+ /**
7
+ * - Payload snapshotted through the declaration's `serialize(record)` at mutation time.
8
+ */
9
+ data: Record<string, unknown>;
10
+ /**
11
+ * - Mutation operation that published.
12
+ */
13
+ operation: "create" | "update" | "destroy";
14
+ /**
15
+ * - Mutated server model record.
16
+ */
17
+ record: unknown;
18
+ /**
19
+ * - Published resource id.
20
+ */
21
+ resourceId: string;
22
+ /**
23
+ * - Published resource type.
24
+ */
25
+ resourceType: string;
26
+ /**
27
+ * - Upserted sync/change row.
28
+ */
29
+ syncRow: unknown;
30
+ /**
31
+ * - Published sync type ("update" for creates/updates, "delete" for destroys).
32
+ */
33
+ syncType: string;
34
+ };
35
+ /**
36
+ * One declarative broadcast fanned out after a published server-side mutation
37
+ * commits — same shape the replay service's injected broadcaster consumes.
38
+ */
39
+ export type SyncPublishBroadcast = {
40
+ /**
41
+ * - Channel name or resolver.
42
+ */
43
+ channel: string | ((args: SyncPublishBroadcastArgs) => string);
44
+ /**
45
+ * - Channel routing params.
46
+ */
47
+ broadcastParams: (args: SyncPublishBroadcastArgs) => Record<string, unknown>;
48
+ /**
49
+ * - Broadcast body.
50
+ */
51
+ body: (args: SyncPublishBroadcastArgs) => unknown;
52
+ /**
53
+ * - Optional gate; skipped when it returns false.
54
+ */
55
+ when?: ((args: SyncPublishBroadcastArgs) => boolean) | undefined;
56
+ };
57
+ /**
58
+ * Server-side publish declaration on a model's `static sync`, consumed by
59
+ * `SyncPublisher.fromConfiguration(...)`. Publishing is on for models
60
+ * declaring it (server-side creates and updates write to the sync change
61
+ * feed and broadcast the standard sync envelope on the framework sync
62
+ * channel automatically once their transaction commits); `publish: true`
63
+ * opts in with all defaults and `publish: false` opts a model out explicitly.
64
+ */
65
+ export type SyncPublishDeclarationConfig<TModel = any> = {
66
+ /**
67
+ * - Builds the published payload snapshot from the mutated record (snapshotted at mutation time). Defaults to the record's attributes with Date values serialized to ISO strings.
68
+ */
69
+ serialize?: ((record: TModel) => Record<string, unknown> | Promise<Record<string, unknown>>) | undefined;
70
+ /**
71
+ * - Record-attribute name overrides per scope attribute declared on the sync model's `static syncScopeAttributes`. By default each declared scope attribute reads the record's attribute of the same name when the model has one, else the record's own id (scope-root models).
72
+ */
73
+ scopeAttributes?: Record<string, string> | undefined;
74
+ /**
75
+ * - Deprecated 1.0.503 form: attribute-name string (or resolver function) persisted to a fixed event_id sync-row column and broadcast as a fixed `eventId` scoping param. Declare `static syncScopeAttributes` on the sync model plus `scopeAttributes` overrides instead.
76
+ */
77
+ eventId?: string | ((record: TModel) => string | number | null | Promise<string | number | null>) | undefined;
78
+ /**
79
+ * - Deprecated: declarative app-channel broadcasts fanned out after the framework sync channel broadcast. The framework broadcast happens automatically; keep this only for legacy channels old app versions still subscribe.
80
+ */
81
+ broadcasts?: SyncPublishBroadcast[] | undefined;
82
+ /**
83
+ * - Published operations. Defaults to creates and updates; destroys are opt-in because a server destroy is often cleanup rather than a synced delete.
84
+ */
85
+ operations?: ("update" | "destroy" | "create")[] | undefined;
86
+ /**
87
+ * - Published resource type. Defaults to the model name.
88
+ */
89
+ resourceType?: string | undefined;
90
+ };
91
+ /**
92
+ * Model-level publish declaration value: `true` publishes with all defaults,
93
+ * `false` opts out explicitly, an object customizes the published payload and scoping.
94
+ */
95
+ export type SyncPublishDeclaration<TModel = any> = boolean | SyncPublishDeclarationConfig<TModel>;
96
+ /**
97
+ * Options for building a sync publisher. Published resources are derived from
98
+ * the configuration's registered models (`static sync` publish declarations).
99
+ */
100
+ export type SyncPublisherOptions = {
101
+ /**
102
+ * - Sync model column linking rows to a device actor. Published server-origin rows set it to null (no device to echo). Defaults to "authentication_token_id".
103
+ */
104
+ actorForeignKeyColumn?: string | undefined;
105
+ /**
106
+ * - Delivers the framework sync channel broadcast and any deprecated declared broadcasts. Defaults to the configuration's channel broadcast.
107
+ */
108
+ broadcaster?: ((broadcast: {
109
+ channel: string;
110
+ params: Record<string, unknown>;
111
+ body: unknown;
112
+ }) => Promise<void>) | undefined;
113
+ /**
114
+ * - Configuration owning the registered models. Defaults to the current configuration.
115
+ */
116
+ configuration?: import("../configuration.js").default | undefined;
117
+ /**
118
+ * - Reports post-commit publish failures. Defaults to loud logging.
119
+ */
120
+ onError?: ((error: Error) => void) | undefined;
121
+ /**
122
+ * - Sync/change model override. Defaults to the registered "Sync" model.
123
+ */
124
+ syncModel?: unknown;
125
+ };
126
+ /**
127
+ * One derived scope-partition source for a published resource — not an
128
+ * app-facing API. The value is persisted to the sync row's `columnName` and
129
+ * broadcast under `scopeAttribute` on the framework sync channel.
130
+ */
131
+ export type SyncPublisherScopePlanEntry = {
132
+ /**
133
+ * - Sync-row column persisting the scope value.
134
+ */
135
+ columnName: string;
136
+ /**
137
+ * - Record attribute read for the scope value, or null when the record's own id is the scope (scope-root models).
138
+ */
139
+ recordAttribute: string | null;
140
+ /**
141
+ * - Deprecated eventId resolver function.
142
+ */
143
+ resolver: ((record: unknown) => string | number | null | Promise<string | number | null>) | undefined;
144
+ /**
145
+ * - Scope attribute name broadcast as the framework channel scoping param.
146
+ */
147
+ scopeAttribute: string;
148
+ };
149
+ /**
150
+ * Internal derived publish policy for one resource — not an app-facing API.
151
+ */
152
+ export type SyncPublisherResourceConfig = {
153
+ /**
154
+ * - Deprecated declared app-channel broadcasts.
155
+ */
156
+ broadcasts: SyncPublishBroadcast[] | undefined;
157
+ /**
158
+ * - Server model class for this resource.
159
+ */
160
+ modelClass: unknown;
161
+ /**
162
+ * - Published operations.
163
+ */
164
+ operations: Array<"create" | "update" | "destroy">;
165
+ /**
166
+ * - Derived scope-partition plan.
167
+ */
168
+ scopePlan: Array<SyncPublisherScopePlanEntry>;
169
+ /**
170
+ * - Payload snapshot builder (the declaration's serialize or the default attribute serializer).
171
+ */
172
+ serialize: (record: unknown) => Record<string, unknown> | Promise<Record<string, unknown>>;
173
+ /**
174
+ * - Published resource type.
175
+ */
176
+ resourceType: string;
177
+ };
178
+ //# sourceMappingURL=sync-publisher-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-publisher-types.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-publisher-types.js"],"names":[],"mappings":";;;;;;;;UAMc,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;;;;eACjB,QAAQ,GAAG,QAAQ,GAAG,SAAS;;;;YAC/B,OAAC;;;;gBACD,MAAM;;;;kBACN,MAAM;;;;aACN,OAAC;;;;cACD,MAAM;;;;;;;;;;aAQN,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,wBAAwB,KAAK,MAAM,CAAC;;;;qBACrD,CAAC,IAAI,EAAE,wBAAwB,KAAK,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;;;;UACrD,CAAC,IAAI,EAAE,wBAAwB,KAAK,OAAC;;;;mBAC9B,wBAAwB,KAAK,OAAO;;;;;;;;;;yCAU3C,MAAM;;;;0BAEG,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC;;;;;;;;iCAE/C,MAAM,KAAK,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;;;;;;;;;;;;;;;;;;mCAStF,MAAM,UACP,OAAO,GAAG,4BAA4B,CAAC,MAAM,CAAC;;;;;;;;;;;;;+BAQjC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC;QAAC,IAAI,EAAE,OAAC,CAAA;KAAC,KAAK,OAAO,CAAC,IAAI,CAAC;;;;;;;;uBAE3E,KAAK,KAAK,IAAI;;;;gBACtB,OAAC;;;;;;;;;;;gBAQD,MAAM;;;;qBACN,MAAM,GAAG,IAAI;;;;cACb,CAAC,CAAC,MAAM,EAAE,OAAC,KAAK,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC,GAAG,SAAS;;;;oBACrF,MAAM;;;;;;;;;gBAMN,oBAAoB,EAAE,GAAG,SAAS;;;;gBAClC,OAAC;;;;gBACD,KAAK,CAAC,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;;;;eACtC,KAAK,CAAC,2BAA2B,CAAC;;;;eAClC,CAAC,MAAM,EAAE,OAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC;;;;kBAC7D,MAAM"}
@@ -0,0 +1,3 @@
1
+ // @ts-check
2
+ export {};
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1wdWJsaXNoZXItdHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3luYy9zeW5jLXB1Ymxpc2hlci10eXBlcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogQXJncyByZXNvbHZlZCBhZ2FpbnN0IGEgcHVibGlzaCBkZWNsYXJhdGlvbidzIGRlcHJlY2F0ZWQgYnJvYWRjYXN0cyBhZnRlciBhXG4gKiBwdWJsaXNoZWQgc2VydmVyLXNpZGUgbXV0YXRpb24gY29tbWl0cy5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5bmNQdWJsaXNoQnJvYWRjYXN0QXJnc1xuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCA/Pn0gZGF0YSAtIFBheWxvYWQgc25hcHNob3R0ZWQgdGhyb3VnaCB0aGUgZGVjbGFyYXRpb24ncyBgc2VyaWFsaXplKHJlY29yZClgIGF0IG11dGF0aW9uIHRpbWUuXG4gKiBAcHJvcGVydHkge1wiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCJ9IG9wZXJhdGlvbiAtIE11dGF0aW9uIG9wZXJhdGlvbiB0aGF0IHB1Ymxpc2hlZC5cbiAqIEBwcm9wZXJ0eSB7P30gcmVjb3JkIC0gTXV0YXRlZCBzZXJ2ZXIgbW9kZWwgcmVjb3JkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlc291cmNlSWQgLSBQdWJsaXNoZWQgcmVzb3VyY2UgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVzb3VyY2VUeXBlIC0gUHVibGlzaGVkIHJlc291cmNlIHR5cGUuXG4gKiBAcHJvcGVydHkgez99IHN5bmNSb3cgLSBVcHNlcnRlZCBzeW5jL2NoYW5nZSByb3cuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3luY1R5cGUgLSBQdWJsaXNoZWQgc3luYyB0eXBlIChcInVwZGF0ZVwiIGZvciBjcmVhdGVzL3VwZGF0ZXMsIFwiZGVsZXRlXCIgZm9yIGRlc3Ryb3lzKS5cbiAqL1xuXG4vKipcbiAqIE9uZSBkZWNsYXJhdGl2ZSBicm9hZGNhc3QgZmFubmVkIG91dCBhZnRlciBhIHB1Ymxpc2hlZCBzZXJ2ZXItc2lkZSBtdXRhdGlvblxuICogY29tbWl0cyDigJQgc2FtZSBzaGFwZSB0aGUgcmVwbGF5IHNlcnZpY2UncyBpbmplY3RlZCBicm9hZGNhc3RlciBjb25zdW1lcy5cbiAqIEBkZXByZWNhdGVkIFB1Ymxpc2hpbmcgYnJvYWRjYXN0cyB0aGUgc3RhbmRhcmQgc3luYyBlbnZlbG9wZSBvbiB0aGUgZnJhbWV3b3JrIHN5bmMgY2hhbm5lbCBhdXRvbWF0aWNhbGx5OyBkZWNsYXJlIGFwcC1jaGFubmVsIGJyb2FkY2FzdHMgb25seSBmb3IgbGVnYWN5IGNoYW5uZWxzIG9sZCBhcHAgdmVyc2lvbnMgc3RpbGwgc3Vic2NyaWJlLlxuICogQHR5cGVkZWYge29iamVjdH0gU3luY1B1Ymxpc2hCcm9hZGNhc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgKChhcmdzOiBTeW5jUHVibGlzaEJyb2FkY2FzdEFyZ3MpID0+IHN0cmluZyl9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUgb3IgcmVzb2x2ZXIuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiBTeW5jUHVibGlzaEJyb2FkY2FzdEFyZ3MpID0+IFJlY29yZDxzdHJpbmcsID8+fSBicm9hZGNhc3RQYXJhbXMgLSBDaGFubmVsIHJvdXRpbmcgcGFyYW1zLlxuICogQHByb3BlcnR5IHsoYXJnczogU3luY1B1Ymxpc2hCcm9hZGNhc3RBcmdzKSA9PiA/fSBib2R5IC0gQnJvYWRjYXN0IGJvZHkuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiBTeW5jUHVibGlzaEJyb2FkY2FzdEFyZ3MpID0+IGJvb2xlYW59IFt3aGVuXSAtIE9wdGlvbmFsIGdhdGU7IHNraXBwZWQgd2hlbiBpdCByZXR1cm5zIGZhbHNlLlxuICovXG5cbi8qKlxuICogU2VydmVyLXNpZGUgcHVibGlzaCBkZWNsYXJhdGlvbiBvbiBhIG1vZGVsJ3MgYHN0YXRpYyBzeW5jYCwgY29uc3VtZWQgYnlcbiAqIGBTeW5jUHVibGlzaGVyLmZyb21Db25maWd1cmF0aW9uKC4uLilgLiBQdWJsaXNoaW5nIGlzIG9uIGZvciBtb2RlbHNcbiAqIGRlY2xhcmluZyBpdCAoc2VydmVyLXNpZGUgY3JlYXRlcyBhbmQgdXBkYXRlcyB3cml0ZSB0byB0aGUgc3luYyBjaGFuZ2VcbiAqIGZlZWQgYW5kIGJyb2FkY2FzdCB0aGUgc3RhbmRhcmQgc3luYyBlbnZlbG9wZSBvbiB0aGUgZnJhbWV3b3JrIHN5bmNcbiAqIGNoYW5uZWwgYXV0b21hdGljYWxseSBvbmNlIHRoZWlyIHRyYW5zYWN0aW9uIGNvbW1pdHMpOyBgcHVibGlzaDogdHJ1ZWBcbiAqIG9wdHMgaW4gd2l0aCBhbGwgZGVmYXVsdHMgYW5kIGBwdWJsaXNoOiBmYWxzZWAgb3B0cyBhIG1vZGVsIG91dCBleHBsaWNpdGx5LlxuICogQHRlbXBsYXRlIFtUTW9kZWw9YW55XVxuICogQHR5cGVkZWYge29iamVjdH0gU3luY1B1Ymxpc2hEZWNsYXJhdGlvbkNvbmZpZ1xuICogQHByb3BlcnR5IHsocmVjb3JkOiBUTW9kZWwpID0+IFJlY29yZDxzdHJpbmcsID8+IHwgUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCA/Pj59IFtzZXJpYWxpemVdIC0gQnVpbGRzIHRoZSBwdWJsaXNoZWQgcGF5bG9hZCBzbmFwc2hvdCBmcm9tIHRoZSBtdXRhdGVkIHJlY29yZCAoc25hcHNob3R0ZWQgYXQgbXV0YXRpb24gdGltZSkuIERlZmF1bHRzIHRvIHRoZSByZWNvcmQncyBhdHRyaWJ1dGVzIHdpdGggRGF0ZSB2YWx1ZXMgc2VyaWFsaXplZCB0byBJU08gc3RyaW5ncy5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gW3Njb3BlQXR0cmlidXRlc10gLSBSZWNvcmQtYXR0cmlidXRlIG5hbWUgb3ZlcnJpZGVzIHBlciBzY29wZSBhdHRyaWJ1dGUgZGVjbGFyZWQgb24gdGhlIHN5bmMgbW9kZWwncyBgc3RhdGljIHN5bmNTY29wZUF0dHJpYnV0ZXNgLiBCeSBkZWZhdWx0IGVhY2ggZGVjbGFyZWQgc2NvcGUgYXR0cmlidXRlIHJlYWRzIHRoZSByZWNvcmQncyBhdHRyaWJ1dGUgb2YgdGhlIHNhbWUgbmFtZSB3aGVuIHRoZSBtb2RlbCBoYXMgb25lLCBlbHNlIHRoZSByZWNvcmQncyBvd24gaWQgKHNjb3BlLXJvb3QgbW9kZWxzKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgKChyZWNvcmQ6IFRNb2RlbCkgPT4gc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IFByb21pc2U8c3RyaW5nIHwgbnVtYmVyIHwgbnVsbD4pfSBbZXZlbnRJZF0gLSBEZXByZWNhdGVkIDEuMC41MDMgZm9ybTogYXR0cmlidXRlLW5hbWUgc3RyaW5nIChvciByZXNvbHZlciBmdW5jdGlvbikgcGVyc2lzdGVkIHRvIGEgZml4ZWQgZXZlbnRfaWQgc3luYy1yb3cgY29sdW1uIGFuZCBicm9hZGNhc3QgYXMgYSBmaXhlZCBgZXZlbnRJZGAgc2NvcGluZyBwYXJhbS4gRGVjbGFyZSBgc3RhdGljIHN5bmNTY29wZUF0dHJpYnV0ZXNgIG9uIHRoZSBzeW5jIG1vZGVsIHBsdXMgYHNjb3BlQXR0cmlidXRlc2Agb3ZlcnJpZGVzIGluc3RlYWQuXG4gKiBAcHJvcGVydHkge1N5bmNQdWJsaXNoQnJvYWRjYXN0W119IFticm9hZGNhc3RzXSAtIERlcHJlY2F0ZWQ6IGRlY2xhcmF0aXZlIGFwcC1jaGFubmVsIGJyb2FkY2FzdHMgZmFubmVkIG91dCBhZnRlciB0aGUgZnJhbWV3b3JrIHN5bmMgY2hhbm5lbCBicm9hZGNhc3QuIFRoZSBmcmFtZXdvcmsgYnJvYWRjYXN0IGhhcHBlbnMgYXV0b21hdGljYWxseTsga2VlcCB0aGlzIG9ubHkgZm9yIGxlZ2FjeSBjaGFubmVscyBvbGQgYXBwIHZlcnNpb25zIHN0aWxsIHN1YnNjcmliZS5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8XCJjcmVhdGVcIiB8IFwidXBkYXRlXCIgfCBcImRlc3Ryb3lcIj59IFtvcGVyYXRpb25zXSAtIFB1Ymxpc2hlZCBvcGVyYXRpb25zLiBEZWZhdWx0cyB0byBjcmVhdGVzIGFuZCB1cGRhdGVzOyBkZXN0cm95cyBhcmUgb3B0LWluIGJlY2F1c2UgYSBzZXJ2ZXIgZGVzdHJveSBpcyBvZnRlbiBjbGVhbnVwIHJhdGhlciB0aGFuIGEgc3luY2VkIGRlbGV0ZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcmVzb3VyY2VUeXBlXSAtIFB1Ymxpc2hlZCByZXNvdXJjZSB0eXBlLiBEZWZhdWx0cyB0byB0aGUgbW9kZWwgbmFtZS5cbiAqL1xuXG4vKipcbiAqIE1vZGVsLWxldmVsIHB1Ymxpc2ggZGVjbGFyYXRpb24gdmFsdWU6IGB0cnVlYCBwdWJsaXNoZXMgd2l0aCBhbGwgZGVmYXVsdHMsXG4gKiBgZmFsc2VgIG9wdHMgb3V0IGV4cGxpY2l0bHksIGFuIG9iamVjdCBjdXN0b21pemVzIHRoZSBwdWJsaXNoZWQgcGF5bG9hZCBhbmQgc2NvcGluZy5cbiAqIEB0ZW1wbGF0ZSBbVE1vZGVsPWFueV1cbiAqIEB0eXBlZGVmIHtib29sZWFuIHwgU3luY1B1Ymxpc2hEZWNsYXJhdGlvbkNvbmZpZzxUTW9kZWw+fSBTeW5jUHVibGlzaERlY2xhcmF0aW9uXG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciBidWlsZGluZyBhIHN5bmMgcHVibGlzaGVyLiBQdWJsaXNoZWQgcmVzb3VyY2VzIGFyZSBkZXJpdmVkIGZyb21cbiAqIHRoZSBjb25maWd1cmF0aW9uJ3MgcmVnaXN0ZXJlZCBtb2RlbHMgKGBzdGF0aWMgc3luY2AgcHVibGlzaCBkZWNsYXJhdGlvbnMpLlxuICogQHR5cGVkZWYge29iamVjdH0gU3luY1B1Ymxpc2hlck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYWN0b3JGb3JlaWduS2V5Q29sdW1uXSAtIFN5bmMgbW9kZWwgY29sdW1uIGxpbmtpbmcgcm93cyB0byBhIGRldmljZSBhY3Rvci4gUHVibGlzaGVkIHNlcnZlci1vcmlnaW4gcm93cyBzZXQgaXQgdG8gbnVsbCAobm8gZGV2aWNlIHRvIGVjaG8pLiBEZWZhdWx0cyB0byBcImF1dGhlbnRpY2F0aW9uX3Rva2VuX2lkXCIuXG4gKiBAcHJvcGVydHkgeyhicm9hZGNhc3Q6IHtjaGFubmVsOiBzdHJpbmcsIHBhcmFtczogUmVjb3JkPHN0cmluZywgPz4sIGJvZHk6ID99KSA9PiBQcm9taXNlPHZvaWQ+fSBbYnJvYWRjYXN0ZXJdIC0gRGVsaXZlcnMgdGhlIGZyYW1ld29yayBzeW5jIGNoYW5uZWwgYnJvYWRjYXN0IGFuZCBhbnkgZGVwcmVjYXRlZCBkZWNsYXJlZCBicm9hZGNhc3RzLiBEZWZhdWx0cyB0byB0aGUgY29uZmlndXJhdGlvbidzIGNoYW5uZWwgYnJvYWRjYXN0LlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IFtjb25maWd1cmF0aW9uXSAtIENvbmZpZ3VyYXRpb24gb3duaW5nIHRoZSByZWdpc3RlcmVkIG1vZGVscy4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7KGVycm9yOiBFcnJvcikgPT4gdm9pZH0gW29uRXJyb3JdIC0gUmVwb3J0cyBwb3N0LWNvbW1pdCBwdWJsaXNoIGZhaWx1cmVzLiBEZWZhdWx0cyB0byBsb3VkIGxvZ2dpbmcuXG4gKiBAcHJvcGVydHkgez99IFtzeW5jTW9kZWxdIC0gU3luYy9jaGFuZ2UgbW9kZWwgb3ZlcnJpZGUuIERlZmF1bHRzIHRvIHRoZSByZWdpc3RlcmVkIFwiU3luY1wiIG1vZGVsLlxuICovXG5cbi8qKlxuICogT25lIGRlcml2ZWQgc2NvcGUtcGFydGl0aW9uIHNvdXJjZSBmb3IgYSBwdWJsaXNoZWQgcmVzb3VyY2Ug4oCUIG5vdCBhblxuICogYXBwLWZhY2luZyBBUEkuIFRoZSB2YWx1ZSBpcyBwZXJzaXN0ZWQgdG8gdGhlIHN5bmMgcm93J3MgYGNvbHVtbk5hbWVgIGFuZFxuICogYnJvYWRjYXN0IHVuZGVyIGBzY29wZUF0dHJpYnV0ZWAgb24gdGhlIGZyYW1ld29yayBzeW5jIGNoYW5uZWwuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeW5jUHVibGlzaGVyU2NvcGVQbGFuRW50cnlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb2x1bW5OYW1lIC0gU3luYy1yb3cgY29sdW1uIHBlcnNpc3RpbmcgdGhlIHNjb3BlIHZhbHVlLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSByZWNvcmRBdHRyaWJ1dGUgLSBSZWNvcmQgYXR0cmlidXRlIHJlYWQgZm9yIHRoZSBzY29wZSB2YWx1ZSwgb3IgbnVsbCB3aGVuIHRoZSByZWNvcmQncyBvd24gaWQgaXMgdGhlIHNjb3BlIChzY29wZS1yb290IG1vZGVscykuXG4gKiBAcHJvcGVydHkgeygocmVjb3JkOiA/KSA9PiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgUHJvbWlzZTxzdHJpbmcgfCBudW1iZXIgfCBudWxsPikgfCB1bmRlZmluZWR9IHJlc29sdmVyIC0gRGVwcmVjYXRlZCBldmVudElkIHJlc29sdmVyIGZ1bmN0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNjb3BlQXR0cmlidXRlIC0gU2NvcGUgYXR0cmlidXRlIG5hbWUgYnJvYWRjYXN0IGFzIHRoZSBmcmFtZXdvcmsgY2hhbm5lbCBzY29waW5nIHBhcmFtLlxuICovXG5cbi8qKlxuICogSW50ZXJuYWwgZGVyaXZlZCBwdWJsaXNoIHBvbGljeSBmb3Igb25lIHJlc291cmNlIOKAlCBub3QgYW4gYXBwLWZhY2luZyBBUEkuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeW5jUHVibGlzaGVyUmVzb3VyY2VDb25maWdcbiAqIEBwcm9wZXJ0eSB7U3luY1B1Ymxpc2hCcm9hZGNhc3RbXSB8IHVuZGVmaW5lZH0gYnJvYWRjYXN0cyAtIERlcHJlY2F0ZWQgZGVjbGFyZWQgYXBwLWNoYW5uZWwgYnJvYWRjYXN0cy5cbiAqIEBwcm9wZXJ0eSB7P30gbW9kZWxDbGFzcyAtIFNlcnZlciBtb2RlbCBjbGFzcyBmb3IgdGhpcyByZXNvdXJjZS5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8XCJjcmVhdGVcIiB8IFwidXBkYXRlXCIgfCBcImRlc3Ryb3lcIj59IG9wZXJhdGlvbnMgLSBQdWJsaXNoZWQgb3BlcmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8U3luY1B1Ymxpc2hlclNjb3BlUGxhbkVudHJ5Pn0gc2NvcGVQbGFuIC0gRGVyaXZlZCBzY29wZS1wYXJ0aXRpb24gcGxhbi5cbiAqIEBwcm9wZXJ0eSB7KHJlY29yZDogPykgPT4gUmVjb3JkPHN0cmluZywgPz4gfCBQcm9taXNlPFJlY29yZDxzdHJpbmcsID8+Pn0gc2VyaWFsaXplIC0gUGF5bG9hZCBzbmFwc2hvdCBidWlsZGVyICh0aGUgZGVjbGFyYXRpb24ncyBzZXJpYWxpemUgb3IgdGhlIGRlZmF1bHQgYXR0cmlidXRlIHNlcmlhbGl6ZXIpLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlc291cmNlVHlwZSAtIFB1Ymxpc2hlZCByZXNvdXJjZSB0eXBlLlxuICovXG5cbmV4cG9ydCB7fVxuIl19
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Declarative server-side sync publisher — the server mirror of the client's
3
+ * track-by-default mutation tracking.
4
+ *
5
+ * Server models declare what to publish through `static sync`'s `publish`
6
+ * key, and Velocious writes every committed server-side change to the sync
7
+ * change feed (model-backed Sync-row upsert with server re-sequencing) and
8
+ * broadcasts the standard sync envelope (`{echoOrigin, syncs: [...]}`) on the
9
+ * framework sync channel ({@link VELOCIOUS_SYNC_CHANNEL}) scoped by the
10
+ * change's derived scope-partition values, so devices receive server-origin
11
+ * changes without app code declaring channels or calling manual
12
+ * upsert/broadcast helpers:
13
+ *
14
+ * static sync = {publish: true} // default payload (attributes) + default scope partition
15
+ * static sync = {publish: {serialize: (record) => ({id: record.id(), pin: record.pin()})}}
16
+ *
17
+ * The scope partition comes from the sync model's `static
18
+ * syncScopeAttributes` declaration (for example `["eventId"]` or
19
+ * `["accountId"]` — Velocious has no built-in partition name): each declared
20
+ * scope attribute reads the record's attribute of the same name when the
21
+ * model has one, else the record's own id (scope-root models), overridable
22
+ * per model through `publish: {scopeAttributes: {accountId: "ownerId"}}`.
23
+ * The pre-framework-channel `broadcasts` list and the `eventId`
24
+ * string/resolver-function declaration forms keep working but are deprecated.
25
+ *
26
+ * Replayed device mutations never double-publish: the framework's routed
27
+ * replay apply marks its written records through `markServerApply(record)`
28
+ * (see sync-publish-suppression.js), and app code applying already-synced
29
+ * data can use `markServerApply`/`withoutPublishing` the same way.
30
+ */
31
+ export default class SyncPublisher {
32
+ /**
33
+ * Builds a sync publisher derived from the given configuration. Alias for
34
+ * `new SyncPublisher({configuration, ...options})`.
35
+ * @param {Configuration} [configuration] - Configuration owning the registered models. Defaults to the current configuration.
36
+ * @param {Omit<import("./sync-publisher-types.js").SyncPublisherOptions, "configuration">} [options] - Optional overrides.
37
+ * @returns {SyncPublisher} Sync publisher derived from the configuration.
38
+ */
39
+ static fromConfiguration(configuration?: Configuration, options?: Omit<import("./sync-publisher-types.js").SyncPublisherOptions, "configuration">): SyncPublisher;
40
+ /**
41
+ * Starts (and memoizes per configuration) the sync publisher for a server
42
+ * boot: no-op when no registered model declares a publish config, guarded so
43
+ * repeated boots with the same configuration register the publish callbacks
44
+ * only once.
45
+ * @param {Configuration} configuration - Configuration owning the registered models.
46
+ * @returns {Promise<SyncPublisher | null>} Started publisher, or null when no models declare publish.
47
+ */
48
+ static startFromConfiguration(configuration: Configuration): Promise<SyncPublisher | null>;
49
+ /**
50
+ * Builds the sync publisher by deriving published resources from the
51
+ * configuration's registered models: every model declaring `static sync`
52
+ * with a `publish` declaration becomes a published resource
53
+ * (`publish: false` opts out). The sync/change model is the registered
54
+ * "Sync" model and broadcasts default to the configuration's channel
55
+ * broadcast.
56
+ * @param {import("./sync-publisher-types.js").SyncPublisherOptions} [options] - Optional overrides.
57
+ */
58
+ constructor(options?: import("./sync-publisher-types.js").SyncPublisherOptions);
59
+ /** @type {{actorForeignKeyColumn: string, broadcaster: import("./sync-publisher-types.js").SyncPublisherOptions["broadcaster"], configuration: Configuration, onError: import("./sync-publisher-types.js").SyncPublisherOptions["onError"], resources: Record<string, import("./sync-publisher-types.js").SyncPublisherResourceConfig>, syncModel: ?}} */
60
+ config: {
61
+ actorForeignKeyColumn: string;
62
+ broadcaster: import("./sync-publisher-types.js").SyncPublisherOptions["broadcaster"];
63
+ configuration: Configuration;
64
+ onError: import("./sync-publisher-types.js").SyncPublisherOptions["onError"];
65
+ resources: Record<string, import("./sync-publisher-types.js").SyncPublisherResourceConfig>;
66
+ syncModel: unknown;
67
+ };
68
+ /** @type {Array<{callback: (record: ?) => Promise<void>, callbackName: "afterCreate" | "afterUpdate" | "afterDestroy", modelClass: ?}>} */
69
+ _publishedCallbacks: Array<{
70
+ callback: (record: unknown) => Promise<void>;
71
+ callbackName: "afterCreate" | "afterUpdate" | "afterDestroy";
72
+ modelClass: unknown;
73
+ }>;
74
+ /** @type {Logger | null} */
75
+ _logger: Logger | null;
76
+ _started: boolean;
77
+ /**
78
+ * Registers the publish callbacks for every published resource: server-side
79
+ * creates and updates (destroys when opted in) upsert a sync change row and
80
+ * fan out the declared broadcasts once their transaction commits.
81
+ * @returns {Promise<void>}
82
+ */
83
+ start(): Promise<void>;
84
+ /**
85
+ * Unregisters all publish callbacks (tests, shutdown).
86
+ * @returns {void}
87
+ */
88
+ stop(): void;
89
+ /**
90
+ * Builds the lifecycle callback publishing one server-side mutation. The
91
+ * published payload (declaration `serialize`), event scope, and sync type
92
+ * are snapshotted at mutation-callback time, so afterSave hooks assigning
93
+ * unsaved attributes (or any later drift on the record) cannot change what
94
+ * gets published vs what was committed. Persisting and broadcasting are
95
+ * deferred through the model connection's afterCommit hook so they only run
96
+ * once the mutation's transaction has committed (immediately when no
97
+ * transaction is open) - rolled-back mutations never publish. Post-commit
98
+ * publish failures are reported without rethrowing into the driver's
99
+ * afterCommit chain (see reportAfterCommitError).
100
+ * @param {{operation: "create" | "update" | "destroy", resourceConfig: import("./sync-publisher-types.js").SyncPublisherResourceConfig}} args - Operation and resource config.
101
+ * @returns {(record: ?) => Promise<void>} Lifecycle callback.
102
+ */
103
+ publishedMutationCallback({ operation, resourceConfig }: {
104
+ operation: "create" | "update" | "destroy";
105
+ resourceConfig: import("./sync-publisher-types.js").SyncPublisherResourceConfig;
106
+ }): (record: unknown) => Promise<void>;
107
+ /**
108
+ * Resolves the scope-partition values for one published mutation from the
109
+ * resource's derived scope plan: each entry reads its record attribute (or
110
+ * the record's own id for scope-root models, or the deprecated resolver
111
+ * function). The values are persisted onto the sync row's partition columns
112
+ * and broadcast as the framework sync channel's scoping params.
113
+ * @param {{record: ?, resourceConfig: import("./sync-publisher-types.js").SyncPublisherResourceConfig}} args - Mutated record and resource config.
114
+ * @returns {Promise<{columns: Record<string, string | null>, params: Record<string, string | null>}>} Scope values keyed by sync-row column and by scope attribute.
115
+ */
116
+ publishedScopeValues({ record, resourceConfig }: {
117
+ record: unknown;
118
+ resourceConfig: import("./sync-publisher-types.js").SyncPublisherResourceConfig;
119
+ }): Promise<{
120
+ columns: Record<string, string | null>;
121
+ params: Record<string, string | null>;
122
+ }>;
123
+ /**
124
+ * Upserts the published server-origin sync row for a resource identity:
125
+ * server-origin rows carry a null actor column (no device to echo the
126
+ * change back to), so repeated server changes to one resource reuse and
127
+ * re-sequence one feed row.
128
+ * @param {Record<string, ?>} attributes - Snapshotted sync row attributes.
129
+ * @returns {Promise<?>} Upserted sync row.
130
+ */
131
+ upsertPublishedSyncRow(attributes: Record<string, unknown>): Promise<unknown>;
132
+ /**
133
+ * Returns the broadcaster delivering declared broadcasts: the injected one,
134
+ * or the configuration's channel broadcast awaited through the pending
135
+ * broadcast queue.
136
+ * @returns {NonNullable<import("./sync-publisher-types.js").SyncPublisherOptions["broadcaster"]>} Broadcast deliverer.
137
+ */
138
+ broadcaster(): NonNullable<import("./sync-publisher-types.js").SyncPublisherOptions["broadcaster"]>;
139
+ /**
140
+ * Reports a post-commit publish failure. The transaction has already
141
+ * committed when afterCommit callbacks run, so rethrowing here would poison
142
+ * the driver's awaited afterCommit chain (breaking unrelated callbacks) -
143
+ * instead the failure goes to the configured onError hook, or is emitted on
144
+ * the configuration's framework-error/all-error channels (so production bug
145
+ * reporting via `configuration.getErrorEvents()` sees a broken publish
146
+ * path) and logged loudly through the publisher's logger when none is
147
+ * configured.
148
+ * @param {Error} error - Post-commit publish failure.
149
+ * @returns {Promise<void>}
150
+ */
151
+ reportAfterCommitError(error: Error): Promise<void>;
152
+ /**
153
+ * Returns the lazily built publisher logger.
154
+ * @returns {Logger} Publisher logger.
155
+ */
156
+ logger(): Logger;
157
+ }
158
+ import Configuration from "../configuration.js";
159
+ import Logger from "../logger.js";
160
+ //# sourceMappingURL=sync-publisher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-publisher.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-publisher.js"],"names":[],"mappings":"AA0BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH;IAgDE;;;;;;OAMG;IACH,yCAJW,aAAa,YACb,IAAI,CAAC,OAAO,2BAA2B,EAAE,oBAAoB,EAAE,eAAe,CAAC,GAC7E,aAAa,CAIzB;IAED;;;;;;;OAOG;IACH,6CAHW,aAAa,GACX,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAezC;IA/ED;;;;;;;;OAQG;IACH,sBAFW,OAAO,2BAA2B,EAAE,oBAAoB,EAsClE;IAPC,0VAA0V;IAC1V,QADW;QAAC,qBAAqB,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,OAAO,2BAA2B,EAAE,oBAAoB,CAAC,aAAa,CAAC,CAAC;QAAC,aAAa,EAAE,aAAa,CAAC;QAAC,OAAO,EAAE,OAAO,2BAA2B,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,2BAA2B,EAAE,2BAA2B,CAAC,CAAC;QAAC,SAAS,EAAE,OAAC,CAAA;KAAC,CACnO;IACnH,2IAA2I;IAC3I,qBADW,KAAK,CAAC;QAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,YAAY,EAAE,aAAa,GAAG,aAAa,GAAG,cAAc,CAAC;QAAC,UAAU,EAAE,OAAC,CAAA;KAAC,CAAC,CAC1G;IAC7B,4BAA4B;IAC5B,SADW,MAAM,GAAG,IAAI,CACL;IACnB,kBAAqB;IAqCvB;;;;;OAKG;IACH,SAFa,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED;;;OAGG;IACH,QAFa,IAAI,CAShB;IAED;;;;;;;;;;;;;OAaG;IACH,yDAHW;QAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;QAAC,cAAc,EAAE,OAAO,2BAA2B,EAAE,2BAA2B,CAAA;KAAC,GAC3H,CAAC,MAAM,EAAE,OAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CA8CxC;IAED;;;;;;;;OAQG;IACH,iDAHW;QAAC,MAAM,EAAE,OAAC,CAAC;QAAC,cAAc,EAAE,OAAO,2BAA2B,EAAE,2BAA2B,CAAA;KAAC,GAC1F,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAA;KAAC,CAAC,CA2BpG;IAED;;;;;;;OAOG;IACH,mCAHW,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,GACf,OAAO,CAAC,OAAC,CAAC,CAYtB;IAED;;;;;OAKG;IACH,eAFa,WAAW,CAAC,OAAO,2BAA2B,EAAE,oBAAoB,CAAC,aAAa,CAAC,CAAC,CAShG;IAED;;;;;;;;;;;OAWG;IACH,8BAHW,KAAK,GACH,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED;;;OAGG;IACH,UAFa,MAAM,CAMlB;CACF;0BAnVyB,qBAAqB;mBAC5B,cAAc"}