@tier0/sdk-v2 0.0.0-stage → 0.2.1

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 (310) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE.md +7 -0
  3. package/README.md +201 -2
  4. package/dist/cjs/app-identity-contract.generated.d.ts +22 -0
  5. package/dist/cjs/app-identity-contract.generated.js +51 -0
  6. package/dist/cjs/app-identity-contract.generated.js.map +1 -0
  7. package/dist/cjs/capabilities.d.ts +54 -0
  8. package/dist/cjs/capabilities.js +134 -0
  9. package/dist/cjs/capabilities.js.map +1 -0
  10. package/dist/cjs/client.d.ts +604 -0
  11. package/dist/cjs/client.js +35 -0
  12. package/dist/cjs/client.js.map +1 -0
  13. package/dist/cjs/cloud-server.d.ts +31 -0
  14. package/dist/cjs/cloud-server.js +114 -0
  15. package/dist/cjs/cloud-server.js.map +1 -0
  16. package/dist/cjs/cloud-transport.d.ts +67 -0
  17. package/dist/cjs/cloud-transport.js +272 -0
  18. package/dist/cjs/cloud-transport.js.map +1 -0
  19. package/dist/cjs/controls.d.ts +93 -0
  20. package/dist/cjs/controls.js +169 -0
  21. package/dist/cjs/controls.js.map +1 -0
  22. package/dist/cjs/data/bootstrap.d.ts +70 -0
  23. package/dist/cjs/data/bootstrap.js +291 -0
  24. package/dist/cjs/data/bootstrap.js.map +1 -0
  25. package/dist/cjs/data/call.d.ts +33 -0
  26. package/dist/cjs/data/call.js +216 -0
  27. package/dist/cjs/data/call.js.map +1 -0
  28. package/dist/cjs/data/client.d.ts +134 -0
  29. package/dist/cjs/data/client.js +185 -0
  30. package/dist/cjs/data/client.js.map +1 -0
  31. package/dist/cjs/data/collection.d.ts +335 -0
  32. package/dist/cjs/data/collection.js +601 -0
  33. package/dist/cjs/data/collection.js.map +1 -0
  34. package/dist/cjs/data/context.d.ts +12 -0
  35. package/dist/cjs/data/context.js +50 -0
  36. package/dist/cjs/data/context.js.map +1 -0
  37. package/dist/cjs/data/declarations.d.ts +11 -0
  38. package/dist/cjs/data/declarations.js +18 -0
  39. package/dist/cjs/data/declarations.js.map +1 -0
  40. package/dist/cjs/data/define.d.ts +77 -0
  41. package/dist/cjs/data/define.js +31 -0
  42. package/dist/cjs/data/define.js.map +1 -0
  43. package/dist/cjs/data/error.d.ts +78 -0
  44. package/dist/cjs/data/error.js +182 -0
  45. package/dist/cjs/data/error.js.map +1 -0
  46. package/dist/cjs/data/index.d.ts +24 -0
  47. package/dist/cjs/data/index.js +49 -0
  48. package/dist/cjs/data/index.js.map +1 -0
  49. package/dist/cjs/data/schema.d.ts +88 -0
  50. package/dist/cjs/data/schema.js +657 -0
  51. package/dist/cjs/data/schema.js.map +1 -0
  52. package/dist/cjs/data/sort.d.ts +8 -0
  53. package/dist/cjs/data/sort.js +21 -0
  54. package/dist/cjs/data/sort.js.map +1 -0
  55. package/dist/cjs/data/subscribe.d.ts +108 -0
  56. package/dist/cjs/data/subscribe.js +270 -0
  57. package/dist/cjs/data/subscribe.js.map +1 -0
  58. package/dist/cjs/files.d.ts +67 -0
  59. package/dist/cjs/files.js +119 -0
  60. package/dist/cjs/files.js.map +1 -0
  61. package/dist/cjs/framework-scope.d.ts +1 -0
  62. package/dist/cjs/framework-scope.js +14 -0
  63. package/dist/cjs/framework-scope.js.map +1 -0
  64. package/dist/cjs/index.d.ts +14 -0
  65. package/dist/cjs/index.js +33 -0
  66. package/dist/cjs/index.js.map +1 -0
  67. package/dist/cjs/mq/broker.d.ts +65 -0
  68. package/dist/cjs/mq/broker.js +115 -0
  69. package/dist/cjs/mq/broker.js.map +1 -0
  70. package/dist/cjs/mq/client.d.ts +37 -0
  71. package/dist/cjs/mq/client.js +321 -0
  72. package/dist/cjs/mq/client.js.map +1 -0
  73. package/dist/cjs/mq/index.d.ts +5 -0
  74. package/dist/cjs/mq/index.js +11 -0
  75. package/dist/cjs/mq/index.js.map +1 -0
  76. package/dist/cjs/mq/types.d.ts +48 -0
  77. package/dist/cjs/mq/types.js +3 -0
  78. package/dist/cjs/mq/types.js.map +1 -0
  79. package/dist/cjs/openapi/api.generated.d.ts +820 -0
  80. package/dist/cjs/openapi/api.generated.js +607 -0
  81. package/dist/cjs/openapi/api.generated.js.map +1 -0
  82. package/dist/cjs/openapi/client.d.ts +56 -0
  83. package/dist/cjs/openapi/client.js +219 -0
  84. package/dist/cjs/openapi/client.js.map +1 -0
  85. package/dist/cjs/openapi/codecs.generated.d.ts +2234 -0
  86. package/dist/cjs/openapi/codecs.generated.js +6 -0
  87. package/dist/cjs/openapi/codecs.generated.js.map +1 -0
  88. package/dist/cjs/openapi/index.d.ts +5 -0
  89. package/dist/cjs/openapi/index.js +12 -0
  90. package/dist/cjs/openapi/index.js.map +1 -0
  91. package/dist/cjs/openapi/types.generated.d.ts +3227 -0
  92. package/dist/cjs/openapi/types.generated.js +3 -0
  93. package/dist/cjs/openapi/types.generated.js.map +1 -0
  94. package/dist/cjs/package.json +1 -0
  95. package/dist/cjs/react.d.ts +9 -0
  96. package/dist/cjs/react.js +16 -0
  97. package/dist/cjs/react.js.map +1 -0
  98. package/dist/cjs/runtime-context.d.ts +9 -0
  99. package/dist/cjs/runtime-context.js +25 -0
  100. package/dist/cjs/runtime-context.js.map +1 -0
  101. package/dist/cjs/runtime-env.d.ts +1 -0
  102. package/dist/cjs/runtime-env.js +18 -0
  103. package/dist/cjs/runtime-env.js.map +1 -0
  104. package/dist/cjs/source.d.ts +39 -0
  105. package/dist/cjs/source.js +29 -0
  106. package/dist/cjs/source.js.map +1 -0
  107. package/dist/cjs/stream.d.ts +40 -0
  108. package/dist/cjs/stream.js +33 -0
  109. package/dist/cjs/stream.js.map +1 -0
  110. package/dist/cjs/uns-v2/client.d.ts +132 -0
  111. package/dist/cjs/uns-v2/client.js +352 -0
  112. package/dist/cjs/uns-v2/client.js.map +1 -0
  113. package/dist/cjs/uns-v2/codec.d.ts +11 -0
  114. package/dist/cjs/uns-v2/codec.js +290 -0
  115. package/dist/cjs/uns-v2/codec.js.map +1 -0
  116. package/dist/cjs/uns-v2/data-client.d.ts +10 -0
  117. package/dist/cjs/uns-v2/data-client.js +18 -0
  118. package/dist/cjs/uns-v2/data-client.js.map +1 -0
  119. package/dist/cjs/uns-v2/generated.d.ts +18178 -0
  120. package/dist/cjs/uns-v2/generated.js +144 -0
  121. package/dist/cjs/uns-v2/generated.js.map +1 -0
  122. package/dist/cjs/uns-v2/index.d.ts +5 -0
  123. package/dist/cjs/uns-v2/index.js +24 -0
  124. package/dist/cjs/uns-v2/index.js.map +1 -0
  125. package/dist/cjs/uns-v2/sse.d.ts +20 -0
  126. package/dist/cjs/uns-v2/sse.js +65 -0
  127. package/dist/cjs/uns-v2/sse.js.map +1 -0
  128. package/dist/cjs/vue.d.ts +9 -0
  129. package/dist/cjs/vue.js +39 -0
  130. package/dist/cjs/vue.js.map +1 -0
  131. package/dist/esm/app-identity-contract.generated.d.ts +22 -0
  132. package/dist/esm/app-identity-contract.generated.js +48 -0
  133. package/dist/esm/app-identity-contract.generated.js.map +1 -0
  134. package/dist/esm/capabilities.d.ts +54 -0
  135. package/dist/esm/capabilities.js +129 -0
  136. package/dist/esm/capabilities.js.map +1 -0
  137. package/dist/esm/client.d.ts +604 -0
  138. package/dist/esm/client.js +32 -0
  139. package/dist/esm/client.js.map +1 -0
  140. package/dist/esm/cloud-server.d.ts +31 -0
  141. package/dist/esm/cloud-server.js +109 -0
  142. package/dist/esm/cloud-server.js.map +1 -0
  143. package/dist/esm/cloud-transport.d.ts +67 -0
  144. package/dist/esm/cloud-transport.js +267 -0
  145. package/dist/esm/cloud-transport.js.map +1 -0
  146. package/dist/esm/controls.d.ts +93 -0
  147. package/dist/esm/controls.js +163 -0
  148. package/dist/esm/controls.js.map +1 -0
  149. package/dist/esm/data/bootstrap.d.ts +70 -0
  150. package/dist/esm/data/bootstrap.js +286 -0
  151. package/dist/esm/data/bootstrap.js.map +1 -0
  152. package/dist/esm/data/call.d.ts +33 -0
  153. package/dist/esm/data/call.js +211 -0
  154. package/dist/esm/data/call.js.map +1 -0
  155. package/dist/esm/data/client.d.ts +134 -0
  156. package/dist/esm/data/client.js +181 -0
  157. package/dist/esm/data/client.js.map +1 -0
  158. package/dist/esm/data/collection.d.ts +335 -0
  159. package/dist/esm/data/collection.js +594 -0
  160. package/dist/esm/data/collection.js.map +1 -0
  161. package/dist/esm/data/context.d.ts +12 -0
  162. package/dist/esm/data/context.js +44 -0
  163. package/dist/esm/data/context.js.map +1 -0
  164. package/dist/esm/data/declarations.d.ts +11 -0
  165. package/dist/esm/data/declarations.js +10 -0
  166. package/dist/esm/data/declarations.js.map +1 -0
  167. package/dist/esm/data/define.d.ts +77 -0
  168. package/dist/esm/data/define.js +27 -0
  169. package/dist/esm/data/define.js.map +1 -0
  170. package/dist/esm/data/error.d.ts +78 -0
  171. package/dist/esm/data/error.js +176 -0
  172. package/dist/esm/data/error.js.map +1 -0
  173. package/dist/esm/data/index.d.ts +24 -0
  174. package/dist/esm/data/index.js +20 -0
  175. package/dist/esm/data/index.js.map +1 -0
  176. package/dist/esm/data/schema.d.ts +88 -0
  177. package/dist/esm/data/schema.js +646 -0
  178. package/dist/esm/data/schema.js.map +1 -0
  179. package/dist/esm/data/sort.d.ts +8 -0
  180. package/dist/esm/data/sort.js +18 -0
  181. package/dist/esm/data/sort.js.map +1 -0
  182. package/dist/esm/data/subscribe.d.ts +108 -0
  183. package/dist/esm/data/subscribe.js +265 -0
  184. package/dist/esm/data/subscribe.js.map +1 -0
  185. package/dist/esm/files.d.ts +67 -0
  186. package/dist/esm/files.js +113 -0
  187. package/dist/esm/files.js.map +1 -0
  188. package/dist/esm/framework-scope.d.ts +1 -0
  189. package/dist/esm/framework-scope.js +11 -0
  190. package/dist/esm/framework-scope.js.map +1 -0
  191. package/dist/esm/index.d.ts +14 -0
  192. package/dist/esm/index.js +10 -0
  193. package/dist/esm/index.js.map +1 -0
  194. package/dist/esm/mq/broker.d.ts +65 -0
  195. package/dist/esm/mq/broker.js +109 -0
  196. package/dist/esm/mq/broker.js.map +1 -0
  197. package/dist/esm/mq/client.d.ts +37 -0
  198. package/dist/esm/mq/client.js +314 -0
  199. package/dist/esm/mq/client.js.map +1 -0
  200. package/dist/esm/mq/index.d.ts +5 -0
  201. package/dist/esm/mq/index.js +3 -0
  202. package/dist/esm/mq/index.js.map +1 -0
  203. package/dist/esm/mq/types.d.ts +48 -0
  204. package/dist/esm/mq/types.js +2 -0
  205. package/dist/esm/mq/types.js.map +1 -0
  206. package/dist/esm/openapi/api.generated.d.ts +820 -0
  207. package/dist/esm/openapi/api.generated.js +603 -0
  208. package/dist/esm/openapi/api.generated.js.map +1 -0
  209. package/dist/esm/openapi/client.d.ts +56 -0
  210. package/dist/esm/openapi/client.js +210 -0
  211. package/dist/esm/openapi/client.js.map +1 -0
  212. package/dist/esm/openapi/codecs.generated.d.ts +2234 -0
  213. package/dist/esm/openapi/codecs.generated.js +3 -0
  214. package/dist/esm/openapi/codecs.generated.js.map +1 -0
  215. package/dist/esm/openapi/index.d.ts +5 -0
  216. package/dist/esm/openapi/index.js +3 -0
  217. package/dist/esm/openapi/index.js.map +1 -0
  218. package/dist/esm/openapi/types.generated.d.ts +3227 -0
  219. package/dist/esm/openapi/types.generated.js +2 -0
  220. package/dist/esm/openapi/types.generated.js.map +1 -0
  221. package/dist/esm/package.json +1 -0
  222. package/dist/esm/react.d.ts +9 -0
  223. package/dist/esm/react.js +12 -0
  224. package/dist/esm/react.js.map +1 -0
  225. package/dist/esm/runtime-context.d.ts +9 -0
  226. package/dist/esm/runtime-context.js +22 -0
  227. package/dist/esm/runtime-context.js.map +1 -0
  228. package/dist/esm/runtime-env.d.ts +1 -0
  229. package/dist/esm/runtime-env.js +15 -0
  230. package/dist/esm/runtime-env.js.map +1 -0
  231. package/dist/esm/source.d.ts +39 -0
  232. package/dist/esm/source.js +25 -0
  233. package/dist/esm/source.js.map +1 -0
  234. package/dist/esm/stream.d.ts +40 -0
  235. package/dist/esm/stream.js +29 -0
  236. package/dist/esm/stream.js.map +1 -0
  237. package/dist/esm/uns-v2/client.d.ts +132 -0
  238. package/dist/esm/uns-v2/client.js +343 -0
  239. package/dist/esm/uns-v2/client.js.map +1 -0
  240. package/dist/esm/uns-v2/codec.d.ts +11 -0
  241. package/dist/esm/uns-v2/codec.js +284 -0
  242. package/dist/esm/uns-v2/codec.js.map +1 -0
  243. package/dist/esm/uns-v2/data-client.d.ts +10 -0
  244. package/dist/esm/uns-v2/data-client.js +14 -0
  245. package/dist/esm/uns-v2/data-client.js.map +1 -0
  246. package/dist/esm/uns-v2/generated.d.ts +18178 -0
  247. package/dist/esm/uns-v2/generated.js +141 -0
  248. package/dist/esm/uns-v2/generated.js.map +1 -0
  249. package/dist/esm/uns-v2/index.d.ts +5 -0
  250. package/dist/esm/uns-v2/index.js +5 -0
  251. package/dist/esm/uns-v2/index.js.map +1 -0
  252. package/dist/esm/uns-v2/sse.d.ts +20 -0
  253. package/dist/esm/uns-v2/sse.js +60 -0
  254. package/dist/esm/uns-v2/sse.js.map +1 -0
  255. package/dist/esm/vue.d.ts +9 -0
  256. package/dist/esm/vue.js +36 -0
  257. package/dist/esm/vue.js.map +1 -0
  258. package/docs/acceptance-2026-10-22.md +88 -0
  259. package/package.json +243 -4
  260. package/skills/tier0-sdk-v2/SKILL.md +66 -0
  261. package/skills/tier0-sdk-v2/references/integration.md +72 -0
  262. package/skills/tier0-sdk-v2/tier0-sdk-v2-agent/SKILL.md +73 -0
  263. package/skills/tier0-sdk-v2/tier0-sdk-v2-agent/references/results.md +45 -0
  264. package/skills/tier0-sdk-v2/tier0-sdk-v2-controls/SKILL.md +63 -0
  265. package/skills/tier0-sdk-v2/tier0-sdk-v2-data/SKILL.md +58 -0
  266. package/skills/tier0-sdk-v2/tier0-sdk-v2-data/references/consistency.md +70 -0
  267. package/skills/tier0-sdk-v2/tier0-sdk-v2-data/references/errors.md +82 -0
  268. package/skills/tier0-sdk-v2/tier0-sdk-v2-data/references/modeling.md +113 -0
  269. package/skills/tier0-sdk-v2/tier0-sdk-v2-data/references/read-write.md +168 -0
  270. package/skills/tier0-sdk-v2/tier0-sdk-v2-data/references/schema-evolution.md +36 -0
  271. package/skills/tier0-sdk-v2/tier0-sdk-v2-files/SKILL.md +85 -0
  272. package/skills/tier0-sdk-v2/tier0-sdk-v2-files/references/delete.md +22 -0
  273. package/skills/tier0-sdk-v2/tier0-sdk-v2-files/references/download.md +49 -0
  274. package/skills/tier0-sdk-v2/tier0-sdk-v2-files/references/multipart.md +42 -0
  275. package/skills/tier0-sdk-v2/tier0-sdk-v2-files/references/upload.md +27 -0
  276. package/skills/tier0-sdk-v2/tier0-sdk-v2-files/references/url.md +22 -0
  277. package/skills/tier0-sdk-v2/tier0-sdk-v2-members/SKILL.md +56 -0
  278. package/skills/tier0-sdk-v2/tier0-sdk-v2-members/references/app-members.md +41 -0
  279. package/skills/tier0-sdk-v2/tier0-sdk-v2-members/references/platform-members.md +56 -0
  280. package/skills/tier0-sdk-v2/tier0-sdk-v2-mq/SKILL.md +78 -0
  281. package/skills/tier0-sdk-v2/tier0-sdk-v2-mq/references/quickstart.md +69 -0
  282. package/skills/tier0-sdk-v2/tier0-sdk-v2-notifications/SKILL.md +42 -0
  283. package/skills/tier0-sdk-v2/tier0-sdk-v2-notifications/references/get.md +34 -0
  284. package/skills/tier0-sdk-v2/tier0-sdk-v2-notifications/references/send.md +72 -0
  285. package/skills/tier0-sdk-v2/tier0-sdk-v2-source/SKILL.md +38 -0
  286. package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/changes.md +40 -0
  287. package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/create.md +63 -0
  288. package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/delete.md +47 -0
  289. package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/protocols.md +36 -0
  290. package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/read.md +34 -0
  291. package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/state.md +37 -0
  292. package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/update.md +62 -0
  293. package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/SKILL.md +43 -0
  294. package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/create.md +56 -0
  295. package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/delete.md +35 -0
  296. package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/deploy.md +64 -0
  297. package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/lifecycle.md +26 -0
  298. package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/read.md +35 -0
  299. package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/update.md +36 -0
  300. package/skills/tier0-sdk-v2/tier0-sdk-v2-system/SKILL.md +64 -0
  301. package/skills/tier0-sdk-v2/tier0-sdk-v2-system/references/info.md +23 -0
  302. package/skills/tier0-sdk-v2/tier0-sdk-v2-system/references/whoami.md +21 -0
  303. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/SKILL.md +55 -0
  304. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/create.md +56 -0
  305. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/data-workflows.md +69 -0
  306. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/delete.md +53 -0
  307. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/namespace.md +38 -0
  308. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/read.md +34 -0
  309. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/restore.md +39 -0
  310. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/update.md +62 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../src/data/bootstrap.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * First-access bootstrap: one batched `ensure` of every declared collection.\n *\n * - ensure only creates or widens; storage never narrows from here, so old\n * and new code may cold-start in any order.\n * - The result is memoized per client, i.e. per server process; a client\n * built from edited declarations ensures again.\n * Failures are not memoized: a later call retries (an imported App may\n * answer \"hosted App is not ready\").\n * - Seed documents are inserted only for collections ensure reports as\n * `created`: fixed `_id`s, atomic chunks of 200 with a stable idempotency\n * key per chunk, so a failed chunk (outcome unknown, or marked safe to\n * resend) is replayed after a short wait instead of duplicated. Seed writes\n * never carry a data subject.\n * - Preview throws on SCHEMA_CONFLICT and warnings so the worker sees them;\n * a deployment logs them and keeps serving with the IDs it has.\n * - Self-healing: a Preview reset hard-deletes collections, and a worker or\n * admin may archive one, while this process still holds the old IDs. A\n * record call that fails with `data.reason` COLLECTION_NOT_FOUND or\n * COLLECTION_NOT_GRANTED drops the memo, ensures again (seeding what is created)\n * and retries the call once, but only when a collection ID actually\n * changed. Rebuilds are limited to one per REBUILD_INTERVAL_MS per client;\n * APP_GRANT_REVOKED is never retried (ensure itself reports it).\n * - `ignored` notes never fail a request. ensure never writes annotations, so\n * an edited `.describe()` or collection description comes back as\n * ANNOTATION_NOT_APPLIED; it is logged as a warning pointing at\n * schema:replace, which is the only way to change stored annotations.\n */\nimport { createHash } from 'node:crypto';\nimport type { DataCall } from './call.js';\nimport { MAX_ATOMIC_ITEMS } from './collection.js';\nimport type { CollectionDefinition } from './define.js';\nimport { ACCESS_REASONS, DataError } from './error.js';\nimport { compileCollection, validateDocument, type CompiledCollection } from './schema.js';\n\nexport type DataEnvironment = 'preview' | 'deployed';\n\nexport interface EnsureWarning {\n code: string;\n path?: string;\n message?: string;\n}\n\nexport interface EnsureNote {\n path: string;\n reason?: string;\n message?: string;\n}\n\nexport interface EnsureResult {\n alias: string;\n collectionId: string;\n revision: number;\n status: 'created' | 'unchanged' | 'widened';\n ignored?: EnsureNote[];\n warnings?: EnsureWarning[];\n indexStatus?: unknown[];\n}\n\nexport interface EnsureConflict {\n alias: string;\n collectionId?: string;\n path?: string;\n reason?: string;\n current?: string;\n declared?: string;\n}\n\nexport interface EnsureState {\n appId?: string;\n results: EnsureResult[];\n /** Lower-cased alias → collection ID. */\n collectionIds: Map<string, string>;\n /** Declarations that conflicted in a deployment (served with their existing ID, if any). */\n conflicts: EnsureConflict[];\n}\n\nexport interface Logger {\n info(...args: unknown[]): void;\n warn(...args: unknown[]): void;\n error(...args: unknown[]): void;\n}\n\nexport interface BootstrapConfig {\n call: DataCall;\n collections: readonly CollectionDefinition[];\n environment: DataEnvironment;\n logger: Logger;\n}\n\nconst SEED_ATTEMPTS = 3;\n/** Wait before replaying seed chunk attempt n+1: n × this. */\nexport const SEED_RETRY_MS = 1_000;\n\n/** At most one self-healing rebuild per client in this window. */\nexport const REBUILD_INTERVAL_MS = 30_000;\n\n/**\n * Whether a record call failed because the collection ID it used is gone or\n * no longer granted, by UNS's stable `data.reason` code. Archive and Preview\n * purge also remove the App grant, so most stale IDs answer\n * COLLECTION_NOT_GRANTED or COLLECTION_NOT_FOUND. APP_PERMISSION_MISSING (the\n * key lacks e.g. `uns.delete`) and APP_GRANT_REVOKED are not stale IDs.\n */\nexport function isStaleCollectionError(error: unknown): boolean {\n return (\n error instanceof DataError &&\n (error.reason === ACCESS_REASONS.notGranted || error.reason === ACCESS_REASONS.notFound)\n );\n}\n\nfunction sameCollectionIds(a: EnsureState, b: EnsureState): boolean {\n if (a.collectionIds.size !== b.collectionIds.size) return false;\n for (const [alias, id] of a.collectionIds) {\n if (b.collectionIds.get(alias) !== id) return false;\n }\n return true;\n}\n\n/** Idempotency key of one seed chunk (UNS keys are at most 96 characters). */\nfunction seedChunkKey(collectionId: string, chunk: number): string {\n return `seed-${createHash('sha256').update(collectionId).digest('hex').slice(0, 40)}-${chunk}`;\n}\n\n/** What to do about each SCHEMA_CONFLICT reason (CloudAppCollectionConflict.reason). */\nconst CONFLICT_HINTS: Record<string, string> = {\n TYPE_CONFLICT: \"a field's type cannot change; use a new field name and backfill with updateMany\",\n LIMIT_EXCEEDED: 'the joined schema exceeds a UNS limit (depth, properties, enum values or indexes); split the structure',\n OPEN_OBJECT: 'every object must be closed; declare it with z.object',\n ALIAS_IN_USE: 'the alias belongs to another collection; pick another alias',\n NAME_IN_USE: 'the name belongs to another collection; pick another alias',\n INVALID_INDEX: 'fix the index declaration',\n JOIN_UNSUPPORTED:\n 'the stored schema holds a node the declaration cannot widen (e.g. enum values outside its range); repair it with schema:replace via the tier0 MCP',\n DATA_RULE_FIELD:\n 'an employee data rule (ownerField / stateField) uses this field; keep it required with the same type, or ask a workspace admin to change the rule',\n};\n\nfunction describeConflicts(conflicts: EnsureConflict[]): string {\n return conflicts\n .map((conflict) => {\n const where = `${conflict.alias}${conflict.path ? `.${conflict.path}` : ''}`;\n const types = conflict.current || conflict.declared ? ` (stored ${conflict.current ?? '?'}, declared ${conflict.declared ?? '?'})` : '';\n const hint = conflict.reason && CONFLICT_HINTS[conflict.reason] ? ` — ${CONFLICT_HINTS[conflict.reason]}` : '';\n return ` - ${where}: ${conflict.reason ?? 'conflict'}${types}${hint}`;\n })\n .join('\\n');\n}\n\nfunction notePath(alias: string, note: EnsureNote): string {\n return note.path ? `${alias}.${note.path}` : alias;\n}\n\nfunction describeWarnings(results: EnsureResult[]): string {\n return results\n .flatMap((result) =>\n (result.warnings ?? []).map(\n (warning) => ` - ${result.alias}${warning.path ? `.${warning.path}` : ''}: ${warning.code}${warning.message ? ` — ${warning.message}` : ''}`,\n ),\n )\n .join('\\n');\n}\n\nexport function createBootstrap(config: BootstrapConfig) {\n const { call, collections, environment, logger } = config;\n let pending: Promise<EnsureState> | null = null;\n let lastRebuild = Number.NEGATIVE_INFINITY;\n\n async function requestEnsure(items: CompiledCollection[]) {\n // ensure is App-level work: it never carries the employee data subject.\n return call<{ appId?: string; results: EnsureResult[] }>('appCollectionsEnsure', { collections: items });\n }\n\n async function insertSeedChunk(collectionId: string, chunk: number, documents: { id?: string; data: Record<string, unknown> }[]) {\n for (let attempt = 1; ; attempt += 1) {\n try {\n await call('recordInsertMany', {\n collectionId,\n documents,\n ordered: true,\n atomic: true,\n idempotencyKey: seedChunkKey(collectionId, chunk),\n });\n return;\n } catch (error) {\n // The chunk key is stable, so replaying is safe even when the outcome is unknown: a chunk\n // that did commit replays its receipt. Wait first, so a write still running can finish.\n if (!(error instanceof DataError) || !(error.outcomeUnknown || error.retry.safe) || attempt >= SEED_ATTEMPTS) throw error;\n await new Promise((resolve) => setTimeout(resolve, SEED_RETRY_MS * attempt));\n }\n }\n }\n\n async function writeSeeds(results: EnsureResult[]) {\n for (const result of results) {\n if (result.status !== 'created') continue;\n const definition = collections.find((candidate) => candidate.alias.toLowerCase() === result.alias.toLowerCase());\n const seed = definition?.seed;\n if (!definition || !seed || seed.length === 0) continue;\n try {\n const documents = seed.map((document) => {\n const { id, data } = validateDocument(definition, document as Record<string, unknown>);\n return { id, data };\n });\n for (let start = 0; start < documents.length; start += MAX_ATOMIC_ITEMS) {\n await insertSeedChunk(result.collectionId, start / MAX_ATOMIC_ITEMS, documents.slice(start, start + MAX_ATOMIC_ITEMS));\n }\n logger.info(`[data] seeded ${documents.length} record(s) into \"${result.alias}\"`);\n } catch (error) {\n // The collection exists now; a later ensure reports \"unchanged\" and\n // never re-seeds, so the failure must be visible in the server log.\n logger.error(`[data] seed for new collection \"${result.alias}\" failed; it keeps the chunks written so far:`, error);\n }\n }\n }\n\n async function run(payload: CompiledCollection[]): Promise<EnsureState> {\n const conflicts: EnsureConflict[] = [];\n let remaining = payload;\n let response: { appId?: string; results: EnsureResult[] } = { results: [] };\n while (remaining.length > 0) {\n try {\n response = await requestEnsure(remaining);\n break;\n } catch (error) {\n if (!(error instanceof DataError) || error.code !== 'SCHEMA_CONFLICT') throw error;\n const reported = Array.isArray(error.details.conflicts) ? (error.details.conflicts as EnsureConflict[]) : [];\n const summary = describeConflicts(reported);\n if (environment === 'preview') {\n throw new DataError({\n message:\n `The collection declarations conflict with the stored collection schemas; nothing was changed:\\n${summary}`,\n status: 409,\n code: 'SCHEMA_CONFLICT',\n upstreamStatus: error.upstreamStatus,\n requestId: error.requestId,\n execution: error.execution,\n attempts: error.attempts,\n details: error.details,\n });\n }\n // A deployment keeps serving: drop the conflicting declarations (the\n // whole batch was rejected) and ensure the rest again.\n const conflicting = new Set(reported.map((conflict) => conflict.alias.toLowerCase()));\n const next = remaining.filter((item) => !conflicting.has(item.alias.toLowerCase()));\n if (next.length === remaining.length) throw error;\n logger.error(`[data] ensure: declarations conflict with stored schemas; serving them unchanged:\\n${summary}`);\n conflicts.push(...reported);\n remaining = next;\n }\n }\n\n const results = response.results ?? [];\n const collectionIds = new Map<string, string>();\n for (const conflict of conflicts) {\n if (conflict.collectionId) collectionIds.set(conflict.alias.toLowerCase(), conflict.collectionId);\n }\n for (const result of results) {\n collectionIds.set(result.alias.toLowerCase(), result.collectionId);\n const notes = result.ignored ?? [];\n const annotations = notes.filter((note) => note.reason === 'ANNOTATION_NOT_APPLIED');\n const wider = notes.filter((note) => note.reason !== 'ANNOTATION_NOT_APPLIED');\n if (wider.length > 0) {\n logger.info(\n `[data] \"${result.alias}\" storage is wider than this declaration (or has retired parts); ignored: ` +\n wider.map((note) => `${note.path || '(root)'} ${note.reason ?? ''}`.trim()).join(', '),\n );\n }\n if (annotations.length > 0) {\n // A hint, not an error: storage keeps its annotations and serves as before.\n logger.warn(\n `[data] ensure does not change stored titles/descriptions; not applied: ${annotations.map((note) => notePath(result.alias, note)).join(', ')}. ` +\n `Apply them with schema:replace via the tier0 MCP, using compileCollection(...) of the declaration as the body.`,\n );\n }\n }\n\n await writeSeeds(results);\n\n const warnings = describeWarnings(results);\n if (warnings) {\n if (environment === 'preview') {\n throw new DataError({\n message:\n `Collections were ensured with warnings:\\n${warnings}\\n` +\n 'REQUIRED_NOT_ENFORCED: make the field optional again or narrow explicitly with schema:replace via the tier0 MCP. ' +\n 'INDEX_BUILD_FAILED: fix the duplicate or invalid data, then the next ensure retries the index.',\n status: 500,\n code: 'SCHEMA_WARNINGS',\n // ensure did apply; only the warnings fail the Preview request.\n execution: 'committed',\n details: { results },\n });\n }\n logger.warn(`[data] ensure warnings:\\n${warnings}`);\n }\n\n return { appId: response.appId, results, collectionIds, conflicts };\n }\n\n /** Ensures every declaration once per client; a failure is forgotten so the next call retries. */\n function ensure(): Promise<EnsureState> {\n pending ??= Promise.resolve()\n .then(() => run(collections.map(compileCollection)))\n .catch((error) => {\n pending = null;\n throw error;\n });\n return pending;\n }\n\n /**\n * Re-ensures after `before` turned out stale. Joins a rebuild already in\n * flight; otherwise rebuilds at most once per REBUILD_INTERVAL_MS. Resolves\n * whether any collection ID changed; ensure errors (APP_GRANT_REVOKED, …)\n * propagate.\n */\n async function rebuild(before: EnsureState, cause: DataError): Promise<boolean> {\n const current = ensure();\n const latest = await current;\n if (latest !== before) return !sameCollectionIds(before, latest);\n if (pending !== current) return !sameCollectionIds(before, await ensure());\n const now = Date.now();\n if (now - lastRebuild < REBUILD_INTERVAL_MS) return false;\n lastRebuild = now;\n logger.warn(`[data] a collection ID is no longer usable (${cause.code}: ${cause.message}); ensuring collections again`);\n pending = null;\n return !sameCollectionIds(before, await ensure());\n }\n\n /**\n * Runs one data call; when it fails on a stale collection ID, rebuilds and\n * runs it once more if an ID changed. `retry: false` (calls continuing a\n * cursor or resumeAfter token of the old collection) only rebuilds.\n */\n async function recover<R>(fn: () => Promise<R>, options: { retry?: boolean } = {}): Promise<R> {\n const before = await ensure();\n try {\n return await fn();\n } catch (error) {\n if (!isStaleCollectionError(error)) throw error;\n const changed = await rebuild(before, error as DataError);\n if (!changed || options.retry === false) throw error;\n return fn();\n }\n }\n\n async function resolve(definition: CollectionDefinition): Promise<string> {\n const state = await ensure();\n const id = state.collectionIds.get(definition.alias.toLowerCase());\n if (!id) {\n throw new DataError({\n message: `Collection \"${definition.alias}\" is unavailable: ensure did not return it (see the server log).`,\n status: 503,\n code: 'COLLECTION_UNAVAILABLE',\n });\n }\n return id;\n }\n\n return { ensure, resolve, recover, rebuild };\n}\n"]}
