velocious 1.0.514 → 1.0.516

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 (255) hide show
  1. package/README.md +4 -3
  2. package/build/background-jobs/cron-expression.js +9 -9
  3. package/build/background-jobs/forked-runner-child.js +1 -1
  4. package/build/background-jobs/job-runner.js +21 -15
  5. package/build/background-jobs/json-socket.js +4 -0
  6. package/build/background-jobs/main.js +180 -18
  7. package/build/background-jobs/status-reporter.js +12 -5
  8. package/build/background-jobs/store.js +132 -50
  9. package/build/background-jobs/types.js +11 -3
  10. package/build/background-jobs/worker.js +9 -5
  11. package/build/beacon/client.js +13 -6
  12. package/build/configuration.js +54 -29
  13. package/build/controller.js +9 -3
  14. package/build/database/drivers/sqlite/base.js +1 -1
  15. package/build/database/drivers/sqlite/index.js +15 -14
  16. package/build/database/migrations-ledger.js +16 -16
  17. package/build/database/pool/async-tracked-multi-connection.js +16 -0
  18. package/build/database/pool/base.js +26 -0
  19. package/build/database/query/where-model-class-hash.js +2 -0
  20. package/build/database/query/with-count.js +1 -1
  21. package/build/database/record/acts-as-list.js +2 -2
  22. package/build/database/record/auditing.js +23 -6
  23. package/build/database/record/index.js +7 -7
  24. package/build/database/record/validators/uniqueness.js +3 -3
  25. package/build/database/tenants/data-copier.js +23 -23
  26. package/build/database/tenants/schema-cloner.js +27 -27
  27. package/build/environment-handlers/browser.js +0 -1
  28. package/build/environment-handlers/node/cli/commands/background-jobs-runner.js +2 -1
  29. package/build/environment-handlers/node/cli/commands/lint/relationships.js +2 -2
  30. package/build/environment-handlers/node.js +1 -1
  31. package/build/frontend-model-controller.js +26 -18
  32. package/build/frontend-model-resource/base-resource.js +4 -4
  33. package/build/frontend-models/base.js +5 -5
  34. package/build/frontend-models/query.js +12 -12
  35. package/build/http-server/client/index.js +61 -15
  36. package/build/http-server/client/request-runner.js +7 -1
  37. package/build/http-server/client/response.js +17 -1
  38. package/build/http-server/client/websocket-session.js +13 -13
  39. package/build/http-server/server-client.js +96 -0
  40. package/build/http-server/websocket-channel.js +12 -11
  41. package/build/http-server/websocket-connection.js +12 -11
  42. package/build/http-server/websocket-events-host.js +1 -1
  43. package/build/http-server/worker-handler/in-process.js +48 -9
  44. package/build/http-server/worker-handler/index.js +67 -7
  45. package/build/http-server/worker-handler/worker-thread.js +68 -0
  46. package/build/src/background-jobs/cron-expression.d.ts +2 -2
  47. package/build/src/background-jobs/cron-expression.js +10 -10
  48. package/build/src/background-jobs/forked-runner-child.js +2 -2
  49. package/build/src/background-jobs/job-runner.d.ts +5 -1
  50. package/build/src/background-jobs/job-runner.d.ts.map +1 -1
  51. package/build/src/background-jobs/job-runner.js +22 -16
  52. package/build/src/background-jobs/json-socket.d.ts +4 -0
  53. package/build/src/background-jobs/json-socket.d.ts.map +1 -1
  54. package/build/src/background-jobs/json-socket.js +5 -1
  55. package/build/src/background-jobs/main.d.ts +62 -10
  56. package/build/src/background-jobs/main.d.ts.map +1 -1
  57. package/build/src/background-jobs/main.js +171 -19
  58. package/build/src/background-jobs/status-reporter.d.ts +6 -2
  59. package/build/src/background-jobs/status-reporter.d.ts.map +1 -1
  60. package/build/src/background-jobs/status-reporter.js +13 -6
  61. package/build/src/background-jobs/store.d.ts +48 -25
  62. package/build/src/background-jobs/store.d.ts.map +1 -1
  63. package/build/src/background-jobs/store.js +123 -50
  64. package/build/src/background-jobs/types.d.ts +36 -3
  65. package/build/src/background-jobs/types.d.ts.map +1 -1
  66. package/build/src/background-jobs/types.js +12 -4
  67. package/build/src/background-jobs/worker.d.ts +7 -5
  68. package/build/src/background-jobs/worker.d.ts.map +1 -1
  69. package/build/src/background-jobs/worker.js +10 -6
  70. package/build/src/beacon/client.d.ts +6 -3
  71. package/build/src/beacon/client.d.ts.map +1 -1
  72. package/build/src/beacon/client.js +14 -7
  73. package/build/src/configuration-types.d.ts +1 -1
  74. package/build/src/configuration.d.ts +42 -29
  75. package/build/src/configuration.d.ts.map +1 -1
  76. package/build/src/configuration.js +52 -30
  77. package/build/src/controller.d.ts +3 -0
  78. package/build/src/controller.d.ts.map +1 -1
  79. package/build/src/controller.js +9 -4
  80. package/build/src/database/drivers/sqlite/base.js +2 -2
  81. package/build/src/database/drivers/sqlite/index.d.ts +7 -6
  82. package/build/src/database/drivers/sqlite/index.d.ts.map +1 -1
  83. package/build/src/database/drivers/sqlite/index.js +16 -15
  84. package/build/src/database/migrations-ledger.d.ts +16 -16
  85. package/build/src/database/migrations-ledger.js +17 -17
  86. package/build/src/database/pool/async-tracked-multi-connection.d.ts +0 -11
  87. package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
  88. package/build/src/database/pool/async-tracked-multi-connection.js +16 -1
  89. package/build/src/database/pool/base.d.ts +21 -0
  90. package/build/src/database/pool/base.d.ts.map +1 -1
  91. package/build/src/database/pool/base.js +24 -1
  92. package/build/src/database/query/where-model-class-hash.d.ts.map +1 -1
  93. package/build/src/database/query/where-model-class-hash.js +3 -1
  94. package/build/src/database/query/with-count.js +2 -2
  95. package/build/src/database/record/acts-as-list.js +3 -3
  96. package/build/src/database/record/auditing.d.ts +1 -1
  97. package/build/src/database/record/auditing.d.ts.map +1 -1
  98. package/build/src/database/record/auditing.js +24 -7
  99. package/build/src/database/record/index.d.ts +7 -7
  100. package/build/src/database/record/index.js +8 -8
  101. package/build/src/database/record/validators/uniqueness.d.ts +3 -3
  102. package/build/src/database/record/validators/uniqueness.js +4 -4
  103. package/build/src/database/tenants/data-copier.d.ts +18 -18
  104. package/build/src/database/tenants/data-copier.js +24 -24
  105. package/build/src/database/tenants/schema-cloner.d.ts +27 -27
  106. package/build/src/database/tenants/schema-cloner.js +28 -28
  107. package/build/src/environment-handlers/browser.d.ts +9 -0
  108. package/build/src/environment-handlers/browser.d.ts.map +1 -1
  109. package/build/src/environment-handlers/browser.js +1 -2
  110. package/build/src/environment-handlers/node/cli/commands/background-jobs-runner.d.ts.map +1 -1
  111. package/build/src/environment-handlers/node/cli/commands/background-jobs-runner.js +3 -2
  112. package/build/src/environment-handlers/node/cli/commands/lint/relationships.js +3 -3
  113. package/build/src/environment-handlers/node.js +2 -2
  114. package/build/src/frontend-model-controller.d.ts +9 -8
  115. package/build/src/frontend-model-controller.d.ts.map +1 -1
  116. package/build/src/frontend-model-controller.js +26 -19
  117. package/build/src/frontend-model-resource/base-resource.js +5 -5
  118. package/build/src/frontend-models/base.d.ts +4 -4
  119. package/build/src/frontend-models/base.d.ts.map +1 -1
  120. package/build/src/frontend-models/base.js +6 -6
  121. package/build/src/frontend-models/query.d.ts +7 -7
  122. package/build/src/frontend-models/query.js +13 -13
  123. package/build/src/http-server/client/index.d.ts +23 -1
  124. package/build/src/http-server/client/index.d.ts.map +1 -1
  125. package/build/src/http-server/client/index.js +55 -17
  126. package/build/src/http-server/client/request-runner.d.ts.map +1 -1
  127. package/build/src/http-server/client/request-runner.js +8 -2
  128. package/build/src/http-server/client/response.d.ts +11 -1
  129. package/build/src/http-server/client/response.d.ts.map +1 -1
  130. package/build/src/http-server/client/response.js +16 -2
  131. package/build/src/http-server/client/websocket-session.d.ts +13 -13
  132. package/build/src/http-server/client/websocket-session.js +14 -14
  133. package/build/src/http-server/server-client.d.ts +13 -0
  134. package/build/src/http-server/server-client.d.ts.map +1 -1
  135. package/build/src/http-server/server-client.js +94 -1
  136. package/build/src/http-server/websocket-channel.d.ts +12 -11
  137. package/build/src/http-server/websocket-channel.d.ts.map +1 -1
  138. package/build/src/http-server/websocket-channel.js +13 -12
  139. package/build/src/http-server/websocket-connection.d.ts +12 -11
  140. package/build/src/http-server/websocket-connection.d.ts.map +1 -1
  141. package/build/src/http-server/websocket-connection.js +13 -12
  142. package/build/src/http-server/websocket-events-host.d.ts +1 -1
  143. package/build/src/http-server/websocket-events-host.js +2 -2
  144. package/build/src/http-server/worker-handler/in-process.d.ts +2 -0
  145. package/build/src/http-server/worker-handler/in-process.d.ts.map +1 -1
  146. package/build/src/http-server/worker-handler/in-process.js +42 -11
  147. package/build/src/http-server/worker-handler/index.d.ts +21 -0
  148. package/build/src/http-server/worker-handler/index.d.ts.map +1 -1
  149. package/build/src/http-server/worker-handler/index.js +61 -7
  150. package/build/src/http-server/worker-handler/worker-thread.d.ts +30 -0
  151. package/build/src/http-server/worker-handler/worker-thread.d.ts.map +1 -1
  152. package/build/src/http-server/worker-handler/worker-thread.js +61 -1
  153. package/build/src/sync/device-identity.d.ts +2 -2
  154. package/build/src/sync/device-identity.d.ts.map +1 -1
  155. package/build/src/sync/device-identity.js +4 -4
  156. package/build/src/sync/local-mutation-log.d.ts +0 -1
  157. package/build/src/sync/local-mutation-log.d.ts.map +1 -1
  158. package/build/src/sync/local-mutation-log.js +1 -2
  159. package/build/src/sync/query-scope.d.ts +5 -0
  160. package/build/src/sync/query-scope.d.ts.map +1 -1
  161. package/build/src/sync/query-scope.js +7 -2
  162. package/build/src/sync/sync-client-types.d.ts +2 -2
  163. package/build/src/sync/sync-client-types.d.ts.map +1 -1
  164. package/build/src/sync/sync-client-types.js +1 -1
  165. package/build/src/sync/sync-client.d.ts +17 -2
  166. package/build/src/sync/sync-client.d.ts.map +1 -1
  167. package/build/src/sync/sync-client.js +28 -14
  168. package/build/src/sync/sync-realtime-bridge.d.ts +6 -2
  169. package/build/src/sync/sync-realtime-bridge.d.ts.map +1 -1
  170. package/build/src/sync/sync-realtime-bridge.js +14 -3
  171. package/build/src/sync/sync-resource-base.d.ts +14 -3
  172. package/build/src/sync/sync-resource-base.d.ts.map +1 -1
  173. package/build/src/sync/sync-resource-base.js +20 -4
  174. package/build/src/sync/sync-scope-store.d.ts +3 -3
  175. package/build/src/sync/sync-scope-store.d.ts.map +1 -1
  176. package/build/src/sync/sync-scope-store.js +7 -5
  177. package/build/src/sync/sync-websocket-channel.d.ts +10 -0
  178. package/build/src/sync/sync-websocket-channel.d.ts.map +1 -1
  179. package/build/src/sync/sync-websocket-channel.js +20 -3
  180. package/build/src/tenants/tenant-iterator.d.ts +8 -8
  181. package/build/src/tenants/tenant-iterator.js +9 -9
  182. package/build/src/tenants/tenant.d.ts +6 -6
  183. package/build/src/tenants/tenant.js +7 -7
  184. package/build/src/testing/test-runner.d.ts +16 -0
  185. package/build/src/testing/test-runner.d.ts.map +1 -1
  186. package/build/src/testing/test-runner.js +79 -19
  187. package/build/sync/device-identity.js +3 -3
  188. package/build/sync/local-mutation-log.js +0 -1
  189. package/build/sync/query-scope.js +6 -1
  190. package/build/sync/sync-client-types.js +1 -1
  191. package/build/sync/sync-client.js +28 -15
  192. package/build/sync/sync-realtime-bridge.js +13 -2
  193. package/build/sync/sync-resource-base.js +20 -3
  194. package/build/sync/sync-scope-store.js +6 -4
  195. package/build/sync/sync-websocket-channel.js +18 -2
  196. package/build/tenants/tenant-iterator.js +8 -8
  197. package/build/tenants/tenant.js +6 -6
  198. package/build/testing/test-runner.js +86 -20
  199. package/package.json +2 -2
  200. package/src/background-jobs/cron-expression.js +9 -9
  201. package/src/background-jobs/forked-runner-child.js +1 -1
  202. package/src/background-jobs/job-runner.js +21 -15
  203. package/src/background-jobs/json-socket.js +4 -0
  204. package/src/background-jobs/main.js +180 -18
  205. package/src/background-jobs/status-reporter.js +12 -5
  206. package/src/background-jobs/store.js +132 -50
  207. package/src/background-jobs/types.js +11 -3
  208. package/src/background-jobs/worker.js +9 -5
  209. package/src/beacon/client.js +13 -6
  210. package/src/configuration.js +54 -29
  211. package/src/controller.js +9 -3
  212. package/src/database/drivers/sqlite/base.js +1 -1
  213. package/src/database/drivers/sqlite/index.js +15 -14
  214. package/src/database/migrations-ledger.js +16 -16
  215. package/src/database/pool/async-tracked-multi-connection.js +16 -0
  216. package/src/database/pool/base.js +26 -0
  217. package/src/database/query/where-model-class-hash.js +2 -0
  218. package/src/database/query/with-count.js +1 -1
  219. package/src/database/record/acts-as-list.js +2 -2
  220. package/src/database/record/auditing.js +23 -6
  221. package/src/database/record/index.js +7 -7
  222. package/src/database/record/validators/uniqueness.js +3 -3
  223. package/src/database/tenants/data-copier.js +23 -23
  224. package/src/database/tenants/schema-cloner.js +27 -27
  225. package/src/environment-handlers/browser.js +0 -1
  226. package/src/environment-handlers/node/cli/commands/background-jobs-runner.js +2 -1
  227. package/src/environment-handlers/node/cli/commands/lint/relationships.js +2 -2
  228. package/src/environment-handlers/node.js +1 -1
  229. package/src/frontend-model-controller.js +26 -18
  230. package/src/frontend-model-resource/base-resource.js +4 -4
  231. package/src/frontend-models/base.js +5 -5
  232. package/src/frontend-models/query.js +12 -12
  233. package/src/http-server/client/index.js +61 -15
  234. package/src/http-server/client/request-runner.js +7 -1
  235. package/src/http-server/client/response.js +17 -1
  236. package/src/http-server/client/websocket-session.js +13 -13
  237. package/src/http-server/server-client.js +96 -0
  238. package/src/http-server/websocket-channel.js +12 -11
  239. package/src/http-server/websocket-connection.js +12 -11
  240. package/src/http-server/websocket-events-host.js +1 -1
  241. package/src/http-server/worker-handler/in-process.js +48 -9
  242. package/src/http-server/worker-handler/index.js +67 -7
  243. package/src/http-server/worker-handler/worker-thread.js +68 -0
  244. package/src/sync/device-identity.js +3 -3
  245. package/src/sync/local-mutation-log.js +0 -1
  246. package/src/sync/query-scope.js +6 -1
  247. package/src/sync/sync-client-types.js +1 -1
  248. package/src/sync/sync-client.js +28 -15
  249. package/src/sync/sync-realtime-bridge.js +13 -2
  250. package/src/sync/sync-resource-base.js +20 -3
  251. package/src/sync/sync-scope-store.js +6 -4
  252. package/src/sync/sync-websocket-channel.js +18 -2
  253. package/src/tenants/tenant-iterator.js +8 -8
  254. package/src/tenants/tenant.js +6 -6
  255. package/src/testing/test-runner.js +86 -20
