velocious 1.0.643 → 1.0.645

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 (279) hide show
  1. package/README.md +21 -10
  2. package/build/authorization/ability.js +36 -13
  3. package/build/background-jobs/adapter.js +9 -0
  4. package/build/background-jobs/main.js +35 -10
  5. package/build/background-jobs/store.js +217 -38
  6. package/build/background-jobs/types.js +15 -0
  7. package/build/configuration-types.js +1 -1
  8. package/build/configuration.js +45 -9
  9. package/build/database/drivers/base-column.js +8 -0
  10. package/build/database/drivers/mssql/sql/update.js +1 -3
  11. package/build/database/drivers/mysql/sql/update.js +1 -3
  12. package/build/database/drivers/pgsql/column.js +22 -0
  13. package/build/database/drivers/pgsql/sql/update.js +1 -3
  14. package/build/database/drivers/sqlite/sql/alter-table.js +11 -1
  15. package/build/database/drivers/sqlite/sql/update.js +1 -3
  16. package/build/database/query/index.js +2 -2
  17. package/build/database/query/model-class-query.js +26 -10
  18. package/build/database/query/preloader/has-many.js +4 -1
  19. package/build/database/query/query-data.js +2 -1
  20. package/build/database/query/update-base.js +14 -0
  21. package/build/database/query/with-count.js +3 -1
  22. package/build/database/record/acts-as-list.js +37 -13
  23. package/build/database/record/attachments/store.js +336 -26
  24. package/build/database/record/auditing.js +6 -3
  25. package/build/database/record/index.js +197 -42
  26. package/build/database/record/instance-relationships/belongs-to.js +2 -1
  27. package/build/database/record/validators/uniqueness.js +8 -5
  28. package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +24 -8
  29. package/build/frontend-model-controller.js +136 -53
  30. package/build/frontend-model-resource/base-resource.js +87 -37
  31. package/build/frontend-model-resource/velocious-attachment-resource.js +98 -31
  32. package/build/frontend-models/base.js +307 -59
  33. package/build/frontend-models/preloader.js +6 -3
  34. package/build/frontend-models/query.js +15 -6
  35. package/build/frontend-models/resource-definition.js +21 -2
  36. package/build/frontend-models/use-destroyed-event.js +1 -1
  37. package/build/frontend-models/use-model-class-event.js +2 -2
  38. package/build/frontend-models/use-updated-event.js +1 -1
  39. package/build/frontend-models/websocket-channel.js +256 -93
  40. package/build/frontend-models/websocket-publishers.js +218 -18
  41. package/build/http-server/client/websocket-session.js +13 -1
  42. package/build/http-server/websocket-channel.js +15 -2
  43. package/build/src/authorization/ability.d.ts +9 -3
  44. package/build/src/authorization/ability.d.ts.map +1 -1
  45. package/build/src/authorization/ability.js +33 -14
  46. package/build/src/background-jobs/adapter.d.ts +6 -0
  47. package/build/src/background-jobs/adapter.d.ts.map +1 -1
  48. package/build/src/background-jobs/adapter.js +9 -1
  49. package/build/src/background-jobs/main.d.ts +6 -0
  50. package/build/src/background-jobs/main.d.ts.map +1 -1
  51. package/build/src/background-jobs/main.js +34 -11
  52. package/build/src/background-jobs/store.d.ts +66 -12
  53. package/build/src/background-jobs/store.d.ts.map +1 -1
  54. package/build/src/background-jobs/store.js +191 -35
  55. package/build/src/background-jobs/types.d.ts +55 -0
  56. package/build/src/background-jobs/types.d.ts.map +1 -1
  57. package/build/src/background-jobs/types.js +16 -1
  58. package/build/src/configuration-types.d.ts +3 -3
  59. package/build/src/configuration-types.d.ts.map +1 -1
  60. package/build/src/configuration-types.js +2 -2
  61. package/build/src/configuration.d.ts +18 -8
  62. package/build/src/configuration.d.ts.map +1 -1
  63. package/build/src/configuration.js +38 -7
  64. package/build/src/database/drivers/base-column.d.ts +5 -0
  65. package/build/src/database/drivers/base-column.d.ts.map +1 -1
  66. package/build/src/database/drivers/base-column.js +8 -1
  67. package/build/src/database/drivers/mssql/sql/update.d.ts.map +1 -1
  68. package/build/src/database/drivers/mssql/sql/update.js +2 -4
  69. package/build/src/database/drivers/mysql/sql/update.d.ts.map +1 -1
  70. package/build/src/database/drivers/mysql/sql/update.js +2 -4
  71. package/build/src/database/drivers/pgsql/column.d.ts +5 -0
  72. package/build/src/database/drivers/pgsql/column.d.ts.map +1 -1
  73. package/build/src/database/drivers/pgsql/column.js +19 -1
  74. package/build/src/database/drivers/pgsql/sql/update.d.ts.map +1 -1
  75. package/build/src/database/drivers/pgsql/sql/update.js +2 -4
  76. package/build/src/database/drivers/sqlite/sql/alter-table.d.ts.map +1 -1
  77. package/build/src/database/drivers/sqlite/sql/alter-table.js +6 -2
  78. package/build/src/database/drivers/sqlite/sql/update.d.ts.map +1 -1
  79. package/build/src/database/drivers/sqlite/sql/update.js +2 -4
  80. package/build/src/database/query/index.d.ts +4 -4
  81. package/build/src/database/query/index.d.ts.map +1 -1
  82. package/build/src/database/query/index.js +3 -3
  83. package/build/src/database/query/model-class-query.d.ts +8 -2
  84. package/build/src/database/query/model-class-query.d.ts.map +1 -1
  85. package/build/src/database/query/model-class-query.js +25 -11
  86. package/build/src/database/query/preloader/has-many.d.ts.map +1 -1
  87. package/build/src/database/query/preloader/has-many.js +4 -2
  88. package/build/src/database/query/query-data.d.ts.map +1 -1
  89. package/build/src/database/query/query-data.js +3 -2
  90. package/build/src/database/query/update-base.d.ts +7 -0
  91. package/build/src/database/query/update-base.d.ts.map +1 -1
  92. package/build/src/database/query/update-base.js +13 -1
  93. package/build/src/database/query/with-count.d.ts.map +1 -1
  94. package/build/src/database/query/with-count.js +3 -2
  95. package/build/src/database/record/acts-as-list.d.ts.map +1 -1
  96. package/build/src/database/record/acts-as-list.js +35 -14
  97. package/build/src/database/record/attachments/store.d.ts +67 -0
  98. package/build/src/database/record/attachments/store.d.ts.map +1 -1
  99. package/build/src/database/record/attachments/store.js +301 -25
  100. package/build/src/database/record/auditing.d.ts.map +1 -1
  101. package/build/src/database/record/auditing.js +7 -4
  102. package/build/src/database/record/index.d.ts +78 -26
  103. package/build/src/database/record/index.d.ts.map +1 -1
  104. package/build/src/database/record/index.js +171 -42
  105. package/build/src/database/record/instance-relationships/belongs-to.d.ts.map +1 -1
  106. package/build/src/database/record/instance-relationships/belongs-to.js +3 -2
  107. package/build/src/database/record/validators/uniqueness.d.ts.map +1 -1
  108. package/build/src/database/record/validators/uniqueness.js +8 -6
  109. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +4 -4
  110. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
  111. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +24 -12
  112. package/build/src/frontend-model-controller.d.ts +29 -8
  113. package/build/src/frontend-model-controller.d.ts.map +1 -1
  114. package/build/src/frontend-model-controller.js +122 -51
  115. package/build/src/frontend-model-resource/base-resource.d.ts +51 -24
  116. package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
  117. package/build/src/frontend-model-resource/base-resource.js +83 -37
  118. package/build/src/frontend-model-resource/velocious-attachment-resource.d.ts +45 -26
  119. package/build/src/frontend-model-resource/velocious-attachment-resource.d.ts.map +1 -1
  120. package/build/src/frontend-model-resource/velocious-attachment-resource.js +89 -31
  121. package/build/src/frontend-models/base.d.ts +53 -20
  122. package/build/src/frontend-models/base.d.ts.map +1 -1
  123. package/build/src/frontend-models/base.js +275 -59
  124. package/build/src/frontend-models/preloader.d.ts.map +1 -1
  125. package/build/src/frontend-models/preloader.js +6 -4
  126. package/build/src/frontend-models/query.d.ts +2 -2
  127. package/build/src/frontend-models/query.d.ts.map +1 -1
  128. package/build/src/frontend-models/query.js +14 -7
  129. package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
  130. package/build/src/frontend-models/resource-definition.js +20 -3
  131. package/build/src/frontend-models/use-destroyed-event.d.ts +1 -1
  132. package/build/src/frontend-models/use-destroyed-event.d.ts.map +1 -1
  133. package/build/src/frontend-models/use-destroyed-event.js +2 -2
  134. package/build/src/frontend-models/use-model-class-event.d.ts +2 -2
  135. package/build/src/frontend-models/use-model-class-event.d.ts.map +1 -1
  136. package/build/src/frontend-models/use-model-class-event.js +3 -3
  137. package/build/src/frontend-models/use-updated-event.d.ts +1 -1
  138. package/build/src/frontend-models/use-updated-event.d.ts.map +1 -1
  139. package/build/src/frontend-models/use-updated-event.js +2 -2
  140. package/build/src/frontend-models/websocket-channel.d.ts +60 -41
  141. package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
  142. package/build/src/frontend-models/websocket-channel.js +225 -85
  143. package/build/src/frontend-models/websocket-publishers.d.ts +9 -0
  144. package/build/src/frontend-models/websocket-publishers.d.ts.map +1 -1
  145. package/build/src/frontend-models/websocket-publishers.js +190 -19
  146. package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
  147. package/build/src/http-server/client/websocket-session.js +11 -2
  148. package/build/src/http-server/websocket-channel.d.ts +20 -8
  149. package/build/src/http-server/websocket-channel.d.ts.map +1 -1
  150. package/build/src/http-server/websocket-channel.js +15 -3
  151. package/build/src/sync/assets/cache.d.ts +288 -0
  152. package/build/src/sync/assets/cache.d.ts.map +1 -0
  153. package/build/src/sync/assets/cache.js +883 -0
  154. package/build/src/sync/assets/types.d.ts +199 -0
  155. package/build/src/sync/assets/types.d.ts.map +1 -0
  156. package/build/src/sync/assets/types.js +56 -0
  157. package/build/src/sync/sync-api-client.d.ts.map +1 -1
  158. package/build/src/sync/sync-api-client.js +4 -3
  159. package/build/src/sync/sync-client.d.ts.map +1 -1
  160. package/build/src/sync/sync-client.js +3 -2
  161. package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
  162. package/build/src/sync/sync-envelope-replay-service.js +6 -5
  163. package/build/src/sync/sync-publisher.d.ts.map +1 -1
  164. package/build/src/sync/sync-publisher.js +4 -3
  165. package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts +2 -2
  166. package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts.map +1 -1
  167. package/build/src/testing/browser-frontend-model-event-hook-scenarios.js +3 -3
  168. package/build/src/testing/test-profiler.d.ts +4 -4
  169. package/build/src/testing/test-profiler.d.ts.map +1 -1
  170. package/build/src/testing/test-profiler.js +3 -3
  171. package/build/src/testing/test-runner.d.ts +279 -117
  172. package/build/src/testing/test-runner.d.ts.map +1 -1
  173. package/build/src/testing/test-runner.js +503 -933
  174. package/build/src/testing/test.d.ts +11 -72
  175. package/build/src/testing/test.d.ts.map +1 -1
  176. package/build/src/testing/test.js +131 -284
  177. package/build/src/testing/velocious-attempt-executor.d.ts +54 -0
  178. package/build/src/testing/velocious-attempt-executor.d.ts.map +1 -0
  179. package/build/src/testing/velocious-attempt-executor.js +408 -0
  180. package/build/src/testing/velocious-runner-reporter.d.ts +67 -0
  181. package/build/src/testing/velocious-runner-reporter.d.ts.map +1 -0
  182. package/build/src/testing/velocious-runner-reporter.js +240 -0
  183. package/build/src/testing/velocious-suite-hook-executor.d.ts +19 -0
  184. package/build/src/testing/velocious-suite-hook-executor.d.ts.map +1 -0
  185. package/build/src/testing/velocious-suite-hook-executor.js +41 -0
  186. package/build/src/testing/velocious-test-arguments.d.ts +39 -0
  187. package/build/src/testing/velocious-test-arguments.d.ts.map +1 -0
  188. package/build/src/testing/velocious-test-arguments.js +55 -0
  189. package/build/src/utils/model-primary-key.d.ts +73 -0
  190. package/build/src/utils/model-primary-key.d.ts.map +1 -0
  191. package/build/src/utils/model-primary-key.js +144 -0
  192. package/build/src/utils/sha256-bytes-hex.d.ts +7 -0
  193. package/build/src/utils/sha256-bytes-hex.d.ts.map +1 -0
  194. package/build/src/utils/sha256-bytes-hex.js +117 -0
  195. package/build/src/utils/sha256-hex.d.ts +2 -4
  196. package/build/src/utils/sha256-hex.d.ts.map +1 -1
  197. package/build/src/utils/sha256-hex.js +6 -120
  198. package/build/sync/assets/cache.js +998 -0
  199. package/build/sync/assets/types.js +62 -0
  200. package/build/sync/sync-api-client.js +3 -2
  201. package/build/sync/sync-client.js +2 -1
  202. package/build/sync/sync-envelope-replay-service.js +5 -4
  203. package/build/sync/sync-publisher.js +3 -2
  204. package/build/testing/browser-frontend-model-event-hook-scenarios.js +2 -2
  205. package/build/testing/test-profiler.js +2 -2
  206. package/build/testing/test-runner.js +496 -990
  207. package/build/testing/test.js +164 -306
  208. package/build/testing/velocious-attempt-executor.js +441 -0
  209. package/build/testing/velocious-runner-reporter.js +264 -0
  210. package/build/testing/velocious-suite-hook-executor.js +43 -0
  211. package/build/testing/velocious-test-arguments.js +64 -0
  212. package/build/tsconfig.tsbuildinfo +1 -1
  213. package/build/utils/model-primary-key.js +171 -0
  214. package/build/utils/sha256-bytes-hex.js +132 -0
  215. package/build/utils/sha256-hex.js +7 -135
  216. package/package.json +5 -4
  217. package/src/authorization/ability.js +36 -13
  218. package/src/background-jobs/adapter.js +9 -0
  219. package/src/background-jobs/main.js +35 -10
  220. package/src/background-jobs/store.js +217 -38
  221. package/src/background-jobs/types.js +15 -0
  222. package/src/configuration-types.js +1 -1
  223. package/src/configuration.js +45 -9
  224. package/src/database/drivers/base-column.js +8 -0
  225. package/src/database/drivers/mssql/sql/update.js +1 -3
  226. package/src/database/drivers/mysql/sql/update.js +1 -3
  227. package/src/database/drivers/pgsql/column.js +22 -0
  228. package/src/database/drivers/pgsql/sql/update.js +1 -3
  229. package/src/database/drivers/sqlite/sql/alter-table.js +11 -1
  230. package/src/database/drivers/sqlite/sql/update.js +1 -3
  231. package/src/database/query/index.js +2 -2
  232. package/src/database/query/model-class-query.js +26 -10
  233. package/src/database/query/preloader/has-many.js +4 -1
  234. package/src/database/query/query-data.js +2 -1
  235. package/src/database/query/update-base.js +14 -0
  236. package/src/database/query/with-count.js +3 -1
  237. package/src/database/record/acts-as-list.js +37 -13
  238. package/src/database/record/attachments/store.js +336 -26
  239. package/src/database/record/auditing.js +6 -3
  240. package/src/database/record/index.js +197 -42
  241. package/src/database/record/instance-relationships/belongs-to.js +2 -1
  242. package/src/database/record/validators/uniqueness.js +8 -5
  243. package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +24 -8
  244. package/src/frontend-model-controller.js +136 -53
  245. package/src/frontend-model-resource/base-resource.js +87 -37
  246. package/src/frontend-model-resource/velocious-attachment-resource.js +98 -31
  247. package/src/frontend-models/base.js +307 -59
  248. package/src/frontend-models/preloader.js +6 -3
  249. package/src/frontend-models/query.js +15 -6
  250. package/src/frontend-models/resource-definition.js +21 -2
  251. package/src/frontend-models/use-destroyed-event.js +1 -1
  252. package/src/frontend-models/use-model-class-event.js +2 -2
  253. package/src/frontend-models/use-updated-event.js +1 -1
  254. package/src/frontend-models/websocket-channel.js +256 -93
  255. package/src/frontend-models/websocket-publishers.js +218 -18
  256. package/src/http-server/client/websocket-session.js +13 -1
  257. package/src/http-server/websocket-channel.js +15 -2
  258. package/src/sync/assets/cache.js +998 -0
  259. package/src/sync/assets/types.js +62 -0
  260. package/src/sync/sync-api-client.js +3 -2
  261. package/src/sync/sync-client.js +2 -1
  262. package/src/sync/sync-envelope-replay-service.js +5 -4
  263. package/src/sync/sync-publisher.js +3 -2
  264. package/src/testing/browser-frontend-model-event-hook-scenarios.js +2 -2
  265. package/src/testing/test-profiler.js +2 -2
  266. package/src/testing/test-runner.js +496 -990
  267. package/src/testing/test.js +164 -306
  268. package/src/testing/velocious-attempt-executor.js +441 -0
  269. package/src/testing/velocious-runner-reporter.js +264 -0
  270. package/src/testing/velocious-suite-hook-executor.js +43 -0
  271. package/src/testing/velocious-test-arguments.js +64 -0
  272. package/src/utils/model-primary-key.js +171 -0
  273. package/src/utils/sha256-bytes-hex.js +132 -0
  274. package/src/utils/sha256-hex.js +7 -135
  275. package/build/src/testing/testing-package-adapter.d.ts +0 -9
  276. package/build/src/testing/testing-package-adapter.d.ts.map +0 -1
  277. package/build/src/testing/testing-package-adapter.js +0 -69
  278. package/build/testing/testing-package-adapter.js +0 -76
  279. package/src/testing/testing-package-adapter.js +0 -76
