@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,1328 @@
1
+ import * as dntShim from "./_dnt.shims.js";
2
+ import {
3
+ type Authenticator,
4
+ jwtAuthenticator,
5
+ type NatsConnection,
6
+ } from "@nats-io/nats-core";
7
+ import {
8
+ CONTRACT_STATE_METADATA,
9
+ type ContractStateMetadata,
10
+ digestContractManifest,
11
+ } from "./contract_support/mod.js";
12
+ import {
13
+ base64urlDecode,
14
+ base64urlEncode,
15
+ getOrCreateSessionKey,
16
+ getPublicSessionKey,
17
+ natsConnectSigForIat,
18
+ type SessionKeyOptions,
19
+ startAuthRequest,
20
+ } from "./auth/browser.js";
21
+ import {
22
+ BindResponseSchema,
23
+ sha256,
24
+ toArrayBuffer,
25
+ utf8,
26
+ } from "./auth/browser.js";
27
+ import {
28
+ correctedIatSeconds,
29
+ estimateMidpointClockOffsetMs,
30
+ } from "./auth/time.js";
31
+ import { buildNatsConnectSignaturePayload } from "./auth/session_auth.js";
32
+ import { canonicalizeJsonValue } from "./auth/utils.js";
33
+ import {
34
+ importEd25519PrivateKeyFromSeedBase64url,
35
+ publicKeyBase64urlFromSeed,
36
+ signEd25519SeedSha256,
37
+ } from "./auth/keys.js";
38
+ import type { ClientOpts } from "./client.js";
39
+ import type { TrellisAPI, TrellisContractV1 } from "./contracts.js";
40
+ import {
41
+ DEFAULT_RUNTIME_MAX_RECONNECT_ATTEMPTS,
42
+ loadDefaultRuntimeTransport,
43
+ type RuntimeTransport,
44
+ selectRuntimeTransportServers,
45
+ } from "./runtime_transport.js";
46
+ import {
47
+ type ConnectedTrellisClient,
48
+ type RuntimeStateStores,
49
+ Trellis,
50
+ type TrellisOpts,
51
+ } from "./trellis.js";
52
+ import { TransportError } from "./errors/index.js";
53
+ import { AsyncResult, Result, UnexpectedError } from "@qlever-llc/result";
54
+ import { type StaticDecode, Type } from "typebox";
55
+ import { Value } from "typebox/value";
56
+ import {
57
+ bindFlowSig,
58
+ oauthInitSig,
59
+ type SessionKeyHandle,
60
+ signBytes,
61
+ } from "./auth/browser/session.js";
62
+ import {
63
+ observeNatsTrellisConnection,
64
+ type TrellisConnection,
65
+ } from "./connection.js";
66
+
67
+ type ClientContract<
68
+ TApi extends TrellisAPI = TrellisAPI,
69
+ TContract extends TrellisContractV1 = TrellisContractV1,
70
+ > = {
71
+ CONTRACT: TContract;
72
+ CONTRACT_DIGEST?: string;
73
+ API: {
74
+ trellis: TApi;
75
+ };
76
+ readonly [CONTRACT_STATE_METADATA]?: ContractStateMetadata;
77
+ };
78
+
79
+ function createConnectedClient(args: {
80
+ name: string;
81
+ nc: NatsConnection;
82
+ connection: TrellisConnection;
83
+ sessionKey: string;
84
+ sign(data: Uint8Array): Promise<Uint8Array>;
85
+ opts: {
86
+ log: ClientOpts["log"];
87
+ timeout: ClientOpts["timeout"];
88
+ stream: ClientOpts["stream"];
89
+ noResponderRetry: ClientOpts["noResponderRetry"];
90
+ api: TrellisAPI;
91
+ state: TrellisOpts<TrellisAPI>["state"];
92
+ onSessionNotFound?: TrellisOpts<TrellisAPI>["onSessionNotFound"];
93
+ };
94
+ }): Trellis<TrellisAPI, "client", RuntimeStateStores> {
95
+ const trellis = new Trellis<TrellisAPI, "client", RuntimeStateStores>(
96
+ args.name,
97
+ args.nc,
98
+ {
99
+ sessionKey: args.sessionKey,
100
+ sign: args.sign,
101
+ },
102
+ {
103
+ ...args.opts,
104
+ connection: args.connection,
105
+ },
106
+ );
107
+
108
+ return trellis;
109
+ }
110
+
111
+ function clientConnectResult<T>(
112
+ promise: Promise<T>,
113
+ ): AsyncResult<T, TransportError | UnexpectedError> {
114
+ return AsyncResult.from(
115
+ promise.then(
116
+ (value): Result<T, TransportError | UnexpectedError> => Result.ok(value),
117
+ (cause): Result<T, TransportError | UnexpectedError> =>
118
+ Result.err(
119
+ cause instanceof TransportError
120
+ ? cause
121
+ : new UnexpectedError({ cause }),
122
+ ),
123
+ ),
124
+ );
125
+ }
126
+
127
+ type BrowserClientAuthOptions = {
128
+ mode?: "browser";
129
+ handle?: SessionKeyHandle;
130
+ provider?: string;
131
+ redirectTo?: string | (() => string);
132
+ landingPath?: string;
133
+ context?: unknown;
134
+ currentUrl?: URL | string | (() => URL | string);
135
+ flowId?: string;
136
+ sessionKey?: SessionKeyOptions;
137
+ };
138
+
139
+ type SessionKeyClientAuthOptions = {
140
+ mode: "session_key";
141
+ sessionKeySeed: string;
142
+ provider?: string;
143
+ redirectTo: string;
144
+ context?: unknown;
145
+ flowId?: string;
146
+ };
147
+
148
+ export type ClientAuthOptions =
149
+ | BrowserClientAuthOptions
150
+ | SessionKeyClientAuthOptions;
151
+
152
+ export type ClientAuthRequiredContext = {
153
+ loginUrl: string;
154
+ sessionKey: string;
155
+ mode: "browser" | "session_key";
156
+ };
157
+
158
+ export type ClientAuthContinuation =
159
+ | { status: "bound"; flowId: string }
160
+ | { status: "handled" }
161
+ | void;
162
+
163
+ /**
164
+ * Error raised when client authentication was delegated to caller-owned routing.
165
+ */
166
+ export class ClientAuthHandledError extends Error {
167
+ constructor() {
168
+ super("Client authentication was handled by the caller");
169
+ this.name = "ClientAuthHandledError";
170
+ }
171
+ }
172
+
173
+ type ClientConnectArgsFor<TContract extends ClientContract> =
174
+ & ClientOpts
175
+ & {
176
+ trellisUrl: string;
177
+ contract: TContract;
178
+ auth?: ClientAuthOptions;
179
+ onAuthRequired?: (
180
+ ctx: ClientAuthRequiredContext,
181
+ ) => Promise<ClientAuthContinuation> | ClientAuthContinuation;
182
+ };
183
+
184
+ export type TrellisClientConnectArgs<
185
+ TApi extends TrellisAPI = TrellisAPI,
186
+ TContract extends ClientContract<TApi, TrellisContractV1> = ClientContract<
187
+ TApi,
188
+ TrellisContractV1
189
+ >,
190
+ > = ClientConnectArgsFor<TContract>;
191
+
192
+ type ClientRuntimeIdentity = {
193
+ mode: "browser" | "session_key";
194
+ sessionKey: string;
195
+ sign(data: Uint8Array): Promise<Uint8Array>;
196
+ oauthInitSig(
197
+ redirectTo: string,
198
+ context?: unknown,
199
+ provider?: string,
200
+ contract?: Record<string, unknown> | string,
201
+ ): Promise<string>;
202
+ natsConnectSigForIat(iat: number, contractDigest: string): Promise<string>;
203
+ bootstrapSig(iat: number): Promise<string>;
204
+ bindFlowSig(flowId: string): Promise<string>;
205
+ buildRuntimeAuthTokenSync?(iat: number, contractDigest: string): string;
206
+ };
207
+
208
+ const ClientTransportEndpointsSchema = Type.Object({
209
+ natsServers: Type.Array(Type.String({ minLength: 1 }), { minItems: 1 }),
210
+ });
211
+
212
+ const ClientTransportsSchema = Type.Object({
213
+ native: Type.Optional(ClientTransportEndpointsSchema),
214
+ websocket: Type.Optional(ClientTransportEndpointsSchema),
215
+ });
216
+
217
+ type ClientConnectDeps = {
218
+ loadTransport(): Promise<RuntimeTransport>;
219
+ now(): number;
220
+ setInterval?: (
221
+ handler: () => void,
222
+ ms: number,
223
+ ) => ReturnType<typeof globalThis.setInterval>;
224
+ clearInterval?: (id: ReturnType<typeof globalThis.setInterval>) => void;
225
+ };
226
+
227
+ const ClientBootstrapReadySchema = Type.Object({
228
+ status: Type.Literal("ready"),
229
+ serverNow: Type.Integer(),
230
+ connectInfo: Type.Object({
231
+ sessionKey: Type.String({ minLength: 1 }),
232
+ contractId: Type.String({ minLength: 1 }),
233
+ contractDigest: Type.String({ minLength: 1 }),
234
+ transports: ClientTransportsSchema,
235
+ transport: Type.Object({
236
+ inboxPrefix: Type.String({ minLength: 1 }),
237
+ sentinel: Type.Object({
238
+ jwt: Type.String({ minLength: 1 }),
239
+ seed: Type.String({ minLength: 1 }),
240
+ }),
241
+ }),
242
+ }),
243
+ }, { additionalProperties: true });
244
+
245
+ const ClientBootstrapAuthRequiredSchema = Type.Object({
246
+ status: Type.Literal("auth_required"),
247
+ serverNow: Type.Integer(),
248
+ }, { additionalProperties: true });
249
+
250
+ const ClientBootstrapNotReadySchema = Type.Object({
251
+ status: Type.Literal("not_ready"),
252
+ reason: Type.String({ minLength: 1 }),
253
+ serverNow: Type.Integer(),
254
+ }, { additionalProperties: true });
255
+
256
+ const ClientBootstrapIatOutOfRangeSchema = Type.Object({
257
+ reason: Type.Literal("iat_out_of_range"),
258
+ serverNow: Type.Integer(),
259
+ }, { additionalProperties: true });
260
+
261
+ type ClientBootstrapReady = StaticDecode<typeof ClientBootstrapReadySchema>;
262
+ type ClientBootstrapAuthRequired = StaticDecode<
263
+ typeof ClientBootstrapAuthRequiredSchema
264
+ >;
265
+ type ClientBootstrapNotReady = StaticDecode<
266
+ typeof ClientBootstrapNotReadySchema
267
+ >;
268
+ type ClientBootstrapIatOutOfRange = StaticDecode<
269
+ typeof ClientBootstrapIatOutOfRangeSchema
270
+ >;
271
+ type ClientBootstrapResponse =
272
+ | ClientBootstrapReady
273
+ | ClientBootstrapAuthRequired
274
+ | ClientBootstrapNotReady;
275
+ type ClientBootstrapAttemptResponse =
276
+ | ClientBootstrapResponse
277
+ | ClientBootstrapIatOutOfRange;
278
+ type ClockOffsetState = { serverClockOffsetMs: number };
279
+
280
+ function isBrowserRuntime(): boolean {
281
+ return typeof dntShim.dntGlobalThis !== "undefined" && typeof document !== "undefined";
282
+ }
283
+
284
+ const defaultDeps: ClientConnectDeps = {
285
+ loadTransport: loadDefaultRuntimeTransport,
286
+ now: () => Date.now(),
287
+ setInterval: (handler, ms) => globalThis.setInterval(handler, ms),
288
+ clearInterval: (id) => globalThis.clearInterval(id),
289
+ };
290
+
291
+ function transportCauseContext(cause: unknown): Record<string, unknown> {
292
+ if (cause instanceof Error) {
293
+ return { causeName: cause.name, causeMessage: cause.message };
294
+ }
295
+
296
+ return { cause: String(cause) };
297
+ }
298
+
299
+ function createTransportError(args: {
300
+ code: string;
301
+ message: string;
302
+ hint: string;
303
+ context?: Record<string, unknown>;
304
+ cause?: unknown;
305
+ }): TransportError {
306
+ return new TransportError({
307
+ code: args.code,
308
+ message: args.message,
309
+ hint: args.hint,
310
+ cause: args.cause,
311
+ context: {
312
+ ...(args.context ?? {}),
313
+ ...(args.cause === undefined ? {} : transportCauseContext(args.cause)),
314
+ },
315
+ });
316
+ }
317
+
318
+ async function readJsonResponse(
319
+ response: Response,
320
+ args: {
321
+ code: string;
322
+ message: string;
323
+ hint: string;
324
+ context?: Record<string, unknown>;
325
+ },
326
+ ): Promise<unknown> {
327
+ try {
328
+ return await response.json();
329
+ } catch (cause) {
330
+ throw createTransportError({
331
+ ...args,
332
+ cause,
333
+ });
334
+ }
335
+ }
336
+
337
+ function normalizeTrellisUrl(trellisUrl: string): string {
338
+ return new URL(trellisUrl).toString().replace(/\/$/, "");
339
+ }
340
+
341
+ function resolveCurrentUrl(auth?: BrowserClientAuthOptions): URL | null {
342
+ const currentUrl = typeof auth?.currentUrl === "function"
343
+ ? auth.currentUrl()
344
+ : auth?.currentUrl;
345
+ if (currentUrl instanceof URL) return currentUrl;
346
+ if (typeof currentUrl === "string") return new URL(currentUrl);
347
+ return null;
348
+ }
349
+
350
+ function resolveRedirectTo(
351
+ auth: BrowserClientAuthOptions,
352
+ currentUrl: URL,
353
+ ): string {
354
+ const redirectTo = typeof auth.redirectTo === "function"
355
+ ? auth.redirectTo()
356
+ : auth.redirectTo;
357
+ if (redirectTo) {
358
+ return new URL(redirectTo, currentUrl.origin).toString();
359
+ }
360
+
361
+ const queryRedirect = currentUrl.searchParams.get("redirectTo");
362
+ if (queryRedirect) {
363
+ return new URL(queryRedirect, currentUrl.origin).toString();
364
+ }
365
+
366
+ if (auth.landingPath) {
367
+ return new URL(auth.landingPath, currentUrl.origin).toString();
368
+ }
369
+
370
+ return currentUrl.toString();
371
+ }
372
+
373
+ function resolveConfiguredRedirectTo(
374
+ redirectTo: string | (() => string) | undefined,
375
+ ): string | undefined {
376
+ return typeof redirectTo === "function" ? redirectTo() : redirectTo;
377
+ }
378
+
379
+ function authRequestContextRecord(
380
+ value: unknown,
381
+ ): Record<string, unknown> | undefined {
382
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
383
+ return undefined;
384
+ }
385
+ return value as Record<string, unknown>;
386
+ }
387
+
388
+ async function signDomainValue(
389
+ sign: (data: Uint8Array) => Promise<Uint8Array>,
390
+ prefix: string,
391
+ value: string,
392
+ ): Promise<string> {
393
+ const digest = await sha256(utf8(`${prefix}:${value}`));
394
+ const signature = await sign(digest);
395
+ const binary = String.fromCharCode(...signature);
396
+ return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(
397
+ /=+$/g,
398
+ "",
399
+ );
400
+ }
401
+
402
+ async function createSessionKeyRuntimeIdentity(
403
+ sessionKeySeed: string,
404
+ ): Promise<ClientRuntimeIdentity> {
405
+ const seed = base64urlDecode(sessionKeySeed);
406
+ const privateKey = await importEd25519PrivateKeyFromSeedBase64url(
407
+ sessionKeySeed,
408
+ );
409
+ const sessionKey = publicKeyBase64urlFromSeed(seed);
410
+ const sign = async (data: Uint8Array): Promise<Uint8Array> => {
411
+ const signature = await crypto.subtle.sign(
412
+ "Ed25519",
413
+ privateKey,
414
+ toArrayBuffer(data),
415
+ );
416
+ return new Uint8Array(signature);
417
+ };
418
+
419
+ return {
420
+ mode: "session_key",
421
+ sessionKey,
422
+ sign,
423
+ oauthInitSig: (redirectTo, context, provider, contract) =>
424
+ signDomainValue(
425
+ sign,
426
+ "oauth-init",
427
+ contract === undefined
428
+ ? `${redirectTo}:${canonicalizeJsonValue(context ?? null)}`
429
+ : `${redirectTo}:${provider ?? ""}:${
430
+ canonicalizeJsonValue(contract)
431
+ }:${canonicalizeJsonValue(context ?? null)}`,
432
+ ),
433
+ natsConnectSigForIat: (iat, contractDigest) =>
434
+ signDomainValue(
435
+ sign,
436
+ "nats-connect",
437
+ buildNatsConnectSignaturePayload(iat, contractDigest),
438
+ ),
439
+ bootstrapSig: (iat) =>
440
+ signDomainValue(sign, "bootstrap-client", String(iat)),
441
+ bindFlowSig: (flowId) => signDomainValue(sign, "bind-flow", flowId),
442
+ buildRuntimeAuthTokenSync: (iat, contractDigest) => {
443
+ const sig = signEd25519SeedSha256(
444
+ seed,
445
+ utf8(
446
+ `nats-connect:${
447
+ buildNatsConnectSignaturePayload(iat, contractDigest)
448
+ }`,
449
+ ),
450
+ );
451
+ return JSON.stringify({
452
+ v: 1,
453
+ sessionKey,
454
+ iat,
455
+ contractDigest,
456
+ sig: base64urlEncode(new Uint8Array(sig)),
457
+ });
458
+ },
459
+ };
460
+ }
461
+
462
+ async function resolveClientIdentity(
463
+ auth: ClientAuthOptions | undefined,
464
+ ): Promise<ClientRuntimeIdentity> {
465
+ if (auth?.mode === "session_key") {
466
+ return await createSessionKeyRuntimeIdentity(auth.sessionKeySeed);
467
+ }
468
+
469
+ const handle = auth?.handle ?? await getOrCreateSessionKey(auth?.sessionKey);
470
+ return {
471
+ mode: "browser",
472
+ sessionKey: getPublicSessionKey(handle),
473
+ sign: (data) => signBytes(handle, data),
474
+ oauthInitSig: (redirectTo, context, provider, contract) =>
475
+ oauthInitSig(handle, redirectTo, context, provider, contract),
476
+ natsConnectSigForIat: (iat, contractDigest) =>
477
+ natsConnectSigForIat(handle, iat, contractDigest),
478
+ bootstrapSig: (iat) =>
479
+ signDomainValue(
480
+ (data) => signBytes(handle, data),
481
+ "bootstrap-client",
482
+ String(iat),
483
+ ),
484
+ bindFlowSig: (flowId) => bindFlowSig(handle, flowId),
485
+ };
486
+ }
487
+
488
+ async function bindClientFlow(args: {
489
+ trellisUrl: string;
490
+ sessionKey: string;
491
+ flowId: string;
492
+ sig: string;
493
+ }): Promise<void> {
494
+ const response = await fetch(
495
+ `${args.trellisUrl}/auth/flow/${encodeURIComponent(args.flowId)}/bind`,
496
+ {
497
+ method: "POST",
498
+ headers: { "Content-Type": "application/json" },
499
+ body: JSON.stringify({ sessionKey: args.sessionKey, sig: args.sig }),
500
+ },
501
+ );
502
+ if (!response.ok) {
503
+ const reason = await response.text();
504
+ throw createTransportError({
505
+ code: "trellis.auth.bind_failed",
506
+ message: "Trellis could not finish the sign-in step.",
507
+ hint: "Start the sign-in flow again.",
508
+ context: { status: response.status, trellisUrl: args.trellisUrl, reason },
509
+ });
510
+ }
511
+
512
+ const payload = await readJsonResponse(response, {
513
+ code: "trellis.auth.bind_invalid_response",
514
+ message: "Trellis returned an invalid sign-in response.",
515
+ hint: "Start the sign-in flow again.",
516
+ context: { flowId: args.flowId },
517
+ });
518
+ if (
519
+ payload && typeof payload === "object" &&
520
+ (payload as { status?: unknown }).status === "expired"
521
+ ) {
522
+ throw createTransportError({
523
+ code: "trellis.auth.bind_expired",
524
+ message: "The Trellis sign-in step expired.",
525
+ hint: "Start the sign-in flow again.",
526
+ context: { flowId: args.flowId },
527
+ });
528
+ }
529
+ let parsed: StaticDecode<typeof BindResponseSchema>;
530
+ try {
531
+ parsed = Value.Parse(BindResponseSchema, payload) as StaticDecode<
532
+ typeof BindResponseSchema
533
+ >;
534
+ } catch (cause) {
535
+ throw createTransportError({
536
+ code: "trellis.auth.bind_invalid_response",
537
+ message: "Trellis returned an invalid sign-in response.",
538
+ hint: "Start the sign-in flow again.",
539
+ cause,
540
+ context: { flowId: args.flowId },
541
+ });
542
+ }
543
+ if (parsed.status === "insufficient_capabilities") {
544
+ throw createTransportError({
545
+ code: "trellis.auth.insufficient_capabilities",
546
+ message: "The signed-in Trellis account lacks required capabilities.",
547
+ hint:
548
+ "Ask an administrator to grant the missing capabilities or sign in with a different account.",
549
+ context: {
550
+ flowId: args.flowId,
551
+ contractId: parsed.approval.contractId,
552
+ contractDigest: parsed.approval.contractDigest,
553
+ missingCapabilities: parsed.missingCapabilities,
554
+ userCapabilities: parsed.userCapabilities,
555
+ },
556
+ });
557
+ }
558
+ }
559
+
560
+ async function fetchClientBootstrap(args: {
561
+ trellisUrl: string;
562
+ sessionKey: string;
563
+ bootstrapSig: string;
564
+ iat: number;
565
+ }): Promise<ClientBootstrapAttemptResponse> {
566
+ const response = await fetch(`${args.trellisUrl}/bootstrap/client`, {
567
+ method: "POST",
568
+ headers: { "Content-Type": "application/json" },
569
+ body: JSON.stringify({
570
+ sessionKey: args.sessionKey,
571
+ iat: args.iat,
572
+ sig: args.bootstrapSig,
573
+ }),
574
+ });
575
+
576
+ const payload = await readJsonResponse(response, {
577
+ code: "trellis.bootstrap.invalid_response",
578
+ message: "Trellis returned an invalid bootstrap response.",
579
+ hint:
580
+ "Retry the connection. If it keeps happening, check the Trellis deployment.",
581
+ context: { trellisUrl: args.trellisUrl },
582
+ });
583
+ if (!response.ok) {
584
+ if (Value.Check(ClientBootstrapIatOutOfRangeSchema, payload)) {
585
+ return payload;
586
+ }
587
+ const reason = payload && typeof payload === "object" &&
588
+ typeof (payload as { reason?: unknown }).reason === "string"
589
+ ? (payload as { reason: string }).reason
590
+ : `http_${response.status}`;
591
+ throw createTransportError({
592
+ code: "trellis.bootstrap.failed",
593
+ message: "Trellis could not prepare the client session.",
594
+ hint:
595
+ "Retry the connection. If it keeps failing, check Trellis availability and access.",
596
+ context: { trellisUrl: args.trellisUrl, status: response.status, reason },
597
+ });
598
+ }
599
+
600
+ if (Value.Check(ClientBootstrapReadySchema, payload)) {
601
+ return payload;
602
+ }
603
+ if (Value.Check(ClientBootstrapAuthRequiredSchema, payload)) {
604
+ return payload;
605
+ }
606
+ if (Value.Check(ClientBootstrapNotReadySchema, payload)) {
607
+ return payload;
608
+ }
609
+
610
+ throw createTransportError({
611
+ code: "trellis.bootstrap.invalid_response",
612
+ message: "Trellis returned an invalid bootstrap response.",
613
+ hint:
614
+ "Retry the connection. If it keeps happening, check the Trellis deployment.",
615
+ context: { trellisUrl: args.trellisUrl },
616
+ });
617
+ }
618
+
619
+ function updateClockOffsetFromServer(args: {
620
+ offsetState: ClockOffsetState;
621
+ requestStartedAtMs: number;
622
+ responseReceivedAtMs: number;
623
+ serverNowSeconds: number;
624
+ }): void {
625
+ args.offsetState.serverClockOffsetMs = estimateMidpointClockOffsetMs({
626
+ requestStartedAtMs: args.requestStartedAtMs,
627
+ responseReceivedAtMs: args.responseReceivedAtMs,
628
+ serverNowSeconds: args.serverNowSeconds,
629
+ });
630
+ }
631
+
632
+ async function fetchClientBootstrapWithRetry(args: {
633
+ trellisUrl: string;
634
+ sessionKey: string;
635
+ identity: ClientRuntimeIdentity;
636
+ deps: ClientConnectDeps;
637
+ offsetState: ClockOffsetState;
638
+ }): Promise<ClientBootstrapResponse> {
639
+ for (let attempt = 0; attempt < 2; attempt += 1) {
640
+ const requestStartedAtMs = args.deps.now();
641
+ const iat = correctedIatSeconds(
642
+ requestStartedAtMs,
643
+ args.offsetState.serverClockOffsetMs,
644
+ );
645
+ const response = await fetchClientBootstrap({
646
+ trellisUrl: args.trellisUrl,
647
+ sessionKey: args.sessionKey,
648
+ iat,
649
+ bootstrapSig: await args.identity.bootstrapSig(iat),
650
+ });
651
+ const responseReceivedAtMs = args.deps.now();
652
+
653
+ updateClockOffsetFromServer({
654
+ offsetState: args.offsetState,
655
+ requestStartedAtMs,
656
+ responseReceivedAtMs,
657
+ serverNowSeconds: response.serverNow,
658
+ });
659
+
660
+ if ("status" in response) {
661
+ return response;
662
+ }
663
+ }
664
+
665
+ throw createTransportError({
666
+ code: "trellis.bootstrap.time_sync_failed",
667
+ message: "Trellis could not confirm the client time window.",
668
+ hint:
669
+ "Retry the connection. If it keeps happening, check the client and Trellis clocks.",
670
+ context: { trellisUrl: args.trellisUrl },
671
+ });
672
+ }
673
+
674
+ async function createRuntimeUserAuthenticator(args: {
675
+ identity: ClientRuntimeIdentity;
676
+ deps: ClientConnectDeps;
677
+ offsetState: ClockOffsetState;
678
+ getContractDigest(): string;
679
+ getSentinel(): { jwt: string; seed: string };
680
+ recoverBrowserAuth?(): Promise<void>;
681
+ }): Promise<{ authenticators: Authenticator[]; stop: () => void }> {
682
+ const browserTokenLookaheadSeconds = 300;
683
+ const jwtAuth: Authenticator = (nonce?: string) => {
684
+ const sentinel = args.getSentinel();
685
+ return jwtAuthenticator(
686
+ sentinel.jwt,
687
+ new TextEncoder().encode(sentinel.seed),
688
+ )(nonce);
689
+ };
690
+
691
+ if (args.identity.buildRuntimeAuthTokenSync) {
692
+ return {
693
+ authenticators: [
694
+ jwtAuth,
695
+ () => ({
696
+ auth_token: args.identity.buildRuntimeAuthTokenSync!(
697
+ correctedIatSeconds(
698
+ args.deps.now(),
699
+ args.offsetState.serverClockOffsetMs,
700
+ ),
701
+ args.getContractDigest(),
702
+ ),
703
+ }),
704
+ ],
705
+ stop: () => {},
706
+ };
707
+ }
708
+
709
+ const buildRuntimeAuthToken = async (iat: number): Promise<string> => {
710
+ return JSON.stringify({
711
+ v: 1,
712
+ sessionKey: args.identity.sessionKey,
713
+ iat,
714
+ contractDigest: args.getContractDigest(),
715
+ sig: await args.identity.natsConnectSigForIat(
716
+ iat,
717
+ args.getContractDigest(),
718
+ ),
719
+ });
720
+ };
721
+
722
+ let currentToken = await buildRuntimeAuthToken(
723
+ correctedIatSeconds(args.deps.now(), args.offsetState.serverClockOffsetMs),
724
+ );
725
+ const precomputedTokens = new Map<number, string>();
726
+ let latestPreparedIat = 0;
727
+ let refreshInFlight: Promise<void> | null = null;
728
+ let recoveryInFlight: Promise<void> | null = null;
729
+
730
+ const refreshCurrentToken = async (): Promise<void> => {
731
+ const currentIat = correctedIatSeconds(
732
+ args.deps.now(),
733
+ args.offsetState.serverClockOffsetMs,
734
+ );
735
+ const nextToken = await buildRuntimeAuthToken(currentIat);
736
+ precomputedTokens.set(currentIat, nextToken);
737
+ latestPreparedIat = Math.max(latestPreparedIat, currentIat);
738
+ currentToken = nextToken;
739
+ };
740
+
741
+ const refresh = (): Promise<void> => {
742
+ if (refreshInFlight) return refreshInFlight;
743
+ refreshInFlight = (async () => {
744
+ const currentIat = correctedIatSeconds(
745
+ args.deps.now(),
746
+ args.offsetState.serverClockOffsetMs,
747
+ );
748
+ const maxIat = currentIat + browserTokenLookaheadSeconds;
749
+ const startIat = Math.max(currentIat, latestPreparedIat + 1);
750
+
751
+ for (let iat = startIat; iat <= maxIat; iat += 1) {
752
+ precomputedTokens.set(iat, await buildRuntimeAuthToken(iat));
753
+ }
754
+
755
+ latestPreparedIat = Math.max(latestPreparedIat, maxIat);
756
+ for (const iat of precomputedTokens.keys()) {
757
+ if (iat < currentIat - 5) {
758
+ precomputedTokens.delete(iat);
759
+ }
760
+ }
761
+
762
+ const nextToken = precomputedTokens.get(currentIat);
763
+ if (nextToken) {
764
+ currentToken = nextToken;
765
+ }
766
+ })().finally(() => {
767
+ refreshInFlight = null;
768
+ });
769
+ return refreshInFlight;
770
+ };
771
+
772
+ const recover = (): Promise<void> => {
773
+ if (!args.recoverBrowserAuth) {
774
+ return Promise.resolve();
775
+ }
776
+ if (recoveryInFlight) return recoveryInFlight;
777
+ recoveryInFlight = (async () => {
778
+ const digestBefore = args.getContractDigest();
779
+ await args.recoverBrowserAuth?.();
780
+ if (args.getContractDigest() !== digestBefore) {
781
+ precomputedTokens.clear();
782
+ latestPreparedIat = 0;
783
+ }
784
+ await refreshCurrentToken();
785
+ })().finally(() => {
786
+ recoveryInFlight = null;
787
+ });
788
+ return recoveryInFlight;
789
+ };
790
+
791
+ await refresh();
792
+ const setRefreshInterval = args.deps.setInterval ??
793
+ ((
794
+ handler: () => void,
795
+ ms: number,
796
+ ): ReturnType<typeof globalThis.setInterval> =>
797
+ globalThis.setInterval(handler, ms));
798
+ const clearRefreshInterval = args.deps.clearInterval ??
799
+ ((id: ReturnType<typeof globalThis.setInterval>) =>
800
+ globalThis.clearInterval(id));
801
+ const refreshIntervalId = setRefreshInterval(() => {
802
+ void refresh();
803
+ }, 10_000);
804
+
805
+ return {
806
+ authenticators: [
807
+ jwtAuth,
808
+ () => {
809
+ const currentIat = correctedIatSeconds(
810
+ args.deps.now(),
811
+ args.offsetState.serverClockOffsetMs,
812
+ );
813
+ const nextToken = precomputedTokens.get(currentIat);
814
+ if (nextToken) {
815
+ currentToken = nextToken;
816
+ return { auth_token: currentToken };
817
+ }
818
+ if (args.recoverBrowserAuth) {
819
+ void recover();
820
+ return { auth_token: currentToken };
821
+ }
822
+ void refreshCurrentToken();
823
+ return { auth_token: currentToken };
824
+ },
825
+ ],
826
+ stop: () => {
827
+ clearRefreshInterval(refreshIntervalId);
828
+ },
829
+ };
830
+ }
831
+
832
+ function cleanupBrowserCallbackUrl(currentUrl: URL): void {
833
+ if (!isBrowserRuntime()) return;
834
+ if (
835
+ !currentUrl.searchParams.has("flowId") &&
836
+ !currentUrl.searchParams.has("authError")
837
+ ) {
838
+ return;
839
+ }
840
+
841
+ currentUrl.searchParams.delete("flowId");
842
+ currentUrl.searchParams.delete("authError");
843
+ globalThis.history.replaceState(
844
+ {},
845
+ "",
846
+ currentUrl.pathname + currentUrl.search + currentUrl.hash,
847
+ );
848
+ }
849
+
850
+ function isExpiredBindError(error: unknown): boolean {
851
+ return error instanceof TransportError &&
852
+ error.code === "trellis.auth.bind_expired";
853
+ }
854
+
855
+ function needsReauth(
856
+ bootstrap: ClientBootstrapResponse,
857
+ ): bootstrap is
858
+ | Extract<ClientBootstrapResponse, { status: "auth_required" }>
859
+ | Extract<
860
+ ClientBootstrapResponse,
861
+ {
862
+ status: "not_ready";
863
+ reason: "contract_not_active" | "insufficient_permissions";
864
+ }
865
+ > {
866
+ return bootstrap.status === "auth_required" ||
867
+ (
868
+ bootstrap.status === "not_ready" &&
869
+ (bootstrap.reason === "insufficient_permissions" ||
870
+ bootstrap.reason === "contract_not_active")
871
+ );
872
+ }
873
+
874
+ function bootstrapTargetsRequestedContract<
875
+ TContract extends ClientContract<TrellisAPI, TrellisContractV1>,
876
+ >(
877
+ bootstrap: ClientBootstrapResponse,
878
+ args: ClientConnectArgsFor<TContract>,
879
+ ): boolean {
880
+ const requestedDigest = args.contract.CONTRACT_DIGEST ??
881
+ digestContractManifest(args.contract.CONTRACT);
882
+ return bootstrap.status === "ready" &&
883
+ bootstrap.connectInfo.contractId === args.contract.CONTRACT.id &&
884
+ bootstrap.connectInfo.contractDigest === requestedDigest;
885
+ }
886
+
887
+ async function buildSessionKeyLoginUrl(args: {
888
+ trellisUrl: string;
889
+ redirectTo: string;
890
+ sessionKey: string;
891
+ contract: TrellisContractV1;
892
+ contractDigest: string;
893
+ provider?: string;
894
+ context?: unknown;
895
+ oauthInitSig: string;
896
+ fullOauthInitSig: string;
897
+ }): Promise<
898
+ { status: "bound" } | { status: "flow_started"; loginUrl: string }
899
+ > {
900
+ const context = authRequestContextRecord(args.context);
901
+ let response = await fetch(`${args.trellisUrl}/auth/requests`, {
902
+ method: "POST",
903
+ headers: { "Content-Type": "application/json" },
904
+ body: JSON.stringify({
905
+ redirectTo: args.redirectTo,
906
+ sessionKey: args.sessionKey,
907
+ sig: args.oauthInitSig,
908
+ contractDigest: args.contractDigest,
909
+ ...(args.provider ? { provider: args.provider } : {}),
910
+ ...(context ? { context } : {}),
911
+ }),
912
+ });
913
+ if (await authStartNeedsManifest(response)) {
914
+ response = await fetch(`${args.trellisUrl}/auth/requests`, {
915
+ method: "POST",
916
+ headers: { "Content-Type": "application/json" },
917
+ body: JSON.stringify({
918
+ redirectTo: args.redirectTo,
919
+ sessionKey: args.sessionKey,
920
+ sig: args.fullOauthInitSig,
921
+ contractDigest: args.contractDigest,
922
+ contract: args.contract,
923
+ ...(args.provider ? { provider: args.provider } : {}),
924
+ ...(context ? { context } : {}),
925
+ }),
926
+ });
927
+ }
928
+ if (!response.ok) {
929
+ const reason = await response.text();
930
+ throw createTransportError({
931
+ code: "trellis.auth.login_failed",
932
+ message: "Trellis could not start sign-in.",
933
+ hint:
934
+ "Retry sign-in. If it keeps failing, check Trellis availability and access.",
935
+ context: { status: response.status, reason, trellisUrl: args.trellisUrl },
936
+ });
937
+ }
938
+
939
+ const payload = await readJsonResponse(response, {
940
+ code: "trellis.auth.login_invalid_response",
941
+ message: "Trellis returned an invalid sign-in response.",
942
+ hint: "Retry sign-in. If it keeps happening, start the sign-in flow again.",
943
+ context: { trellisUrl: args.trellisUrl },
944
+ });
945
+ if (
946
+ payload && typeof payload === "object" &&
947
+ (payload as { status?: unknown }).status === "flow_started" &&
948
+ typeof (payload as { loginUrl?: unknown }).loginUrl === "string"
949
+ ) {
950
+ return {
951
+ status: "flow_started",
952
+ loginUrl: (payload as { loginUrl: string }).loginUrl,
953
+ };
954
+ }
955
+ if (
956
+ payload && typeof payload === "object" &&
957
+ (payload as { status?: unknown }).status === "bound"
958
+ ) {
959
+ return { status: "bound" };
960
+ }
961
+ throw createTransportError({
962
+ code: "trellis.auth.login_invalid_response",
963
+ message: "Trellis returned an invalid sign-in response.",
964
+ hint: "Retry sign-in. If it keeps happening, start the sign-in flow again.",
965
+ context: { trellisUrl: args.trellisUrl },
966
+ });
967
+ }
968
+
969
+ async function authStartNeedsManifest(response: Response): Promise<boolean> {
970
+ if (response.ok || response.status !== 409) return false;
971
+ let payload: unknown;
972
+ try {
973
+ payload = await response.clone().json();
974
+ } catch {
975
+ payload = undefined;
976
+ }
977
+ if (payload && typeof payload === "object") {
978
+ const record = payload as {
979
+ reason?: unknown;
980
+ code?: unknown;
981
+ error?: unknown;
982
+ message?: unknown;
983
+ };
984
+ return record.reason === "manifest_required" ||
985
+ record.code === "manifest_required" ||
986
+ record.error === "manifest_required" ||
987
+ record.message === "manifest_required";
988
+ }
989
+ return (await response.clone().text()).includes("manifest_required");
990
+ }
991
+
992
+ export async function connectClientWithDeps<
993
+ TContract extends ClientContract<TrellisAPI, TrellisContractV1>,
994
+ >(
995
+ args: ClientConnectArgsFor<TContract>,
996
+ deps: ClientConnectDeps,
997
+ ): Promise<Trellis<TrellisAPI, "client", RuntimeStateStores>> {
998
+ const trellisUrl = normalizeTrellisUrl(args.trellisUrl);
999
+ const identity = await resolveClientIdentity(args.auth);
1000
+ const currentUrl = args.auth?.mode === "session_key"
1001
+ ? null
1002
+ : resolveCurrentUrl(args.auth);
1003
+ const browserAuth = args.auth?.mode === "session_key" ? undefined : args.auth;
1004
+ const callbackFlowId = args.auth?.mode === "session_key"
1005
+ ? args.auth.flowId
1006
+ : browserAuth?.flowId ?? currentUrl?.searchParams.get("flowId") ??
1007
+ undefined;
1008
+ const callbackAuthError = args.auth?.mode === "session_key"
1009
+ ? undefined
1010
+ : currentUrl?.searchParams.get("authError") ?? undefined;
1011
+ const offsetState: ClockOffsetState = { serverClockOffsetMs: 0 };
1012
+
1013
+ if (callbackAuthError) {
1014
+ if (currentUrl) cleanupBrowserCallbackUrl(currentUrl);
1015
+ throw createTransportError({
1016
+ code: `trellis.auth.${callbackAuthError}`,
1017
+ message: "Trellis sign-in did not complete.",
1018
+ hint: "Start sign-in again if you want to approve access.",
1019
+ context: { reason: callbackAuthError, trellisUrl },
1020
+ });
1021
+ }
1022
+
1023
+ if (callbackFlowId) {
1024
+ try {
1025
+ await bindClientFlow({
1026
+ trellisUrl,
1027
+ sessionKey: identity.sessionKey,
1028
+ flowId: callbackFlowId,
1029
+ sig: await identity.bindFlowSig(callbackFlowId),
1030
+ });
1031
+ if (currentUrl) cleanupBrowserCallbackUrl(currentUrl);
1032
+ } catch (error) {
1033
+ if (currentUrl && isExpiredBindError(error)) {
1034
+ cleanupBrowserCallbackUrl(currentUrl);
1035
+ }
1036
+ throw error;
1037
+ }
1038
+ }
1039
+
1040
+ const initialBootstrap = await fetchClientBootstrapWithRetry({
1041
+ trellisUrl,
1042
+ sessionKey: identity.sessionKey,
1043
+ identity,
1044
+ deps,
1045
+ offsetState,
1046
+ });
1047
+
1048
+ const bootstrap = needsReauth(initialBootstrap) ||
1049
+ !bootstrapTargetsRequestedContract(initialBootstrap, args)
1050
+ ? await resolveAuthRequired(args, identity, currentUrl, deps, offsetState)
1051
+ : initialBootstrap;
1052
+
1053
+ if (bootstrap.status !== "ready") {
1054
+ if (bootstrap.status === "not_ready") {
1055
+ throw createTransportError({
1056
+ code: "trellis.bootstrap.not_ready",
1057
+ message: "Trellis is not ready to connect this client.",
1058
+ hint:
1059
+ "Wait for the requested app access to become available, then try again.",
1060
+ context: { reason: bootstrap.reason },
1061
+ });
1062
+ }
1063
+ throw createTransportError({
1064
+ code: "trellis.bootstrap.auth_required",
1065
+ message: "Trellis still requires sign-in before connecting this client.",
1066
+ hint: "Complete sign-in, then try again.",
1067
+ });
1068
+ }
1069
+
1070
+ const transport = await deps.loadTransport();
1071
+ const runtimeState = {
1072
+ contractDigest: bootstrap.connectInfo.contractDigest,
1073
+ sentinel: bootstrap.connectInfo.transport.sentinel,
1074
+ };
1075
+ const recoverBrowserAuth = identity.mode === "browser"
1076
+ ? async () => {
1077
+ const latestCurrentUrl = resolveCurrentUrl(browserAuth);
1078
+ const refreshedBootstrap = await fetchClientBootstrapWithRetry({
1079
+ trellisUrl,
1080
+ sessionKey: identity.sessionKey,
1081
+ identity,
1082
+ deps,
1083
+ offsetState,
1084
+ });
1085
+ const resolvedBootstrap = needsReauth(refreshedBootstrap) ||
1086
+ (refreshedBootstrap.status === "ready" &&
1087
+ !bootstrapTargetsRequestedContract(refreshedBootstrap, args))
1088
+ ? await resolveAuthRequired(
1089
+ args,
1090
+ identity,
1091
+ latestCurrentUrl,
1092
+ deps,
1093
+ offsetState,
1094
+ )
1095
+ : refreshedBootstrap;
1096
+ if (resolvedBootstrap.status !== "ready") {
1097
+ if (resolvedBootstrap.status === "not_ready") {
1098
+ throw createTransportError({
1099
+ code: "trellis.bootstrap.not_ready",
1100
+ message: "Trellis is not ready to reconnect this client.",
1101
+ hint:
1102
+ "Wait for the requested app access to become available, then try again.",
1103
+ context: { reason: resolvedBootstrap.reason },
1104
+ });
1105
+ }
1106
+ throw createTransportError({
1107
+ code: "trellis.bootstrap.auth_required",
1108
+ message:
1109
+ "Trellis still requires sign-in before reconnecting this client.",
1110
+ hint: "Complete sign-in, then try again.",
1111
+ });
1112
+ }
1113
+ runtimeState.contractDigest =
1114
+ resolvedBootstrap.connectInfo.contractDigest;
1115
+ runtimeState.sentinel = resolvedBootstrap.connectInfo.transport.sentinel;
1116
+ }
1117
+ : undefined;
1118
+ const handleSessionNotFound = identity.mode === "browser"
1119
+ ? async () => {
1120
+ const latestCurrentUrl = resolveCurrentUrl(browserAuth);
1121
+ try {
1122
+ await resolveAuthRequired(
1123
+ args,
1124
+ identity,
1125
+ latestCurrentUrl,
1126
+ deps,
1127
+ offsetState,
1128
+ );
1129
+ } catch (error) {
1130
+ if (error instanceof ClientAuthHandledError) {
1131
+ return;
1132
+ }
1133
+ throw error;
1134
+ }
1135
+ }
1136
+ : undefined;
1137
+ const runtimeAuth = await createRuntimeUserAuthenticator({
1138
+ identity,
1139
+ deps,
1140
+ offsetState,
1141
+ getContractDigest: () => runtimeState.contractDigest,
1142
+ getSentinel: () => runtimeState.sentinel,
1143
+ recoverBrowserAuth,
1144
+ });
1145
+ let nc: NatsConnection;
1146
+ try {
1147
+ nc = await transport.connect({
1148
+ servers: selectRuntimeTransportServers(bootstrap.connectInfo.transports),
1149
+ maxReconnectAttempts: DEFAULT_RUNTIME_MAX_RECONNECT_ATTEMPTS,
1150
+ inboxPrefix: bootstrap.connectInfo.transport.inboxPrefix,
1151
+ authenticator: runtimeAuth.authenticators,
1152
+ });
1153
+ } catch (error) {
1154
+ runtimeAuth.stop();
1155
+ throw createTransportError({
1156
+ code: "trellis.runtime.connect_failed",
1157
+ message: "Trellis could not open the runtime connection.",
1158
+ hint:
1159
+ "Retry the connection. If it keeps failing, check Trellis transport availability.",
1160
+ cause: error,
1161
+ context: { trellisUrl },
1162
+ });
1163
+ }
1164
+ void nc.closed().finally(() => runtimeAuth.stop());
1165
+
1166
+ const clientOpts: ClientOpts = {
1167
+ ...(typeof args.name === "string" ? { name: args.name } : {}),
1168
+ ...(args.log ? { log: args.log } : {}),
1169
+ ...(typeof args.timeout === "number" ? { timeout: args.timeout } : {}),
1170
+ ...(typeof args.stream === "string" ? { stream: args.stream } : {}),
1171
+ ...(args.noResponderRetry
1172
+ ? { noResponderRetry: args.noResponderRetry }
1173
+ : {}),
1174
+ };
1175
+ const connection = observeNatsTrellisConnection({
1176
+ kind: "client",
1177
+ nc,
1178
+ log: false,
1179
+ ...(args.log
1180
+ ? {
1181
+ lifecycleLog: {
1182
+ log: args.log,
1183
+ context: { client: clientOpts.name ?? "client" },
1184
+ },
1185
+ }
1186
+ : {}),
1187
+ });
1188
+
1189
+ const api: TrellisAPI = args.contract.API.trellis;
1190
+ const state = args.contract[CONTRACT_STATE_METADATA] as TrellisOpts<
1191
+ TrellisAPI
1192
+ >["state"];
1193
+
1194
+ return createConnectedClient({
1195
+ name: clientOpts.name ?? "client",
1196
+ nc,
1197
+ connection,
1198
+ sessionKey: identity.sessionKey,
1199
+ sign: identity.sign,
1200
+ opts: {
1201
+ log: clientOpts.log,
1202
+ timeout: clientOpts.timeout,
1203
+ stream: clientOpts.stream,
1204
+ noResponderRetry: clientOpts.noResponderRetry,
1205
+ api,
1206
+ state,
1207
+ onSessionNotFound: handleSessionNotFound,
1208
+ },
1209
+ });
1210
+ }
1211
+
1212
+ async function resolveAuthRequired<
1213
+ TContract extends ClientContract<TrellisAPI, TrellisContractV1>,
1214
+ >(
1215
+ args: ClientConnectArgsFor<TContract>,
1216
+ identity: ClientRuntimeIdentity,
1217
+ currentUrl: URL | null,
1218
+ deps: ClientConnectDeps,
1219
+ offsetState: ClockOffsetState,
1220
+ ): Promise<ClientBootstrapResponse> {
1221
+ const browserAuth: BrowserClientAuthOptions =
1222
+ args.auth?.mode === "session_key" ? {} : args.auth ?? {};
1223
+ const redirectTo = args.auth?.mode === "session_key"
1224
+ ? args.auth.redirectTo
1225
+ : currentUrl
1226
+ ? resolveRedirectTo(browserAuth, currentUrl)
1227
+ : resolveConfiguredRedirectTo(browserAuth.redirectTo);
1228
+ if (!redirectTo) {
1229
+ throw new Error("Client authentication requires a redirectTo URL");
1230
+ }
1231
+
1232
+ const authStart = args.auth?.mode === "session_key"
1233
+ ? await buildSessionKeyLoginUrl({
1234
+ trellisUrl: normalizeTrellisUrl(args.trellisUrl),
1235
+ redirectTo,
1236
+ sessionKey: identity.sessionKey,
1237
+ contract: args.contract.CONTRACT,
1238
+ contractDigest: args.contract.CONTRACT_DIGEST ??
1239
+ digestContractManifest(args.contract.CONTRACT),
1240
+ provider: args.auth.provider,
1241
+ context: args.auth.context,
1242
+ oauthInitSig: await identity.oauthInitSig(
1243
+ redirectTo,
1244
+ authRequestContextRecord(args.auth.context),
1245
+ args.auth.provider,
1246
+ args.contract.CONTRACT_DIGEST ??
1247
+ digestContractManifest(args.contract.CONTRACT),
1248
+ ),
1249
+ fullOauthInitSig: await identity.oauthInitSig(
1250
+ redirectTo,
1251
+ authRequestContextRecord(args.auth.context),
1252
+ args.auth.provider,
1253
+ args.contract.CONTRACT,
1254
+ ),
1255
+ })
1256
+ : await startAuthRequest({
1257
+ authUrl: normalizeTrellisUrl(args.trellisUrl),
1258
+ redirectTo,
1259
+ handle: browserAuth.handle ?? await getOrCreateSessionKey(
1260
+ browserAuth.sessionKey,
1261
+ ),
1262
+ provider: browserAuth.provider,
1263
+ contract: args.contract.CONTRACT,
1264
+ context: browserAuth.context,
1265
+ });
1266
+
1267
+ if (authStart.status === "bound") {
1268
+ return await fetchClientBootstrapWithRetry({
1269
+ trellisUrl: normalizeTrellisUrl(args.trellisUrl),
1270
+ sessionKey: identity.sessionKey,
1271
+ identity,
1272
+ deps,
1273
+ offsetState,
1274
+ });
1275
+ }
1276
+
1277
+ const loginUrl = authStart.loginUrl;
1278
+
1279
+ const continuation = await args.onAuthRequired?.({
1280
+ loginUrl,
1281
+ sessionKey: identity.sessionKey,
1282
+ mode: identity.mode,
1283
+ });
1284
+ if (continuation && continuation.status === "handled") {
1285
+ throw new ClientAuthHandledError();
1286
+ }
1287
+
1288
+ if (continuation && continuation.status === "bound") {
1289
+ await bindClientFlow({
1290
+ trellisUrl: normalizeTrellisUrl(args.trellisUrl),
1291
+ sessionKey: identity.sessionKey,
1292
+ flowId: continuation.flowId,
1293
+ sig: await identity.bindFlowSig(continuation.flowId),
1294
+ });
1295
+ return await fetchClientBootstrapWithRetry({
1296
+ trellisUrl: normalizeTrellisUrl(args.trellisUrl),
1297
+ sessionKey: identity.sessionKey,
1298
+ identity,
1299
+ deps,
1300
+ offsetState,
1301
+ });
1302
+ }
1303
+
1304
+ if (isBrowserRuntime()) {
1305
+ globalThis.location.href = loginUrl;
1306
+ throw new Error("Redirecting to Trellis login");
1307
+ }
1308
+
1309
+ throw new Error(
1310
+ "Client authentication required and no auth continuation was provided",
1311
+ );
1312
+ }
1313
+
1314
+ export class TrellisClient {
1315
+ static connect<
1316
+ TContract extends ClientContract<TrellisAPI, TrellisContractV1>,
1317
+ >(
1318
+ args: ClientConnectArgsFor<TContract>,
1319
+ ): AsyncResult<
1320
+ ConnectedTrellisClient<TContract>,
1321
+ TransportError | UnexpectedError
1322
+ >;
1323
+ static connect(
1324
+ args: TrellisClientConnectArgs,
1325
+ ): AsyncResult<unknown, TransportError | UnexpectedError> {
1326
+ return clientConnectResult(connectClientWithDeps(args, defaultDeps));
1327
+ }
1328
+ }