@qlever-llc/trellis 0.8.3 → 0.9.0-rc.10

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 (693) hide show
  1. package/README.md +1 -1
  2. package/bin/trellis-generate.js +132 -0
  3. package/esm/auth/browser/login.d.ts.map +1 -1
  4. package/esm/auth/browser/login.js +46 -3
  5. package/esm/auth/browser/portal.d.ts.map +1 -1
  6. package/esm/auth/browser/portal.js +5 -1
  7. package/esm/auth/browser/session.d.ts +18 -7
  8. package/esm/auth/browser/session.d.ts.map +1 -1
  9. package/esm/auth/browser/session.js +47 -11
  10. package/esm/auth/browser/storage.d.ts +6 -1
  11. package/esm/auth/browser/storage.d.ts.map +1 -1
  12. package/esm/auth/browser/storage.js +15 -3
  13. package/esm/auth/browser.d.ts +2 -2
  14. package/esm/auth/browser.d.ts.map +1 -1
  15. package/esm/auth/browser.js +1 -1
  16. package/esm/auth/device_activation.d.ts +36 -33
  17. package/esm/auth/device_activation.d.ts.map +1 -1
  18. package/esm/auth/device_activation.js +26 -22
  19. package/esm/auth/mod.d.ts +4 -4
  20. package/esm/auth/mod.d.ts.map +1 -1
  21. package/esm/auth/mod.js +2 -2
  22. package/esm/auth/proof.d.ts +3 -1
  23. package/esm/auth/proof.d.ts.map +1 -1
  24. package/esm/auth/proof.js +21 -15
  25. package/esm/auth/protocol.d.ts +2457 -941
  26. package/esm/auth/protocol.d.ts.map +1 -1
  27. package/esm/auth/protocol.js +747 -375
  28. package/esm/auth/schemas.d.ts +25 -4
  29. package/esm/auth/schemas.d.ts.map +1 -1
  30. package/esm/auth/schemas.js +14 -4
  31. package/esm/auth/session_auth.d.ts +1 -1
  32. package/esm/auth/session_auth.d.ts.map +1 -1
  33. package/esm/auth/session_auth.js +7 -1
  34. package/esm/client_connect.d.ts +2 -0
  35. package/esm/client_connect.d.ts.map +1 -1
  36. package/esm/client_connect.js +76 -15
  37. package/esm/contract.d.ts +3 -0
  38. package/esm/contract.d.ts.map +1 -1
  39. package/esm/contract_support/mod.d.ts +422 -43
  40. package/esm/contract_support/mod.d.ts.map +1 -1
  41. package/esm/contract_support/mod.js +734 -33
  42. package/esm/contract_support/protocol.d.ts +20 -5
  43. package/esm/contract_support/protocol.d.ts.map +1 -1
  44. package/esm/contract_support/protocol.js +18 -10
  45. package/esm/contract_support/runtime.d.ts +11 -0
  46. package/esm/contract_support/runtime.d.ts.map +1 -1
  47. package/esm/contract_support/schema_pointers.d.ts.map +1 -1
  48. package/esm/contract_support/schema_pointers.js +32 -14
  49. package/esm/device.d.ts +2 -0
  50. package/esm/device.d.ts.map +1 -1
  51. package/esm/device.js +3 -0
  52. package/esm/errors/AuthError.d.ts +2 -1
  53. package/esm/errors/AuthError.d.ts.map +1 -1
  54. package/esm/errors/AuthError.js +8 -3
  55. package/esm/errors/index.d.ts +4 -4
  56. package/esm/errors/index.d.ts.map +1 -1
  57. package/esm/errors/index.js +1 -0
  58. package/esm/generated-sdk/auth/api.d.ts +27 -9
  59. package/esm/generated-sdk/auth/api.d.ts.map +1 -1
  60. package/esm/generated-sdk/auth/api.js +16 -590
  61. package/esm/generated-sdk/auth/client.d.ts +91 -85
  62. package/esm/generated-sdk/auth/client.d.ts.map +1 -1
  63. package/esm/generated-sdk/auth/contract.d.ts +1 -1
  64. package/esm/generated-sdk/auth/contract.d.ts.map +1 -1
  65. package/esm/generated-sdk/auth/contract.js +4 -2
  66. package/esm/generated-sdk/auth/mod.d.ts +1 -0
  67. package/esm/generated-sdk/auth/mod.d.ts.map +1 -1
  68. package/esm/generated-sdk/auth/owned_api.d.ts +3 -0
  69. package/esm/generated-sdk/auth/owned_api.d.ts.map +1 -0
  70. package/esm/generated-sdk/auth/owned_api.js +594 -0
  71. package/esm/generated-sdk/auth/schemas.d.ts +9959 -5160
  72. package/esm/generated-sdk/auth/schemas.d.ts.map +1 -1
  73. package/esm/generated-sdk/auth/schemas.js +136 -137
  74. package/esm/generated-sdk/auth/types.d.ts +2418 -1557
  75. package/esm/generated-sdk/auth/types.d.ts.map +1 -1
  76. package/esm/generated-sdk/auth/types.js +1 -1
  77. package/esm/generated-sdk/health/api.d.ts +24 -9
  78. package/esm/generated-sdk/health/api.d.ts.map +1 -1
  79. package/esm/generated-sdk/health/api.js +12 -20
  80. package/esm/generated-sdk/health/client.d.ts +2 -1
  81. package/esm/generated-sdk/health/client.d.ts.map +1 -1
  82. package/esm/generated-sdk/health/contract.d.ts.map +1 -1
  83. package/esm/generated-sdk/health/contract.js +2 -0
  84. package/esm/generated-sdk/health/owned_api.d.ts +3 -0
  85. package/esm/generated-sdk/health/owned_api.d.ts.map +1 -0
  86. package/esm/generated-sdk/health/owned_api.js +16 -0
  87. package/esm/generated-sdk/health/types.d.ts +2 -0
  88. package/esm/generated-sdk/health/types.d.ts.map +1 -1
  89. package/esm/generated-sdk/jobs/api.d.ts +33 -9
  90. package/esm/generated-sdk/jobs/api.d.ts.map +1 -1
  91. package/esm/generated-sdk/jobs/api.js +22 -87
  92. package/esm/generated-sdk/jobs/client.d.ts +9 -2
  93. package/esm/generated-sdk/jobs/client.d.ts.map +1 -1
  94. package/esm/generated-sdk/jobs/contract.d.ts +1 -1
  95. package/esm/generated-sdk/jobs/contract.d.ts.map +1 -1
  96. package/esm/generated-sdk/jobs/contract.js +4 -2
  97. package/esm/generated-sdk/jobs/owned_api.d.ts +3 -0
  98. package/esm/generated-sdk/jobs/owned_api.d.ts.map +1 -0
  99. package/esm/generated-sdk/jobs/owned_api.js +118 -0
  100. package/esm/generated-sdk/jobs/schemas.d.ts +336 -123
  101. package/esm/generated-sdk/jobs/schemas.d.ts.map +1 -1
  102. package/esm/generated-sdk/jobs/schemas.js +17 -15
  103. package/esm/generated-sdk/jobs/types.d.ts +144 -34
  104. package/esm/generated-sdk/jobs/types.d.ts.map +1 -1
  105. package/esm/generated-sdk/jobs/types.js +36 -1
  106. package/esm/generated-sdk/state/api.d.ts +27 -9
  107. package/esm/generated-sdk/state/api.d.ts.map +1 -1
  108. package/esm/generated-sdk/state/api.js +16 -71
  109. package/esm/generated-sdk/state/client.d.ts +4 -2
  110. package/esm/generated-sdk/state/client.d.ts.map +1 -1
  111. package/esm/generated-sdk/state/contract.d.ts +1 -1
  112. package/esm/generated-sdk/state/contract.d.ts.map +1 -1
  113. package/esm/generated-sdk/state/contract.js +4 -2
  114. package/esm/generated-sdk/state/owned_api.d.ts +3 -0
  115. package/esm/generated-sdk/state/owned_api.d.ts.map +1 -0
  116. package/esm/generated-sdk/state/owned_api.js +66 -0
  117. package/esm/generated-sdk/state/schemas.d.ts +264 -284
  118. package/esm/generated-sdk/state/schemas.d.ts.map +1 -1
  119. package/esm/generated-sdk/state/schemas.js +6 -6
  120. package/esm/generated-sdk/state/types.d.ts +24 -23
  121. package/esm/generated-sdk/state/types.d.ts.map +1 -1
  122. package/esm/generated-sdk/state/types.js +1 -1
  123. package/esm/generated-sdk/trellis-core/api.d.ts +27 -9
  124. package/esm/generated-sdk/trellis-core/api.d.ts.map +1 -1
  125. package/esm/generated-sdk/trellis-core/api.js +16 -39
  126. package/esm/generated-sdk/trellis-core/client.d.ts +5 -2
  127. package/esm/generated-sdk/trellis-core/client.d.ts.map +1 -1
  128. package/esm/generated-sdk/trellis-core/contract.d.ts +1 -1
  129. package/esm/generated-sdk/trellis-core/contract.d.ts.map +1 -1
  130. package/esm/generated-sdk/trellis-core/contract.js +4 -2
  131. package/esm/generated-sdk/trellis-core/owned_api.d.ts +3 -0
  132. package/esm/generated-sdk/trellis-core/owned_api.d.ts.map +1 -0
  133. package/esm/generated-sdk/trellis-core/owned_api.js +42 -0
  134. package/esm/generated-sdk/trellis-core/schemas.d.ts +259 -11
  135. package/esm/generated-sdk/trellis-core/schemas.d.ts.map +1 -1
  136. package/esm/generated-sdk/trellis-core/schemas.js +5 -3
  137. package/esm/generated-sdk/trellis-core/types.d.ts +56 -1
  138. package/esm/generated-sdk/trellis-core/types.d.ts.map +1 -1
  139. package/esm/generated-sdk/trellis-core/types.js +1 -1
  140. package/esm/helpers.d.ts.map +1 -1
  141. package/esm/index.d.ts +4 -3
  142. package/esm/index.d.ts.map +1 -1
  143. package/esm/index.js +1 -0
  144. package/esm/jobs.d.ts +10 -1
  145. package/esm/jobs.d.ts.map +1 -1
  146. package/esm/jobs.js +16 -1
  147. package/esm/kv.d.ts.map +1 -1
  148. package/esm/kv.js +10 -4
  149. package/esm/models/auth/rpc/Logout.d.ts +4 -4
  150. package/esm/models/auth/rpc/Logout.d.ts.map +1 -1
  151. package/esm/models/auth/rpc/Logout.js +2 -2
  152. package/esm/models/trellis/Page.d.ts +2 -0
  153. package/esm/models/trellis/Page.d.ts.map +1 -0
  154. package/esm/models/trellis/Page.js +1 -0
  155. package/esm/models/trellis/State.d.ts +1 -0
  156. package/esm/models/trellis/State.d.ts.map +1 -1
  157. package/esm/models/trellis/State.js +1 -0
  158. package/esm/models/trellis/rpc/StateList.d.ts +9 -12
  159. package/esm/models/trellis/rpc/StateList.d.ts.map +1 -1
  160. package/esm/models/trellis/rpc/StateList.js +16 -18
  161. package/esm/npm/src/auth/browser/login.d.ts.map +1 -1
  162. package/esm/npm/src/auth/browser/login.js +46 -3
  163. package/esm/npm/src/auth/browser/portal.d.ts.map +1 -1
  164. package/esm/npm/src/auth/browser/portal.js +5 -1
  165. package/esm/npm/src/auth/browser/session.d.ts +18 -7
  166. package/esm/npm/src/auth/browser/session.d.ts.map +1 -1
  167. package/esm/npm/src/auth/browser/session.js +47 -11
  168. package/esm/npm/src/auth/browser/storage.d.ts +6 -1
  169. package/esm/npm/src/auth/browser/storage.d.ts.map +1 -1
  170. package/esm/npm/src/auth/browser/storage.js +15 -3
  171. package/esm/npm/src/auth/browser.d.ts +2 -2
  172. package/esm/npm/src/auth/browser.d.ts.map +1 -1
  173. package/esm/npm/src/auth/browser.js +1 -1
  174. package/esm/npm/src/auth/device_activation.d.ts +36 -33
  175. package/esm/npm/src/auth/device_activation.d.ts.map +1 -1
  176. package/esm/npm/src/auth/device_activation.js +26 -22
  177. package/esm/npm/src/auth/mod.d.ts +4 -4
  178. package/esm/npm/src/auth/mod.d.ts.map +1 -1
  179. package/esm/npm/src/auth/mod.js +2 -2
  180. package/esm/npm/src/auth/proof.d.ts +3 -1
  181. package/esm/npm/src/auth/proof.d.ts.map +1 -1
  182. package/esm/npm/src/auth/proof.js +21 -15
  183. package/esm/npm/src/auth/protocol.d.ts +2457 -941
  184. package/esm/npm/src/auth/protocol.d.ts.map +1 -1
  185. package/esm/npm/src/auth/protocol.js +747 -375
  186. package/esm/npm/src/auth/schemas.d.ts +25 -4
  187. package/esm/npm/src/auth/schemas.d.ts.map +1 -1
  188. package/esm/npm/src/auth/schemas.js +14 -4
  189. package/esm/npm/src/auth/session_auth.d.ts +1 -1
  190. package/esm/npm/src/auth/session_auth.d.ts.map +1 -1
  191. package/esm/npm/src/auth/session_auth.js +7 -1
  192. package/esm/npm/src/client_connect.d.ts +2 -0
  193. package/esm/npm/src/client_connect.d.ts.map +1 -1
  194. package/esm/npm/src/client_connect.js +76 -15
  195. package/esm/npm/src/contract.d.ts +3 -0
  196. package/esm/npm/src/contract.d.ts.map +1 -1
  197. package/esm/npm/src/contract_support/mod.d.ts +422 -43
  198. package/esm/npm/src/contract_support/mod.d.ts.map +1 -1
  199. package/esm/npm/src/contract_support/mod.js +734 -33
  200. package/esm/npm/src/contract_support/protocol.d.ts +20 -5
  201. package/esm/npm/src/contract_support/protocol.d.ts.map +1 -1
  202. package/esm/npm/src/contract_support/protocol.js +18 -10
  203. package/esm/npm/src/contract_support/runtime.d.ts +11 -0
  204. package/esm/npm/src/contract_support/runtime.d.ts.map +1 -1
  205. package/esm/npm/src/contract_support/schema_pointers.d.ts.map +1 -1
  206. package/esm/npm/src/contract_support/schema_pointers.js +32 -14
  207. package/esm/npm/src/device/deno.d.ts.map +1 -1
  208. package/esm/npm/src/device/deno.js +6 -0
  209. package/esm/npm/src/device.d.ts +2 -0
  210. package/esm/npm/src/device.d.ts.map +1 -1
  211. package/esm/npm/src/device.js +3 -0
  212. package/esm/npm/src/errors/AuthError.d.ts +2 -1
  213. package/esm/npm/src/errors/AuthError.d.ts.map +1 -1
  214. package/esm/npm/src/errors/AuthError.js +8 -3
  215. package/esm/npm/src/errors/index.d.ts +4 -4
  216. package/esm/npm/src/errors/index.d.ts.map +1 -1
  217. package/esm/npm/src/errors/index.js +1 -0
  218. package/esm/npm/src/generate.js +54 -24
  219. package/esm/npm/src/helpers.d.ts.map +1 -1
  220. package/esm/npm/src/index.d.ts +4 -3
  221. package/esm/npm/src/index.d.ts.map +1 -1
  222. package/esm/npm/src/index.js +1 -0
  223. package/esm/npm/src/jobs.d.ts +10 -1
  224. package/esm/npm/src/jobs.d.ts.map +1 -1
  225. package/esm/npm/src/jobs.js +16 -1
  226. package/esm/npm/src/kv.d.ts.map +1 -1
  227. package/esm/npm/src/kv.js +10 -4
  228. package/esm/npm/src/models/auth/rpc/Logout.d.ts +4 -4
  229. package/esm/npm/src/models/auth/rpc/Logout.d.ts.map +1 -1
  230. package/esm/npm/src/models/auth/rpc/Logout.js +2 -2
  231. package/esm/npm/src/models/trellis/Page.d.ts +2 -0
  232. package/esm/npm/src/models/trellis/Page.d.ts.map +1 -0
  233. package/esm/npm/src/models/trellis/Page.js +1 -0
  234. package/esm/npm/src/models/trellis/State.d.ts +1 -0
  235. package/esm/npm/src/models/trellis/State.d.ts.map +1 -1
  236. package/esm/npm/src/models/trellis/State.js +1 -0
  237. package/esm/npm/src/models/trellis/rpc/StateList.d.ts +9 -12
  238. package/esm/npm/src/models/trellis/rpc/StateList.d.ts.map +1 -1
  239. package/esm/npm/src/models/trellis/rpc/StateList.js +16 -18
  240. package/esm/npm/src/operations.d.ts +16 -7
  241. package/esm/npm/src/operations.d.ts.map +1 -1
  242. package/esm/npm/src/operations.js +84 -19
  243. package/esm/npm/src/runtime_transport.d.ts +2 -0
  244. package/esm/npm/src/runtime_transport.d.ts.map +1 -1
  245. package/esm/npm/src/runtime_transport.js +1 -0
  246. package/esm/npm/src/server/internal_jobs/active-job.d.ts +2 -1
  247. package/esm/npm/src/server/internal_jobs/active-job.d.ts.map +1 -1
  248. package/esm/npm/src/server/internal_jobs/active-job.js +3 -0
  249. package/esm/npm/src/server/internal_jobs/job-manager.d.ts +4 -1
  250. package/esm/npm/src/server/internal_jobs/job-manager.d.ts.map +1 -1
  251. package/esm/npm/src/server/internal_jobs/job-manager.js +61 -1
  252. package/esm/npm/src/server/internal_jobs/projection.js +1 -0
  253. package/esm/npm/src/server/internal_jobs/runtime-worker.d.ts +13 -1
  254. package/esm/npm/src/server/internal_jobs/runtime-worker.d.ts.map +1 -1
  255. package/esm/npm/src/server/internal_jobs/runtime-worker.js +73 -13
  256. package/esm/npm/src/server/internal_jobs/types.d.ts +19 -0
  257. package/esm/npm/src/server/internal_jobs/types.d.ts.map +1 -1
  258. package/esm/npm/src/server/internal_jobs/types.js +10 -0
  259. package/esm/npm/src/server/runtime.d.ts +1 -0
  260. package/esm/npm/src/server/runtime.d.ts.map +1 -1
  261. package/esm/npm/src/server/service.d.ts +10 -1
  262. package/esm/npm/src/server/service.d.ts.map +1 -1
  263. package/esm/npm/src/server/service.js +210 -64
  264. package/esm/npm/src/server/transfer.d.ts.map +1 -1
  265. package/esm/npm/src/server/transfer.js +4 -0
  266. package/esm/npm/src/server.d.ts.map +1 -1
  267. package/esm/npm/src/server.js +337 -34
  268. package/esm/npm/src/store.d.ts +8 -1
  269. package/esm/npm/src/store.d.ts.map +1 -1
  270. package/esm/npm/src/store.js +46 -8
  271. package/esm/npm/src/transfer.d.ts +3 -0
  272. package/esm/npm/src/transfer.d.ts.map +1 -1
  273. package/esm/npm/src/transfer.js +20 -30
  274. package/esm/npm/src/trellis.d.ts +85 -22
  275. package/esm/npm/src/trellis.d.ts.map +1 -1
  276. package/esm/npm/src/trellis.js +525 -61
  277. package/esm/operations.d.ts +16 -7
  278. package/esm/operations.d.ts.map +1 -1
  279. package/esm/operations.js +84 -19
  280. package/esm/runtime_transport.d.ts +2 -0
  281. package/esm/runtime_transport.d.ts.map +1 -1
  282. package/esm/runtime_transport.js +1 -0
  283. package/esm/store.d.ts +8 -1
  284. package/esm/store.d.ts.map +1 -1
  285. package/esm/store.js +46 -8
  286. package/esm/transfer.d.ts +3 -0
  287. package/esm/transfer.d.ts.map +1 -1
  288. package/esm/transfer.js +20 -30
  289. package/esm/trellis.d.ts +85 -22
  290. package/esm/trellis.d.ts.map +1 -1
  291. package/esm/trellis.js +525 -61
  292. package/package.json +6 -4
  293. package/script/auth/browser/login.d.ts.map +1 -1
  294. package/script/auth/browser/login.js +46 -3
  295. package/script/auth/browser/portal.d.ts.map +1 -1
  296. package/script/auth/browser/portal.js +5 -1
  297. package/script/auth/browser/session.d.ts +18 -7
  298. package/script/auth/browser/session.d.ts.map +1 -1
  299. package/script/auth/browser/session.js +47 -11
  300. package/script/auth/browser/storage.d.ts +6 -1
  301. package/script/auth/browser/storage.d.ts.map +1 -1
  302. package/script/auth/browser/storage.js +15 -3
  303. package/script/auth/browser.d.ts +2 -2
  304. package/script/auth/browser.d.ts.map +1 -1
  305. package/script/auth/browser.js +2 -1
  306. package/script/auth/device_activation.d.ts +36 -33
  307. package/script/auth/device_activation.d.ts.map +1 -1
  308. package/script/auth/device_activation.js +25 -21
  309. package/script/auth/mod.d.ts +4 -4
  310. package/script/auth/mod.d.ts.map +1 -1
  311. package/script/auth/mod.js +132 -137
  312. package/script/auth/proof.d.ts +3 -1
  313. package/script/auth/proof.d.ts.map +1 -1
  314. package/script/auth/proof.js +21 -15
  315. package/script/auth/protocol.d.ts +2457 -941
  316. package/script/auth/protocol.d.ts.map +1 -1
  317. package/script/auth/protocol.js +749 -377
  318. package/script/auth/schemas.d.ts +25 -4
  319. package/script/auth/schemas.d.ts.map +1 -1
  320. package/script/auth/schemas.js +16 -5
  321. package/script/auth/session_auth.d.ts +1 -1
  322. package/script/auth/session_auth.d.ts.map +1 -1
  323. package/script/auth/session_auth.js +7 -1
  324. package/script/client_connect.d.ts +2 -0
  325. package/script/client_connect.d.ts.map +1 -1
  326. package/script/client_connect.js +76 -15
  327. package/script/contract.d.ts +3 -0
  328. package/script/contract.d.ts.map +1 -1
  329. package/script/contract_support/mod.d.ts +422 -43
  330. package/script/contract_support/mod.d.ts.map +1 -1
  331. package/script/contract_support/mod.js +757 -51
  332. package/script/contract_support/protocol.d.ts +20 -5
  333. package/script/contract_support/protocol.d.ts.map +1 -1
  334. package/script/contract_support/protocol.js +20 -11
  335. package/script/contract_support/runtime.d.ts +11 -0
  336. package/script/contract_support/runtime.d.ts.map +1 -1
  337. package/script/contract_support/schema_pointers.d.ts.map +1 -1
  338. package/script/contract_support/schema_pointers.js +32 -14
  339. package/script/device.d.ts +2 -0
  340. package/script/device.d.ts.map +1 -1
  341. package/script/device.js +3 -0
  342. package/script/errors/AuthError.d.ts +2 -1
  343. package/script/errors/AuthError.d.ts.map +1 -1
  344. package/script/errors/AuthError.js +8 -3
  345. package/script/errors/index.d.ts +4 -4
  346. package/script/errors/index.d.ts.map +1 -1
  347. package/script/errors/index.js +1 -0
  348. package/script/generated-sdk/auth/api.d.ts +27 -9
  349. package/script/generated-sdk/auth/api.d.ts.map +1 -1
  350. package/script/generated-sdk/auth/api.js +17 -591
  351. package/script/generated-sdk/auth/client.d.ts +91 -85
  352. package/script/generated-sdk/auth/client.d.ts.map +1 -1
  353. package/script/generated-sdk/auth/contract.d.ts +1 -1
  354. package/script/generated-sdk/auth/contract.d.ts.map +1 -1
  355. package/script/generated-sdk/auth/contract.js +4 -2
  356. package/script/generated-sdk/auth/mod.d.ts +1 -0
  357. package/script/generated-sdk/auth/mod.d.ts.map +1 -1
  358. package/script/generated-sdk/auth/owned_api.d.ts +3 -0
  359. package/script/generated-sdk/auth/owned_api.d.ts.map +1 -0
  360. package/script/generated-sdk/auth/owned_api.js +597 -0
  361. package/script/generated-sdk/auth/schemas.d.ts +9959 -5160
  362. package/script/generated-sdk/auth/schemas.d.ts.map +1 -1
  363. package/script/generated-sdk/auth/schemas.js +139 -140
  364. package/script/generated-sdk/auth/types.d.ts +2418 -1557
  365. package/script/generated-sdk/auth/types.d.ts.map +1 -1
  366. package/script/generated-sdk/auth/types.js +1 -1
  367. package/script/generated-sdk/health/api.d.ts +24 -9
  368. package/script/generated-sdk/health/api.d.ts.map +1 -1
  369. package/script/generated-sdk/health/api.js +13 -21
  370. package/script/generated-sdk/health/client.d.ts +2 -1
  371. package/script/generated-sdk/health/client.d.ts.map +1 -1
  372. package/script/generated-sdk/health/contract.d.ts.map +1 -1
  373. package/script/generated-sdk/health/contract.js +2 -0
  374. package/script/generated-sdk/health/owned_api.d.ts +3 -0
  375. package/script/generated-sdk/health/owned_api.d.ts.map +1 -0
  376. package/script/generated-sdk/health/owned_api.js +19 -0
  377. package/script/generated-sdk/health/types.d.ts +2 -0
  378. package/script/generated-sdk/health/types.d.ts.map +1 -1
  379. package/script/generated-sdk/jobs/api.d.ts +33 -9
  380. package/script/generated-sdk/jobs/api.d.ts.map +1 -1
  381. package/script/generated-sdk/jobs/api.js +23 -88
  382. package/script/generated-sdk/jobs/client.d.ts +9 -2
  383. package/script/generated-sdk/jobs/client.d.ts.map +1 -1
  384. package/script/generated-sdk/jobs/contract.d.ts +1 -1
  385. package/script/generated-sdk/jobs/contract.d.ts.map +1 -1
  386. package/script/generated-sdk/jobs/contract.js +4 -2
  387. package/script/generated-sdk/jobs/owned_api.d.ts +3 -0
  388. package/script/generated-sdk/jobs/owned_api.d.ts.map +1 -0
  389. package/script/generated-sdk/jobs/owned_api.js +154 -0
  390. package/script/generated-sdk/jobs/schemas.d.ts +336 -123
  391. package/script/generated-sdk/jobs/schemas.d.ts.map +1 -1
  392. package/script/generated-sdk/jobs/schemas.js +18 -16
  393. package/script/generated-sdk/jobs/types.d.ts +144 -34
  394. package/script/generated-sdk/jobs/types.d.ts.map +1 -1
  395. package/script/generated-sdk/jobs/types.js +38 -2
  396. package/script/generated-sdk/state/api.d.ts +27 -9
  397. package/script/generated-sdk/state/api.d.ts.map +1 -1
  398. package/script/generated-sdk/state/api.js +17 -72
  399. package/script/generated-sdk/state/client.d.ts +4 -2
  400. package/script/generated-sdk/state/client.d.ts.map +1 -1
  401. package/script/generated-sdk/state/contract.d.ts +1 -1
  402. package/script/generated-sdk/state/contract.d.ts.map +1 -1
  403. package/script/generated-sdk/state/contract.js +4 -2
  404. package/script/generated-sdk/state/owned_api.d.ts +3 -0
  405. package/script/generated-sdk/state/owned_api.d.ts.map +1 -0
  406. package/script/generated-sdk/state/owned_api.js +69 -0
  407. package/script/generated-sdk/state/schemas.d.ts +264 -284
  408. package/script/generated-sdk/state/schemas.d.ts.map +1 -1
  409. package/script/generated-sdk/state/schemas.js +6 -6
  410. package/script/generated-sdk/state/types.d.ts +24 -23
  411. package/script/generated-sdk/state/types.d.ts.map +1 -1
  412. package/script/generated-sdk/state/types.js +1 -1
  413. package/script/generated-sdk/trellis-core/api.d.ts +27 -9
  414. package/script/generated-sdk/trellis-core/api.d.ts.map +1 -1
  415. package/script/generated-sdk/trellis-core/api.js +17 -40
  416. package/script/generated-sdk/trellis-core/client.d.ts +5 -2
  417. package/script/generated-sdk/trellis-core/client.d.ts.map +1 -1
  418. package/script/generated-sdk/trellis-core/contract.d.ts +1 -1
  419. package/script/generated-sdk/trellis-core/contract.d.ts.map +1 -1
  420. package/script/generated-sdk/trellis-core/contract.js +4 -2
  421. package/script/generated-sdk/trellis-core/owned_api.d.ts +3 -0
  422. package/script/generated-sdk/trellis-core/owned_api.d.ts.map +1 -0
  423. package/script/generated-sdk/trellis-core/owned_api.js +45 -0
  424. package/script/generated-sdk/trellis-core/schemas.d.ts +259 -11
  425. package/script/generated-sdk/trellis-core/schemas.d.ts.map +1 -1
  426. package/script/generated-sdk/trellis-core/schemas.js +6 -4
  427. package/script/generated-sdk/trellis-core/types.d.ts +56 -1
  428. package/script/generated-sdk/trellis-core/types.d.ts.map +1 -1
  429. package/script/generated-sdk/trellis-core/types.js +1 -1
  430. package/script/helpers.d.ts.map +1 -1
  431. package/script/index.d.ts +4 -3
  432. package/script/index.d.ts.map +1 -1
  433. package/script/index.js +5 -2
  434. package/script/jobs.d.ts +10 -1
  435. package/script/jobs.d.ts.map +1 -1
  436. package/script/jobs.js +17 -2
  437. package/script/kv.d.ts.map +1 -1
  438. package/script/kv.js +10 -4
  439. package/script/models/auth/rpc/Logout.d.ts +4 -4
  440. package/script/models/auth/rpc/Logout.d.ts.map +1 -1
  441. package/script/models/auth/rpc/Logout.js +3 -3
  442. package/script/models/trellis/Page.d.ts +2 -0
  443. package/script/models/trellis/Page.d.ts.map +1 -0
  444. package/script/models/trellis/Page.js +6 -0
  445. package/script/models/trellis/State.d.ts +1 -0
  446. package/script/models/trellis/State.d.ts.map +1 -1
  447. package/script/models/trellis/State.js +1 -0
  448. package/script/models/trellis/rpc/StateList.d.ts +9 -12
  449. package/script/models/trellis/rpc/StateList.d.ts.map +1 -1
  450. package/script/models/trellis/rpc/StateList.js +16 -18
  451. package/script/npm/src/auth/browser/login.d.ts.map +1 -1
  452. package/script/npm/src/auth/browser/login.js +46 -3
  453. package/script/npm/src/auth/browser/portal.d.ts.map +1 -1
  454. package/script/npm/src/auth/browser/portal.js +5 -1
  455. package/script/npm/src/auth/browser/session.d.ts +18 -7
  456. package/script/npm/src/auth/browser/session.d.ts.map +1 -1
  457. package/script/npm/src/auth/browser/session.js +47 -11
  458. package/script/npm/src/auth/browser/storage.d.ts +6 -1
  459. package/script/npm/src/auth/browser/storage.d.ts.map +1 -1
  460. package/script/npm/src/auth/browser/storage.js +15 -3
  461. package/script/npm/src/auth/browser.d.ts +2 -2
  462. package/script/npm/src/auth/browser.d.ts.map +1 -1
  463. package/script/npm/src/auth/browser.js +2 -1
  464. package/script/npm/src/auth/device_activation.d.ts +36 -33
  465. package/script/npm/src/auth/device_activation.d.ts.map +1 -1
  466. package/script/npm/src/auth/device_activation.js +25 -21
  467. package/script/npm/src/auth/mod.d.ts +4 -4
  468. package/script/npm/src/auth/mod.d.ts.map +1 -1
  469. package/script/npm/src/auth/mod.js +132 -137
  470. package/script/npm/src/auth/proof.d.ts +3 -1
  471. package/script/npm/src/auth/proof.d.ts.map +1 -1
  472. package/script/npm/src/auth/proof.js +21 -15
  473. package/script/npm/src/auth/protocol.d.ts +2457 -941
  474. package/script/npm/src/auth/protocol.d.ts.map +1 -1
  475. package/script/npm/src/auth/protocol.js +749 -377
  476. package/script/npm/src/auth/schemas.d.ts +25 -4
  477. package/script/npm/src/auth/schemas.d.ts.map +1 -1
  478. package/script/npm/src/auth/schemas.js +16 -5
  479. package/script/npm/src/auth/session_auth.d.ts +1 -1
  480. package/script/npm/src/auth/session_auth.d.ts.map +1 -1
  481. package/script/npm/src/auth/session_auth.js +7 -1
  482. package/script/npm/src/client_connect.d.ts +2 -0
  483. package/script/npm/src/client_connect.d.ts.map +1 -1
  484. package/script/npm/src/client_connect.js +76 -15
  485. package/script/npm/src/contract.d.ts +3 -0
  486. package/script/npm/src/contract.d.ts.map +1 -1
  487. package/script/npm/src/contract_support/mod.d.ts +422 -43
  488. package/script/npm/src/contract_support/mod.d.ts.map +1 -1
  489. package/script/npm/src/contract_support/mod.js +757 -51
  490. package/script/npm/src/contract_support/protocol.d.ts +20 -5
  491. package/script/npm/src/contract_support/protocol.d.ts.map +1 -1
  492. package/script/npm/src/contract_support/protocol.js +20 -11
  493. package/script/npm/src/contract_support/runtime.d.ts +11 -0
  494. package/script/npm/src/contract_support/runtime.d.ts.map +1 -1
  495. package/script/npm/src/contract_support/schema_pointers.d.ts.map +1 -1
  496. package/script/npm/src/contract_support/schema_pointers.js +32 -14
  497. package/script/npm/src/device/deno.d.ts.map +1 -1
  498. package/script/npm/src/device/deno.js +6 -0
  499. package/script/npm/src/device.d.ts +2 -0
  500. package/script/npm/src/device.d.ts.map +1 -1
  501. package/script/npm/src/device.js +3 -0
  502. package/script/npm/src/errors/AuthError.d.ts +2 -1
  503. package/script/npm/src/errors/AuthError.d.ts.map +1 -1
  504. package/script/npm/src/errors/AuthError.js +8 -3
  505. package/script/npm/src/errors/index.d.ts +4 -4
  506. package/script/npm/src/errors/index.d.ts.map +1 -1
  507. package/script/npm/src/errors/index.js +1 -0
  508. package/script/npm/src/generate.js +54 -57
  509. package/script/npm/src/helpers.d.ts.map +1 -1
  510. package/script/npm/src/index.d.ts +4 -3
  511. package/script/npm/src/index.d.ts.map +1 -1
  512. package/script/npm/src/index.js +5 -2
  513. package/script/npm/src/jobs.d.ts +10 -1
  514. package/script/npm/src/jobs.d.ts.map +1 -1
  515. package/script/npm/src/jobs.js +17 -2
  516. package/script/npm/src/kv.d.ts.map +1 -1
  517. package/script/npm/src/kv.js +10 -4
  518. package/script/npm/src/models/auth/rpc/Logout.d.ts +4 -4
  519. package/script/npm/src/models/auth/rpc/Logout.d.ts.map +1 -1
  520. package/script/npm/src/models/auth/rpc/Logout.js +3 -3
  521. package/script/npm/src/models/trellis/Page.d.ts +2 -0
  522. package/script/npm/src/models/trellis/Page.d.ts.map +1 -0
  523. package/script/npm/src/models/trellis/Page.js +6 -0
  524. package/script/npm/src/models/trellis/State.d.ts +1 -0
  525. package/script/npm/src/models/trellis/State.d.ts.map +1 -1
  526. package/script/npm/src/models/trellis/State.js +1 -0
  527. package/script/npm/src/models/trellis/rpc/StateList.d.ts +9 -12
  528. package/script/npm/src/models/trellis/rpc/StateList.d.ts.map +1 -1
  529. package/script/npm/src/models/trellis/rpc/StateList.js +16 -18
  530. package/script/npm/src/operations.d.ts +16 -7
  531. package/script/npm/src/operations.d.ts.map +1 -1
  532. package/script/npm/src/operations.js +84 -19
  533. package/script/npm/src/runtime_transport.d.ts +2 -0
  534. package/script/npm/src/runtime_transport.d.ts.map +1 -1
  535. package/script/npm/src/runtime_transport.js +2 -1
  536. package/script/npm/src/server/internal_jobs/active-job.d.ts +2 -1
  537. package/script/npm/src/server/internal_jobs/active-job.d.ts.map +1 -1
  538. package/script/npm/src/server/internal_jobs/active-job.js +3 -0
  539. package/script/npm/src/server/internal_jobs/job-manager.d.ts +4 -1
  540. package/script/npm/src/server/internal_jobs/job-manager.d.ts.map +1 -1
  541. package/script/npm/src/server/internal_jobs/job-manager.js +61 -1
  542. package/script/npm/src/server/internal_jobs/projection.js +1 -0
  543. package/script/npm/src/server/internal_jobs/runtime-worker.d.ts +13 -1
  544. package/script/npm/src/server/internal_jobs/runtime-worker.d.ts.map +1 -1
  545. package/script/npm/src/server/internal_jobs/runtime-worker.js +74 -13
  546. package/script/npm/src/server/internal_jobs/types.d.ts +19 -0
  547. package/script/npm/src/server/internal_jobs/types.d.ts.map +1 -1
  548. package/script/npm/src/server/internal_jobs/types.js +11 -1
  549. package/script/npm/src/server/runtime.d.ts +1 -0
  550. package/script/npm/src/server/runtime.d.ts.map +1 -1
  551. package/script/npm/src/server/service.d.ts +10 -1
  552. package/script/npm/src/server/service.d.ts.map +1 -1
  553. package/script/npm/src/server/service.js +208 -62
  554. package/script/npm/src/server/transfer.d.ts.map +1 -1
  555. package/script/npm/src/server/transfer.js +4 -0
  556. package/script/npm/src/server.d.ts.map +1 -1
  557. package/script/npm/src/server.js +336 -33
  558. package/script/npm/src/store.d.ts +8 -1
  559. package/script/npm/src/store.d.ts.map +1 -1
  560. package/script/npm/src/store.js +46 -8
  561. package/script/npm/src/transfer.d.ts +3 -0
  562. package/script/npm/src/transfer.d.ts.map +1 -1
  563. package/script/npm/src/transfer.js +19 -29
  564. package/script/npm/src/trellis.d.ts +85 -22
  565. package/script/npm/src/trellis.d.ts.map +1 -1
  566. package/script/npm/src/trellis.js +525 -61
  567. package/script/operations.d.ts +16 -7
  568. package/script/operations.d.ts.map +1 -1
  569. package/script/operations.js +84 -19
  570. package/script/runtime_transport.d.ts +2 -0
  571. package/script/runtime_transport.d.ts.map +1 -1
  572. package/script/runtime_transport.js +2 -1
  573. package/script/store.d.ts +8 -1
  574. package/script/store.d.ts.map +1 -1
  575. package/script/store.js +46 -8
  576. package/script/transfer.d.ts +3 -0
  577. package/script/transfer.d.ts.map +1 -1
  578. package/script/transfer.js +19 -29
  579. package/script/trellis.d.ts +85 -22
  580. package/script/trellis.d.ts.map +1 -1
  581. package/script/trellis.js +525 -61
  582. package/src/_dnt.polyfills.ts +274 -0
  583. package/src/_dnt.shims.ts +64 -0
  584. package/src/auth/browser/login.ts +295 -0
  585. package/src/auth/browser/portal.ts +75 -0
  586. package/src/auth/browser/session.ts +197 -0
  587. package/src/auth/browser/storage.ts +105 -0
  588. package/src/auth/browser.ts +82 -0
  589. package/src/auth/device_activation.ts +715 -0
  590. package/src/auth/keys.ts +116 -0
  591. package/src/auth/mod.ts +298 -0
  592. package/src/auth/proof.ts +111 -0
  593. package/src/auth/protocol.ts +1629 -0
  594. package/src/auth/schemas.ts +145 -0
  595. package/src/auth/session_auth.ts +167 -0
  596. package/src/auth/time.ts +15 -0
  597. package/src/auth/trellis_id.ts +9 -0
  598. package/src/auth/types.ts +4 -0
  599. package/src/auth/utils.ts +87 -0
  600. package/src/auth.ts +2 -0
  601. package/src/browser.ts +8 -0
  602. package/src/client.ts +164 -0
  603. package/src/client_connect.ts +1328 -0
  604. package/src/codec.ts +107 -0
  605. package/src/connection.ts +466 -0
  606. package/src/contract.ts +84 -0
  607. package/src/contract_support/canonical.ts +217 -0
  608. package/src/contract_support/mod.ts +5079 -0
  609. package/src/contract_support/protocol.ts +213 -0
  610. package/src/contract_support/runtime.ts +129 -0
  611. package/src/contract_support/schema_pointers.ts +161 -0
  612. package/src/contracts.ts +9 -0
  613. package/src/device/deno.ts +941 -0
  614. package/src/device.ts +989 -0
  615. package/src/env.ts +1 -0
  616. package/src/errors/AuthError.ts +82 -0
  617. package/src/errors/KVError.ts +47 -0
  618. package/src/errors/RemoteError.ts +111 -0
  619. package/src/errors/StoreError.ts +43 -0
  620. package/src/errors/TransferError.ts +43 -0
  621. package/src/errors/TransportError.ts +48 -0
  622. package/src/errors/TrellisError.ts +20 -0
  623. package/src/errors/ValidationError.ts +80 -0
  624. package/src/errors/index.ts +195 -0
  625. package/src/generate.ts +329 -0
  626. package/src/globals.ts +26 -0
  627. package/src/health.ts +28 -0
  628. package/src/helpers.ts +63 -0
  629. package/src/host/mod.ts +9 -0
  630. package/src/host/node.ts +9 -0
  631. package/src/index.ts +233 -0
  632. package/src/jobs.ts +344 -0
  633. package/src/kv.ts +564 -0
  634. package/src/models/auth/rpc/Logout.ts +15 -0
  635. package/src/models/trellis/Page.ts +6 -0
  636. package/src/models/trellis/State.ts +55 -0
  637. package/src/models/trellis/TrellisError.ts +21 -0
  638. package/src/models/trellis/rpc/StateDelete.ts +13 -0
  639. package/src/models/trellis/rpc/StateGet.ts +25 -0
  640. package/src/models/trellis/rpc/StateList.ts +26 -0
  641. package/src/models/trellis/rpc/StatePut.ts +42 -0
  642. package/src/operations.ts +1508 -0
  643. package/src/runtime_transport.ts +132 -0
  644. package/src/sdk/auth.ts +2 -0
  645. package/src/sdk/core.ts +2 -0
  646. package/src/sdk/health.ts +2 -0
  647. package/src/sdk/jobs.ts +2 -0
  648. package/src/sdk/state.ts +2 -0
  649. package/src/server/health.ts +379 -0
  650. package/src/server/health_rpc.ts +51 -0
  651. package/src/server/health_schemas.ts +61 -0
  652. package/src/server/internal_jobs/active-job.ts +115 -0
  653. package/src/server/internal_jobs/bindings.ts +26 -0
  654. package/src/server/internal_jobs/cancellation-registry.ts +71 -0
  655. package/src/server/internal_jobs/heartbeat.ts +120 -0
  656. package/src/server/internal_jobs/job-manager.ts +456 -0
  657. package/src/server/internal_jobs/projection.ts +48 -0
  658. package/src/server/internal_jobs/runtime-worker.ts +741 -0
  659. package/src/server/internal_jobs/types.ts +124 -0
  660. package/src/server/runtime.ts +27 -0
  661. package/src/server/service.ts +2377 -0
  662. package/src/server/subscription.ts +143 -0
  663. package/src/server/transfer.ts +962 -0
  664. package/src/server.ts +1725 -0
  665. package/src/server_logger.ts +10 -0
  666. package/src/service/deno.ts +18 -0
  667. package/src/service/mod.ts +68 -0
  668. package/src/service/node.ts +18 -0
  669. package/src/store.ts +658 -0
  670. package/src/tasks.ts +34 -0
  671. package/src/telemetry/carrier.ts +35 -0
  672. package/src/telemetry/core.ts +31 -0
  673. package/src/telemetry/env.ts +23 -0
  674. package/src/telemetry/mod.ts +26 -0
  675. package/src/telemetry/nats.ts +15 -0
  676. package/src/telemetry/result.ts +20 -0
  677. package/src/telemetry/trace.ts +39 -0
  678. package/src/telemetry/trellis.ts +1 -0
  679. package/src/tracing.ts +28 -0
  680. package/src/transfer.ts +602 -0
  681. package/src/trellis.ts +3650 -0
  682. package/esm/models/trellis/Paginate.d.ts +0 -7
  683. package/esm/models/trellis/Paginate.d.ts.map +0 -1
  684. package/esm/models/trellis/Paginate.js +0 -5
  685. package/esm/npm/src/models/trellis/Paginate.d.ts +0 -7
  686. package/esm/npm/src/models/trellis/Paginate.d.ts.map +0 -1
  687. package/esm/npm/src/models/trellis/Paginate.js +0 -5
  688. package/script/models/trellis/Paginate.d.ts +0 -7
  689. package/script/models/trellis/Paginate.d.ts.map +0 -1
  690. package/script/models/trellis/Paginate.js +0 -11
  691. package/script/npm/src/models/trellis/Paginate.d.ts +0 -7
  692. package/script/npm/src/models/trellis/Paginate.d.ts.map +0 -1
  693. package/script/npm/src/models/trellis/Paginate.js +0 -11