@@ -1,5 +1,9 @@
1
1
  export type WebsocketJsonValue = null | boolean | number | string | object;
2
2
  export type WebsocketParams = Record<string, WebsocketJsonValue>;
3
+ export type WebsocketBroadcastMetadata = {
4
+ broadcastParams?: WebsocketParams;
5
+ eventId?: string;
6
+ };
3
7
  /**
4
8
  * WebsocketJsonValue type.
5
9
  * @typedef {null | boolean | number | string | object} WebsocketJsonValue
@@ -8,6 +12,10 @@ export type WebsocketParams = Record<string, WebsocketJsonValue>;
8
12
  * WebsocketParams type.
9
13
  * @typedef {Record<string, WebsocketJsonValue>} WebsocketParams
10
14
  */
15
+ /**
16
+ * Server-side metadata accompanying a matched broadcast.
17
+ * @typedef {{broadcastParams?: WebsocketParams, eventId?: string}} WebsocketBroadcastMetadata
18
+ */
11
19
  /**
12
20
  * Base class for app-defined 1:N pub/sub channels.
13
21
  *
@@ -84,6 +92,14 @@ export default class VelociousWebsocketChannel {
84
92
  * @returns {boolean} - True to deliver the broadcast to this subscriber.
85
93
  */
86
94
  matches(..._broadcastArgs: WebsocketJsonValue[]): boolean;