@@ -83,6 +83,10 @@ export default class VelociousHttpServerClientResponse {
83
83
  * File path.
84
84
  * @type {string | null} */
85
85
  filePath = null;
86
+ /**
87
+ * File response completion callback.
88
+ * @type {((result: "completed" | "aborted") => void | Promise<void>) | null} */
89
+ fileOnFinished = null;
86
90
  /**
87
91
  * Headers.
88
92
  * @type {Record<string, string[]>} */
@@ -149,6 +153,7 @@ export default class VelociousHttpServerClientResponse {
149
153
  */
150
154
  setBody(value) {
151
155
  this.filePath = null;
156
+ this.fileOnFinished = null;
152
157
  this.body = value;
153
158
  }
154
159
  /**
@@ -158,13 +163,22 @@ export default class VelociousHttpServerClientResponse {
158
163
  getFilePath() {
159
164
  return this.filePath;
160
165
  }
166
+ /**
167
+ * Gets the file response completion callback.
168
+ * @returns {((result: "completed" | "aborted") => void | Promise<void>) | null} - File response completion callback.
169
+ */
170
+ getFileOnFinished() {
171
+ return this.fileOnFinished;
172
+ }
161
173
  /**
162
174
  * Runs set file path.
163
175
  * @param {string} path - File path.
176
+ * @param {((result: "completed" | "aborted") => void | Promise<void>) | null} [onFinished] - Completion callback.
164
177
  * @returns {void} - No return value.
165
178
  */
166
- setFilePath(path) {
179
+ setFilePath(path, onFinished = null) {
167
180
  this.filePath = path;
181
+ this.fileOnFinished = onFinished;
168
182
  this.body = null;
169
183
  }
170
184
  /**
@@ -226,4 +240,4 @@ export default class VelociousHttpServerClientResponse {
226
240
  this._requestTimeoutMsChangeHandler = handler;
227
241
  }
228
242
  }
229
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3Jlc3BvbnNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7b0NBRW9DO0FBQ3BDLE1BQU0sb0JBQW9CLEdBQUc7SUFDM0IsU0FBUyxFQUFFLEdBQUc7SUFDZCxXQUFXLEVBQUUsR0FBRztJQUNoQix1QkFBdUIsRUFBRSxHQUFHO0NBQzdCLENBQUE7QUFFRDs7b0NBRW9DO0FBQ3BDLE1BQU0sd0JBQXdCLEdBQUc7SUFDL0IsR0FBRyxFQUFFLFVBQVU7SUFDZixHQUFHLEVBQUUscUJBQXFCO0lBQzFCLEdBQUcsRUFBRSxZQUFZO0lBQ2pCLEdBQUcsRUFBRSxhQUFhO0lBQ2xCLEdBQUcsRUFBRSxJQUFJO0lBQ1QsR0FBRyxFQUFFLFNBQVM7SUFDZCxHQUFHLEVBQUUsVUFBVTtJQUNmLEdBQUcsRUFBRSwrQkFBK0I7SUFDcEMsR0FBRyxFQUFFLFlBQVk7SUFDakIsR0FBRyxFQUFFLGVBQWU7SUFDcEIsR0FBRyxFQUFFLGlCQUFpQjtJQUN0QixHQUFHLEVBQUUsY0FBYztJQUNuQixHQUFHLEVBQUUsa0JBQWtCO0lBQ3ZCLEdBQUcsRUFBRSxTQUFTO0lBQ2QsR0FBRyxFQUFFLGtCQUFrQjtJQUN2QixHQUFHLEVBQUUsbUJBQW1CO0lBQ3hCLEdBQUcsRUFBRSxPQUFPO0lBQ1osR0FBRyxFQUFFLFdBQVc7SUFDaEIsR0FBRyxFQUFFLGNBQWM7SUFDbkIsR0FBRyxFQUFFLFdBQVc7SUFDaEIsR0FBRyxFQUFFLG9CQUFvQjtJQUN6QixHQUFHLEVBQUUsb0JBQW9CO0lBQ3pCLEdBQUcsRUFBRSxhQUFhO0lBQ2xCLEdBQUcsRUFBRSxjQUFjO0lBQ25CLEdBQUcsRUFBRSxrQkFBa0I7SUFDdkIsR0FBRyxFQUFFLFdBQVc7SUFDaEIsR0FBRyxFQUFFLFdBQVc7SUFDaEIsR0FBRyxFQUFFLG9CQUFvQjtJQUN6QixH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L0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxtQkFBbUIsQ0FBQyxjQUFjO1FBQ2hDLElBQUksT0FBTyxjQUFjLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUMxRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsY0FBYyxDQUFBO1FBQ3pDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQTtRQUNwQyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUE7UUFDN0QsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsZ0NBQWdDLENBQUMsT0FBTztRQUN0QyxJQUFJLENBQUMsOEJBQThCLEdBQUcsT0FBTyxDQUFBO0lBQy9DLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIE5hbWVkIHN0YXR1cyBhbGlhc2VzLlxuICogQHR5cGUge1JlY29yZDxzdHJpbmcsIG51bWJlcj59ICovXG5jb25zdCBOQU1FRF9TVEFUVVNfQUxJQVNFUyA9IHtcbiAgXCJzdWNjZXNzXCI6IDIwMCxcbiAgXCJub3QtZm91bmRcIjogNDA0LFxuICBcImludGVybmFsLXNlcnZlci1lcnJvclwiOiA1MDBcbn1cblxuLyoqXG4gKiBTdGFuZGFyZCBzdGF0dXMgbWVzc2FnZXMuXG4gKiBAdHlwZSB7UmVjb3JkPG51bWJlciwgc3RyaW5nPn0gKi9cbmNvbnN0IFNUQU5EQVJEX1NUQVRVU19NRVNTQUdFUyA9IHtcbiAgMTAwOiBcIkNvbnRpbnVlXCIsXG4gIDEwMTogXCJTd2l0Y2hpbmcgUHJvdG9jb2xzXCIsXG4gIDEwMjogXCJQcm9jZXNzaW5nXCIsXG4gIDEwMzogXCJFYXJseSBIaW50c1wiLFxuICAyMDA6IFwiT0tcIixcbiAgMjAxOiBcIkNyZWF0ZWRcIixcbiAgMjAyOiBcIkFjY2VwdGVkXCIsXG4gIDIwMzogXCJOb24tQXV0aG9yaXRhdGl2ZSBJbmZvcm1hdGlvblwiLFxuICAyMDQ6IFwiTm8gQ29udGVudFwiLFxuICAyMDU6IFwiUmVzZXQgQ29udGVudFwiLFxuICAyMDY6IFwiUGFydGlhbCBDb250ZW50XCIsXG4gIDIwNzogXCJNdWx0aS1TdGF0dXNcIixcbiAgMjA4OiBcIkFscmVhZHkgUmVwb3J0ZWRcIixcbiAgMjI2OiBcIklNIFVzZWRcIixcbiAgMzAwOiBcIk11bHRpcGxlIENob2ljZXNcIixcbiAgMzAxOiBcIk1vdmVkIFBlcm1hbmVudGx5XCIsXG4gIDMwMjogXCJGb3VuZFwiLFxuICAzMDM6IFwiU2VlIE90aGVyXCIsXG4gIDMwNDogXCJOb3QgTW9kaWZpZWRcIixcbiAgMzA1OiBcIlVzZSBQcm94eVwiLFxuICAzMDc6IFwiVGVtcG9yYXJ5IFJlZGlyZWN0XCIsXG4gIDMwODogXCJQZXJtYW5lbnQgUmVkaXJlY3RcIixcbiAgNDAwOiBcIkJhZCBSZXF1ZXN0XCIsXG4gIDQwMTogXCJVbmF1dGhvcml6ZWRcIixcbiAgNDAyOiBcIlBheW1lbnQgUmVxdWlyZWRcIixcbiAgNDAzOiBcIkZvcmJpZGRlblwiLFxuICA0MDQ6IFwiTm90IEZvdW5kXCIsXG4gIDQwNTogXCJNZXRob2QgTm90IEFsbG93ZWRcIixcbiAgNDA2OiBcIk5vdCBBY2NlcHRhYmxlXCIsXG4gIDQwNzogXCJQcm94eSBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZFwiLFxuICA0MDg6IFwiUmVxdWVzdCBUaW1lb3V0XCIsXG4gIDQwOTogXCJDb25mbGljdFwiLFxuICA0MTA6IFwiR29uZVwiLFxuICA0MTE6IFwiTGVuZ3RoIFJlcXVpcmVkXCIsXG4gIDQxMjogXCJQcmVjb25kaXRpb24gRmFpbGVkXCIsXG4gIDQxMzogXCJQYXlsb2FkIFRvbyBMYXJnZVwiLFxuICA0MTQ6IFwiVVJJIFRvbyBMb25nXCIsXG4gIDQxNTogXCJVbnN1cHBvcnRlZCBNZWRpYSBUeXBlXCIsXG4gIDQxNjogXCJSYW5nZSBOb3QgU2F0aXNmaWFibGVcIixcbiAgNDE3OiBcIkV4cGVjdGF0aW9uIEZhaWxlZFwiLFxuICA0MTg6IFwiSSdtIGEgdGVhcG90XCIsXG4gIDQyMTogXCJNaXNkaXJlY3RlZCBSZXF1ZXN0XCIsXG4gIDQyMjogXCJVbnByb2Nlc3NhYmxlIEVudGl0eVwiLFxuICA0MjM6IFwiTG9ja2VkXCIsXG4gIDQyNDogXCJGYWlsZWQgRGVwZW5kZW5jeVwiLFxuICA0MjU6IFwiVG9vIEVhcmx5XCIsXG4gIDQyNjogXCJVcGdyYWRlIFJlcXVpcmVkXCIsXG4gIDQyODogXCJQcmVjb25kaXRpb24gUmVxdWlyZWRcIixcbiAgNDI5OiBcIlRvbyBNYW55IFJlcXVlc3RzXCIsXG4gIDQzMTogXCJSZXF1ZXN0IEhlYWRlciBGaWVsZHMgVG9vIExhcmdlXCIsXG4gIDQ1MTogXCJVbmF2YWlsYWJsZSBGb3IgTGVnYWwgUmVhc29uc1wiLFxuICA1MDA6IFwiSW50ZXJuYWwgc2VydmVyIGVycm9yXCIsXG4gIDUwMTogXCJOb3QgSW1wbGVtZW50ZWRcIixcbiAgNTAyOiBcIkJhZCBHYXRld2F5XCIsXG4gIDUwMzogXCJTZXJ2aWNlIFVuYXZhaWxhYmxlXCIsXG4gIDUwNDogXCJHYXRld2F5IFRpbWVvdXRcIixcbiAgNTA1OiBcIkhUVFAgVmVyc2lvbiBOb3QgU3VwcG9ydGVkXCIsXG4gIDUwNjogXCJWYXJpYW50IEFsc28gTmVnb3RpYXRlc1wiLFxuICA1MDc6IFwiSW5zdWZmaWNpZW50IFN0b3JhZ2VcIixcbiAgNTA4OiBcIkxvb3AgRGV0ZWN0ZWRcIixcbiAgNTEwOiBcIk5vdCBFeHRlbmRlZFwiLFxuICA1MTE6IFwiTmV0d29yayBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZFwiXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0h0dHBTZXJ2ZXJDbGllbnRSZXNwb25zZSB7XG4gIC8qKlxuICAgKiBCb2R5LlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgVWludDhBcnJheSB8IG51bGx9ICovXG4gIGJvZHkgPSBudWxsXG5cbiAgLyoqXG4gICAqIEZpbGUgcGF0aC5cbiAgICogQHR5cGUge3N0cmluZyB8IG51bGx9ICovXG4gIGZpbGVQYXRoID0gbnVsbFxuXG4gIC8qKlxuICAgKiBIZWFkZXJzLlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+fSAqL1xuICBoZWFkZXJzID0ge31cblxuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbn0pIHtcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5fcmVxdWVzdFRpbWVvdXRNcyA9IHVuZGVmaW5lZFxuICAgIHRoaXMuX3JlcXVlc3RUaW1lb3V0TXNDaGFuZ2VIYW5kbGVyID0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhZGQgaGVhZGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gS2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBWYWx1ZSB0byB1c2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIGFkZEhlYWRlcihrZXksIHZhbHVlKSB7XG4gICAgaWYgKCEoa2V5IGluIHRoaXMuaGVhZGVycykpIHtcbiAgICAgIHRoaXMuaGVhZGVyc1trZXldID0gW11cbiAgICB9XG5cbiAgICB0aGlzLmhlYWRlcnNba2V5XS5wdXNoKHZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2V0IGhlYWRlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIEtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVmFsdWUgdG8gdXNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXRIZWFkZXIoa2V5LCB2YWx1ZSkge1xuICAgIHRoaXMuaGVhZGVyc1trZXldID0gW3ZhbHVlXVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGJvZHkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBVaW50OEFycmF5IHwgbnVsbH0gLSBUaGUgYm9keS5cbiAgICovXG4gIGdldEJvZHkoKSB7XG4gICAgaWYgKHRoaXMuYm9keSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5ib2R5XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gYm9keSBoYXMgYmVlbiBzZXRcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBzdGF0dXMgY29kZS5cbiAgICogQHJldHVybnMge251bWJlcn0gLSBUaGUgc3RhdHVzIGNvZGUuXG4gICAqL1xuICBnZXRTdGF0dXNDb2RlKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXR1c0NvZGUgfHwgMjAwXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgc3RhdHVzIG1lc3NhZ2UuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIHN0YXR1cyBtZXNzYWdlLlxuICAgKi9cbiAgZ2V0U3RhdHVzTWVzc2FnZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0dXNNZXNzYWdlIHx8IFwiT0tcIlxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2V0IGJvZHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVWludDhBcnJheX0gdmFsdWUgLSBWYWx1ZSB0byB1c2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNldEJvZHkodmFsdWUpIHtcbiAgICB0aGlzLmZpbGVQYXRoID0gbnVsbFxuICAgIHRoaXMuYm9keSA9IHZhbHVlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgZmlsZSBwYXRoLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gLSBGaWxlIHBhdGguXG4gICAqL1xuICBnZXRGaWxlUGF0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5maWxlUGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2V0IGZpbGUgcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBGaWxlIHBhdGguXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNldEZpbGVQYXRoKHBhdGgpIHtcbiAgICB0aGlzLmZpbGVQYXRoID0gcGF0aFxuICAgIHRoaXMuYm9keSA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNldCBlcnJvciBib2R5LlxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIEVycm9yIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXRFcnJvckJvZHkoZXJyb3IpIHtcbiAgICB0aGlzLnNldEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcInRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcIilcbiAgICB0aGlzLnNldEJvZHkoYCR7ZXJyb3IubWVzc2FnZX1cXG5cXG4ke2Vycm9yLnN0YWNrfWApXG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0cyBhIG51bWVyaWMgSFRUUCBzdGF0dXMgY29kZSAoZS5nLiBgNDIyYCkgb3Igb25lIG9mIHRoZVxuICAgKiBuYW1lZCBhbGlhc2VzIChgXCJzdWNjZXNzXCJgLCBgXCJub3QtZm91bmRcImAsIGBcImludGVybmFsLXNlcnZlci1lcnJvclwiYCkuXG4gICAqIE51bWVyaWMgaW5wdXRzIGluIHRoZSBzdGFuZGFyZCAxeHgtNXh4IHJhbmdlIHJlc29sdmUgdGhlaXIgb3duXG4gICAqIHN0YXR1cyBtZXNzYWdlcyBmcm9tIHRoZSBJQU5BIHJlZ2lzdHJ5OyBhbGlhc2VzIGtlZXAgdGhlXG4gICAqIGJhY2stY29tcGF0aWJsZSBjb2RlIG1hcHBpbmcuXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgc3RyaW5nfSBzdGF0dXMgLSBTdGF0dXMuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNldFN0YXR1cyhzdGF0dXMpIHtcbiAgICBjb25zdCBhbGlhc0NvZGUgPSBOQU1FRF9TVEFUVVNfQUxJQVNFU1tTdHJpbmcoc3RhdHVzKV1cbiAgICBjb25zdCBudW1lcmljU3RhdHVzID0gYWxpYXNDb2RlID8/IE51bWJlcihzdGF0dXMpXG5cbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobnVtZXJpY1N0YXR1cykgfHwgbnVtZXJpY1N0YXR1cyA8IDEwMCB8fCBudW1lcmljU3RhdHVzID4gNTk5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBzdGF0dXM6ICR7c3RhdHVzfWApXG4gICAgfVxuXG4gICAgdGhpcy5zdGF0dXNDb2RlID0gbnVtZXJpY1N0YXR1c1xuICAgIHRoaXMuc3RhdHVzTWVzc2FnZSA9IFNUQU5EQVJEX1NUQVRVU19NRVNTQUdFU1tudW1lcmljU3RhdHVzXSB8fCBcIk9LXCJcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCByZXF1ZXN0IHRpbWVvdXQgbXMuXG4gICAqIEByZXR1cm5zIHtudW1iZXIgfCB1bmRlZmluZWR9IC0gUmVxdWVzdCB0aW1lb3V0IGluIHNlY29uZHMuXG4gICAqL1xuICBnZXRSZXF1ZXN0VGltZW91dE1zKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0VGltZW91dE1zXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgcmVxdWVzdCB0aW1lb3V0IG1zLlxuICAgKiBAcGFyYW0ge251bWJlciB8IHVuZGVmaW5lZCB8IG51bGx9IHRpbWVvdXRTZWNvbmRzIC0gVGltZW91dCBpbiBzZWNvbmRzLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXRSZXF1ZXN0VGltZW91dE1zKHRpbWVvdXRTZWNvbmRzKSB7XG4gICAgaWYgKHR5cGVvZiB0aW1lb3V0U2Vjb25kcyA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNGaW5pdGUodGltZW91dFNlY29uZHMpKSB7XG4gICAgICB0aGlzLl9yZXF1ZXN0VGltZW91dE1zID0gdGltZW91dFNlY29uZHNcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVxdWVzdFRpbWVvdXRNcyA9IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGlmICh0aGlzLl9yZXF1ZXN0VGltZW91dE1zQ2hhbmdlSGFuZGxlcikge1xuICAgICAgdGhpcy5fcmVxdWVzdFRpbWVvdXRNc0NoYW5nZUhhbmRsZXIodGhpcy5fcmVxdWVzdFRpbWVvdXRNcylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgcmVxdWVzdCB0aW1lb3V0IG1zIGNoYW5nZSBoYW5kbGVyLlxuICAgKiBAcGFyYW0geyh0aW1lb3V0U2Vjb25kczogbnVtYmVyIHwgdW5kZWZpbmVkKSA9PiB2b2lkfSBoYW5kbGVyIC0gQ2hhbmdlIGhhbmRsZXIuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNldFJlcXVlc3RUaW1lb3V0TXNDaGFuZ2VIYW5kbGVyKGhhbmRsZXIpIHtcbiAgICB0aGlzLl9yZXF1ZXN0VGltZW91dE1zQ2hhbmdlSGFuZGxlciA9IGhhbmRsZXJcbiAgfVxufVxuIl19
243
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3Jlc3BvbnNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7b0NBRW9DO0FBQ3BDLE1BQU0sb0JBQW9CLEdBQUc7SUFDM0IsU0FBUyxFQUFFLEdBQUc7SUFDZCxXQUFXLEVBQUUsR0FBRztJQUNoQix1QkFBdUIsRUFBRSxHQUFHO0NBQzdCLENBQUE7QUFFRDs7b0NBRW9DO0FBQ3BDLE1BQU0sd0JBQXdCLEdBQUc7SUFDL0IsR0FBRyxFQUFFLFVBQVU7SUFDZixHQUFHLEVBQUUscUJBQXFCO0lBQzFCLEdBQUcsRUFBRSxZQUFZO0lBQ2pCLEdBQUcsRUFBRSxhQUFhO0lBQ2xCLEdBQUcsRUFBRSxJQUFJO0lBQ1QsR0FBRyxFQUFFLFNBQVM7SUFDZCxHQUFHLEVBQUUsVUFBVTtJQUNmLEdBQUcsRUFBRSwrQkFBK0I7SUFDcEMsR0FBRyxFQUFFLFlBQVk7SUFDakIsR0FBRyxFQUFFLGVBQWU7SUFDcEIsR0FBRyxFQUFFLGlCQUFpQjtJQUN0QixHQUFHLEVBQUUsY0FBYztJQUNuQixHQUFHLEVBQUUsa0JBQWtCO0lBQ3ZCLEdBQUcsRUFBRSxTQUFTO0lBQ2QsR0FBRyxFQUFFLGtCQUFrQjtJQUN2QixHQUFHLEVBQUUsbUJBQW1CO0lBQ3hCLEdBQUcsRUFBRSxPQUFPO0lBQ1osR0FBRyxFQUFFLFdBQVc7SUFDaEIsR0FBRyxFQUFFLGNBQWM7SUFDbkIsR0FBRyxFQUFFLFdBQVc7SUFDaEIsR0FBRyxFQUFFLG9CQUFvQjtJQUN6QixHQUFHLEVBQUUsb0JBQW9CO0lBQ3pCLEdBQUcsRUFBRSxhQUFhO0lBQ2xCLEdBQUcsRUFBRSxjQUFjO0lBQ25CLEdBQUcsRUFBRSxrQkFBa0I7SUFDdkIsR0FBRyxFQUFFLFdBQVc7SUFDaEIsR0FBRyxFQUFFLFdBQVc7SUFDaEIsR0FBRyxFQUFFLG9CQUFvQjtJQUN6QixH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QUFNLEVBQUUsQ0FBQyxDQUFBO1FBQ2hELENBQUM7UUFFRCxJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQTtRQUMvQixJQUFJLENBQUMsYUFBYSxHQUFHLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyxJQUFJLElBQUksQ0FBQTtJQUN0RSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsbUJBQW1CO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFBO0lBQy9CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsbUJBQW1CLENBQUMsY0FBYztRQUNoQyxJQUFJLE9BQU8sY0FBYyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDMUUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGNBQWMsQ0FBQTtRQUN6QyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUE7UUFDcEMsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1FBQzdELENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGdDQUFnQyxDQUFDLE9BQU87UUFDdEMsSUFBSSxDQUFDLDhCQUE4QixHQUFHLE9BQU8sQ0FBQTtJQUMvQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBOYW1lZCBzdGF0dXMgYWxpYXNlcy5cbiAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXI+fSAqL1xuY29uc3QgTkFNRURfU1RBVFVTX0FMSUFTRVMgPSB7XG4gIFwic3VjY2Vzc1wiOiAyMDAsXG4gIFwibm90LWZvdW5kXCI6IDQwNCxcbiAgXCJpbnRlcm5hbC1zZXJ2ZXItZXJyb3JcIjogNTAwXG59XG5cbi8qKlxuICogU3RhbmRhcmQgc3RhdHVzIG1lc3NhZ2VzLlxuICogQHR5cGUge1JlY29yZDxudW1iZXIsIHN0cmluZz59ICovXG5jb25zdCBTVEFOREFSRF9TVEFUVVNfTUVTU0FHRVMgPSB7XG4gIDEwMDogXCJDb250aW51ZVwiLFxuICAxMDE6IFwiU3dpdGNoaW5nIFByb3RvY29sc1wiLFxuICAxMDI6IFwiUHJvY2Vzc2luZ1wiLFxuICAxMDM6IFwiRWFybHkgSGludHNcIixcbiAgMjAwOiBcIk9LXCIsXG4gIDIwMTogXCJDcmVhdGVkXCIsXG4gIDIwMjogXCJBY2NlcHRlZFwiLFxuICAyMDM6IFwiTm9uLUF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb25cIixcbiAgMjA0OiBcIk5vIENvbnRlbnRcIixcbiAgMjA1OiBcIlJlc2V0IENvbnRlbnRcIixcbiAgMjA2OiBcIlBhcnRpYWwgQ29udGVudFwiLFxuICAyMDc6IFwiTXVsdGktU3RhdHVzXCIsXG4gIDIwODogXCJBbHJlYWR5IFJlcG9ydGVkXCIsXG4gIDIyNjogXCJJTSBVc2VkXCIsXG4gIDMwMDogXCJNdWx0aXBsZSBDaG9pY2VzXCIsXG4gIDMwMTogXCJNb3ZlZCBQZXJtYW5lbnRseVwiLFxuICAzMDI6IFwiRm91bmRcIixcbiAgMzAzOiBcIlNlZSBPdGhlclwiLFxuICAzMDQ6IFwiTm90IE1vZGlmaWVkXCIsXG4gIDMwNTogXCJVc2UgUHJveHlcIixcbiAgMzA3OiBcIlRlbXBvcmFyeSBSZWRpcmVjdFwiLFxuICAzMDg6IFwiUGVybWFuZW50IFJlZGlyZWN0XCIsXG4gIDQwMDogXCJCYWQgUmVxdWVzdFwiLFxuICA0MDE6IFwiVW5hdXRob3JpemVkXCIsXG4gIDQwMjogXCJQYXltZW50IFJlcXVpcmVkXCIsXG4gIDQwMzogXCJGb3JiaWRkZW5cIixcbiAgNDA0OiBcIk5vdCBGb3VuZFwiLFxuICA0MDU6IFwiTWV0aG9kIE5vdCBBbGxvd2VkXCIsXG4gIDQwNjogXCJOb3QgQWNjZXB0YWJsZVwiLFxuICA0MDc6IFwiUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWRcIixcbiAgNDA4OiBcIlJlcXVlc3QgVGltZW91dFwiLFxuICA0MDk6IFwiQ29uZmxpY3RcIixcbiAgNDEwOiBcIkdvbmVcIixcbiAgNDExOiBcIkxlbmd0aCBSZXF1aXJlZFwiLFxuICA0MTI6IFwiUHJlY29uZGl0aW9uIEZhaWxlZFwiLFxuICA0MTM6IFwiUGF5bG9hZCBUb28gTGFyZ2VcIixcbiAgNDE0OiBcIlVSSSBUb28gTG9uZ1wiLFxuICA0MTU6IFwiVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZVwiLFxuICA0MTY6IFwiUmFuZ2UgTm90IFNhdGlzZmlhYmxlXCIsXG4gIDQxNzogXCJFeHBlY3RhdGlvbiBGYWlsZWRcIixcbiAgNDE4OiBcIkknbSBhIHRlYXBvdFwiLFxuICA0MjE6IFwiTWlzZGlyZWN0ZWQgUmVxdWVzdFwiLFxuICA0MjI6IFwiVW5wcm9jZXNzYWJsZSBFbnRpdHlcIixcbiAgNDIzOiBcIkxvY2tlZFwiLFxuICA0MjQ6IFwiRmFpbGVkIERlcGVuZGVuY3lcIixcbiAgNDI1OiBcIlRvbyBFYXJseVwiLFxuICA0MjY6IFwiVXBncmFkZSBSZXF1aXJlZFwiLFxuICA0Mjg6IFwiUHJlY29uZGl0aW9uIFJlcXVpcmVkXCIsXG4gIDQyOTogXCJUb28gTWFueSBSZXF1ZXN0c1wiLFxuICA0MzE6IFwiUmVxdWVzdCBIZWFkZXIgRmllbGRzIFRvbyBMYXJnZVwiLFxuICA0NTE6IFwiVW5hdmFpbGFibGUgRm9yIExlZ2FsIFJlYXNvbnNcIixcbiAgNTAwOiBcIkludGVybmFsIHNlcnZlciBlcnJvclwiLFxuICA1MDE6IFwiTm90IEltcGxlbWVudGVkXCIsXG4gIDUwMjogXCJCYWQgR2F0ZXdheVwiLFxuICA1MDM6IFwiU2VydmljZSBVbmF2YWlsYWJsZVwiLFxuICA1MDQ6IFwiR2F0ZXdheSBUaW1lb3V0XCIsXG4gIDUwNTogXCJIVFRQIFZlcnNpb24gTm90IFN1cHBvcnRlZFwiLFxuICA1MDY6IFwiVmFyaWFudCBBbHNvIE5lZ290aWF0ZXNcIixcbiAgNTA3OiBcIkluc3VmZmljaWVudCBTdG9yYWdlXCIsXG4gIDUwODogXCJMb29wIERldGVjdGVkXCIsXG4gIDUxMDogXCJOb3QgRXh0ZW5kZWRcIixcbiAgNTExOiBcIk5ldHdvcmsgQXV0aGVudGljYXRpb24gUmVxdWlyZWRcIlxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNIdHRwU2VydmVyQ2xpZW50UmVzcG9uc2Uge1xuICAvKipcbiAgICogQm9keS5cbiAgICogQHR5cGUge3N0cmluZyB8IFVpbnQ4QXJyYXkgfCBudWxsfSAqL1xuICBib2R5ID0gbnVsbFxuXG4gIC8qKlxuICAgKiBGaWxlIHBhdGguXG4gICAqIEB0eXBlIHtzdHJpbmcgfCBudWxsfSAqL1xuICBmaWxlUGF0aCA9IG51bGxcblxuICAvKipcbiAgICogRmlsZSByZXNwb25zZSBjb21wbGV0aW9uIGNhbGxiYWNrLlxuICAgKiBAdHlwZSB7KChyZXN1bHQ6IFwiY29tcGxldGVkXCIgfCBcImFib3J0ZWRcIikgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4pIHwgbnVsbH0gKi9cbiAgZmlsZU9uRmluaXNoZWQgPSBudWxsXG5cbiAgLyoqXG4gICAqIEhlYWRlcnMuXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59ICovXG4gIGhlYWRlcnMgPSB7fVxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9ufSkge1xuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLl9yZXF1ZXN0VGltZW91dE1zID0gdW5kZWZpbmVkXG4gICAgdGhpcy5fcmVxdWVzdFRpbWVvdXRNc0NoYW5nZUhhbmRsZXIgPSB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFkZCBoZWFkZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBLZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFZhbHVlIHRvIHVzZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgYWRkSGVhZGVyKGtleSwgdmFsdWUpIHtcbiAgICBpZiAoIShrZXkgaW4gdGhpcy5oZWFkZXJzKSkge1xuICAgICAgdGhpcy5oZWFkZXJzW2tleV0gPSBbXVxuICAgIH1cblxuICAgIHRoaXMuaGVhZGVyc1trZXldLnB1c2godmFsdWUpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgaGVhZGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gS2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBWYWx1ZSB0byB1c2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNldEhlYWRlcihrZXksIHZhbHVlKSB7XG4gICAgdGhpcy5oZWFkZXJzW2tleV0gPSBbdmFsdWVdXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgYm9keS5cbiAgICogQHJldHVybnMge3N0cmluZyB8IFVpbnQ4QXJyYXkgfCBudWxsfSAtIFRoZSBib2R5LlxuICAgKi9cbiAgZ2V0Qm9keSgpIHtcbiAgICBpZiAodGhpcy5ib2R5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmJvZHlcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBib2R5IGhhcyBiZWVuIHNldFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IHN0YXR1cyBjb2RlLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSAtIFRoZSBzdGF0dXMgY29kZS5cbiAgICovXG4gIGdldFN0YXR1c0NvZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzQ29kZSB8fCAyMDBcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBzdGF0dXMgbWVzc2FnZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgc3RhdHVzIG1lc3NhZ2UuXG4gICAqL1xuICBnZXRTdGF0dXNNZXNzYWdlKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXR1c01lc3NhZ2UgfHwgXCJPS1wiXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgYm9keS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBVaW50OEFycmF5fSB2YWx1ZSAtIFZhbHVlIHRvIHVzZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2V0Qm9keSh2YWx1ZSkge1xuICAgIHRoaXMuZmlsZVBhdGggPSBudWxsXG4gICAgdGhpcy5maWxlT25GaW5pc2hlZCA9IG51bGxcbiAgICB0aGlzLmJvZHkgPSB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGZpbGUgcGF0aC5cbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IC0gRmlsZSBwYXRoLlxuICAgKi9cbiAgZ2V0RmlsZVBhdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsZVBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBmaWxlIHJlc3BvbnNlIGNvbXBsZXRpb24gY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHsoKHJlc3VsdDogXCJjb21wbGV0ZWRcIiB8IFwiYWJvcnRlZFwiKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPikgfCBudWxsfSAtIEZpbGUgcmVzcG9uc2UgY29tcGxldGlvbiBjYWxsYmFjay5cbiAgICovXG4gIGdldEZpbGVPbkZpbmlzaGVkKCkge1xuICAgIHJldHVybiB0aGlzLmZpbGVPbkZpbmlzaGVkXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgZmlsZSBwYXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIEZpbGUgcGF0aC5cbiAgICogQHBhcmFtIHsoKHJlc3VsdDogXCJjb21wbGV0ZWRcIiB8IFwiYWJvcnRlZFwiKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPikgfCBudWxsfSBbb25GaW5pc2hlZF0gLSBDb21wbGV0aW9uIGNhbGxiYWNrLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXRGaWxlUGF0aChwYXRoLCBvbkZpbmlzaGVkID0gbnVsbCkge1xuICAgIHRoaXMuZmlsZVBhdGggPSBwYXRoXG4gICAgdGhpcy5maWxlT25GaW5pc2hlZCA9IG9uRmluaXNoZWRcbiAgICB0aGlzLmJvZHkgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgZXJyb3IgYm9keS5cbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBFcnJvciBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2V0RXJyb3JCb2R5KGVycm9yKSB7XG4gICAgdGhpcy5zZXRIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJ0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XCIpXG4gICAgdGhpcy5zZXRCb2R5KGAke2Vycm9yLm1lc3NhZ2V9XFxuXFxuJHtlcnJvci5zdGFja31gKVxuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdHMgYSBudW1lcmljIEhUVFAgc3RhdHVzIGNvZGUgKGUuZy4gYDQyMmApIG9yIG9uZSBvZiB0aGVcbiAgICogbmFtZWQgYWxpYXNlcyAoYFwic3VjY2Vzc1wiYCwgYFwibm90LWZvdW5kXCJgLCBgXCJpbnRlcm5hbC1zZXJ2ZXItZXJyb3JcImApLlxuICAgKiBOdW1lcmljIGlucHV0cyBpbiB0aGUgc3RhbmRhcmQgMXh4LTV4eCByYW5nZSByZXNvbHZlIHRoZWlyIG93blxuICAgKiBzdGF0dXMgbWVzc2FnZXMgZnJvbSB0aGUgSUFOQSByZWdpc3RyeTsgYWxpYXNlcyBrZWVwIHRoZVxuICAgKiBiYWNrLWNvbXBhdGlibGUgY29kZSBtYXBwaW5nLlxuICAgKiBAcGFyYW0ge251bWJlciB8IHN0cmluZ30gc3RhdHVzIC0gU3RhdHVzLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXRTdGF0dXMoc3RhdHVzKSB7XG4gICAgY29uc3QgYWxpYXNDb2RlID0gTkFNRURfU1RBVFVTX0FMSUFTRVNbU3RyaW5nKHN0YXR1cyldXG4gICAgY29uc3QgbnVtZXJpY1N0YXR1cyA9IGFsaWFzQ29kZSA/PyBOdW1iZXIoc3RhdHVzKVxuXG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG51bWVyaWNTdGF0dXMpIHx8IG51bWVyaWNTdGF0dXMgPCAxMDAgfHwgbnVtZXJpY1N0YXR1cyA+IDU5OSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmhhbmRsZWQgc3RhdHVzOiAke3N0YXR1c31gKVxuICAgIH1cblxuICAgIHRoaXMuc3RhdHVzQ29kZSA9IG51bWVyaWNTdGF0dXNcbiAgICB0aGlzLnN0YXR1c01lc3NhZ2UgPSBTVEFOREFSRF9TVEFUVVNfTUVTU0FHRVNbbnVtZXJpY1N0YXR1c10gfHwgXCJPS1wiXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgcmVxdWVzdCB0aW1lb3V0IG1zLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyIHwgdW5kZWZpbmVkfSAtIFJlcXVlc3QgdGltZW91dCBpbiBzZWNvbmRzLlxuICAgKi9cbiAgZ2V0UmVxdWVzdFRpbWVvdXRNcygpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdFRpbWVvdXRNc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2V0IHJlcXVlc3QgdGltZW91dCBtcy5cbiAgICogQHBhcmFtIHtudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsfSB0aW1lb3V0U2Vjb25kcyAtIFRpbWVvdXQgaW4gc2Vjb25kcy5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2V0UmVxdWVzdFRpbWVvdXRNcyh0aW1lb3V0U2Vjb25kcykge1xuICAgIGlmICh0eXBlb2YgdGltZW91dFNlY29uZHMgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKHRpbWVvdXRTZWNvbmRzKSkge1xuICAgICAgdGhpcy5fcmVxdWVzdFRpbWVvdXRNcyA9IHRpbWVvdXRTZWNvbmRzXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3JlcXVlc3RUaW1lb3V0TXMgPSB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcmVxdWVzdFRpbWVvdXRNc0NoYW5nZUhhbmRsZXIpIHtcbiAgICAgIHRoaXMuX3JlcXVlc3RUaW1lb3V0TXNDaGFuZ2VIYW5kbGVyKHRoaXMuX3JlcXVlc3RUaW1lb3V0TXMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2V0IHJlcXVlc3QgdGltZW91dCBtcyBjaGFuZ2UgaGFuZGxlci5cbiAgICogQHBhcmFtIHsodGltZW91dFNlY29uZHM6IG51bWJlciB8IHVuZGVmaW5lZCkgPT4gdm9pZH0gaGFuZGxlciAtIENoYW5nZSBoYW5kbGVyLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXRSZXF1ZXN0VGltZW91dE1zQ2hhbmdlSGFuZGxlcihoYW5kbGVyKSB7XG4gICAgdGhpcy5fcmVxdWVzdFRpbWVvdXRNc0NoYW5nZUhhbmRsZXIgPSBoYW5kbGVyXG4gIH1cbn1cbiJdfQ==
@@ -142,7 +142,7 @@ export default class VelociousHttpServerClientWebsocketSession {
142
142
  * Removes a closed connection from the session registry. Called by
143
143
  * `VelociousWebsocketConnection.close()` after it sends the final
144
144
  * `connection-closed` frame.
145
- * @param {string} connectionId
145
+ * @param {string} connectionId - Closed connection identifier to remove.
146
146
  * @returns {void}
147
147
  */
148
148
  _removeConnection(connectionId: string): void;
@@ -215,7 +215,7 @@ export default class VelociousHttpServerClientWebsocketSession {
215
215
  * The actual message dispatch, extracted so
216
216
  * `configuration.getWebsocketAroundRequest()` can wrap it in any
217
217
  * per-request context (AsyncLocalStorage, tracing, etc.).
218
- * @param {WebsocketSessionMessage} message
218
+ * @param {WebsocketSessionMessage} message - Decoded client frame to dispatch by message type.
219
219
  * @returns {Promise<void>}
220
220
  */
221
221
  _handleMessageInner(message: WebsocketSessionMessage): Promise<void>;
@@ -229,8 +229,8 @@ export default class VelociousHttpServerClientWebsocketSession {
229
229
  * fragmented message. Returns true when the fragment was accepted
230
230
  * and false when the per-message cap was hit and the socket has
231
231
  * been closed.
232
- * @param {Buffer} payload
233
- * @returns {boolean}
232
+ * @param {Buffer} payload - Continuation-frame bytes to append.
233
+ * @returns {boolean} - Whether the fragment was accepted.
234
234
  */
235
235
  _appendFragment(payload: Buffer): boolean;
236
236
  /**
@@ -239,7 +239,7 @@ export default class VelociousHttpServerClientWebsocketSession {
239
239
  * close frame, and tears the session down. Returns true when the
240
240
  * caller can continue processing, false when the session is being
241
241
  * closed.
242
- * @returns {boolean}
242
+ * @returns {boolean} - Whether fragment processing may continue.
243
243
  */
244
244
  _enforceFragmentLimits(): boolean;
245
245
  /**
@@ -315,7 +315,7 @@ export default class VelociousHttpServerClientWebsocketSession {
315
315
  * The returned promise is stored at pause time and awaited at
316
316
  * resume time so we can reject resume attempts from a different
317
317
  * authenticated caller (signed out, swapped user, expired cookie).
318
- * @returns {Promise<?>}
318
+ * @returns {Promise<?>} - Captured authenticated identity for resume validation.
319
319
  */
320
320
  _captureResumeIdentity(): Promise<unknown>;
321
321
  /**
@@ -343,7 +343,7 @@ export default class VelociousHttpServerClientWebsocketSession {
343
343
  * created one whose socket just connected) transfers state from
344
344
  * the paused session and instructs the client via
345
345
  * `session-resumed` or `session-gone`.
346
- * @param {Record<string, ?>} message
346
+ * @param {Record<string, ?>} message - Session-resume frame containing the paused session identifier.
347
347
  * @returns {Promise<void>}
348
348
  */
349
349
  _handleSessionResume(message: Record<string, unknown>): Promise<void>;
@@ -351,7 +351,7 @@ export default class VelociousHttpServerClientWebsocketSession {
351
351
  * Fires `onClose(reason)` on every live app-defined connection, then
352
352
  * drops them from the registry. No network frame is sent — the
353
353
  * socket is already going away.
354
- * @param {"session_destroyed" | "grace_expired" | "error"} reason
354
+ * @param {"session_destroyed" | "grace_expired" | "error"} reason - Permanent teardown reason passed to each connection.
355
355
  * @returns {Promise<void>}
356
356
  */
357
357
  _teardownConnections(reason: "session_destroyed" | "grace_expired" | "error"): Promise<void>;
@@ -360,20 +360,20 @@ export default class VelociousHttpServerClientWebsocketSession {
360
360
  * registered connection class, stores it on `_connections`, and
361
361
  * fires `onConnect()`. Sends `connection-opened` on success or
362
362
  * `connection-error` on failure.
363
- * @param {Record<string, ?>} message
363
+ * @param {Record<string, ?>} message - Connection-open frame naming the connection type and identifier.
364
364
  * @returns {Promise<void>}
365
365
  */
366
366
  _handleConnectionOpen(message: Record<string, unknown>): Promise<void>;
367
367
  /**
368
368
  * Handles a `{type: "connection-message"}` from the client.
369
- * @param {Record<string, ?>} message
369
+ * @param {Record<string, ?>} message - Connection-message frame containing the target identifier and body.
370
370
  * @returns {Promise<void>}
371
371
  */
372
372
  _handleConnectionMessage(message: Record<string, unknown>): Promise<void>;
373
373
  /**
374
374
  * Handles a `{type: "connection-close"}` from the client — fires
375
375
  * `onClose("client_close")` and confirms with `connection-closed`.
376
- * @param {Record<string, ?>} message
376
+ * @param {Record<string, ?>} message - Connection-close frame containing the target identifier.
377
377
  * @returns {Promise<void>}
378
378
  */
379
379
  _handleConnectionClose(message: Record<string, unknown>): Promise<void>;
@@ -381,7 +381,7 @@ export default class VelociousHttpServerClientWebsocketSession {
381
381
  * Handles `{type: "channel-subscribe"}` — runs `canSubscribe()`,
382
382
  * registers with the Configuration's global routing registry on
383
383
  * success, and sends `channel-subscribed` or `channel-error`.
384
- * @param {Record<string, ?>} message
384
+ * @param {Record<string, ?>} message - Channel-subscribe frame describing the requested subscription.
385
385
  * @returns {Promise<void>}
386
386
  */
387
387
  _handleChannelSubscribe(message: Record<string, unknown>): Promise<void>;
@@ -403,7 +403,7 @@ export default class VelociousHttpServerClientWebsocketSession {
403
403
  /**
404
404
  * Handles `{type: "channel-unsubscribe"}` from the client — calls
405
405
  * `unsubscribed()` and sends `channel-unsubscribed`.
406
- * @param {Record<string, ?>} message
406
+ * @param {Record<string, ?>} message - Channel-unsubscribe frame containing the subscription identifier.
407
407
  * @returns {Promise<void>}
408
408
  */
409
409
  _handleChannelUnsubscribe(message: Record<string, unknown>): Promise<void>;