@@ -0,0 +1,962 @@
1
+ import {
2
+ AsyncResult,
3
+ isErr,
4
+ Result,
5
+ type Result as ResultType,
6
+ } from "@qlever-llc/result";
7
+ import {
8
+ headers as natsHeaders,
9
+ type Msg,
10
+ type NatsConnection,
11
+ type Subscription,
12
+ } from "@nats-io/nats-core";
13
+ import { ulid } from "ulid";
14
+
15
+ import type {
16
+ OperationTransferHandle,
17
+ RuntimeOperationTransferProgress,
18
+ TrellisAuth,
19
+ } from "../trellis.js";
20
+ import type { StoreError } from "../errors/StoreError.js";
21
+ import { TransferError } from "../errors/TransferError.js";
22
+ import { type StoreInfo, TypedStore, TypedStoreEntry } from "../store.js";
23
+ import type {
24
+ FileInfo,
25
+ ReceiveTransferGrant,
26
+ SendTransferGrant,
27
+ } from "../transfer.js";
28
+ import { verifyTransferMessage } from "../transfer.js";
29
+
30
+ const UPLOAD_SUBJECT_PREFIX = "transfer.v1.upload";
31
+ const DOWNLOAD_SUBJECT_PREFIX = "transfer.v1.download";
32
+ const TRANSFER_SEQUENCE_HEADER = "trellis-transfer-seq";
33
+ const TRANSFER_EOF_HEADER = "trellis-transfer-eof";
34
+ const DEFAULT_TRANSFER_CHUNK_BYTES = 256 * 1024;
35
+
36
+ export type TransferStoreHandle = {
37
+ open(): AsyncResult<TypedStore, StoreError>;
38
+ };
39
+
40
+ export type InitiateUploadArgs = {
41
+ sessionKey: string;
42
+ store: string;
43
+ key: string;
44
+ expiresInMs: number;
45
+ maxBytes?: number;
46
+ contentType?: string;
47
+ metadata?: Record<string, string>;
48
+ onProgress?: (
49
+ progress: RuntimeOperationTransferProgress,
50
+ ) => Promise<void> | void;
51
+ onComplete?: (info: FileInfo) => Promise<void> | void;
52
+ onError?: (error: TransferError) => Promise<void> | void;
53
+ onStored?: (stored: StoredTransfer) => Promise<void> | void;
54
+ };
55
+
56
+ export type OperationUploadTransfer = {
57
+ grant: SendTransferGrant;
58
+ transfer: OperationTransferHandle;
59
+ };
60
+
61
+ export type InitiateDownloadArgs = {
62
+ sessionKey: string;
63
+ store: string;
64
+ key: string;
65
+ expiresInMs: number;
66
+ };
67
+
68
+ type ServiceTransferOpts = {
69
+ name: string;
70
+ nc: NatsConnection;
71
+ auth: TrellisAuth;
72
+ stores: Record<string, TransferStoreHandle>;
73
+ chunkBytes?: number;
74
+ };
75
+
76
+ export type StoredTransfer = {
77
+ transferId: string;
78
+ sessionKey: string;
79
+ store: TypedStore;
80
+ entry: TypedStoreEntry;
81
+ info: FileInfo;
82
+ };
83
+
84
+ type UploadSession = {
85
+ kind: "upload";
86
+ subject: string;
87
+ transferId: string;
88
+ sessionKey: string;
89
+ expiresAtMs: number;
90
+ store: TypedStore;
91
+ key: string;
92
+ maxBytes?: number;
93
+ contentType?: string;
94
+ metadata?: Record<string, string>;
95
+ onProgress?: (
96
+ progress: RuntimeOperationTransferProgress,
97
+ ) => Promise<void> | void;
98
+ onComplete?: (info: FileInfo) => Promise<void> | void;
99
+ onError?: (error: TransferError) => Promise<void> | void;
100
+ onStored?: (stored: StoredTransfer) => Promise<void> | void;
101
+ subscription: Subscription;
102
+ timeoutId: ReturnType<typeof setTimeout>;
103
+ queue: AsyncChunkQueue;
104
+ putPromise: AsyncResult<void, StoreError>;
105
+ nextSeq: number;
106
+ receivedBytes: number;
107
+ };
108
+
109
+ type DownloadSession = {
110
+ kind: "download";
111
+ subject: string;
112
+ transferId: string;
113
+ sessionKey: string;
114
+ expiresAtMs: number;
115
+ store: TypedStore;
116
+ key: string;
117
+ info: FileInfo;
118
+ subscription: Subscription;
119
+ timeoutId: ReturnType<typeof setTimeout>;
120
+ };
121
+
122
+ function effectiveUploadMaxBytes(
123
+ argsMaxBytes?: number,
124
+ storeMaxObjectBytes?: number,
125
+ ): number | undefined {
126
+ if (argsMaxBytes === undefined) {
127
+ return storeMaxObjectBytes;
128
+ }
129
+ if (storeMaxObjectBytes === undefined) {
130
+ return argsMaxBytes;
131
+ }
132
+ return Math.min(argsMaxBytes, storeMaxObjectBytes);
133
+ }
134
+
135
+ function deferred<T>(): { promise: Promise<T>; resolve(value: T): void } {
136
+ let resolve!: (value: T) => void;
137
+ const promise = new Promise<T>((r) => {
138
+ resolve = r;
139
+ });
140
+ return { promise, resolve };
141
+ }
142
+
143
+ class AsyncValueQueue<T> implements AsyncIterable<T> {
144
+ #values: T[] = [];
145
+ #resolvers: Array<(result: IteratorResult<T>) => void> = [];
146
+ #closed = false;
147
+
148
+ push(value: T): void {
149
+ if (this.#closed) {
150
+ return;
151
+ }
152
+
153
+ const resolver = this.#resolvers.shift();
154
+ if (resolver) {
155
+ resolver({ value, done: false });
156
+ return;
157
+ }
158
+
159
+ this.#values.push(value);
160
+ }
161
+
162
+ close(): void {
163
+ if (this.#closed) {
164
+ return;
165
+ }
166
+ this.#closed = true;
167
+ while (this.#resolvers.length > 0) {
168
+ const resolver = this.#resolvers.shift();
169
+ resolver?.({ value: undefined as T, done: true });
170
+ }
171
+ }
172
+
173
+ [Symbol.asyncIterator](): AsyncIterator<T> {
174
+ return {
175
+ next: async (): Promise<IteratorResult<T>> => {
176
+ const value = this.#values.shift();
177
+ if (value !== undefined) {
178
+ return { value, done: false };
179
+ }
180
+ if (this.#closed) {
181
+ return { value: undefined as T, done: true };
182
+ }
183
+ return await new Promise<IteratorResult<T>>((resolve) => {
184
+ this.#resolvers.push(resolve);
185
+ });
186
+ },
187
+ };
188
+ }
189
+ }
190
+
191
+ class AsyncValueBroadcaster<T> {
192
+ #subscribers = new Set<AsyncValueQueue<T>>();
193
+ #closed = false;
194
+
195
+ push(value: T): void {
196
+ if (this.#closed) {
197
+ return;
198
+ }
199
+
200
+ for (const subscriber of this.#subscribers) {
201
+ subscriber.push(value);
202
+ }
203
+ }
204
+
205
+ close(): void {
206
+ if (this.#closed) {
207
+ return;
208
+ }
209
+
210
+ this.#closed = true;
211
+ for (const subscriber of this.#subscribers) {
212
+ subscriber.close();
213
+ }
214
+ this.#subscribers.clear();
215
+ }
216
+
217
+ subscribe(): AsyncIterable<T> {
218
+ const subscriber = new AsyncValueQueue<T>();
219
+ if (this.#closed) {
220
+ subscriber.close();
221
+ } else {
222
+ this.#subscribers.add(subscriber);
223
+ }
224
+
225
+ const subscribers = this.#subscribers;
226
+
227
+ return {
228
+ async *[Symbol.asyncIterator]() {
229
+ try {
230
+ for await (const value of subscriber) {
231
+ yield value;
232
+ }
233
+ } finally {
234
+ subscribers.delete(subscriber);
235
+ }
236
+ },
237
+ };
238
+ }
239
+ }
240
+
241
+ class AsyncChunkQueue implements AsyncIterable<Uint8Array> {
242
+ #values: Uint8Array[] = [];
243
+ #resolvers: Array<(result: IteratorResult<Uint8Array>) => void> = [];
244
+ #closed = false;
245
+ #error: unknown;
246
+
247
+ push(chunk: Uint8Array): void {
248
+ if (this.#closed) {
249
+ return;
250
+ }
251
+
252
+ const resolver = this.#resolvers.shift();
253
+ if (resolver) {
254
+ resolver({ value: chunk, done: false });
255
+ return;
256
+ }
257
+
258
+ this.#values.push(chunk);
259
+ }
260
+
261
+ close(): void {
262
+ if (this.#closed) {
263
+ return;
264
+ }
265
+ this.#closed = true;
266
+ while (this.#resolvers.length > 0) {
267
+ this.#resolvers.shift()?.({ value: undefined, done: true });
268
+ }
269
+ }
270
+
271
+ fail(error: unknown): void {
272
+ if (this.#closed) {
273
+ return;
274
+ }
275
+ this.#error = error;
276
+ this.#closed = true;
277
+ while (this.#resolvers.length > 0) {
278
+ this.#resolvers.shift()?.({ value: undefined, done: true });
279
+ }
280
+ }
281
+
282
+ async next(): Promise<IteratorResult<Uint8Array>> {
283
+ if (this.#values.length > 0) {
284
+ return { value: this.#values.shift()!, done: false };
285
+ }
286
+ if (this.#error) {
287
+ throw this.#error;
288
+ }
289
+ if (this.#closed) {
290
+ return { value: undefined, done: true };
291
+ }
292
+
293
+ return await new Promise<IteratorResult<Uint8Array>>((resolve) => {
294
+ this.#resolvers.push(resolve);
295
+ });
296
+ }
297
+
298
+ [Symbol.asyncIterator](): AsyncIterator<Uint8Array> {
299
+ return {
300
+ next: () => this.next(),
301
+ };
302
+ }
303
+ }
304
+
305
+ function fileInfoFromStoreInfo(info: StoreInfo): FileInfo {
306
+ return {
307
+ key: info.key,
308
+ size: info.size,
309
+ updatedAt: info.updatedAt,
310
+ ...(info.digest ? { digest: info.digest } : {}),
311
+ ...(info.contentType ? { contentType: info.contentType } : {}),
312
+ metadata: info.metadata,
313
+ };
314
+ }
315
+
316
+ function replyError(msg: Msg, error: TransferError): void {
317
+ const headers = natsHeaders();
318
+ headers.set("status", "error");
319
+ msg.respond(JSON.stringify(error.toSerializable()), { headers });
320
+ }
321
+
322
+ function publishError(
323
+ nc: NatsConnection,
324
+ subject: string,
325
+ error: TransferError,
326
+ ): void {
327
+ const headers = natsHeaders();
328
+ headers.set("status", "error");
329
+ nc.publish(subject, JSON.stringify(error.toSerializable()), { headers });
330
+ }
331
+
332
+ function parseSeq(msg: Msg): ResultType<number, TransferError> {
333
+ const raw = msg.headers?.get(TRANSFER_SEQUENCE_HEADER);
334
+ if (!raw) {
335
+ return Result.err(
336
+ new TransferError({
337
+ operation: "transfer",
338
+ context: { reason: "missing_sequence" },
339
+ }),
340
+ );
341
+ }
342
+ const value = Number(raw);
343
+ if (!Number.isInteger(value) || value < 0) {
344
+ return Result.err(
345
+ new TransferError({
346
+ operation: "transfer",
347
+ context: { reason: "invalid_sequence", raw },
348
+ }),
349
+ );
350
+ }
351
+ return Result.ok(value);
352
+ }
353
+
354
+ async function* iterateStream(
355
+ stream: ReadableStream<Uint8Array>,
356
+ ): AsyncIterable<Uint8Array> {
357
+ const reader = stream.getReader();
358
+ try {
359
+ while (true) {
360
+ const next = await reader.read();
361
+ if (next.done) {
362
+ return;
363
+ }
364
+ yield next.value;
365
+ }
366
+ } finally {
367
+ reader.releaseLock();
368
+ }
369
+ }
370
+
371
+ export class ServiceTransfer {
372
+ readonly #name: string;
373
+ readonly #nc: NatsConnection;
374
+ readonly #auth: TrellisAuth;
375
+ readonly #stores: Record<string, TransferStoreHandle>;
376
+ readonly #chunkBytes: number;
377
+ readonly #uploadSessions = new Map<string, UploadSession>();
378
+ readonly #downloadSessions = new Map<string, DownloadSession>();
379
+
380
+ constructor(opts: ServiceTransferOpts) {
381
+ this.#name = opts.name;
382
+ this.#nc = opts.nc;
383
+ this.#auth = opts.auth;
384
+ this.#stores = opts.stores;
385
+ this.#chunkBytes = opts.chunkBytes ?? DEFAULT_TRANSFER_CHUNK_BYTES;
386
+ }
387
+
388
+ async initiateUpload(
389
+ args: InitiateUploadArgs,
390
+ ): Promise<ResultType<SendTransferGrant, TransferError>> {
391
+ const store = await this.#openStore(args.store, "initiateUpload");
392
+ const storeValue = store.take();
393
+ if (isErr(storeValue)) {
394
+ return Result.err(storeValue.error);
395
+ }
396
+
397
+ const storeStatus = await storeValue.status();
398
+ const storeStatusValue = storeStatus.take();
399
+ if (isErr(storeStatusValue)) {
400
+ return Result.err(
401
+ new TransferError({
402
+ operation: "initiateUpload",
403
+ cause: storeStatusValue.error,
404
+ }),
405
+ );
406
+ }
407
+
408
+ const maxBytes = effectiveUploadMaxBytes(
409
+ args.maxBytes,
410
+ storeStatusValue.maxObjectBytes,
411
+ );
412
+
413
+ const transferId = ulid();
414
+ const subject = `${UPLOAD_SUBJECT_PREFIX}.${
415
+ this.#auth.sessionKey.slice(0, 16)
416
+ }.${transferId}`;
417
+ const expiresAtMs = Date.now() + args.expiresInMs;
418
+ const queue = new AsyncChunkQueue();
419
+ const subscription = this.#nc.subscribe(subject);
420
+ const putPromise = storeValue.put(args.key, queue, {
421
+ ...(args.contentType ? { contentType: args.contentType } : {}),
422
+ ...(args.metadata ? { metadata: args.metadata } : {}),
423
+ });
424
+
425
+ const session: UploadSession = {
426
+ kind: "upload",
427
+ subject,
428
+ transferId,
429
+ sessionKey: args.sessionKey,
430
+ expiresAtMs,
431
+ store: storeValue,
432
+ key: args.key,
433
+ ...(maxBytes !== undefined ? { maxBytes } : {}),
434
+ ...(args.contentType ? { contentType: args.contentType } : {}),
435
+ ...(args.metadata ? { metadata: args.metadata } : {}),
436
+ ...(args.onProgress ? { onProgress: args.onProgress } : {}),
437
+ ...(args.onComplete ? { onComplete: args.onComplete } : {}),
438
+ ...(args.onError ? { onError: args.onError } : {}),
439
+ ...(args.onStored ? { onStored: args.onStored } : {}),
440
+ subscription,
441
+ timeoutId: setTimeout(
442
+ () => this.#expireUploadSession(subject),
443
+ args.expiresInMs,
444
+ ),
445
+ queue,
446
+ putPromise,
447
+ nextSeq: 0,
448
+ receivedBytes: 0,
449
+ };
450
+
451
+ this.#uploadSessions.set(subject, session);
452
+ this.#runUploadSession(session);
453
+
454
+ const ready = await this.#flushSubscriptionInterest("initiateUpload");
455
+ const readyValue = ready.take();
456
+ if (isErr(readyValue)) {
457
+ this.#expireUploadSession(subject, readyValue.error);
458
+ return Result.err(readyValue.error);
459
+ }
460
+ if (!this.#uploadSessions.has(subject)) {
461
+ return Result.err(
462
+ new TransferError({
463
+ operation: "initiateUpload",
464
+ context: { reason: "session_closed" },
465
+ }),
466
+ );
467
+ }
468
+ if (Date.now() >= expiresAtMs) {
469
+ const error = new TransferError({
470
+ operation: "initiateUpload",
471
+ context: { reason: "expired" },
472
+ });
473
+ this.#expireUploadSession(subject, error);
474
+ return Result.err(error);
475
+ }
476
+
477
+ return Result.ok({
478
+ type: "TransferGrant",
479
+ direction: "send",
480
+ service: this.#name,
481
+ sessionKey: args.sessionKey,
482
+ transferId,
483
+ subject,
484
+ expiresAt: new Date(expiresAtMs).toISOString(),
485
+ chunkBytes: this.#chunkBytes,
486
+ ...(maxBytes !== undefined ? { maxBytes } : {}),
487
+ ...(args.contentType ? { contentType: args.contentType } : {}),
488
+ ...(args.metadata ? { metadata: args.metadata } : {}),
489
+ });
490
+ }
491
+
492
+ createOperationUpload(
493
+ args: InitiateUploadArgs,
494
+ ): AsyncResult<OperationUploadTransfer, TransferError> {
495
+ return AsyncResult.from(
496
+ (async (): Promise<
497
+ ResultType<OperationUploadTransfer, TransferError>
498
+ > => {
499
+ const updates = new AsyncValueBroadcaster<
500
+ RuntimeOperationTransferProgress
501
+ >();
502
+ const completed = deferred<ResultType<FileInfo, TransferError>>();
503
+ let settled = false;
504
+ const settle = (value: ResultType<FileInfo, TransferError>) => {
505
+ if (settled) {
506
+ return;
507
+ }
508
+ settled = true;
509
+ updates.close();
510
+ completed.resolve(value);
511
+ };
512
+
513
+ const grant = await this.initiateUpload({
514
+ ...args,
515
+ onProgress: async (progress) => {
516
+ updates.push(progress);
517
+ await args.onProgress?.(progress);
518
+ },
519
+ onComplete: async (info) => {
520
+ await args.onComplete?.(info);
521
+ settle(Result.ok(info));
522
+ },
523
+ onError: async (error) => {
524
+ await args.onError?.(error);
525
+ settle(Result.err(error));
526
+ },
527
+ onStored: async (stored) => {
528
+ await args.onStored?.(stored);
529
+ },
530
+ });
531
+ const grantValue = grant.take();
532
+ if (isErr(grantValue)) {
533
+ return Result.err(grantValue.error);
534
+ }
535
+
536
+ return Result.ok({
537
+ grant: grantValue,
538
+ transfer: {
539
+ updates: () => updates.subscribe(),
540
+ completed: () => AsyncResult.from(completed.promise),
541
+ },
542
+ });
543
+ })(),
544
+ );
545
+ }
546
+
547
+ async initiateDownload(
548
+ args: InitiateDownloadArgs,
549
+ ): Promise<ResultType<ReceiveTransferGrant, TransferError>> {
550
+ const store = await this.#openStore(args.store, "initiateDownload");
551
+ const storeValue = store.take();
552
+ if (isErr(storeValue)) {
553
+ return Result.err(storeValue.error);
554
+ }
555
+
556
+ const entry = await storeValue.get(args.key);
557
+ const entryValue = entry.take();
558
+ if (isErr(entryValue)) {
559
+ return Result.err(
560
+ new TransferError({
561
+ operation: "initiateDownload",
562
+ cause: entryValue.error,
563
+ }),
564
+ );
565
+ }
566
+
567
+ const transferId = ulid();
568
+ const subject = `${DOWNLOAD_SUBJECT_PREFIX}.${
569
+ this.#auth.sessionKey.slice(0, 16)
570
+ }.${transferId}`;
571
+ const expiresAtMs = Date.now() + args.expiresInMs;
572
+ const subscription = this.#nc.subscribe(subject);
573
+ const session: DownloadSession = {
574
+ kind: "download",
575
+ subject,
576
+ transferId,
577
+ sessionKey: args.sessionKey,
578
+ expiresAtMs,
579
+ store: storeValue,
580
+ key: args.key,
581
+ info: fileInfoFromStoreInfo(entryValue.info),
582
+ subscription,
583
+ timeoutId: setTimeout(
584
+ () => this.#cleanupDownloadSession(subject),
585
+ args.expiresInMs,
586
+ ),
587
+ };
588
+
589
+ this.#downloadSessions.set(subject, session);
590
+ this.#runDownloadSession(session);
591
+
592
+ const ready = await this.#flushSubscriptionInterest("initiateDownload");
593
+ const readyValue = ready.take();
594
+ if (isErr(readyValue)) {
595
+ this.#cleanupDownloadSession(subject);
596
+ return Result.err(readyValue.error);
597
+ }
598
+ if (!this.#downloadSessions.has(subject)) {
599
+ return Result.err(
600
+ new TransferError({
601
+ operation: "initiateDownload",
602
+ context: { reason: "session_closed" },
603
+ }),
604
+ );
605
+ }
606
+ if (Date.now() >= expiresAtMs) {
607
+ this.#cleanupDownloadSession(subject);
608
+ return Result.err(
609
+ new TransferError({
610
+ operation: "initiateDownload",
611
+ context: { reason: "expired" },
612
+ }),
613
+ );
614
+ }
615
+
616
+ return Result.ok({
617
+ type: "TransferGrant",
618
+ direction: "receive",
619
+ service: this.#name,
620
+ sessionKey: args.sessionKey,
621
+ transferId,
622
+ subject,
623
+ expiresAt: new Date(expiresAtMs).toISOString(),
624
+ chunkBytes: this.#chunkBytes,
625
+ info: session.info,
626
+ });
627
+ }
628
+
629
+ async stop(): Promise<void> {
630
+ for (const subject of [...this.#uploadSessions.keys()]) {
631
+ this.#expireUploadSession(subject);
632
+ }
633
+ for (const subject of [...this.#downloadSessions.keys()]) {
634
+ this.#cleanupDownloadSession(subject);
635
+ }
636
+ }
637
+
638
+ async #openStore(
639
+ alias: string,
640
+ operation: string,
641
+ ): Promise<ResultType<TypedStore, TransferError>> {
642
+ const handle = this.#stores[alias];
643
+ if (!handle) {
644
+ return Result.err(
645
+ new TransferError({
646
+ operation,
647
+ context: { reason: "unknown_store", store: alias },
648
+ }),
649
+ );
650
+ }
651
+
652
+ const store = await handle.open();
653
+ const value = store.take();
654
+ if (isErr(value)) {
655
+ return Result.err(
656
+ new TransferError({
657
+ operation,
658
+ cause: value.error,
659
+ context: { store: alias },
660
+ }),
661
+ );
662
+ }
663
+ return Result.ok(value);
664
+ }
665
+
666
+ async #flushSubscriptionInterest(
667
+ operation: string,
668
+ ): Promise<ResultType<void, TransferError>> {
669
+ try {
670
+ await this.#nc.flush();
671
+ return Result.ok(undefined);
672
+ } catch (cause) {
673
+ return Result.err(new TransferError({ operation, cause }));
674
+ }
675
+ }
676
+
677
+ async #runUploadSession(session: UploadSession): Promise<void> {
678
+ try {
679
+ for await (const msg of session.subscription) {
680
+ await this.#handleUploadMessage(session, msg);
681
+ if (!this.#uploadSessions.has(session.subject)) {
682
+ break;
683
+ }
684
+ }
685
+ } finally {
686
+ this.#cleanupUploadSession(session.subject);
687
+ }
688
+ }
689
+
690
+ async #handleUploadMessage(session: UploadSession, msg: Msg): Promise<void> {
691
+ if (Date.now() >= session.expiresAtMs) {
692
+ const error = new TransferError({
693
+ operation: "put",
694
+ context: { reason: "expired" },
695
+ });
696
+ replyError(msg, error);
697
+ this.#expireUploadSession(session.subject, error);
698
+ return;
699
+ }
700
+
701
+ const authenticated = await verifyTransferMessage({
702
+ expectedSessionKey: session.sessionKey,
703
+ subject: msg.subject,
704
+ payload: msg.data,
705
+ proof: msg.headers?.get("proof"),
706
+ sessionKey: msg.headers?.get("session-key"),
707
+ iat: msg.headers?.get("iat"),
708
+ requestId: msg.headers?.get("request-id"),
709
+ });
710
+ if (!authenticated) {
711
+ const error = new TransferError({
712
+ operation: "put",
713
+ context: { reason: "invalid_proof" },
714
+ });
715
+ replyError(msg, error);
716
+ this.#expireUploadSession(session.subject, error);
717
+ return;
718
+ }
719
+
720
+ const seq = parseSeq(msg).take();
721
+ if (isErr(seq)) {
722
+ replyError(msg, seq.error);
723
+ this.#expireUploadSession(session.subject, seq.error);
724
+ return;
725
+ }
726
+ if (seq !== session.nextSeq) {
727
+ const error = new TransferError({
728
+ operation: "put",
729
+ context: {
730
+ reason: "out_of_order",
731
+ expected: session.nextSeq,
732
+ actual: seq,
733
+ },
734
+ });
735
+ replyError(msg, error);
736
+ this.#expireUploadSession(session.subject, error);
737
+ return;
738
+ }
739
+ if (msg.data.length > 0) {
740
+ if (msg.data.length > this.#chunkBytes) {
741
+ const error = new TransferError({
742
+ operation: "put",
743
+ context: {
744
+ reason: "chunk_too_large",
745
+ maxChunkBytes: this.#chunkBytes,
746
+ },
747
+ });
748
+ replyError(msg, error);
749
+ this.#expireUploadSession(session.subject, error);
750
+ return;
751
+ }
752
+ session.receivedBytes += msg.data.length;
753
+ if (
754
+ session.maxBytes !== undefined &&
755
+ session.receivedBytes > session.maxBytes
756
+ ) {
757
+ const error = new TransferError({
758
+ operation: "put",
759
+ context: {
760
+ reason: "max_bytes_exceeded",
761
+ maxBytes: session.maxBytes,
762
+ attemptedBytes: session.receivedBytes,
763
+ },
764
+ });
765
+ replyError(msg, error);
766
+ this.#expireUploadSession(session.subject, error);
767
+ return;
768
+ }
769
+ session.queue.push(msg.data);
770
+ await session.onProgress?.({
771
+ chunkIndex: session.nextSeq,
772
+ chunkBytes: msg.data.length,
773
+ transferredBytes: session.receivedBytes,
774
+ });
775
+ }
776
+ session.nextSeq += 1;
777
+
778
+ if (msg.headers?.get(TRANSFER_EOF_HEADER) === "true") {
779
+ session.queue.close();
780
+ const putResult = await session.putPromise;
781
+ const putValue = putResult.take();
782
+ if (isErr(putValue)) {
783
+ const error = new TransferError({
784
+ operation: "put",
785
+ cause: putValue.error,
786
+ });
787
+ replyError(msg, error);
788
+ this.#expireUploadSession(session.subject, error);
789
+ return;
790
+ }
791
+
792
+ const stored = await session.store.get(session.key);
793
+ const storedValue = stored.take();
794
+ if (isErr(storedValue)) {
795
+ const error = new TransferError({
796
+ operation: "put",
797
+ cause: storedValue.error,
798
+ });
799
+ replyError(msg, error);
800
+ this.#expireUploadSession(session.subject, error);
801
+ return;
802
+ }
803
+
804
+ const info = fileInfoFromStoreInfo(storedValue.info);
805
+ msg.respond(JSON.stringify({ status: "complete", info }));
806
+ await session.onComplete?.(info);
807
+ if (session.onStored) {
808
+ void Promise.resolve(session.onStored({
809
+ transferId: session.transferId,
810
+ sessionKey: session.sessionKey,
811
+ store: session.store,
812
+ entry: storedValue,
813
+ info,
814
+ })).catch((error) => {
815
+ console.error("transfer onStored callback failed", error);
816
+ });
817
+ }
818
+ this.#cleanupUploadSession(session.subject);
819
+ return;
820
+ }
821
+
822
+ msg.respond(JSON.stringify({ status: "continue" }));
823
+ }
824
+
825
+ async #runDownloadSession(session: DownloadSession): Promise<void> {
826
+ try {
827
+ for await (const msg of session.subscription) {
828
+ await this.#handleDownloadRequest(session, msg);
829
+ break;
830
+ }
831
+ } finally {
832
+ this.#cleanupDownloadSession(session.subject);
833
+ }
834
+ }
835
+
836
+ async #handleDownloadRequest(
837
+ session: DownloadSession,
838
+ msg: Msg,
839
+ ): Promise<void> {
840
+ const reply = msg.reply;
841
+ if (
842
+ !reply || !reply.startsWith(`_INBOX.${session.sessionKey.slice(0, 16)}.`)
843
+ ) {
844
+ replyError(
845
+ msg,
846
+ new TransferError({
847
+ operation: "get",
848
+ context: { reason: "reply_subject_mismatch" },
849
+ }),
850
+ );
851
+ return;
852
+ }
853
+ if (Date.now() >= session.expiresAtMs) {
854
+ publishError(
855
+ this.#nc,
856
+ reply,
857
+ new TransferError({ operation: "get", context: { reason: "expired" } }),
858
+ );
859
+ return;
860
+ }
861
+
862
+ const authenticated = await verifyTransferMessage({
863
+ expectedSessionKey: session.sessionKey,
864
+ subject: msg.subject,
865
+ payload: msg.data,
866
+ proof: msg.headers?.get("proof"),
867
+ sessionKey: msg.headers?.get("session-key"),
868
+ iat: msg.headers?.get("iat"),
869
+ requestId: msg.headers?.get("request-id"),
870
+ });
871
+ if (!authenticated) {
872
+ publishError(
873
+ this.#nc,
874
+ reply,
875
+ new TransferError({
876
+ operation: "get",
877
+ context: { reason: "invalid_proof" },
878
+ }),
879
+ );
880
+ return;
881
+ }
882
+
883
+ const entry = await session.store.get(session.key);
884
+ const entryValue = entry.take();
885
+ if (isErr(entryValue)) {
886
+ publishError(
887
+ this.#nc,
888
+ reply,
889
+ new TransferError({ operation: "get", cause: entryValue.error }),
890
+ );
891
+ return;
892
+ }
893
+
894
+ const stream = await entryValue.stream();
895
+ const streamValue = stream.take();
896
+ if (isErr(streamValue)) {
897
+ publishError(
898
+ this.#nc,
899
+ reply,
900
+ new TransferError({ operation: "get", cause: streamValue.error }),
901
+ );
902
+ return;
903
+ }
904
+
905
+ let seq = 0;
906
+ try {
907
+ for await (const chunk of iterateStream(streamValue)) {
908
+ const headers = natsHeaders();
909
+ headers.set(TRANSFER_SEQUENCE_HEADER, String(seq));
910
+ this.#nc.publish(reply, chunk, { headers });
911
+ seq += 1;
912
+ }
913
+ const finalHeaders = natsHeaders();
914
+ finalHeaders.set(TRANSFER_SEQUENCE_HEADER, String(seq));
915
+ finalHeaders.set(TRANSFER_EOF_HEADER, "true");
916
+ this.#nc.publish(reply, new Uint8Array(), { headers: finalHeaders });
917
+ await this.#nc.flush();
918
+ } catch (cause) {
919
+ publishError(
920
+ this.#nc,
921
+ reply,
922
+ new TransferError({ operation: "get", cause }),
923
+ );
924
+ }
925
+ }
926
+
927
+ #expireUploadSession(
928
+ subject: string,
929
+ error = new TransferError({
930
+ operation: "put",
931
+ context: { reason: "expired" },
932
+ }),
933
+ ): void {
934
+ const session = this.#uploadSessions.get(subject);
935
+ if (!session) {
936
+ return;
937
+ }
938
+ session.queue.fail(error);
939
+ void Promise.resolve(session.onError?.(error));
940
+ this.#cleanupUploadSession(subject);
941
+ }
942
+
943
+ #cleanupUploadSession(subject: string): void {
944
+ const session = this.#uploadSessions.get(subject);
945
+ if (!session) {
946
+ return;
947
+ }
948
+ clearTimeout(session.timeoutId);
949
+ session.subscription.unsubscribe();
950
+ this.#uploadSessions.delete(subject);
951
+ }
952
+
953
+ #cleanupDownloadSession(subject: string): void {
954
+ const session = this.#downloadSessions.get(subject);
955
+ if (!session) {
956
+ return;
957
+ }
958
+ clearTimeout(session.timeoutId);
959
+ session.subscription.unsubscribe();
960
+ this.#downloadSessions.delete(subject);
961
+ }
962
+ }