@@ -0,0 +1,33 @@
1
+ import { type ClientConfig } from '../openapi/client.js';
2
+ import { UnsV2Error, type UnsV2RecordSubscribeRequest, type UnsV2SubscriptionEvent } from '../uns-v2/client.js';
3
+ import { type UnsV2OperationName } from '../uns-v2/generated.js';
4
+ /** Whole call, from its start. The gateway gives UNS at most 20 s, so a data call ends within 25 s. */
5
+ export declare const DEFAULT_DATA_TIMEOUT_MS = 25000;
6
+ /** Data requests in flight per process, across every data client. */
7
+ export declare const MAX_CONCURRENT_CALLS = 6;
8
+ /** Resends of one call after its first attempt. */
9
+ export declare const MAX_RETRIES = 2;
10
+ /** A retry waits at most this long; a longer `retry.afterMs` surfaces the error instead. */
11
+ export declare const MAX_RETRY_WAIT_MS = 5000;
12
+ export interface CallOptions {
13
+ /** Employee assertion forwarded from the current business request. */
14
+ dataSubject?: string;
15
+ /** Abort of the current business request: a queued call leaves the queue, an in-flight one is cancelled. */
16
+ signal?: AbortSignal;
17
+ }
18
+ /** Sends one operation and resolves with the envelope's `data`. */
19
+ export type DataCall = <T>(operation: UnsV2OperationName, request: Record<string, unknown>, options?: CallOptions) => Promise<T>;
20
+ /**
21
+ * Opens one `records:subscribe` stream (outside the concurrency gate: it is
22
+ * long-lived and holds no UNS connection while it waits). Failures are DataErrors.
23
+ */
24
+ export type DataOpenStream = (request: UnsV2RecordSubscribeRequest, options: CallOptions & {
25
+ lastEventId?: string;
26
+ signal: AbortSignal;
27
+ }) => AsyncGenerator<UnsV2SubscriptionEvent>;
28
+ /** Wait before resend `attempt` (1-based), or undefined when the error must surface. */
29
+ export declare function retryDelay(error: UnsV2Error, attempt: number): number | undefined;
30
+ export declare function createDataTransport(config: ClientConfig): {
31
+ call: DataCall;
32
+ openStream: DataOpenStream;
33
+ };
@@ -0,0 +1,211 @@
1
+ /**
2
+ * One UNS call of the data layer. The SDK's UNS client resolves host and key,
3
+ * sends the request and checks the envelope; this adds the App runtime policy
4
+ * around it and turns every failure into a `DataError`:
5
+ *
6
+ * - binds the employee data subject and the abort signal of the current call;
7
+ * - gives every write that takes an idempotency key a fresh UUID unless the
8
+ * caller set one, and keeps it for the retries of that call;
9
+ * - sends at most MAX_CONCURRENT_CALLS requests per process at a time; the
10
+ * rest wait in line;
11
+ * - resends a failed request (same body, same key) at most MAX_RETRIES times,
12
+ * only when its `retry.safe` says so, after `retry.afterMs` or a jittered
13
+ * exponential backoff. UNS sets `retry.safe` (429 overload, 503 temporary
14
+ * failure, a rolled-back write …); for failures without a UNS answer the
15
+ * client sets it for reads only (timeout, network, ingress 502/503/504), so
16
+ * a write whose outcome is unknown is never resent here;
17
+ * - bounds the whole call, queueing, attempts and waits included, by one
18
+ * deadline from its start. A call that runs out of time or is aborted
19
+ * while it waits in line leaves the queue and is never sent
20
+ * (`DATA_OVERLOADED` / `DATA_ABORTED`, `execution: notStarted`).
21
+ *
22
+ * `openStream` opens one `records:subscribe` event stream for `data.subscribe`,
23
+ * which owns reconnects.
24
+ */
25
+ import { randomUUID } from 'node:crypto';
26
+ import { HttpClient } from '../openapi/client.js';
27
+ import { UnsV2ClientCore, UnsV2Error, } from '../uns-v2/client.js';
28
+ import { UNS_V2_OPERATIONS } from '../uns-v2/generated.js';
29
+ import { DataError, toDataError } from './error.js';
30
+ /** Whole call, from its start. The gateway gives UNS at most 20 s, so a data call ends within 25 s. */
31
+ export const DEFAULT_DATA_TIMEOUT_MS = 25_000;
32
+ /** Data requests in flight per process, across every data client. */
33
+ export const MAX_CONCURRENT_CALLS = 6;
34
+ /** Resends of one call after its first attempt. */
35
+ export const MAX_RETRIES = 2;
36
+ /** A retry waits at most this long; a longer `retry.afterMs` surfaces the error instead. */
37
+ export const MAX_RETRY_WAIT_MS = 5_000;
38
+ const BACKOFF_BASE_MS = 250;
39
+ /** Why a waiter left the queue without a slot. */
40
+ class Abandoned extends Error {
41
+ }
42
+ /** FIFO counting semaphore whose waiters can leave the line. */
43
+ class Gate {
44
+ limit;
45
+ active = 0;
46
+ waiting = [];
47
+ constructor(limit) {
48
+ this.limit = limit;
49
+ }
50
+ /** Runs `fn` with a slot; rejects with Abandoned if `signal` aborts while still waiting. */
51
+ async run(fn, signal) {
52
+ if (this.active < this.limit) {
53
+ this.active += 1;
54
+ }
55
+ else {
56
+ await new Promise((resolve, reject) => {
57
+ const waiter = {
58
+ grant: () => {
59
+ signal.removeEventListener('abort', leave);
60
+ resolve();
61
+ },
62
+ };
63
+ const leave = () => {
64
+ const index = this.waiting.indexOf(waiter);
65
+ if (index >= 0)
66
+ this.waiting.splice(index, 1);
67
+ reject(new Abandoned());
68
+ };
69
+ if (signal.aborted)
70
+ return leave();
71
+ signal.addEventListener('abort', leave, { once: true });
72
+ this.waiting.push(waiter);
73
+ });
74
+ }
75
+ try {
76
+ return await fn();
77
+ }
78
+ finally {
79
+ // Hand the slot straight to the next waiter, so the count never dips below the queue.
80
+ const next = this.waiting.shift();
81
+ if (next)
82
+ next.grant();
83
+ else
84
+ this.active -= 1;
85
+ }
86
+ }
87
+ }
88
+ // One gate per process, shared across data clients and dev-server module reloads.
89
+ const GATE_KEY = Symbol.for('tier0.sdk-v2.data.call-gate/2');
90
+ const globalGate = globalThis;
91
+ const gate = (globalGate[GATE_KEY] ??= new Gate(MAX_CONCURRENT_CALLS));
92
+ /** Wait before resend `attempt` (1-based), or undefined when the error must surface. */
93
+ export function retryDelay(error, attempt) {
94
+ if (!error.retry.safe || attempt > MAX_RETRIES)
95
+ return undefined;
96
+ if (error.retry.afterMs !== undefined)
97
+ return error.retry.afterMs <= MAX_RETRY_WAIT_MS ? error.retry.afterMs : undefined;
98
+ const ceiling = Math.min(MAX_RETRY_WAIT_MS, BACKOFF_BASE_MS * 2 ** (attempt - 1));
99
+ return ceiling / 2 + Math.random() * (ceiling / 2);
100
+ }
101
+ /** Resolves after `ms`, or early (false) when `signal` aborts. */
102
+ function pause(ms, signal) {
103
+ return new Promise((resolve) => {
104
+ if (signal.aborted)
105
+ return resolve(false);
106
+ const done = () => {
107
+ clearTimeout(timer);
108
+ signal.removeEventListener('abort', done);
109
+ resolve(!signal.aborted);
110
+ };
111
+ const timer = setTimeout(done, ms);
112
+ signal.addEventListener('abort', done, { once: true });
113
+ });
114
+ }
115
+ export function createDataTransport(config) {
116
+ const http = new HttpClient(config);
117
+ const resolve = () => http;
118
+ const timeoutMs = config.transportTimeoutMs ?? DEFAULT_DATA_TIMEOUT_MS;
119
+ const transport = { transportTimeoutMs: timeoutMs };
120
+ const app = new UnsV2ClientCore(resolve, transport);
121
+ function assertConfigured() {
122
+ let problem;
123
+ try {
124
+ http.getBaseURL();
125
+ if (!http.getApiKey()?.trim())
126
+ problem = 'TIER0_API_KEY is not set';
127
+ }
128
+ catch (error) {
129
+ problem = error instanceof Error ? error.message : String(error);
130
+ }
131
+ if (problem) {
132
+ throw new DataError({
133
+ message: `${problem}. The platform injects TIER0_API_HOST and TIER0_API_KEY in Preview and deployments; for local development set them before starting the App.`,
134
+ status: 503,
135
+ code: 'DATA_NOT_CONFIGURED',
136
+ });
137
+ }
138
+ }
139
+ // The SDK binds a data subject to one client; App-level calls use the shared one without it.
140
+ const coreFor = (dataSubject) => dataSubject ? new UnsV2ClientCore(resolve, { ...transport, unsV2AppDataSubject: dataSubject }) : app;
141
+ async function call(operation, request, options = {}) {
142
+ assertConfigured();
143
+ const key = UNS_V2_OPERATIONS[operation].idempotencyKey
144
+ ? (typeof request.idempotencyKey === 'string' ? request.idempotencyKey : randomUUID())
145
+ : undefined;
146
+ const body = key === undefined || request.idempotencyKey !== undefined ? request : { ...request, idempotencyKey: key };
147
+ const deadline = Date.now() + timeoutMs;
148
+ // Aborts when the call runs out of time or its business request is aborted.
149
+ const stop = new AbortController();
150
+ const expire = setTimeout(() => stop.abort(), timeoutMs);
151
+ const relay = () => stop.abort();
152
+ options.signal?.addEventListener('abort', relay, { once: true });
153
+ if (options.signal?.aborted)
154
+ stop.abort();
155
+ const notSent = (attempts) => new DataError({
156
+ ...(options.signal?.aborted
157
+ ? { message: `The data call ${operation} was aborted before it was sent.`, status: 499, code: 'DATA_ABORTED' }
158
+ : {
159
+ message: `The data call ${operation} waited ${timeoutMs} ms for one of the ${MAX_CONCURRENT_CALLS} request slots of this process and was not sent.`,
160
+ status: 503,
161
+ code: 'DATA_OVERLOADED',
162
+ }),
163
+ execution: 'notStarted',
164
+ retry: { safe: !options.signal?.aborted },
165
+ attempts,
166
+ idempotencyKey: key,
167
+ });
168
+ try {
169
+ for (let attempt = 1;; attempt += 1) {
170
+ try {
171
+ const response = await gate.run(() => {
172
+ // Each attempt gets the time left of the call as its transport deadline.
173
+ const remaining = Math.max(1, deadline - Date.now());
174
+ const core = new UnsV2ClientCore(resolve, {
175
+ transportTimeoutMs: remaining,
176
+ ...(options.dataSubject ? { unsV2AppDataSubject: options.dataSubject } : {}),
177
+ });
178
+ // In flight, only the business request's abort cancels; the transport deadline covers the time.
179
+ return core.call(operation, body, { signal: options.signal });
180
+ }, stop.signal);
181
+ return response.data;
182
+ }
183
+ catch (error) {
184
+ if (error instanceof Abandoned)
185
+ throw notSent(attempt - 1);
186
+ if (!(error instanceof UnsV2Error))
187
+ throw error;
188
+ const delay = retryDelay(error, attempt);
189
+ if (delay === undefined || Date.now() + delay >= deadline || !(await pause(delay, stop.signal))) {
190
+ throw toDataError(error, attempt, key);
191
+ }
192
+ }
193
+ }
194
+ }
195
+ finally {
196
+ clearTimeout(expire);
197
+ options.signal?.removeEventListener('abort', relay);
198
+ }
199
+ }
200
+ async function* openStream(request, options) {
201
+ assertConfigured();
202
+ try {
203
+ yield* coreFor(options.dataSubject).subscribeRecords(request, options);
204
+ }
205
+ catch (error) {
206
+ throw error instanceof UnsV2Error ? toDataError(error) : error;
207
+ }
208
+ }
209
+ return { call, openStream };
210
+ }
211
+ //# sourceMappingURL=call.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call.js","sourceRoot":"","sources":["../../../src/data/call.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * One UNS call of the data layer. The SDK's UNS client resolves host and key,\n * sends the request and checks the envelope; this adds the App runtime policy\n * around it and turns every failure into a `DataError`:\n *\n * - binds the employee data subject and the abort signal of the current call;\n * - gives every write that takes an idempotency key a fresh UUID unless the\n * caller set one, and keeps it for the retries of that call;\n * - sends at most MAX_CONCURRENT_CALLS requests per process at a time; the\n * rest wait in line;\n * - resends a failed request (same body, same key) at most MAX_RETRIES times,\n * only when its `retry.safe` says so, after `retry.afterMs` or a jittered\n * exponential backoff. UNS sets `retry.safe` (429 overload, 503 temporary\n * failure, a rolled-back write …); for failures without a UNS answer the\n * client sets it for reads only (timeout, network, ingress 502/503/504), so\n * a write whose outcome is unknown is never resent here;\n * - bounds the whole call, queueing, attempts and waits included, by one\n * deadline from its start. A call that runs out of time or is aborted\n * while it waits in line leaves the queue and is never sent\n * (`DATA_OVERLOADED` / `DATA_ABORTED`, `execution: notStarted`).\n *\n * `openStream` opens one `records:subscribe` event stream for `data.subscribe`,\n * which owns reconnects.\n */\nimport { randomUUID } from 'node:crypto';\nimport { HttpClient, type ClientConfig } from '../openapi/client.js';\nimport {\n UnsV2ClientCore,\n UnsV2Error,\n type UnsV2RecordSubscribeRequest,\n type UnsV2SubscriptionEvent,\n} from '../uns-v2/client.js';\nimport { UNS_V2_OPERATIONS, type UnsV2OperationName, type UnsV2Request } from '../uns-v2/generated.js';\nimport { DataError, toDataError } from './error.js';\n\n/** Whole call, from its start. The gateway gives UNS at most 20 s, so a data call ends within 25 s. */\nexport const DEFAULT_DATA_TIMEOUT_MS = 25_000;\n/** Data requests in flight per process, across every data client. */\nexport const MAX_CONCURRENT_CALLS = 6;\n/** Resends of one call after its first attempt. */\nexport const MAX_RETRIES = 2;\n/** A retry waits at most this long; a longer `retry.afterMs` surfaces the error instead. */\nexport const MAX_RETRY_WAIT_MS = 5_000;\nconst BACKOFF_BASE_MS = 250;\n\nexport interface CallOptions {\n /** Employee assertion forwarded from the current business request. */\n dataSubject?: string;\n /** Abort of the current business request: a queued call leaves the queue, an in-flight one is cancelled. */\n signal?: AbortSignal;\n}\n\n/** Sends one operation and resolves with the envelope's `data`. */\nexport type DataCall = <T>(operation: UnsV2OperationName, request: Record<string, unknown>, options?: CallOptions) => Promise<T>;\n\n/**\n * Opens one `records:subscribe` stream (outside the concurrency gate: it is\n * long-lived and holds no UNS connection while it waits). Failures are DataErrors.\n */\nexport type DataOpenStream = (\n request: UnsV2RecordSubscribeRequest,\n options: CallOptions & { lastEventId?: string; signal: AbortSignal },\n) => AsyncGenerator<UnsV2SubscriptionEvent>;\n\n/** Why a waiter left the queue without a slot. */\nclass Abandoned extends Error {}\n\n/** FIFO counting semaphore whose waiters can leave the line. */\nclass Gate {\n private active = 0;\n private readonly waiting: { grant: () => void }[] = [];\n\n constructor(private readonly limit: number) {}\n\n /** Runs `fn` with a slot; rejects with Abandoned if `signal` aborts while still waiting. */\n async run<T>(fn: () => Promise<T>, signal: AbortSignal): Promise<T> {\n if (this.active < this.limit) {\n this.active += 1;\n } else {\n await new Promise<void>((resolve, reject) => {\n const waiter = {\n grant: () => {\n signal.removeEventListener('abort', leave);\n resolve();\n },\n };\n const leave = () => {\n const index = this.waiting.indexOf(waiter);\n if (index >= 0) this.waiting.splice(index, 1);\n reject(new Abandoned());\n };\n if (signal.aborted) return leave();\n signal.addEventListener('abort', leave, { once: true });\n this.waiting.push(waiter);\n });\n }\n try {\n return await fn();\n } finally {\n // Hand the slot straight to the next waiter, so the count never dips below the queue.\n const next = this.waiting.shift();\n if (next) next.grant();\n else this.active -= 1;\n }\n }\n}\n\n// One gate per process, shared across data clients and dev-server module reloads.\nconst GATE_KEY = Symbol.for('tier0.sdk-v2.data.call-gate/2');\nconst globalGate = globalThis as typeof globalThis & { [GATE_KEY]?: Gate };\nconst gate = (globalGate[GATE_KEY] ??= new Gate(MAX_CONCURRENT_CALLS));\n\n/** Wait before resend `attempt` (1-based), or undefined when the error must surface. */\nexport function retryDelay(error: UnsV2Error, attempt: number): number | undefined {\n if (!error.retry.safe || attempt > MAX_RETRIES) return undefined;\n if (error.retry.afterMs !== undefined) return error.retry.afterMs <= MAX_RETRY_WAIT_MS ? error.retry.afterMs : undefined;\n const ceiling = Math.min(MAX_RETRY_WAIT_MS, BACKOFF_BASE_MS * 2 ** (attempt - 1));\n return ceiling / 2 + Math.random() * (ceiling / 2);\n}\n\n/** Resolves after `ms`, or early (false) when `signal` aborts. */\nfunction pause(ms: number, signal: AbortSignal): Promise<boolean> {\n return new Promise((resolve) => {\n if (signal.aborted) return resolve(false);\n const done = () => {\n clearTimeout(timer);\n signal.removeEventListener('abort', done);\n resolve(!signal.aborted);\n };\n const timer = setTimeout(done, ms);\n signal.addEventListener('abort', done, { once: true });\n });\n}\n\nexport function createDataTransport(config: ClientConfig): { call: DataCall; openStream: DataOpenStream } {\n const http = new HttpClient(config);\n const resolve = () => http;\n const timeoutMs = config.transportTimeoutMs ?? DEFAULT_DATA_TIMEOUT_MS;\n const transport = { transportTimeoutMs: timeoutMs };\n const app = new UnsV2ClientCore(resolve, transport);\n\n function assertConfigured() {\n let problem: string | undefined;\n try {\n http.getBaseURL();\n if (!http.getApiKey()?.trim()) problem = 'TIER0_API_KEY is not set';\n } catch (error) {\n problem = error instanceof Error ? error.message : String(error);\n }\n if (problem) {\n throw new DataError({\n message: `${problem}. The platform injects TIER0_API_HOST and TIER0_API_KEY in Preview and deployments; for local development set them before starting the App.`,\n status: 503,\n code: 'DATA_NOT_CONFIGURED',\n });\n }\n }\n\n // The SDK binds a data subject to one client; App-level calls use the shared one without it.\n const coreFor = (dataSubject: string | undefined) =>\n dataSubject ? new UnsV2ClientCore(resolve, { ...transport, unsV2AppDataSubject: dataSubject }) : app;\n\n async function call<T>(operation: UnsV2OperationName, request: Record<string, unknown>, options: CallOptions = {}): Promise<T> {\n assertConfigured();\n const key = UNS_V2_OPERATIONS[operation].idempotencyKey\n ? (typeof request.idempotencyKey === 'string' ? request.idempotencyKey : randomUUID())\n : undefined;\n const body = key === undefined || request.idempotencyKey !== undefined ? request : { ...request, idempotencyKey: key };\n const deadline = Date.now() + timeoutMs;\n // Aborts when the call runs out of time or its business request is aborted.\n const stop = new AbortController();\n const expire = setTimeout(() => stop.abort(), timeoutMs);\n const relay = () => stop.abort();\n options.signal?.addEventListener('abort', relay, { once: true });\n if (options.signal?.aborted) stop.abort();\n const notSent = (attempts: number) => new DataError({\n ...(options.signal?.aborted\n ? { message: `The data call ${operation} was aborted before it was sent.`, status: 499, code: 'DATA_ABORTED' }\n : {\n message: `The data call ${operation} waited ${timeoutMs} ms for one of the ${MAX_CONCURRENT_CALLS} request slots of this process and was not sent.`,\n status: 503,\n code: 'DATA_OVERLOADED',\n }),\n execution: 'notStarted',\n retry: { safe: !options.signal?.aborted },\n attempts,\n idempotencyKey: key,\n });\n try {\n for (let attempt = 1; ; attempt += 1) {\n try {\n const response = await gate.run(() => {\n // Each attempt gets the time left of the call as its transport deadline.\n const remaining = Math.max(1, deadline - Date.now());\n const core = new UnsV2ClientCore(resolve, {\n transportTimeoutMs: remaining,\n ...(options.dataSubject ? { unsV2AppDataSubject: options.dataSubject } : {}),\n });\n // In flight, only the business request's abort cancels; the transport deadline covers the time.\n return core.call(operation, body as UnsV2Request<typeof operation>, { signal: options.signal });\n }, stop.signal);\n return response.data as T;\n } catch (error) {\n if (error instanceof Abandoned) throw notSent(attempt - 1);\n if (!(error instanceof UnsV2Error)) throw error;\n const delay = retryDelay(error, attempt);\n if (delay === undefined || Date.now() + delay >= deadline || !(await pause(delay, stop.signal))) {\n throw toDataError(error, attempt, key);\n }\n }\n }\n } finally {\n clearTimeout(expire);\n options.signal?.removeEventListener('abort', relay);\n }\n }\n\n async function* openStream(\n request: UnsV2RecordSubscribeRequest,\n options: CallOptions & { lastEventId?: string; signal: AbortSignal },\n ): AsyncGenerator<UnsV2SubscriptionEvent> {\n assertConfigured();\n try {\n yield* coreFor(options.dataSubject).subscribeRecords(request, options);\n } catch (error) {\n throw error instanceof UnsV2Error ? toDataError(error) : error;\n }\n }\n\n return { call, openStream };\n}\n"]}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Data client factory: collection handles, cross-collection transactions and
3
+ * the shared bootstrap. An App builds one client per process from its
4
+ * collection declarations; tests build their own with a mock `fetch`.
5
+ */
6
+ import type { z } from 'zod';
7
+ import type { ClientConfig } from '../openapi/client.js';
8
+ import { type DataEnvironment, type EnsureState, type Logger } from './bootstrap.js';
9
+ import { Collection, type BatchQuery, type WithMeta } from './collection.js';
10
+ import { type CollectionDefinition } from './define.js';
11
+ import { type SubscribeOptions, type SubscriptionEvent } from './subscribe.js';
12
+ import { DataError } from './error.js';
13
+ import { type Filter, type Sort } from './sort.js';
14
+ export type TransactAction = 'record.create' | 'record.check' | 'record.read' | 'record.update' | 'record.modify' | 'record.replace' | 'record.delete' | 'record.query';
15
+ /** One `recordTransactionExecute` item; `collection` is a declaration or alias instead of a collection ID. */
16
+ export interface TransactStep {
17
+ opId: string;
18
+ action: TransactAction;
19
+ collection: CollectionDefinition | string;
20
+ id?: string | {
21
+ ref: string;
22
+ };
23
+ filter?: Filter;
24
+ data?: Record<string, unknown>;
25
+ update?: Record<string, unknown>;
26
+ upsert?: boolean;
27
+ expectedRevision?: number;
28
+ dependsOn?: string[];
29
+ bindings?: {
30
+ path: string;
31
+ ref: string;
32
+ resultPath: string;
33
+ }[];
34
+ selection?: 'exactOne' | 'first';
35
+ sort?: Sort;
36
+ returnDocument?: 'before' | 'after';
37
+ exists?: boolean;
38
+ operations?: Record<string, unknown>[];
39
+ conditions?: Filter[];
40
+ /** `record.query`: rows to bind from; `expectCount` asserts the match count before `limit`. */
41
+ query?: {
42
+ filter?: Filter;
43
+ sort?: Sort;
44
+ limit?: number;
45
+ expectCount?: {
46
+ min?: number;
47
+ max?: number;
48
+ };
49
+ };
50
+ arrayFilters?: Record<string, unknown>[];
51
+ }
52
+ export interface TransactResultItem {
53
+ opId: string;
54
+ action: string;
55
+ id: string;
56
+ status: string;
57
+ collectionId?: string;
58
+ revision?: number;
59
+ /** Before/after snapshot when requested, as a flat document. */
60
+ document?: WithMeta<Record<string, unknown>>;
61
+ data?: unknown;
62
+ query?: unknown;
63
+ error?: unknown;
64
+ }
65
+ export interface TransactResult {
66
+ status: string;
67
+ results: TransactResultItem[];
68
+ }
69
+ /** Named reads for `data.queryBatch`: 1–20 entries, names matching `[A-Za-z0-9_.-]{1,64}`. */
70
+ export type BatchQueries = Record<string, BatchQuery<unknown>>;
71
+ export type BatchResults<Q extends BatchQueries> = {
72
+ [K in keyof Q]: Q[K] extends BatchQuery<infer R> ? R : never;
73
+ };
74
+ export type SettledBatchResults<Q extends BatchQueries> = {
75
+ [K in keyof Q]: Q[K] extends BatchQuery<infer R> ? {
76
+ ok: true;
77
+ value: R;
78
+ } | {
79
+ ok: false;
80
+ error: DataError;
81
+ } : never;
82
+ };
83
+ /** Contract limit of `records:queryBatch`. */
84
+ export declare const MAX_BATCH_QUERIES = 20;
85
+ /** Credentials as for `createClient`; `transportTimeoutMs` (per attempt) defaults to 25 s here, see DEFAULT_DATA_TIMEOUT_MS. */
86
+ export interface DataClientConfig extends ClientConfig {
87
+ collections: readonly CollectionDefinition[];
88
+ /** Defaults to "deployed" when NODE_ENV is production, otherwise "preview". */
89
+ environment?: DataEnvironment;
90
+ logger?: Logger;
91
+ }
92
+ export interface DataClient {
93
+ /** Typed handle for a declaration listed in `collections`. */
94
+ collection<C extends CollectionDefinition>(definition: C): Collection<z.output<C['schema']>, z.input<C['schema']>>;
95
+ /** Handle by alias, typed by the caller. */
96
+ collection<T extends object = Record<string, unknown>>(alias: string): Collection<T>;
97
+ /**
98
+ * Atomic multi-record, multi-collection write (`recordTransactionExecute`, sync),
99
+ * at most 200 steps. Steps can depend on each other (`dependsOn`) and bind
100
+ * earlier results (`bindings`). This is not a Mongo session: everything is
101
+ * sent at once.
102
+ */
103
+ transact(steps: readonly TransactStep[], options?: {
104
+ dryRun?: boolean;
105
+ idempotencyKey?: string;
106
+ }): Promise<TransactResult>;
107
+ /**
108
+ * Committed record changes of declared collections (all by default), as
109
+ * one async iterable that reconnects and resumes by itself; see
110
+ * `SubscribeOptions`. Events carry identities only; changes in collections
111
+ * with employee data rules arrive as collection-level notices unless
112
+ * `restricted: "record"` is asked for. Open it inside a request to watch as
113
+ * that employee, or in `runAsApp` for one App-wide stream a server fans out.
114
+ */
115
+ subscribe(options?: SubscribeOptions): AsyncIterable<SubscriptionEvent>;
116
+ /**
117
+ * Up to 20 reads of declared collections in one request, answered from one
118
+ * snapshot: what a page shows (a list page with its total, counters, a
119
+ * lookup by ID) in one round trip. Build each read with
120
+ * `collection.query.*`; results come back under the same names.
121
+ *
122
+ * A read UNS refuses on its own (invalid filter, no grant) rejects the
123
+ * whole call with its DataError; with `{ settle: true }` every result is
124
+ * `{ ok, value }` or `{ ok: false, error }` instead. A statement timeout or
125
+ * a batch over 2000 rows / 8 MiB always fails the whole call.
126
+ */
127
+ queryBatch<Q extends BatchQueries>(queries: Q): Promise<BatchResults<Q>>;
128
+ queryBatch<Q extends BatchQueries>(queries: Q, options: {
129
+ settle: true;
130
+ }): Promise<SettledBatchResults<Q>>;
131
+ /** Ensures every declaration now (normally lazy on first access). */
132
+ ensure(): Promise<EnsureState>;
133
+ }
134
+ export declare function createDataClient(config: DataClientConfig): DataClient;