95
+ /**
96
+ * Whether replaying a persisted broadcast would require a client resync.
97
+ * Subclasses override this when replay storage deliberately omits metadata
98
+ * required to deliver an event safely.
99
+ * @param {WebsocketJsonValue} _body - Persisted broadcast payload.
100
+ * @returns {boolean | Promise<boolean>} - Whether the session must report a replay gap.
101
+ */
102
+ _requiresReplayGap(_body: WebsocketJsonValue): boolean | Promise<boolean>;
87
103
  /**
88
104
  * Returns sanitized diagnostics for debug snapshots.
89
105
  * Subclasses can override to expose non-sensitive routing details.
@@ -95,23 +111,19 @@ export default class VelociousWebsocketChannel {
95
111
  * override when the outbound body must be tailored to subscription
96
112
  * params before sending.
97
113
  * @param {WebsocketJsonValue} body - Broadcast payload offered to this subscription.
98
- * @param {{eventId?: string}} [meta] - Optional event metadata.
114
+ * @param {WebsocketBroadcastMetadata} [meta] - Optional server-side broadcast metadata.
99
115
  * @returns {void | Promise<void>} - Completes after broadcast delivery.
100
116
  */
101
- deliverBroadcast(body: WebsocketJsonValue, meta?: {
102
- eventId?: string;
103
- }): void | Promise<void>;
117
+ deliverBroadcast(body: WebsocketJsonValue, meta?: WebsocketBroadcastMetadata): void | Promise<void>;
104
118
  /**
105
119
  * Sends a `channel-message` frame to THIS subscriber only.
106
120
  * When `meta.eventId` is provided, the client receives it so it
107
121
  * can track its checkpoint for `lastEventId` replay on reconnect.
108
122
  * @param {WebsocketJsonValue} body - Channel payload to send to the subscribed client.
109
- * @param {{eventId?: string}} [meta] - Optional event metadata.
123
+ * @param {WebsocketBroadcastMetadata} [meta] - Optional server-side broadcast metadata.
110
124
  * @returns {void}
111
125
  */
112
- sendMessage(body: WebsocketJsonValue, meta?: {
113
- eventId?: string;
114
- }): void;
126
+ sendMessage(body: WebsocketJsonValue, meta?: WebsocketBroadcastMetadata): void;
115
127
  /**
116
128
  * Runs is closed.
117
129
  * @returns {boolean} - Whether the channel is closed.
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-channel.d.ts","sourceRoot":"","sources":["../../../src/http-server/websocket-channel.js"],"names":[],"mappings":"AAIG,YAAqD,kBAAkB,GAA7D,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAoB;AAIvE,YAA8C,eAAe,GAAnD,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAiB;AANhE;;;GAGG;AACH;;;GAGG;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,OAAO,yBAAyB;IASrC,cAAc;IACd,MAAM;IACN,OAAO;IACP,OAAO;IAXd;;;;;;OAMG;IACH,YAAY,EAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAC,EAJ1C;QAAqB,cAAc,EAA3B,MAAM,CACd;QAA8B,MAAM,EAA5B,eAAe,CACvB;QAA8D,OAAO,EAA7D,OAAO,+BAA+B,EAAE,OAAO,CACzD;KAC4C,EAK5C;IAED;;;;;OAKG;IACH,YAAY,IAFC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAER;IAE/B;;;;;OAKG;IACH,UAAU,IAFG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAElB;IAEf;;;;OAIG;IACH,YAAY,IAFC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhB;IAEjB;;;;;;OAMG;IACH,YAAY,IAFC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhB;IAEjB;;;;OAIG;IACH,QAAQ,IAFK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpB;IAEb;;;;;;OAMG;IACH,iBAAiB,CAAC,SAAS,EAHhB,eAGgB,GAFd,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAEF;IAE/B;;;;;;;OAOG;IACH,OAAO,CAAC,GAAG,cAAc,EAHX,kBAAkB,EAGP,GAFZ,OAAO,CAEsB;IAE1C;;;;OAIG;IACH,aAAa,IAFA,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAE7B;IAE7B;;;;;;;OAOG;IACH,gBAAgB,CAAC,IAAI,EAJV,kBAIU,EAAE,IAAI,AAHxB,CACA,EADQ;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAGD,GAFd,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAIhC;IAED;;;;;;;OAOG;IACH,WAAW,CAAC,IAAI,EAJL,kBAIK,EAAE,IAAI,AAHnB,CACA,EADQ;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAGN,GAFT,IAAI,CAahB;IAED;;;OAGG;IACH,QAAQ,IAFK,OAAO,CAEc;CACnC"}
1
+ {"version":3,"file":"websocket-channel.d.ts","sourceRoot":"","sources":["../../../src/http-server/websocket-channel.js"],"names":[],"mappings":"AAIG,YAAqD,kBAAkB,GAA7D,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAoB;AAIvE,YAA8C,eAAe,GAAnD,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAiB;AAI7D,YAAiE,0BAA0B,GAAjF;IAAC,eAAe,CAAC,EAAE,eAAe,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAC,CAA4B;AAV9F;;;GAGG;AACH;;;GAGG;AACH;;;GAGG;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,OAAO,yBAAyB;IASrC,cAAc;IACd,MAAM;IACN,OAAO;IACP,OAAO;IAXd;;;;;;OAMG;IACH,YAAY,EAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAC,EAJ1C;QAAqB,cAAc,EAA3B,MAAM,CACd;QAA8B,MAAM,EAA5B,eAAe,CACvB;QAA8D,OAAO,EAA7D,OAAO,+BAA+B,EAAE,OAAO,CACzD;KAC4C,EAK5C;IAED;;;;;OAKG;IACH,YAAY,IAFC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAER;IAE/B;;;;;OAKG;IACH,UAAU,IAFG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAElB;IAEf;;;;OAIG;IACH,YAAY,IAFC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhB;IAEjB;;;;;;OAMG;IACH,YAAY,IAFC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhB;IAEjB;;;;OAIG;IACH,QAAQ,IAFK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpB;IAEb;;;;;;OAMG;IACH,iBAAiB,CAAC,SAAS,EAHhB,eAGgB,GAFd,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAEF;IAE/B;;;;;;;OAOG;IACH,OAAO,CAAC,GAAG,cAAc,EAHX,kBAAkB,EAGP,GAFZ,OAAO,CAEsB;IAE1C;;;;;;OAMG;IACH,kBAAkB,CAAC,KAAK,EAHb,kBAGa,GAFX,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAEG;IAE1C;;;;OAIG;IACH,aAAa,IAFA,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAE7B;IAE7B;;;;;;;OAOG;IACH,gBAAgB,CAAC,IAAI,EAJV,kBAIU,EAAE,IAAI,AAHxB,CACA,EADQ,0BAGgB,GAFd,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAIhC;IAED;;;;;;;OAOG;IACH,WAAW,CAAC,IAAI,EAJL,kBAIK,EAAE,IAAI,AAHnB,CACA,EADQ,0BAGW,GAFT,IAAI,CAahB;IAED;;;OAGG;IACH,QAAQ,IAFK,OAAO,CAEc;CACnC"}
@@ -7,6 +7,10 @@
7
7
  * WebsocketParams type.
8
8
  * @typedef {Record<string, WebsocketJsonValue>} WebsocketParams
9
9
  */
10
+ /**
11
+ * Server-side metadata accompanying a matched broadcast.
12
+ * @typedef {{broadcastParams?: WebsocketParams, eventId?: string}} WebsocketBroadcastMetadata
13
+ */
10
14
  /**
11
15
  * Base class for app-defined 1:N pub/sub channels.
12
16
  *
@@ -80,6 +84,14 @@ export default class VelociousWebsocketChannel {
80
84
  * @returns {boolean} - True to deliver the broadcast to this subscriber.
81
85
  */
82
86
  matches(..._broadcastArgs) { return true; }
87
+ /**
88
+ * Whether replaying a persisted broadcast would require a client resync.
89
+ * Subclasses override this when replay storage deliberately omits metadata
90
+ * required to deliver an event safely.
91
+ * @param {WebsocketJsonValue} _body - Persisted broadcast payload.
92
+ * @returns {boolean | Promise<boolean>} - Whether the session must report a replay gap.
93
+ */
94
+ _requiresReplayGap(_body) { return false; }
83
95
  /**
84
96
  * Returns sanitized diagnostics for debug snapshots.
85
97
  * Subclasses can override to expose non-sensitive routing details.
@@ -91,7 +103,7 @@ export default class VelociousWebsocketChannel {
91
103
  * override when the outbound body must be tailored to subscription
92
104
  * params before sending.
93
105
  * @param {WebsocketJsonValue} body - Broadcast payload offered to this subscription.
94
- * @param {{eventId?: string}} [meta] - Optional event metadata.
106
+ * @param {WebsocketBroadcastMetadata} [meta] - Optional server-side broadcast metadata.
95
107
  * @returns {void | Promise<void>} - Completes after broadcast delivery.
96
108
  */
97
109
  deliverBroadcast(body, meta) {
@@ -102,7 +114,7 @@ export default class VelociousWebsocketChannel {
102
114
  * When `meta.eventId` is provided, the client receives it so it
103
115
  * can track its checkpoint for `lastEventId` replay on reconnect.
104
116
  * @param {WebsocketJsonValue} body - Channel payload to send to the subscribed client.
105
- * @param {{eventId?: string}} [meta] - Optional event metadata.
117
+ * @param {WebsocketBroadcastMetadata} [meta] - Optional server-side broadcast metadata.
106
118
  * @returns {void}
107
119
  */
108
120
  sendMessage(body, meta) {
@@ -122,4 +134,4 @@ export default class VelociousWebsocketChannel {
122
134
  */
123
135
  isClosed() { return this._closed; }
124
136
  }
125
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNoYW5uZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvd2Vic29ja2V0LWNoYW5uZWwuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaOzs7R0FHRztBQUNIOzs7R0FHRztBQUVIOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLHlCQUF5QjtJQUM1Qzs7Ozs7O09BTUc7SUFDSCxZQUFZLEVBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUM7UUFDM0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUE7UUFDcEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFBO1FBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBO1FBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFBO0lBQ3RCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFlBQVksS0FBSyxPQUFPLEtBQUssQ0FBQSxDQUFDLENBQUM7SUFFL0I7Ozs7O09BS0c7SUFDSCxVQUFVLEtBQUksQ0FBQztJQUVmOzs7O09BSUc7SUFDSCxZQUFZLEtBQUksQ0FBQztJQUVqQjs7Ozs7O09BTUc7SUFDSCxZQUFZLEtBQUksQ0FBQztJQUVqQjs7OztPQUlHO0lBQ0gsUUFBUSxLQUFJLENBQUM7SUFFYjs7Ozs7O09BTUc7SUFDSCxpQkFBaUIsQ0FBQyxTQUFTLElBQUcsQ0FBQztJQUUvQjs7Ozs7OztPQU9HO0lBQ0gsT0FBTyxDQUFDLEdBQUcsY0FBYyxJQUFJLE9BQU8sSUFBSSxDQUFBLENBQUMsQ0FBQztJQUUxQzs7OztPQUlHO0lBQ0gsYUFBYSxLQUFLLE9BQU8sRUFBRSxDQUFBLENBQUMsQ0FBQztJQUU3Qjs7Ozs7OztPQU9HO0lBQ0gsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLElBQUk7UUFDekIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDOUIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUk7UUFDcEIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUE7UUFDckYsQ0FBQztRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1lBQ3BCLElBQUksRUFBRSxpQkFBaUI7WUFDdkIsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjO1lBQ25DLElBQUk7WUFDSixHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDbEQsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVEsS0FBSyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUEsQ0FBQyxDQUFDO0NBQ25DIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogV2Vic29ja2V0SnNvblZhbHVlIHR5cGUuXG4gKiBAdHlwZWRlZiB7bnVsbCB8IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcgfCBvYmplY3R9IFdlYnNvY2tldEpzb25WYWx1ZVxuICovXG4vKipcbiAqIFdlYnNvY2tldFBhcmFtcyB0eXBlLlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIFdlYnNvY2tldEpzb25WYWx1ZT59IFdlYnNvY2tldFBhcmFtc1xuICovXG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgYXBwLWRlZmluZWQgMTpOIHB1Yi9zdWIgY2hhbm5lbHMuXG4gKlxuICogU3ViY2xhc3NlcyBvdmVycmlkZTpcbiAqICAtIGBjYW5TdWJzY3JpYmUoKWAg4oCUIHN1YnNjcmliZS10aW1lIGF1dGggKGRlZmF1bHQgYGZhbHNlYCkuXG4gKiAgLSBgc3Vic2NyaWJlZCgpYCAvIGB1bnN1YnNjcmliZWQoKWAg4oCUIG9wdGlvbmFsIGxpZmVjeWNsZSBob29rcy5cbiAqICAtIGBtYXRjaGVzKGJyb2FkY2FzdFBhcmFtcylgIOKAlCBicm9hZGNhc3Qgcm91dGluZyBmaWx0ZXIuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c1dlYnNvY2tldENoYW5uZWwge1xuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBTZXNzaW9uLCBjaGFubmVsIHBhcmFtZXRlcnMsIGFuZCBjbGllbnQgc3Vic2NyaXB0aW9uIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnN1YnNjcmlwdGlvbklkIC0gQ2xpZW50LWFzc2lnbmVkIGlkLCB1bmlxdWUgd2l0aGluIHRoZSBzZXNzaW9uLlxuICAgKiBAcGFyYW0ge1dlYnNvY2tldFBhcmFtc30gYXJncy5wYXJhbXMgLSBTdWJzY3JpYmUgcGFyYW1zLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vY2xpZW50L3dlYnNvY2tldC1zZXNzaW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3Muc2Vzc2lvbiAtIE93bmluZyBzZXNzaW9uLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe3N1YnNjcmlwdGlvbklkLCBwYXJhbXMsIHNlc3Npb259KSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25JZCA9IHN1YnNjcmlwdGlvbklkXG4gICAgdGhpcy5wYXJhbXMgPSBwYXJhbXMgfHwge31cbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uXG4gICAgdGhpcy5fY2xvc2VkID0gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUtdGltZSBhdXRoLiBEZWZhdWx0IGlzIGBmYWxzZWAgKGRlbnkpLiBDaGFubmVsIGF1dGhvcnNcbiAgICogTVVTVCBvdmVycmlkZSB0byBhbGxvdyBzdWJzY3JpcHRpb25zLiBSZXR1cm5pbmcgYSBQcm9taXNlIGRlZmVyc1xuICAgKiB0aGUgYGNoYW5uZWwtc3Vic2NyaWJlZGAgY29uZmlybWF0aW9uIHVudGlsIGl0IHJlc29sdmVzLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGUgc3Vic2NyaXB0aW9uIGlzIGF1dGhvcml6ZWQuXG4gICAqL1xuICBjYW5TdWJzY3JpYmUoKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIOKAlCBjYWxsZWQgb25jZSBhZnRlciBgY2FuU3Vic2NyaWJlYCByZXNvbHZlcyB0cnV0aHkgYW5kXG4gICAqIGJlZm9yZSBgY2hhbm5lbC1zdWJzY3JpYmVkYCBpcyBzZW50IHRvIHRoZSBjbGllbnQuIFVzZSBmb3JcbiAgICogaW5pdGlhbCBzbmFwc2hvdCBkZWxpdmVyeS5cbiAgICogQHJldHVybnMge3ZvaWQgfCBQcm9taXNlPHZvaWQ+fSAtIENvbXBsZXRlcyBhZnRlciBzdWJzY3JpcHRpb24gc2V0dXAuXG4gICAqL1xuICBzdWJzY3JpYmVkKCkge31cblxuICAvKipcbiAgICogT3B0aW9uYWwg4oCUIGNhbGxlZCBvbmNlIHdoZW4gdGhlIHN1YnNjcmlwdGlvbiBlbmRzLiBGaXJlcyBvblxuICAgKiBjbGllbnQtaW5pdGlhdGVkIGBjaGFubmVsLXVuc3Vic2NyaWJlYCBvciBvbiBzZXNzaW9uIHRlYXJkb3duLlxuICAgKiBAcmV0dXJucyB7dm9pZCB8IFByb21pc2U8dm9pZD59IC0gQ29tcGxldGVzIGFmdGVyIHN1YnNjcmlwdGlvbiB0ZWFyZG93bi5cbiAgICovXG4gIHVuc3Vic2NyaWJlZCgpIHt9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSB1bmRlcmx5aW5nIHNvY2tldCBkcm9wcyBhbmQgdGhlIHNlc3Npb24gaXNcbiAgICogbW92ZWQgaW50byB0aGUgcGF1c2VkL2dyYWNlIHJlZ2lzdHJ5LiBFaXRoZXIgYG9uUmVzdW1lYCBmaXJlc1xuICAgKiBvbiBzdWNjZXNzZnVsIGNsaWVudCByZWNvbm5lY3QsIG9yIGB1bnN1YnNjcmliZWQoKWAgZmlyZXMgd2hlblxuICAgKiB0aGUgZ3JhY2Ugd2luZG93IGV4cGlyZXMuXG4gICAqIEByZXR1cm5zIHt2b2lkIHwgUHJvbWlzZTx2b2lkPn0gLSBDb21wbGV0ZXMgYWZ0ZXIgZGlzY29ubmVjdCBoYW5kbGluZy5cbiAgICovXG4gIG9uRGlzY29ubmVjdCgpIHt9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBhZnRlciBhIGNsaWVudCByZWNvbm5lY3QgKyBgc2Vzc2lvbi1yZXN1bWVgIHJlYmluZHMgdGhpc1xuICAgKiBzdWJzY3JpcHRpb24gdG8gYSBuZXcgc29ja2V0LlxuICAgKiBAcmV0dXJucyB7dm9pZCB8IFByb21pc2U8dm9pZD59IC0gQ29tcGxldGVzIGFmdGVyIHJlc3VtZSBoYW5kbGluZy5cbiAgICovXG4gIG9uUmVzdW1lKCkge31cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGNsaWVudCBzZW5kcyB1cGRhdGVkIG1ldGFkYXRhIChlLmcuIGFmdGVyXG4gICAqIHNpZ24taW4gLyBsb2NhbGUgY2hhbmdlKS4gT3ZlcnJpZGUgdG8gcmVhY3QgdG8gc2Vzc2lvbi1sZXZlbFxuICAgKiBtZXRhZGF0YSB1cGRhdGVzLlxuICAgKiBAcGFyYW0ge1dlYnNvY2tldFBhcmFtc30gX21ldGFkYXRhIC0gVXBkYXRlZCBtZXRhZGF0YS5cbiAgICogQHJldHVybnMge3ZvaWQgfCBQcm9taXNlPHZvaWQ+fSAtIENvbXBsZXRlcyBhZnRlciBtZXRhZGF0YS1jaGFuZ2UgaGFuZGxpbmcuXG4gICAqL1xuICBvbk1ldGFkYXRhQ2hhbmdlZChfbWV0YWRhdGEpIHt9XG5cbiAgLyoqXG4gICAqIEJyb2FkY2FzdCByb3V0aW5nIGZpbHRlci4gQ2FsbGVkIGJ5IGBicm9hZGNhc3RUb0NoYW5uZWxgIGZvclxuICAgKiBlYWNoIGxpdmUgc3Vic2NyaXB0aW9uIOKAlCByZXR1cm5pbmcgdHJ1ZSBkZWxpdmVycyB0aGUgYm9keSB2aWFcbiAgICogYHNlbmRNZXNzYWdlYC4gRGVmYXVsdCBtYXRjaGVzIGFsbCBicm9hZGNhc3RzIHJlZ2FyZGxlc3Mgb2ZcbiAgICogcGFyYW1zOyBvdmVycmlkZSBmb3IgcGVyLXN1YnNjcmliZXIgZmlsdGVyaW5nLlxuICAgKiBAcGFyYW0gey4uLldlYnNvY2tldEpzb25WYWx1ZX0gX2Jyb2FkY2FzdEFyZ3MgLSBQYXJhbXMgZm9yd2FyZGVkIGZyb20gYGJyb2FkY2FzdFRvQ2hhbm5lbGAgKGlnbm9yZWQgYnkgZGVmYXVsdCkuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFRydWUgdG8gZGVsaXZlciB0aGUgYnJvYWRjYXN0IHRvIHRoaXMgc3Vic2NyaWJlci5cbiAgICovXG4gIG1hdGNoZXMoLi4uX2Jyb2FkY2FzdEFyZ3MpIHsgcmV0dXJuIHRydWUgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHNhbml0aXplZCBkaWFnbm9zdGljcyBmb3IgZGVidWcgc25hcHNob3RzLlxuICAgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0byBleHBvc2Ugbm9uLXNlbnNpdGl2ZSByb3V0aW5nIGRldGFpbHMuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IERlYnVnLXNhZmUgc3Vic2NyaXB0aW9uIGRldGFpbHMuXG4gICAqL1xuICBkZWJ1Z1NuYXBzaG90KCkgeyByZXR1cm4ge30gfVxuXG4gIC8qKlxuICAgKiBEZWxpdmVycyBhIG1hdGNoZWQgYnJvYWRjYXN0IHRvIHRoaXMgc3Vic2NyaWJlci4gU3ViY2xhc3NlcyBjYW5cbiAgICogb3ZlcnJpZGUgd2hlbiB0aGUgb3V0Ym91bmQgYm9keSBtdXN0IGJlIHRhaWxvcmVkIHRvIHN1YnNjcmlwdGlvblxuICAgKiBwYXJhbXMgYmVmb3JlIHNlbmRpbmcuXG4gICAqIEBwYXJhbSB7V2Vic29ja2V0SnNvblZhbHVlfSBib2R5IC0gQnJvYWRjYXN0IHBheWxvYWQgb2ZmZXJlZCB0byB0aGlzIHN1YnNjcmlwdGlvbi5cbiAgICogQHBhcmFtIHt7ZXZlbnRJZD86IHN0cmluZ319IFttZXRhXSAtIE9wdGlvbmFsIGV2ZW50IG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7dm9pZCB8IFByb21pc2U8dm9pZD59IC0gQ29tcGxldGVzIGFmdGVyIGJyb2FkY2FzdCBkZWxpdmVyeS5cbiAgICovXG4gIGRlbGl2ZXJCcm9hZGNhc3QoYm9keSwgbWV0YSkge1xuICAgIHRoaXMuc2VuZE1lc3NhZ2UoYm9keSwgbWV0YSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIGBjaGFubmVsLW1lc3NhZ2VgIGZyYW1lIHRvIFRISVMgc3Vic2NyaWJlciBvbmx5LlxuICAgKiBXaGVuIGBtZXRhLmV2ZW50SWRgIGlzIHByb3ZpZGVkLCB0aGUgY2xpZW50IHJlY2VpdmVzIGl0IHNvIGl0XG4gICAqIGNhbiB0cmFjayBpdHMgY2hlY2twb2ludCBmb3IgYGxhc3RFdmVudElkYCByZXBsYXkgb24gcmVjb25uZWN0LlxuICAgKiBAcGFyYW0ge1dlYnNvY2tldEpzb25WYWx1ZX0gYm9keSAtIENoYW5uZWwgcGF5bG9hZCB0byBzZW5kIHRvIHRoZSBzdWJzY3JpYmVkIGNsaWVudC5cbiAgICogQHBhcmFtIHt7ZXZlbnRJZD86IHN0cmluZ319IFttZXRhXSAtIE9wdGlvbmFsIGV2ZW50IG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNlbmRNZXNzYWdlKGJvZHksIG1ldGEpIHtcbiAgICBpZiAodGhpcy5fY2xvc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzZW5kTWVzc2FnZSBvbiBjbG9zZWQgc3Vic2NyaXB0aW9uICR7dGhpcy5zdWJzY3JpcHRpb25JZH1gKVxuICAgIH1cblxuICAgIHRoaXMuc2Vzc2lvbi5zZW5kSnNvbih7XG4gICAgICB0eXBlOiBcImNoYW5uZWwtbWVzc2FnZVwiLFxuICAgICAgc3Vic2NyaXB0aW9uSWQ6IHRoaXMuc3Vic2NyaXB0aW9uSWQsXG4gICAgICBib2R5LFxuICAgICAgLi4uKG1ldGE/LmV2ZW50SWQgPyB7ZXZlbnRJZDogbWV0YS5ldmVudElkfSA6IHt9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpcyBjbG9zZWQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGNoYW5uZWwgaXMgY2xvc2VkLlxuICAgKi9cbiAgaXNDbG9zZWQoKSB7IHJldHVybiB0aGlzLl9jbG9zZWQgfVxufVxuIl19
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNoYW5uZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvd2Vic29ja2V0LWNoYW5uZWwuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaOzs7R0FHRztBQUNIOzs7R0FHRztBQUNIOzs7R0FHRztBQUVIOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLHlCQUF5QjtJQUM1Qzs7Ozs7O09BTUc7SUFDSCxZQUFZLEVBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUM7UUFDM0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUE7UUFDcEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFBO1FBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBO1FBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFBO0lBQ3RCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFlBQVksS0FBSyxPQUFPLEtBQUssQ0FBQSxDQUFDLENBQUM7SUFFL0I7Ozs7O09BS0c7SUFDSCxVQUFVLEtBQUksQ0FBQztJQUVmOzs7O09BSUc7SUFDSCxZQUFZLEtBQUksQ0FBQztJQUVqQjs7Ozs7O09BTUc7SUFDSCxZQUFZLEtBQUksQ0FBQztJQUVqQjs7OztPQUlHO0lBQ0gsUUFBUSxLQUFJLENBQUM7SUFFYjs7Ozs7O09BTUc7SUFDSCxpQkFBaUIsQ0FBQyxTQUFTLElBQUcsQ0FBQztJQUUvQjs7Ozs7OztPQU9HO0lBQ0gsT0FBTyxDQUFDLEdBQUcsY0FBYyxJQUFJLE9BQU8sSUFBSSxDQUFBLENBQUMsQ0FBQztJQUUxQzs7Ozs7O09BTUc7SUFDSCxrQkFBa0IsQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLENBQUEsQ0FBQyxDQUFDO0lBRTFDOzs7O09BSUc7SUFDSCxhQUFhLEtBQUssT0FBTyxFQUFFLENBQUEsQ0FBQyxDQUFDO0lBRTdCOzs7Ozs7O09BT0c7SUFDSCxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsSUFBSTtRQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUM5QixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSTtRQUNwQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQTtRQUNyRixDQUFDO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFDcEIsSUFBSSxFQUFFLGlCQUFpQjtZQUN2QixjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7WUFDbkMsSUFBSTtZQUNKLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNsRCxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUSxLQUFLLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQSxDQUFDLENBQUM7Q0FDbkMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBXZWJzb2NrZXRKc29uVmFsdWUgdHlwZS5cbiAqIEB0eXBlZGVmIHtudWxsIHwgYm9vbGVhbiB8IG51bWJlciB8IHN0cmluZyB8IG9iamVjdH0gV2Vic29ja2V0SnNvblZhbHVlXG4gKi9cbi8qKlxuICogV2Vic29ja2V0UGFyYW1zIHR5cGUuXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgV2Vic29ja2V0SnNvblZhbHVlPn0gV2Vic29ja2V0UGFyYW1zXG4gKi9cbi8qKlxuICogU2VydmVyLXNpZGUgbWV0YWRhdGEgYWNjb21wYW55aW5nIGEgbWF0Y2hlZCBicm9hZGNhc3QuXG4gKiBAdHlwZWRlZiB7e2Jyb2FkY2FzdFBhcmFtcz86IFdlYnNvY2tldFBhcmFtcywgZXZlbnRJZD86IHN0cmluZ319IFdlYnNvY2tldEJyb2FkY2FzdE1ldGFkYXRhXG4gKi9cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBhcHAtZGVmaW5lZCAxOk4gcHViL3N1YiBjaGFubmVscy5cbiAqXG4gKiBTdWJjbGFzc2VzIG92ZXJyaWRlOlxuICogIC0gYGNhblN1YnNjcmliZSgpYCDigJQgc3Vic2NyaWJlLXRpbWUgYXV0aCAoZGVmYXVsdCBgZmFsc2VgKS5cbiAqICAtIGBzdWJzY3JpYmVkKClgIC8gYHVuc3Vic2NyaWJlZCgpYCDigJQgb3B0aW9uYWwgbGlmZWN5Y2xlIGhvb2tzLlxuICogIC0gYG1hdGNoZXMoYnJvYWRjYXN0UGFyYW1zKWAg4oCUIGJyb2FkY2FzdCByb3V0aW5nIGZpbHRlci5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzV2Vic29ja2V0Q2hhbm5lbCB7XG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFNlc3Npb24sIGNoYW5uZWwgcGFyYW1ldGVycywgYW5kIGNsaWVudCBzdWJzY3JpcHRpb24gaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc3Vic2NyaXB0aW9uSWQgLSBDbGllbnQtYXNzaWduZWQgaWQsIHVuaXF1ZSB3aXRoaW4gdGhlIHNlc3Npb24uXG4gICAqIEBwYXJhbSB7V2Vic29ja2V0UGFyYW1zfSBhcmdzLnBhcmFtcyAtIFN1YnNjcmliZSBwYXJhbXMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jbGllbnQvd2Vic29ja2V0LXNlc3Npb24uanNcIikuZGVmYXVsdH0gYXJncy5zZXNzaW9uIC0gT3duaW5nIHNlc3Npb24uXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7c3Vic2NyaXB0aW9uSWQsIHBhcmFtcywgc2Vzc2lvbn0pIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbklkID0gc3Vic2NyaXB0aW9uSWRcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcyB8fCB7fVxuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb25cbiAgICB0aGlzLl9jbG9zZWQgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZS10aW1lIGF1dGguIERlZmF1bHQgaXMgYGZhbHNlYCAoZGVueSkuIENoYW5uZWwgYXV0aG9yc1xuICAgKiBNVVNUIG92ZXJyaWRlIHRvIGFsbG93IHN1YnNjcmlwdGlvbnMuIFJldHVybmluZyBhIFByb21pc2UgZGVmZXJzXG4gICAqIHRoZSBgY2hhbm5lbC1zdWJzY3JpYmVkYCBjb25maXJtYXRpb24gdW50aWwgaXQgcmVzb2x2ZXMuXG4gICAqIEByZXR1cm5zIHtib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHRoZSBzdWJzY3JpcHRpb24gaXMgYXV0aG9yaXplZC5cbiAgICovXG4gIGNhblN1YnNjcmliZSgpIHsgcmV0dXJuIGZhbHNlIH1cblxuICAvKipcbiAgICogT3B0aW9uYWwg4oCUIGNhbGxlZCBvbmNlIGFmdGVyIGBjYW5TdWJzY3JpYmVgIHJlc29sdmVzIHRydXRoeSBhbmRcbiAgICogYmVmb3JlIGBjaGFubmVsLXN1YnNjcmliZWRgIGlzIHNlbnQgdG8gdGhlIGNsaWVudC4gVXNlIGZvclxuICAgKiBpbml0aWFsIHNuYXBzaG90IGRlbGl2ZXJ5LlxuICAgKiBAcmV0dXJucyB7dm9pZCB8IFByb21pc2U8dm9pZD59IC0gQ29tcGxldGVzIGFmdGVyIHN1YnNjcmlwdGlvbiBzZXR1cC5cbiAgICovXG4gIHN1YnNjcmliZWQoKSB7fVxuXG4gIC8qKlxuICAgKiBPcHRpb25hbCDigJQgY2FsbGVkIG9uY2Ugd2hlbiB0aGUgc3Vic2NyaXB0aW9uIGVuZHMuIEZpcmVzIG9uXG4gICAqIGNsaWVudC1pbml0aWF0ZWQgYGNoYW5uZWwtdW5zdWJzY3JpYmVgIG9yIG9uIHNlc3Npb24gdGVhcmRvd24uXG4gICAqIEByZXR1cm5zIHt2b2lkIHwgUHJvbWlzZTx2b2lkPn0gLSBDb21wbGV0ZXMgYWZ0ZXIgc3Vic2NyaXB0aW9uIHRlYXJkb3duLlxuICAgKi9cbiAgdW5zdWJzY3JpYmVkKCkge31cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHVuZGVybHlpbmcgc29ja2V0IGRyb3BzIGFuZCB0aGUgc2Vzc2lvbiBpc1xuICAgKiBtb3ZlZCBpbnRvIHRoZSBwYXVzZWQvZ3JhY2UgcmVnaXN0cnkuIEVpdGhlciBgb25SZXN1bWVgIGZpcmVzXG4gICAqIG9uIHN1Y2Nlc3NmdWwgY2xpZW50IHJlY29ubmVjdCwgb3IgYHVuc3Vic2NyaWJlZCgpYCBmaXJlcyB3aGVuXG4gICAqIHRoZSBncmFjZSB3aW5kb3cgZXhwaXJlcy5cbiAgICogQHJldHVybnMge3ZvaWQgfCBQcm9taXNlPHZvaWQ+fSAtIENvbXBsZXRlcyBhZnRlciBkaXNjb25uZWN0IGhhbmRsaW5nLlxuICAgKi9cbiAgb25EaXNjb25uZWN0KCkge31cblxuICAvKipcbiAgICogQ2FsbGVkIGFmdGVyIGEgY2xpZW50IHJlY29ubmVjdCArIGBzZXNzaW9uLXJlc3VtZWAgcmViaW5kcyB0aGlzXG4gICAqIHN1YnNjcmlwdGlvbiB0byBhIG5ldyBzb2NrZXQuXG4gICAqIEByZXR1cm5zIHt2b2lkIHwgUHJvbWlzZTx2b2lkPn0gLSBDb21wbGV0ZXMgYWZ0ZXIgcmVzdW1lIGhhbmRsaW5nLlxuICAgKi9cbiAgb25SZXN1bWUoKSB7fVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgY2xpZW50IHNlbmRzIHVwZGF0ZWQgbWV0YWRhdGEgKGUuZy4gYWZ0ZXJcbiAgICogc2lnbi1pbiAvIGxvY2FsZSBjaGFuZ2UpLiBPdmVycmlkZSB0byByZWFjdCB0byBzZXNzaW9uLWxldmVsXG4gICAqIG1ldGFkYXRhIHVwZGF0ZXMuXG4gICAqIEBwYXJhbSB7V2Vic29ja2V0UGFyYW1zfSBfbWV0YWRhdGEgLSBVcGRhdGVkIG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7dm9pZCB8IFByb21pc2U8dm9pZD59IC0gQ29tcGxldGVzIGFmdGVyIG1ldGFkYXRhLWNoYW5nZSBoYW5kbGluZy5cbiAgICovXG4gIG9uTWV0YWRhdGFDaGFuZ2VkKF9tZXRhZGF0YSkge31cblxuICAvKipcbiAgICogQnJvYWRjYXN0IHJvdXRpbmcgZmlsdGVyLiBDYWxsZWQgYnkgYGJyb2FkY2FzdFRvQ2hhbm5lbGAgZm9yXG4gICAqIGVhY2ggbGl2ZSBzdWJzY3JpcHRpb24g4oCUIHJldHVybmluZyB0cnVlIGRlbGl2ZXJzIHRoZSBib2R5IHZpYVxuICAgKiBgc2VuZE1lc3NhZ2VgLiBEZWZhdWx0IG1hdGNoZXMgYWxsIGJyb2FkY2FzdHMgcmVnYXJkbGVzcyBvZlxuICAgKiBwYXJhbXM7IG92ZXJyaWRlIGZvciBwZXItc3Vic2NyaWJlciBmaWx0ZXJpbmcuXG4gICAqIEBwYXJhbSB7Li4uV2Vic29ja2V0SnNvblZhbHVlfSBfYnJvYWRjYXN0QXJncyAtIFBhcmFtcyBmb3J3YXJkZWQgZnJvbSBgYnJvYWRjYXN0VG9DaGFubmVsYCAoaWdub3JlZCBieSBkZWZhdWx0KS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gVHJ1ZSB0byBkZWxpdmVyIHRoZSBicm9hZGNhc3QgdG8gdGhpcyBzdWJzY3JpYmVyLlxuICAgKi9cbiAgbWF0Y2hlcyguLi5fYnJvYWRjYXN0QXJncykgeyByZXR1cm4gdHJ1ZSB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgcmVwbGF5aW5nIGEgcGVyc2lzdGVkIGJyb2FkY2FzdCB3b3VsZCByZXF1aXJlIGEgY2xpZW50IHJlc3luYy5cbiAgICogU3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzIHdoZW4gcmVwbGF5IHN0b3JhZ2UgZGVsaWJlcmF0ZWx5IG9taXRzIG1ldGFkYXRhXG4gICAqIHJlcXVpcmVkIHRvIGRlbGl2ZXIgYW4gZXZlbnQgc2FmZWx5LlxuICAgKiBAcGFyYW0ge1dlYnNvY2tldEpzb25WYWx1ZX0gX2JvZHkgLSBQZXJzaXN0ZWQgYnJvYWRjYXN0IHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHRoZSBzZXNzaW9uIG11c3QgcmVwb3J0IGEgcmVwbGF5IGdhcC5cbiAgICovXG4gIF9yZXF1aXJlc1JlcGxheUdhcChfYm9keSkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHNhbml0aXplZCBkaWFnbm9zdGljcyBmb3IgZGVidWcgc25hcHNob3RzLlxuICAgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0byBleHBvc2Ugbm9uLXNlbnNpdGl2ZSByb3V0aW5nIGRldGFpbHMuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IERlYnVnLXNhZmUgc3Vic2NyaXB0aW9uIGRldGFpbHMuXG4gICAqL1xuICBkZWJ1Z1NuYXBzaG90KCkgeyByZXR1cm4ge30gfVxuXG4gIC8qKlxuICAgKiBEZWxpdmVycyBhIG1hdGNoZWQgYnJvYWRjYXN0IHRvIHRoaXMgc3Vic2NyaWJlci4gU3ViY2xhc3NlcyBjYW5cbiAgICogb3ZlcnJpZGUgd2hlbiB0aGUgb3V0Ym91bmQgYm9keSBtdXN0IGJlIHRhaWxvcmVkIHRvIHN1YnNjcmlwdGlvblxuICAgKiBwYXJhbXMgYmVmb3JlIHNlbmRpbmcuXG4gICAqIEBwYXJhbSB7V2Vic29ja2V0SnNvblZhbHVlfSBib2R5IC0gQnJvYWRjYXN0IHBheWxvYWQgb2ZmZXJlZCB0byB0aGlzIHN1YnNjcmlwdGlvbi5cbiAgICogQHBhcmFtIHtXZWJzb2NrZXRCcm9hZGNhc3RNZXRhZGF0YX0gW21ldGFdIC0gT3B0aW9uYWwgc2VydmVyLXNpZGUgYnJvYWRjYXN0IG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7dm9pZCB8IFByb21pc2U8dm9pZD59IC0gQ29tcGxldGVzIGFmdGVyIGJyb2FkY2FzdCBkZWxpdmVyeS5cbiAgICovXG4gIGRlbGl2ZXJCcm9hZGNhc3QoYm9keSwgbWV0YSkge1xuICAgIHRoaXMuc2VuZE1lc3NhZ2UoYm9keSwgbWV0YSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIGBjaGFubmVsLW1lc3NhZ2VgIGZyYW1lIHRvIFRISVMgc3Vic2NyaWJlciBvbmx5LlxuICAgKiBXaGVuIGBtZXRhLmV2ZW50SWRgIGlzIHByb3ZpZGVkLCB0aGUgY2xpZW50IHJlY2VpdmVzIGl0IHNvIGl0XG4gICAqIGNhbiB0cmFjayBpdHMgY2hlY2twb2ludCBmb3IgYGxhc3RFdmVudElkYCByZXBsYXkgb24gcmVjb25uZWN0LlxuICAgKiBAcGFyYW0ge1dlYnNvY2tldEpzb25WYWx1ZX0gYm9keSAtIENoYW5uZWwgcGF5bG9hZCB0byBzZW5kIHRvIHRoZSBzdWJzY3JpYmVkIGNsaWVudC5cbiAgICogQHBhcmFtIHtXZWJzb2NrZXRCcm9hZGNhc3RNZXRhZGF0YX0gW21ldGFdIC0gT3B0aW9uYWwgc2VydmVyLXNpZGUgYnJvYWRjYXN0IG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNlbmRNZXNzYWdlKGJvZHksIG1ldGEpIHtcbiAgICBpZiAodGhpcy5fY2xvc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzZW5kTWVzc2FnZSBvbiBjbG9zZWQgc3Vic2NyaXB0aW9uICR7dGhpcy5zdWJzY3JpcHRpb25JZH1gKVxuICAgIH1cblxuICAgIHRoaXMuc2Vzc2lvbi5zZW5kSnNvbih7XG4gICAgICB0eXBlOiBcImNoYW5uZWwtbWVzc2FnZVwiLFxuICAgICAgc3Vic2NyaXB0aW9uSWQ6IHRoaXMuc3Vic2NyaXB0aW9uSWQsXG4gICAgICBib2R5LFxuICAgICAgLi4uKG1ldGE/LmV2ZW50SWQgPyB7ZXZlbnRJZDogbWV0YS5ldmVudElkfSA6IHt9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpcyBjbG9zZWQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGNoYW5uZWwgaXMgY2xvc2VkLlxuICAgKi9cbiAgaXNDbG9zZWQoKSB7IHJldHVybiB0aGlzLl9jbG9zZWQgfVxufVxuIl19
@@ -0,0 +1,288 @@
1
+ export type SynchronizedAssetDownloadFlight = {
2
+ byteSize: number;
3
+ contentType: string | null;
4
+ promise: Promise<{
5
+ error: Error;
6
+ uri: null;
7
+ } | {
8
+ error: null;
9
+ uri: string;
10
+ }>;
11
+ };
12
+ /**
13
+ * Core synchronized asset cache. Platform packages own byte and metadata
14
+ * persistence while this class owns policy, integrity, and lifecycle.
15
+ */
16
+ export default class SynchronizedAssetCache {
17
+ accountId: string;
18
+ adapter: import("./types.js").SynchronizedAssetCacheAdapter;
19
+ download: (descriptor: import("./types.js").SynchronizedAssetCacheDescriptor) => Promise<Uint8Array>;
20
+ maxBytes: number;
21
+ now: () => Date;
22
+ retryBaseDelayMs: number;
23
+ retryMaxDelayMs: number;
24
+ /** @type {Map<string, number>} */
25
+ activeDigestCounts: Map<string, number>;
26
+ /** @type {Map<string, Promise<void>>} */
27
+ deletionPromises: Map<string, Promise<void>>;
28
+ /** @type {Set<string>} */
29
+ cleanupRequiredAfterReleaseDigests: Set<string>;
30
+ /** @type {Promise<number>} */
31
+ cleanupPromise: Promise<number>;
32
+ /** @type {Map<string, SynchronizedAssetDownloadFlight>} */
33
+ downloadPromises: Map<string, SynchronizedAssetDownloadFlight>;
34
+ /** @type {import("./types.js").SynchronizedAssetCacheState | null} */
35
+ state: import("./types.js").SynchronizedAssetCacheState | null;
36
+ /** @type {Promise<import("./types.js").SynchronizedAssetCacheState> | null} */
37
+ statePromise: Promise<import("./types.js").SynchronizedAssetCacheState> | null;
38
+ /** @type {Promise<void>} */
39
+ saveStatePromise: Promise<void>;
40
+ /** @type {Map<string, Promise<import("./types.js").SynchronizedAssetCacheSynchronizationResult>>} */
41
+ synchronizePromises: Map<string, Promise<import("./types.js").SynchronizedAssetCacheSynchronizationResult>>;
42
+ /**
43
+ * Creates a synchronized asset cache.
44
+ * @param {object} args Options.
45
+ * @param {string} args.accountId Authenticated account namespace.
46
+ * @param {import("./types.js").SynchronizedAssetCacheAdapter} args.adapter Platform storage adapter.
47
+ * @param {(descriptor: import("./types.js").SynchronizedAssetCacheDescriptor) => Promise<Uint8Array>} args.download Authenticated byte downloader.
48
+ * @param {number} args.maxBytes Maximum evictable cache size.
49
+ * @param {() => Date} [args.now] Clock.
50
+ * @param {number} [args.retryBaseDelayMs] Initial retry delay.
51
+ * @param {number} [args.retryMaxDelayMs] Maximum retry delay.
52
+ */
53
+ constructor({ accountId, adapter, download, maxBytes, now, retryBaseDelayMs, retryMaxDelayMs }: {
54
+ accountId: string;
55
+ adapter: import("./types.js").SynchronizedAssetCacheAdapter;
56
+ download: (descriptor: import("./types.js").SynchronizedAssetCacheDescriptor) => Promise<Uint8Array>;
57
+ maxBytes: number;
58
+ now?: () => Date;
59
+ retryBaseDelayMs?: number;
60
+ retryMaxDelayMs?: number;
61
+ });
62
+ /**
63
+ * Reconciles the immutable descriptors for one synchronized scope and
64
+ * downloads eligible eager assets.
65
+ * @param {object} args Reconciliation inputs.
66
+ * @param {import("./types.js").SynchronizedAssetCacheDescriptor[]} args.descriptors Current descriptors in the scope.
67
+ * @param {boolean} args.online Whether authenticated downloads are available.
68
+ * @param {string} args.scopeKey Stable synchronized scope key.
69
+ * @returns {Promise<import("./types.js").SynchronizedAssetCacheSynchronizationResult>} Synchronization result.
70
+ */
71
+ synchronize({ descriptors, online, scopeKey }: {
72
+ descriptors: import("./types.js").SynchronizedAssetCacheDescriptor[];
73
+ online: boolean;
74
+ scopeKey: string;
75
+ }): Promise<import("./types.js").SynchronizedAssetCacheSynchronizationResult>;
76
+ /**
77
+ * Runs one scope synchronization after prior calls for that scope finish.
78
+ * @param {object} args Reconciliation inputs.
79
+ * @param {import("./types.js").SynchronizedAssetCacheDescriptor[]} args.descriptors Current descriptors in the scope.
80
+ * @param {boolean} args.online Whether authenticated downloads are available.
81
+ * @param {string} args.scopeKey Stable synchronized scope key.
82
+ * @returns {Promise<import("./types.js").SynchronizedAssetCacheSynchronizationResult>} Synchronization result.
83
+ */
84
+ synchronizeScope({ descriptors, online, scopeKey }: {
85
+ descriptors: import("./types.js").SynchronizedAssetCacheDescriptor[];
86
+ online: boolean;
87
+ scopeKey: string;
88
+ }): Promise<import("./types.js").SynchronizedAssetCacheSynchronizationResult>;
89
+ /**
90
+ * Resolves a cached asset URI, downloading it on demand when allowed.
91
+ * @param {object} args Resolution inputs.
92
+ * @param {string} args.assetId Attachment descriptor id.
93
+ * @param {boolean} args.online Whether authenticated downloads are available.
94
+ * @returns {Promise<string | null>} Cached asset URI.
95
+ */
96
+ resolve({ assetId, online }: {
97
+ assetId: string;
98
+ online: boolean;
99
+ }): Promise<string | null>;
100
+ /**
101
+ * Evicts least-recently-used blobs until the unique cached byte total is
102
+ * within the configured budget. A blob stays durable when any live
103
+ * descriptor reference declares durable retention.
104
+ * @param {Set<string>} [protectedDigests] Digests needed by the active caller.
105
+ * @returns {Promise<number>} Bytes removed.
106
+ */
107
+ cleanup(protectedDigests?: Set<string>): Promise<number>;
108
+ /**
109
+ * Performs one serialized eviction pass.
110
+ * @param {Set<string>} protectedDigests Digests needed by the active caller.
111
+ * @returns {Promise<number>} Bytes removed.
112
+ */
113
+ performCleanup(protectedDigests: Set<string>): Promise<number>;
114
+ /**
115
+ * Loads cache state once for this cache instance.
116
+ * @returns {Promise<import("./types.js").SynchronizedAssetCacheState>} Loaded state.
117
+ */
118
+ loadState(): Promise<import("./types.js").SynchronizedAssetCacheState>;
119
+ /**
120
+ * Loads and recovers persisted cache state.
121
+ * @returns {Promise<import("./types.js").SynchronizedAssetCacheState>} Loaded state.
122
+ */
123
+ loadStateFromAdapter(): Promise<import("./types.js").SynchronizedAssetCacheState>;
124
+ /**
125
+ * Persists the current cache state.
126
+ * @returns {Promise<void>} Resolves after state persistence.
127
+ */
128
+ saveState(): Promise<void>;
129
+ /**
130
+ * Persists a detached reconciliation before exposing it through shared state.
131
+ * @param {object} args Reconciliation inputs.
132
+ * @param {import("./types.js").SynchronizedAssetCacheDescriptor[]} args.descriptors Current descriptors in the scope.
133
+ * @param {string} args.scopeKey Stable synchronized scope key.
134
+ * @returns {Promise<Map<string, import("./types.js").SynchronizedAssetCacheEntry>>} Reconciled live entries by id.
135
+ */
136
+ reconcileDescriptors({ descriptors, scopeKey }: {
137
+ descriptors: import("./types.js").SynchronizedAssetCacheDescriptor[];
138
+ scopeKey: string;
139
+ }): Promise<Map<string, import("./types.js").SynchronizedAssetCacheEntry>>;
140
+ /**
141
+ * Applies one scope's descriptor set to cache state.
142
+ * @param {object} args Reconciliation inputs.
143
+ * @param {import("./types.js").SynchronizedAssetCacheDescriptor[]} args.descriptors Current descriptors in the scope.
144
+ * @param {number} args.newEntryLastAccessedAt Initial LRU timestamp for new entries.
145
+ * @param {string} args.scopeKey Stable synchronized scope key.
146
+ * @param {import("./types.js").SynchronizedAssetCacheState} args.state State to reconcile.
147
+ * @returns {Map<string, import("./types.js").SynchronizedAssetCacheEntry>} Live entries by id.
148
+ */
149
+ applyDescriptorReconciliation({ descriptors, newEntryLastAccessedAt, scopeKey, state }: {
150
+ descriptors: import("./types.js").SynchronizedAssetCacheDescriptor[];
151
+ newEntryLastAccessedAt: number;
152
+ scopeKey: string;
153
+ state: import("./types.js").SynchronizedAssetCacheState;
154
+ }): Map<string, import("./types.js").SynchronizedAssetCacheEntry>;
155
+ /**
156
+ * Copies metadata into a detached persistence candidate.
157
+ * @param {import("./types.js").SynchronizedAssetCacheState} state State to copy.
158
+ * @returns {import("./types.js").SynchronizedAssetCacheState} Detached state.
159
+ */
160
+ copyState(state: import("./types.js").SynchronizedAssetCacheState): import("./types.js").SynchronizedAssetCacheState;
161
+ /**
162
+ * Serializes one metadata persistence operation after prior failures or successes.
163
+ * @param {() => Promise<void>} persist Persistence operation.
164
+ * @returns {Promise<void>} Resolves after persistence.
165
+ */
166
+ serializeStatePersistence(persist: () => Promise<void>): Promise<void>;
167
+ /**
168
+ * Ensures one descriptor has verified local bytes.
169
+ * @param {import("./types.js").SynchronizedAssetCacheEntry} entry Descriptor state.
170
+ * @returns {Promise<{error: Error | null, uri: string | null}>} Cache result.
171
+ */
172
+ ensureCached(entry: import("./types.js").SynchronizedAssetCacheEntry): Promise<{
173
+ error: Error | null;
174
+ uri: string | null;
175
+ }>;
176
+ /**
177
+ * Resolves or downloads descriptors sharing one protected digest.
178
+ * @param {import("./types.js").SynchronizedAssetCacheEntry[]} entries Descriptor states.
179
+ * @returns {Promise<{error: Error | null, uri: string | null}>} Cache result.
180
+ */
181
+ ensureCachedWhileActive(entries: import("./types.js").SynchronizedAssetCacheEntry[]): Promise<{
182
+ error: Error | null;
183
+ uri: string | null;
184
+ }>;
185
+ /**
186
+ * Records one cached digest result for every participating descriptor.
187
+ * @param {import("./types.js").SynchronizedAssetCacheEntry[]} entries Descriptor states.
188
+ * @returns {Promise<void>} Resolves after persistence.
189
+ */
190
+ recordCachedEntries(entries: import("./types.js").SynchronizedAssetCacheEntry[]): Promise<void>;
191
+ /**
192
+ * Persists download intent, then downloads one digest and records a shared failure once.
193
+ * @param {import("./types.js").SynchronizedAssetCacheDescriptor} descriptor Asset descriptor.
194
+ * @returns {Promise<{error: Error, uri: null} | {error: null, uri: string}>} Shared cache result.
195
+ */
196
+ downloadAfterPersistingState(descriptor: import("./types.js").SynchronizedAssetCacheDescriptor): Promise<{
197
+ error: Error;
198
+ uri: null;
199
+ } | {
200
+ error: null;
201
+ uri: string;
202
+ }>;
203
+ /**
204
+ * Advances retry metadata for every live descriptor sharing one failed digest.
205
+ * @param {string} digest Content digest.
206
+ * @returns {Promise<void>} Resolves after persistence.
207
+ */
208
+ recordDownloadFailure(digest: string): Promise<void>;
209
+ /**
210
+ * Downloads, verifies, and atomically persists one content digest.
211
+ * @param {import("./types.js").SynchronizedAssetCacheDescriptor} descriptor Asset descriptor.
212
+ * @returns {Promise<string>} Adapter URI.
213
+ */
214
+ downloadVerified(descriptor: import("./types.js").SynchronizedAssetCacheDescriptor): Promise<string>;
215
+ /**
216
+ * Resolves an existing local URI after waiting for deletion work.
217
+ * @param {import("./types.js").SynchronizedAssetCacheEntry} entry Descriptor state.
218
+ * @returns {Promise<string | null>} Existing URI.
219
+ */
220
+ cachedUri(entry: import("./types.js").SynchronizedAssetCacheEntry): Promise<string | null>;
221
+ /**
222
+ * Resolves an existing local URI while its digest is protected.
223
+ * @param {import("./types.js").SynchronizedAssetCacheEntry} entry Descriptor state.
224
+ * @returns {Promise<string | null>} Existing URI.
225
+ */
226
+ cachedUriWhileActive(entry: import("./types.js").SynchronizedAssetCacheEntry): Promise<string | null>;
227
+ /**
228
+ * Waits for deletion and protects a digest for one active cache operation.
229
+ * @param {string} digest Content digest.
230
+ * @returns {Promise<void>} Resolves after protection is registered.
231
+ */
232
+ beginActiveDigest(digest: string): Promise<void>;
233
+ /**
234
+ * Releases one cache operation and processes deferred deletion after the last.
235
+ * @param {string} digest Content digest.
236
+ * @param {Set<string>} [protectedCleanupDigests] Digests needed by the resolving caller.
237
+ * @returns {Promise<boolean>} Whether finalization requires URI revalidation.
238
+ */
239
+ finishActiveDigest(digest: string, protectedCleanupDigests?: Set<string>): Promise<boolean>;
240
+ /**
241
+ * Releases every acquired digest before propagating finalization failures.
242
+ * @param {string[]} digests Content digests.
243
+ * @returns {Promise<void>} Resolves after every digest is released.
244
+ */
245
+ finishActiveDigests(digests: string[]): Promise<void>;
246
+ /**
247
+ * Deletes blobs that lost their final descriptor reference.
248
+ * @returns {Promise<void>} Resolves after deletion.
249
+ */
250
+ deleteUnreferencedDigests(): Promise<void>;
251
+ /**
252
+ * Deletes one persisted pending digest when no descriptor or active operation owns it.
253
+ * @param {string} digest Content digest.
254
+ * @returns {Promise<boolean>} Whether the blob was deleted.
255
+ */
256
+ deletePendingDigestIfUnreferenced(digest: string): Promise<boolean>;
257
+ /**
258
+ * Runs one deletion only after earlier deletion work and when no cache operation owns the digest.
259
+ * @param {string} digest Content digest.
260
+ * @param {() => Promise<boolean>} callback Protected deletion callback.
261
+ * @returns {Promise<boolean>} Whether the callback deleted the blob.
262
+ */
263
+ deleteDigestIfInactive(digest: string, callback: () => Promise<boolean>): Promise<boolean>;
264
+ /**
265
+ * Finds required assets without locally cached bytes.
266
+ * @param {string} scopeKey Synchronized scope to inspect.
267
+ * @returns {Promise<string[]>} Missing required descriptor ids.
268
+ */
269
+ missingRequiredAssetIds(scopeKey: string): Promise<string[]>;
270
+ /**
271
+ * Checks whether a failed or missing entry may be downloaded now.
272
+ * @param {import("./types.js").SynchronizedAssetCacheEntry} entry Descriptor state.
273
+ * @returns {boolean} Whether the retry deadline has passed.
274
+ */
275
+ retryEligible(entry: import("./types.js").SynchronizedAssetCacheEntry): boolean;
276
+ /**
277
+ * Calculates bounded exponential retry delay.
278
+ * @param {number} attempts Consecutive failures.
279
+ * @returns {number} Retry delay.
280
+ */
281
+ retryDelay(attempts: number): number;
282
+ /**
283
+ * Reads the injectable wall clock.
284
+ * @returns {number} Current epoch milliseconds.
285
+ */
286
+ nowMilliseconds(): number;
287
+ }
288
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../../src/sync/assets/cache.js"],"names":[],"mappings":"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"}