@endora-commerce/platform 0.100.0

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 (657) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +58 -0
  3. package/dist/cli/dispatch.d.ts +146 -0
  4. package/dist/cli/dispatch.d.ts.map +1 -0
  5. package/dist/cli/dispatch.js +259 -0
  6. package/dist/cli/dispatch.js.map +1 -0
  7. package/dist/cli/index.d.ts +58 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/index.js +58 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/cli/module-commands.d.ts +118 -0
  12. package/dist/cli/module-commands.d.ts.map +1 -0
  13. package/dist/cli/module-commands.js +120 -0
  14. package/dist/cli/module-commands.js.map +1 -0
  15. package/dist/commands/actor.d.ts +19 -0
  16. package/dist/commands/actor.d.ts.map +1 -0
  17. package/dist/commands/actor.js +45 -0
  18. package/dist/commands/actor.js.map +1 -0
  19. package/dist/commands/audit-from-context.d.ts +24 -0
  20. package/dist/commands/audit-from-context.d.ts.map +1 -0
  21. package/dist/commands/audit-from-context.js +28 -0
  22. package/dist/commands/audit-from-context.js.map +1 -0
  23. package/dist/commands/command-bus.d.ts +40 -0
  24. package/dist/commands/command-bus.d.ts.map +1 -0
  25. package/dist/commands/command-bus.js +46 -0
  26. package/dist/commands/command-bus.js.map +1 -0
  27. package/dist/commands/command.d.ts +76 -0
  28. package/dist/commands/command.d.ts.map +1 -0
  29. package/dist/commands/command.js +2 -0
  30. package/dist/commands/command.js.map +1 -0
  31. package/dist/commands/index.d.ts +65 -0
  32. package/dist/commands/index.d.ts.map +1 -0
  33. package/dist/commands/index.js +57 -0
  34. package/dist/commands/index.js.map +1 -0
  35. package/dist/commands/reversible.d.ts +66 -0
  36. package/dist/commands/reversible.d.ts.map +1 -0
  37. package/dist/commands/reversible.js +41 -0
  38. package/dist/commands/reversible.js.map +1 -0
  39. package/dist/composition/compose-app.d.ts +305 -0
  40. package/dist/composition/compose-app.d.ts.map +1 -0
  41. package/dist/composition/compose-app.js +939 -0
  42. package/dist/composition/compose-app.js.map +1 -0
  43. package/dist/composition/index.d.ts +92 -0
  44. package/dist/composition/index.d.ts.map +1 -0
  45. package/dist/composition/index.js +175 -0
  46. package/dist/composition/index.js.map +1 -0
  47. package/dist/composition/newsletter-token-secret.d.ts +19 -0
  48. package/dist/composition/newsletter-token-secret.d.ts.map +1 -0
  49. package/dist/composition/newsletter-token-secret.js +24 -0
  50. package/dist/composition/newsletter-token-secret.js.map +1 -0
  51. package/dist/composition/process-runs-workers.d.ts +17 -0
  52. package/dist/composition/process-runs-workers.d.ts.map +1 -0
  53. package/dist/composition/process-runs-workers.js +19 -0
  54. package/dist/composition/process-runs-workers.js.map +1 -0
  55. package/dist/db/baseline-migration-inventory.d.ts +15 -0
  56. package/dist/db/baseline-migration-inventory.d.ts.map +1 -0
  57. package/dist/db/baseline-migration-inventory.js +115 -0
  58. package/dist/db/baseline-migration-inventory.js.map +1 -0
  59. package/dist/db/configured-entities.d.ts +74 -0
  60. package/dist/db/configured-entities.d.ts.map +1 -0
  61. package/dist/db/configured-entities.js +20 -0
  62. package/dist/db/configured-entities.js.map +1 -0
  63. package/dist/db/configured-migrations.d.ts +199 -0
  64. package/dist/db/configured-migrations.d.ts.map +1 -0
  65. package/dist/db/configured-migrations.js +181 -0
  66. package/dist/db/configured-migrations.js.map +1 -0
  67. package/dist/db/index.d.ts +54 -0
  68. package/dist/db/index.d.ts.map +1 -0
  69. package/dist/db/index.js +54 -0
  70. package/dist/db/index.js.map +1 -0
  71. package/dist/db/migrate.d.ts +21 -0
  72. package/dist/db/migrate.d.ts.map +1 -0
  73. package/dist/db/migrate.js +48 -0
  74. package/dist/db/migrate.js.map +1 -0
  75. package/dist/db/migration-order.d.ts +159 -0
  76. package/dist/db/migration-order.d.ts.map +1 -0
  77. package/dist/db/migration-order.js +273 -0
  78. package/dist/db/migration-order.js.map +1 -0
  79. package/dist/db/mikro-orm.config.d.ts +51 -0
  80. package/dist/db/mikro-orm.config.d.ts.map +1 -0
  81. package/dist/db/mikro-orm.config.js +64 -0
  82. package/dist/db/mikro-orm.config.js.map +1 -0
  83. package/dist/db/orm.d.ts +40 -0
  84. package/dist/db/orm.d.ts.map +1 -0
  85. package/dist/db/orm.js +25 -0
  86. package/dist/db/orm.js.map +1 -0
  87. package/dist/db/platform-schema.d.ts +102 -0
  88. package/dist/db/platform-schema.d.ts.map +1 -0
  89. package/dist/db/platform-schema.js +79 -0
  90. package/dist/db/platform-schema.js.map +1 -0
  91. package/dist/db/pluralizing-naming-strategy.d.ts +16 -0
  92. package/dist/db/pluralizing-naming-strategy.d.ts.map +1 -0
  93. package/dist/db/pluralizing-naming-strategy.js +66 -0
  94. package/dist/db/pluralizing-naming-strategy.js.map +1 -0
  95. package/dist/demo/guard.d.ts +101 -0
  96. package/dist/demo/guard.d.ts.map +1 -0
  97. package/dist/demo/guard.js +168 -0
  98. package/dist/demo/guard.js.map +1 -0
  99. package/dist/demo/host-command.d.ts +133 -0
  100. package/dist/demo/host-command.d.ts.map +1 -0
  101. package/dist/demo/host-command.js +113 -0
  102. package/dist/demo/host-command.js.map +1 -0
  103. package/dist/demo/index.d.ts +82 -0
  104. package/dist/demo/index.d.ts.map +1 -0
  105. package/dist/demo/index.js +82 -0
  106. package/dist/demo/index.js.map +1 -0
  107. package/dist/demo/packages.d.ts +67 -0
  108. package/dist/demo/packages.d.ts.map +1 -0
  109. package/dist/demo/packages.js +132 -0
  110. package/dist/demo/packages.js.map +1 -0
  111. package/dist/demo/plan.d.ts +111 -0
  112. package/dist/demo/plan.d.ts.map +1 -0
  113. package/dist/demo/plan.js +74 -0
  114. package/dist/demo/plan.js.map +1 -0
  115. package/dist/demo/report.d.ts +17 -0
  116. package/dist/demo/report.d.ts.map +1 -0
  117. package/dist/demo/report.js +85 -0
  118. package/dist/demo/report.js.map +1 -0
  119. package/dist/demo/runner.d.ts +207 -0
  120. package/dist/demo/runner.d.ts.map +1 -0
  121. package/dist/demo/runner.js +169 -0
  122. package/dist/demo/runner.js.map +1 -0
  123. package/dist/demo/scope.d.ts +44 -0
  124. package/dist/demo/scope.d.ts.map +1 -0
  125. package/dist/demo/scope.js +44 -0
  126. package/dist/demo/scope.js.map +1 -0
  127. package/dist/env/index.d.ts +68 -0
  128. package/dist/env/index.d.ts.map +1 -0
  129. package/dist/env/index.js +427 -0
  130. package/dist/env/index.js.map +1 -0
  131. package/dist/events/bus.d.ts +29 -0
  132. package/dist/events/bus.d.ts.map +1 -0
  133. package/dist/events/bus.js +67 -0
  134. package/dist/events/bus.js.map +1 -0
  135. package/dist/events/index.d.ts +19 -0
  136. package/dist/events/index.d.ts.map +1 -0
  137. package/dist/events/index.js +19 -0
  138. package/dist/events/index.js.map +1 -0
  139. package/dist/http/cursor.d.ts +10 -0
  140. package/dist/http/cursor.d.ts.map +1 -0
  141. package/dist/http/cursor.js +20 -0
  142. package/dist/http/cursor.js.map +1 -0
  143. package/dist/http/error-envelope.d.ts +127 -0
  144. package/dist/http/error-envelope.d.ts.map +1 -0
  145. package/dist/http/error-envelope.js +402 -0
  146. package/dist/http/error-envelope.js.map +1 -0
  147. package/dist/http/health.d.ts +88 -0
  148. package/dist/http/health.d.ts.map +1 -0
  149. package/dist/http/health.js +77 -0
  150. package/dist/http/health.js.map +1 -0
  151. package/dist/http/index.d.ts +50 -0
  152. package/dist/http/index.d.ts.map +1 -0
  153. package/dist/http/index.js +50 -0
  154. package/dist/http/index.js.map +1 -0
  155. package/dist/http/interceptors/dispatch.d.ts +14 -0
  156. package/dist/http/interceptors/dispatch.d.ts.map +1 -0
  157. package/dist/http/interceptors/dispatch.js +113 -0
  158. package/dist/http/interceptors/dispatch.js.map +1 -0
  159. package/dist/http/interceptors/index.d.ts +6 -0
  160. package/dist/http/interceptors/index.d.ts.map +1 -0
  161. package/dist/http/interceptors/index.js +5 -0
  162. package/dist/http/interceptors/index.js.map +1 -0
  163. package/dist/http/interceptors/registry.d.ts +44 -0
  164. package/dist/http/interceptors/registry.d.ts.map +1 -0
  165. package/dist/http/interceptors/registry.js +123 -0
  166. package/dist/http/interceptors/registry.js.map +1 -0
  167. package/dist/http/interceptors/route-table.d.ts +33 -0
  168. package/dist/http/interceptors/route-table.d.ts.map +1 -0
  169. package/dist/http/interceptors/route-table.js +39 -0
  170. package/dist/http/interceptors/route-table.js.map +1 -0
  171. package/dist/http/interceptors/types.d.ts +101 -0
  172. package/dist/http/interceptors/types.d.ts.map +1 -0
  173. package/dist/http/interceptors/types.js +2 -0
  174. package/dist/http/interceptors/types.js.map +1 -0
  175. package/dist/http/interceptors/validation.d.ts +22 -0
  176. package/dist/http/interceptors/validation.d.ts.map +1 -0
  177. package/dist/http/interceptors/validation.js +39 -0
  178. package/dist/http/interceptors/validation.js.map +1 -0
  179. package/dist/http/logger.d.ts +9 -0
  180. package/dist/http/logger.d.ts.map +1 -0
  181. package/dist/http/logger.js +25 -0
  182. package/dist/http/logger.js.map +1 -0
  183. package/dist/http/openapi.d.ts +21 -0
  184. package/dist/http/openapi.d.ts.map +1 -0
  185. package/dist/http/openapi.js +114 -0
  186. package/dist/http/openapi.js.map +1 -0
  187. package/dist/http/product-audience.d.ts +78 -0
  188. package/dist/http/product-audience.d.ts.map +1 -0
  189. package/dist/http/product-audience.js +92 -0
  190. package/dist/http/product-audience.js.map +1 -0
  191. package/dist/http/request-actor.d.ts +82 -0
  192. package/dist/http/request-actor.d.ts.map +1 -0
  193. package/dist/http/request-actor.js +2 -0
  194. package/dist/http/request-actor.js.map +1 -0
  195. package/dist/http/server.d.ts +60 -0
  196. package/dist/http/server.d.ts.map +1 -0
  197. package/dist/http/server.js +117 -0
  198. package/dist/http/server.js.map +1 -0
  199. package/dist/http/storefront-revalidator.d.ts +29 -0
  200. package/dist/http/storefront-revalidator.d.ts.map +1 -0
  201. package/dist/http/storefront-revalidator.js +34 -0
  202. package/dist/http/storefront-revalidator.js.map +1 -0
  203. package/dist/http/test-actor-carrier.d.ts +28 -0
  204. package/dist/http/test-actor-carrier.d.ts.map +1 -0
  205. package/dist/http/test-actor-carrier.js +10 -0
  206. package/dist/http/test-actor-carrier.js.map +1 -0
  207. package/dist/http/trusted-proxy.d.ts +48 -0
  208. package/dist/http/trusted-proxy.d.ts.map +1 -0
  209. package/dist/http/trusted-proxy.js +136 -0
  210. package/dist/http/trusted-proxy.js.map +1 -0
  211. package/dist/kernel/audit/audit-log-entry.entity.d.ts +33 -0
  212. package/dist/kernel/audit/audit-log-entry.entity.d.ts.map +1 -0
  213. package/dist/kernel/audit/audit-log-entry.entity.js +102 -0
  214. package/dist/kernel/audit/audit-log-entry.entity.js.map +1 -0
  215. package/dist/kernel/audit/audit-log-service.d.ts +63 -0
  216. package/dist/kernel/audit/audit-log-service.d.ts.map +1 -0
  217. package/dist/kernel/audit/audit-log-service.js +107 -0
  218. package/dist/kernel/audit/audit-log-service.js.map +1 -0
  219. package/dist/kernel/cache/in-process-cache-registry.d.ts +93 -0
  220. package/dist/kernel/cache/in-process-cache-registry.d.ts.map +1 -0
  221. package/dist/kernel/cache/in-process-cache-registry.js +78 -0
  222. package/dist/kernel/cache/in-process-cache-registry.js.map +1 -0
  223. package/dist/kernel/cache/shared-drop-marks.d.ts +39 -0
  224. package/dist/kernel/cache/shared-drop-marks.d.ts.map +1 -0
  225. package/dist/kernel/cache/shared-drop-marks.js +68 -0
  226. package/dist/kernel/cache/shared-drop-marks.js.map +1 -0
  227. package/dist/kernel/compose.d.ts +234 -0
  228. package/dist/kernel/compose.d.ts.map +1 -0
  229. package/dist/kernel/compose.js +279 -0
  230. package/dist/kernel/compose.js.map +1 -0
  231. package/dist/kernel/container.d.ts +95 -0
  232. package/dist/kernel/container.d.ts.map +1 -0
  233. package/dist/kernel/container.js +90 -0
  234. package/dist/kernel/container.js.map +1 -0
  235. package/dist/kernel/contribution-sinks.d.ts +106 -0
  236. package/dist/kernel/contribution-sinks.d.ts.map +1 -0
  237. package/dist/kernel/contribution-sinks.js +153 -0
  238. package/dist/kernel/contribution-sinks.js.map +1 -0
  239. package/dist/kernel/crypto/password-hasher.d.ts +3 -0
  240. package/dist/kernel/crypto/password-hasher.d.ts.map +1 -0
  241. package/dist/kernel/crypto/password-hasher.js +44 -0
  242. package/dist/kernel/crypto/password-hasher.js.map +1 -0
  243. package/dist/kernel/i18n/error-envelope-options.d.ts +56 -0
  244. package/dist/kernel/i18n/error-envelope-options.d.ts.map +1 -0
  245. package/dist/kernel/i18n/error-envelope-options.js +46 -0
  246. package/dist/kernel/i18n/error-envelope-options.js.map +1 -0
  247. package/dist/kernel/i18n/error-translation.d.ts +144 -0
  248. package/dist/kernel/i18n/error-translation.d.ts.map +1 -0
  249. package/dist/kernel/i18n/error-translation.js +84 -0
  250. package/dist/kernel/i18n/error-translation.js.map +1 -0
  251. package/dist/kernel/i18n/request-language.d.ts +80 -0
  252. package/dist/kernel/i18n/request-language.d.ts.map +1 -0
  253. package/dist/kernel/i18n/request-language.js +168 -0
  254. package/dist/kernel/i18n/request-language.js.map +1 -0
  255. package/dist/kernel/index.d.ts +142 -0
  256. package/dist/kernel/index.d.ts.map +1 -0
  257. package/dist/kernel/index.js +160 -0
  258. package/dist/kernel/index.js.map +1 -0
  259. package/dist/kernel/lazy-port.d.ts +59 -0
  260. package/dist/kernel/lazy-port.d.ts.map +1 -0
  261. package/dist/kernel/lazy-port.js +78 -0
  262. package/dist/kernel/lazy-port.js.map +1 -0
  263. package/dist/kernel/lifecycle/activation-resolver.d.ts +63 -0
  264. package/dist/kernel/lifecycle/activation-resolver.d.ts.map +1 -0
  265. package/dist/kernel/lifecycle/activation-resolver.js +70 -0
  266. package/dist/kernel/lifecycle/activation-resolver.js.map +1 -0
  267. package/dist/kernel/lifecycle/capability-registry.d.ts +145 -0
  268. package/dist/kernel/lifecycle/capability-registry.d.ts.map +1 -0
  269. package/dist/kernel/lifecycle/capability-registry.js +170 -0
  270. package/dist/kernel/lifecycle/capability-registry.js.map +1 -0
  271. package/dist/kernel/lifecycle/effective-state.d.ts +126 -0
  272. package/dist/kernel/lifecycle/effective-state.d.ts.map +1 -0
  273. package/dist/kernel/lifecycle/effective-state.js +111 -0
  274. package/dist/kernel/lifecycle/effective-state.js.map +1 -0
  275. package/dist/kernel/lifecycle/module-registration.entity.d.ts +57 -0
  276. package/dist/kernel/lifecycle/module-registration.entity.d.ts.map +1 -0
  277. package/dist/kernel/lifecycle/module-registration.entity.js +111 -0
  278. package/dist/kernel/lifecycle/module-registration.entity.js.map +1 -0
  279. package/dist/kernel/lifecycle/plugin-helpers.d.ts +165 -0
  280. package/dist/kernel/lifecycle/plugin-helpers.d.ts.map +1 -0
  281. package/dist/kernel/lifecycle/plugin-helpers.js +395 -0
  282. package/dist/kernel/lifecycle/plugin-helpers.js.map +1 -0
  283. package/dist/kernel/lifecycle/registry-cache.d.ts +318 -0
  284. package/dist/kernel/lifecycle/registry-cache.d.ts.map +1 -0
  285. package/dist/kernel/lifecycle/registry-cache.js +509 -0
  286. package/dist/kernel/lifecycle/registry-cache.js.map +1 -0
  287. package/dist/kernel/lifecycle/required-modules.d.ts +137 -0
  288. package/dist/kernel/lifecycle/required-modules.d.ts.map +1 -0
  289. package/dist/kernel/lifecycle/required-modules.js +80 -0
  290. package/dist/kernel/lifecycle/required-modules.js.map +1 -0
  291. package/dist/kernel/lifecycle/unique-module-ids.d.ts +58 -0
  292. package/dist/kernel/lifecycle/unique-module-ids.d.ts.map +1 -0
  293. package/dist/kernel/lifecycle/unique-module-ids.js +82 -0
  294. package/dist/kernel/lifecycle/unique-module-ids.js.map +1 -0
  295. package/dist/kernel/logging.d.ts +116 -0
  296. package/dist/kernel/logging.d.ts.map +1 -0
  297. package/dist/kernel/logging.js +71 -0
  298. package/dist/kernel/logging.js.map +1 -0
  299. package/dist/kernel/module-context.d.ts +563 -0
  300. package/dist/kernel/module-context.d.ts.map +1 -0
  301. package/dist/kernel/module-context.js +670 -0
  302. package/dist/kernel/module-context.js.map +1 -0
  303. package/dist/kernel/ports/audit.d.ts +115 -0
  304. package/dist/kernel/ports/audit.d.ts.map +1 -0
  305. package/dist/kernel/ports/audit.js +2 -0
  306. package/dist/kernel/ports/audit.js.map +1 -0
  307. package/dist/kernel/ports/organizations.d.ts +56 -0
  308. package/dist/kernel/ports/organizations.d.ts.map +1 -0
  309. package/dist/kernel/ports/organizations.js +2 -0
  310. package/dist/kernel/ports/organizations.js.map +1 -0
  311. package/dist/kernel/ports/provide.d.ts +14 -0
  312. package/dist/kernel/ports/provide.d.ts.map +1 -0
  313. package/dist/kernel/ports/provide.js +50 -0
  314. package/dist/kernel/ports/provide.js.map +1 -0
  315. package/dist/kernel/ports/require-admin.d.ts +61 -0
  316. package/dist/kernel/ports/require-admin.d.ts.map +1 -0
  317. package/dist/kernel/ports/require-admin.js +2 -0
  318. package/dist/kernel/ports/require-admin.js.map +1 -0
  319. package/dist/kernel/ports/require-customer.d.ts +17 -0
  320. package/dist/kernel/ports/require-customer.d.ts.map +1 -0
  321. package/dist/kernel/ports/require-customer.js +2 -0
  322. package/dist/kernel/ports/require-customer.js.map +1 -0
  323. package/dist/kernel/ports/sales-channel.d.ts +84 -0
  324. package/dist/kernel/ports/sales-channel.d.ts.map +1 -0
  325. package/dist/kernel/ports/sales-channel.js +2 -0
  326. package/dist/kernel/ports/sales-channel.js.map +1 -0
  327. package/dist/kernel/ports/settings.d.ts +59 -0
  328. package/dist/kernel/ports/settings.d.ts.map +1 -0
  329. package/dist/kernel/ports/settings.js +2 -0
  330. package/dist/kernel/ports/settings.js.map +1 -0
  331. package/dist/kernel/public-api-base-url.d.ts +98 -0
  332. package/dist/kernel/public-api-base-url.d.ts.map +1 -0
  333. package/dist/kernel/public-api-base-url.js +144 -0
  334. package/dist/kernel/public-api-base-url.js.map +1 -0
  335. package/dist/kernel/request-scope-hook.d.ts +63 -0
  336. package/dist/kernel/request-scope-hook.d.ts.map +1 -0
  337. package/dist/kernel/request-scope-hook.js +67 -0
  338. package/dist/kernel/request-scope-hook.js.map +1 -0
  339. package/dist/kernel/sales-channels/channel-bridge-registry.d.ts +109 -0
  340. package/dist/kernel/sales-channels/channel-bridge-registry.d.ts.map +1 -0
  341. package/dist/kernel/sales-channels/channel-bridge-registry.js +75 -0
  342. package/dist/kernel/sales-channels/channel-bridge-registry.js.map +1 -0
  343. package/dist/kernel/sales-channels/compose.d.ts +69 -0
  344. package/dist/kernel/sales-channels/compose.d.ts.map +1 -0
  345. package/dist/kernel/sales-channels/compose.js +43 -0
  346. package/dist/kernel/sales-channels/compose.js.map +1 -0
  347. package/dist/kernel/sales-channels/default-channel-reconciler.d.ts +66 -0
  348. package/dist/kernel/sales-channels/default-channel-reconciler.d.ts.map +1 -0
  349. package/dist/kernel/sales-channels/default-channel-reconciler.js +91 -0
  350. package/dist/kernel/sales-channels/default-channel-reconciler.js.map +1 -0
  351. package/dist/kernel/sales-channels/no-system-default-channel.error.d.ts +28 -0
  352. package/dist/kernel/sales-channels/no-system-default-channel.error.d.ts.map +1 -0
  353. package/dist/kernel/sales-channels/no-system-default-channel.error.js +33 -0
  354. package/dist/kernel/sales-channels/no-system-default-channel.error.js.map +1 -0
  355. package/dist/kernel/sales-channels/request-channel-assortment.d.ts +72 -0
  356. package/dist/kernel/sales-channels/request-channel-assortment.d.ts.map +1 -0
  357. package/dist/kernel/sales-channels/request-channel-assortment.js +83 -0
  358. package/dist/kernel/sales-channels/request-channel-assortment.js.map +1 -0
  359. package/dist/kernel/sales-channels/sales-channel-membership.service.d.ts +157 -0
  360. package/dist/kernel/sales-channels/sales-channel-membership.service.d.ts.map +1 -0
  361. package/dist/kernel/sales-channels/sales-channel-membership.service.js +302 -0
  362. package/dist/kernel/sales-channels/sales-channel-membership.service.js.map +1 -0
  363. package/dist/kernel/sales-channels/sales-channel-resolver.middleware.d.ts +76 -0
  364. package/dist/kernel/sales-channels/sales-channel-resolver.middleware.d.ts.map +1 -0
  365. package/dist/kernel/sales-channels/sales-channel-resolver.middleware.js +184 -0
  366. package/dist/kernel/sales-channels/sales-channel-resolver.middleware.js.map +1 -0
  367. package/dist/kernel/sales-channels/sales-channel-resolver.service.d.ts +82 -0
  368. package/dist/kernel/sales-channels/sales-channel-resolver.service.d.ts.map +1 -0
  369. package/dist/kernel/sales-channels/sales-channel-resolver.service.js +126 -0
  370. package/dist/kernel/sales-channels/sales-channel-resolver.service.js.map +1 -0
  371. package/dist/kernel/sales-channels/sales-channel.entity.d.ts +50 -0
  372. package/dist/kernel/sales-channels/sales-channel.entity.d.ts.map +1 -0
  373. package/dist/kernel/sales-channels/sales-channel.entity.js +132 -0
  374. package/dist/kernel/sales-channels/sales-channel.entity.js.map +1 -0
  375. package/dist/kernel/sales-channels/sales-channels-cache.d.ts +170 -0
  376. package/dist/kernel/sales-channels/sales-channels-cache.d.ts.map +1 -0
  377. package/dist/kernel/sales-channels/sales-channels-cache.js +243 -0
  378. package/dist/kernel/sales-channels/sales-channels-cache.js.map +1 -0
  379. package/dist/kernel/scope.d.ts +153 -0
  380. package/dist/kernel/scope.d.ts.map +1 -0
  381. package/dist/kernel/scope.js +172 -0
  382. package/dist/kernel/scope.js.map +1 -0
  383. package/dist/kernel/settings/compose.d.ts +49 -0
  384. package/dist/kernel/settings/compose.d.ts.map +1 -0
  385. package/dist/kernel/settings/compose.js +21 -0
  386. package/dist/kernel/settings/compose.js.map +1 -0
  387. package/dist/kernel/settings/manifest-reconciler.d.ts +78 -0
  388. package/dist/kernel/settings/manifest-reconciler.d.ts.map +1 -0
  389. package/dist/kernel/settings/manifest-reconciler.js +343 -0
  390. package/dist/kernel/settings/manifest-reconciler.js.map +1 -0
  391. package/dist/kernel/settings/secret-value-codec.d.ts +52 -0
  392. package/dist/kernel/settings/secret-value-codec.d.ts.map +1 -0
  393. package/dist/kernel/settings/secret-value-codec.js +102 -0
  394. package/dist/kernel/settings/secret-value-codec.js.map +1 -0
  395. package/dist/kernel/settings/setting-group.entity.d.ts +25 -0
  396. package/dist/kernel/settings/setting-group.entity.d.ts.map +1 -0
  397. package/dist/kernel/settings/setting-group.entity.js +79 -0
  398. package/dist/kernel/settings/setting-group.entity.js.map +1 -0
  399. package/dist/kernel/settings/setting-value.entity.d.ts +23 -0
  400. package/dist/kernel/settings/setting-value.entity.d.ts.map +1 -0
  401. package/dist/kernel/settings/setting-value.entity.js +66 -0
  402. package/dist/kernel/settings/setting-value.entity.js.map +1 -0
  403. package/dist/kernel/settings/setting.entity.d.ts +56 -0
  404. package/dist/kernel/settings/setting.entity.d.ts.map +1 -0
  405. package/dist/kernel/settings/setting.entity.js +147 -0
  406. package/dist/kernel/settings/setting.entity.js.map +1 -0
  407. package/dist/kernel/settings/settings-cache.d.ts +158 -0
  408. package/dist/kernel/settings/settings-cache.d.ts.map +1 -0
  409. package/dist/kernel/settings/settings-cache.js +253 -0
  410. package/dist/kernel/settings/settings-cache.js.map +1 -0
  411. package/dist/kernel/settings/settings.service.d.ts +142 -0
  412. package/dist/kernel/settings/settings.service.d.ts.map +1 -0
  413. package/dist/kernel/settings/settings.service.js +294 -0
  414. package/dist/kernel/settings/settings.service.js.map +1 -0
  415. package/dist/lifecycle/backend.d.ts +51 -0
  416. package/dist/lifecycle/backend.d.ts.map +1 -0
  417. package/dist/lifecycle/backend.js +40 -0
  418. package/dist/lifecycle/backend.js.map +1 -0
  419. package/dist/lifecycle/commands/activation.commands.d.ts +97 -0
  420. package/dist/lifecycle/commands/activation.commands.d.ts.map +1 -0
  421. package/dist/lifecycle/commands/activation.commands.js +142 -0
  422. package/dist/lifecycle/commands/activation.commands.js.map +1 -0
  423. package/dist/lifecycle/commands/disable.d.ts +3 -0
  424. package/dist/lifecycle/commands/disable.d.ts.map +1 -0
  425. package/dist/lifecycle/commands/disable.js +126 -0
  426. package/dist/lifecycle/commands/disable.js.map +1 -0
  427. package/dist/lifecycle/commands/enable.d.ts +3 -0
  428. package/dist/lifecycle/commands/enable.d.ts.map +1 -0
  429. package/dist/lifecycle/commands/enable.js +102 -0
  430. package/dist/lifecycle/commands/enable.js.map +1 -0
  431. package/dist/lifecycle/commands/install.d.ts +3 -0
  432. package/dist/lifecycle/commands/install.d.ts.map +1 -0
  433. package/dist/lifecycle/commands/install.js +263 -0
  434. package/dist/lifecycle/commands/install.js.map +1 -0
  435. package/dist/lifecycle/commands/operator-entry.d.ts +104 -0
  436. package/dist/lifecycle/commands/operator-entry.d.ts.map +1 -0
  437. package/dist/lifecycle/commands/operator-entry.js +127 -0
  438. package/dist/lifecycle/commands/operator-entry.js.map +1 -0
  439. package/dist/lifecycle/commands/operator-runtime.d.ts +147 -0
  440. package/dist/lifecycle/commands/operator-runtime.d.ts.map +1 -0
  441. package/dist/lifecycle/commands/operator-runtime.js +40 -0
  442. package/dist/lifecycle/commands/operator-runtime.js.map +1 -0
  443. package/dist/lifecycle/commands/status.d.ts +3 -0
  444. package/dist/lifecycle/commands/status.d.ts.map +1 -0
  445. package/dist/lifecycle/commands/status.js +108 -0
  446. package/dist/lifecycle/commands/status.js.map +1 -0
  447. package/dist/lifecycle/commands/uninstall.d.ts +3 -0
  448. package/dist/lifecycle/commands/uninstall.d.ts.map +1 -0
  449. package/dist/lifecycle/commands/uninstall.js +223 -0
  450. package/dist/lifecycle/commands/uninstall.js.map +1 -0
  451. package/dist/lifecycle/divergence-declaration.d.ts +74 -0
  452. package/dist/lifecycle/divergence-declaration.d.ts.map +1 -0
  453. package/dist/lifecycle/divergence-declaration.js +92 -0
  454. package/dist/lifecycle/divergence-declaration.js.map +1 -0
  455. package/dist/lifecycle/i18n/en.json +4 -0
  456. package/dist/lifecycle/i18n/pl.json +4 -0
  457. package/dist/lifecycle/index.d.ts +110 -0
  458. package/dist/lifecycle/index.d.ts.map +1 -0
  459. package/dist/lifecycle/index.js +189 -0
  460. package/dist/lifecycle/index.js.map +1 -0
  461. package/dist/lifecycle/manifest-registry.d.ts +244 -0
  462. package/dist/lifecycle/manifest-registry.d.ts.map +1 -0
  463. package/dist/lifecycle/manifest-registry.js +223 -0
  464. package/dist/lifecycle/manifest-registry.js.map +1 -0
  465. package/dist/lifecycle/manifest.d.ts +166 -0
  466. package/dist/lifecycle/manifest.d.ts.map +1 -0
  467. package/dist/lifecycle/manifest.js +121 -0
  468. package/dist/lifecycle/manifest.js.map +1 -0
  469. package/dist/lifecycle/plugin.d.ts +56 -0
  470. package/dist/lifecycle/plugin.d.ts.map +1 -0
  471. package/dist/lifecycle/plugin.js +59 -0
  472. package/dist/lifecycle/plugin.js.map +1 -0
  473. package/dist/lifecycle/resident.d.ts +16 -0
  474. package/dist/lifecycle/resident.d.ts.map +1 -0
  475. package/dist/lifecycle/resident.js +59 -0
  476. package/dist/lifecycle/resident.js.map +1 -0
  477. package/dist/lifecycle/routes.admin.d.ts +57 -0
  478. package/dist/lifecycle/routes.admin.d.ts.map +1 -0
  479. package/dist/lifecycle/routes.admin.js +162 -0
  480. package/dist/lifecycle/routes.admin.js.map +1 -0
  481. package/dist/lifecycle/routes.storefront.d.ts +26 -0
  482. package/dist/lifecycle/routes.storefront.d.ts.map +1 -0
  483. package/dist/lifecycle/routes.storefront.js +36 -0
  484. package/dist/lifecycle/routes.storefront.js.map +1 -0
  485. package/dist/lifecycle/services/deactivation-ledger.d.ts +216 -0
  486. package/dist/lifecycle/services/deactivation-ledger.d.ts.map +1 -0
  487. package/dist/lifecycle/services/deactivation-ledger.js +171 -0
  488. package/dist/lifecycle/services/deactivation-ledger.js.map +1 -0
  489. package/dist/lifecycle/services/dep-graph.d.ts +119 -0
  490. package/dist/lifecycle/services/dep-graph.d.ts.map +1 -0
  491. package/dist/lifecycle/services/dep-graph.js +334 -0
  492. package/dist/lifecycle/services/dep-graph.js.map +1 -0
  493. package/dist/lifecycle/services/gating-graph.d.ts +164 -0
  494. package/dist/lifecycle/services/gating-graph.d.ts.map +1 -0
  495. package/dist/lifecycle/services/gating-graph.js +203 -0
  496. package/dist/lifecycle/services/gating-graph.js.map +1 -0
  497. package/dist/lifecycle/services/lock.d.ts +27 -0
  498. package/dist/lifecycle/services/lock.d.ts.map +1 -0
  499. package/dist/lifecycle/services/lock.js +82 -0
  500. package/dist/lifecycle/services/lock.js.map +1 -0
  501. package/dist/lifecycle/services/manifest-loader.d.ts +125 -0
  502. package/dist/lifecycle/services/manifest-loader.d.ts.map +1 -0
  503. package/dist/lifecycle/services/manifest-loader.js +210 -0
  504. package/dist/lifecycle/services/manifest-loader.js.map +1 -0
  505. package/dist/lifecycle/services/migration-ownership.d.ts +36 -0
  506. package/dist/lifecycle/services/migration-ownership.d.ts.map +1 -0
  507. package/dist/lifecycle/services/migration-ownership.js +15 -0
  508. package/dist/lifecycle/services/migration-ownership.js.map +1 -0
  509. package/dist/lifecycle/services/module-id-claims.d.ts +38 -0
  510. package/dist/lifecycle/services/module-id-claims.d.ts.map +1 -0
  511. package/dist/lifecycle/services/module-id-claims.js +123 -0
  512. package/dist/lifecycle/services/module-id-claims.js.map +1 -0
  513. package/dist/lifecycle/services/module-origin.d.ts +55 -0
  514. package/dist/lifecycle/services/module-origin.d.ts.map +1 -0
  515. package/dist/lifecycle/services/module-origin.js +47 -0
  516. package/dist/lifecycle/services/module-origin.js.map +1 -0
  517. package/dist/lifecycle/services/orchestrator.d.ts +235 -0
  518. package/dist/lifecycle/services/orchestrator.d.ts.map +1 -0
  519. package/dist/lifecycle/services/orchestrator.js +954 -0
  520. package/dist/lifecycle/services/orchestrator.js.map +1 -0
  521. package/dist/lifecycle/services/presence-load.d.ts +281 -0
  522. package/dist/lifecycle/services/presence-load.d.ts.map +1 -0
  523. package/dist/lifecycle/services/presence-load.js +437 -0
  524. package/dist/lifecycle/services/presence-load.js.map +1 -0
  525. package/dist/lifecycle/services/static-registry.d.ts +47 -0
  526. package/dist/lifecycle/services/static-registry.d.ts.map +1 -0
  527. package/dist/lifecycle/services/static-registry.js +41 -0
  528. package/dist/lifecycle/services/static-registry.js.map +1 -0
  529. package/dist/migrations/20260424T165847_core_foundation_init.d.ts +25 -0
  530. package/dist/migrations/20260424T165847_core_foundation_init.d.ts.map +1 -0
  531. package/dist/migrations/20260424T165847_core_foundation_init.js +238 -0
  532. package/dist/migrations/20260424T165847_core_foundation_init.js.map +1 -0
  533. package/dist/migrations/20260425T050720_core_commerce_init.d.ts +19 -0
  534. package/dist/migrations/20260425T050720_core_commerce_init.d.ts.map +1 -0
  535. package/dist/migrations/20260425T050720_core_commerce_init.js +200 -0
  536. package/dist/migrations/20260425T050720_core_commerce_init.js.map +1 -0
  537. package/dist/migrations/20260430T101450_core_settings_init.d.ts +25 -0
  538. package/dist/migrations/20260430T101450_core_settings_init.d.ts.map +1 -0
  539. package/dist/migrations/20260430T101450_core_settings_init.js +113 -0
  540. package/dist/migrations/20260430T101450_core_settings_init.js.map +1 -0
  541. package/dist/migrations/20260430T170044_core_sales_channels_promote.d.ts +67 -0
  542. package/dist/migrations/20260430T170044_core_sales_channels_promote.d.ts.map +1 -0
  543. package/dist/migrations/20260430T170044_core_sales_channels_promote.js +101 -0
  544. package/dist/migrations/20260430T170044_core_sales_channels_promote.js.map +1 -0
  545. package/dist/migrations/20260506T200657_core_module_lifecycle_init.d.ts +21 -0
  546. package/dist/migrations/20260506T200657_core_module_lifecycle_init.d.ts.map +1 -0
  547. package/dist/migrations/20260506T200657_core_module_lifecycle_init.js +41 -0
  548. package/dist/migrations/20260506T200657_core_module_lifecycle_init.js.map +1 -0
  549. package/dist/migrations/20260514T111329_core_settings_global_value.d.ts +30 -0
  550. package/dist/migrations/20260514T111329_core_settings_global_value.d.ts.map +1 -0
  551. package/dist/migrations/20260514T111329_core_settings_global_value.js +34 -0
  552. package/dist/migrations/20260514T111329_core_settings_global_value.js.map +1 -0
  553. package/dist/migrations/20260611T140411_core_settings_secret_value_type.d.ts +26 -0
  554. package/dist/migrations/20260611T140411_core_settings_secret_value_type.d.ts.map +1 -0
  555. package/dist/migrations/20260611T140411_core_settings_secret_value_type.js +63 -0
  556. package/dist/migrations/20260611T140411_core_settings_secret_value_type.js.map +1 -0
  557. package/dist/migrations/20260611T140419_core_settings_enum_options.d.ts +19 -0
  558. package/dist/migrations/20260611T140419_core_settings_enum_options.d.ts.map +1 -0
  559. package/dist/migrations/20260611T140419_core_settings_enum_options.js +23 -0
  560. package/dist/migrations/20260611T140419_core_settings_enum_options.js.map +1 -0
  561. package/dist/migrations/20260629T090100_core_settings_hidden_flag.d.ts +20 -0
  562. package/dist/migrations/20260629T090100_core_settings_hidden_flag.d.ts.map +1 -0
  563. package/dist/migrations/20260629T090100_core_settings_hidden_flag.js +24 -0
  564. package/dist/migrations/20260629T090100_core_settings_hidden_flag.js.map +1 -0
  565. package/dist/migrations/20260717T134752_core_tenant_scope_indexes.d.ts +27 -0
  566. package/dist/migrations/20260717T134752_core_tenant_scope_indexes.d.ts.map +1 -0
  567. package/dist/migrations/20260717T134752_core_tenant_scope_indexes.js +32 -0
  568. package/dist/migrations/20260717T134752_core_tenant_scope_indexes.js.map +1 -0
  569. package/dist/migrations/20260721T011510_core_settings_credential_ref_value_type.d.ts +24 -0
  570. package/dist/migrations/20260721T011510_core_settings_credential_ref_value_type.d.ts.map +1 -0
  571. package/dist/migrations/20260721T011510_core_settings_credential_ref_value_type.js +57 -0
  572. package/dist/migrations/20260721T011510_core_settings_credential_ref_value_type.js.map +1 -0
  573. package/dist/migrations/20260816T203339_core_retire_core_activation_settings.d.ts +39 -0
  574. package/dist/migrations/20260816T203339_core_retire_core_activation_settings.d.ts.map +1 -0
  575. package/dist/migrations/20260816T203339_core_retire_core_activation_settings.js +59 -0
  576. package/dist/migrations/20260816T203339_core_retire_core_activation_settings.js.map +1 -0
  577. package/dist/migrations/20260919T101500_core_module_registrations_boot_converged.d.ts +34 -0
  578. package/dist/migrations/20260919T101500_core_module_registrations_boot_converged.d.ts.map +1 -0
  579. package/dist/migrations/20260919T101500_core_module_registrations_boot_converged.js +38 -0
  580. package/dist/migrations/20260919T101500_core_module_registrations_boot_converged.js.map +1 -0
  581. package/dist/migrations/baseline-migrations.generated.d.ts +2 -0
  582. package/dist/migrations/baseline-migrations.generated.d.ts.map +1 -0
  583. package/dist/migrations/baseline-migrations.generated.js +136 -0
  584. package/dist/migrations/baseline-migrations.generated.js.map +1 -0
  585. package/dist/migrations/index.d.ts +62 -0
  586. package/dist/migrations/index.d.ts.map +1 -0
  587. package/dist/migrations/index.js +75 -0
  588. package/dist/migrations/index.js.map +1 -0
  589. package/dist/overlay/deployment-roots.d.ts +37 -0
  590. package/dist/overlay/deployment-roots.d.ts.map +1 -0
  591. package/dist/overlay/deployment-roots.js +90 -0
  592. package/dist/overlay/deployment-roots.js.map +1 -0
  593. package/dist/overlay/index.d.ts +62 -0
  594. package/dist/overlay/index.d.ts.map +1 -0
  595. package/dist/overlay/index.js +62 -0
  596. package/dist/overlay/index.js.map +1 -0
  597. package/dist/overlay/overlay-runtime.d.ts +173 -0
  598. package/dist/overlay/overlay-runtime.d.ts.map +1 -0
  599. package/dist/overlay/overlay-runtime.js +281 -0
  600. package/dist/overlay/overlay-runtime.js.map +1 -0
  601. package/dist/overlay/resolve-overlay.d.ts +41 -0
  602. package/dist/overlay/resolve-overlay.d.ts.map +1 -0
  603. package/dist/overlay/resolve-overlay.js +72 -0
  604. package/dist/overlay/resolve-overlay.js.map +1 -0
  605. package/dist/packages/index.d.ts +57 -0
  606. package/dist/packages/index.d.ts.map +1 -0
  607. package/dist/packages/index.js +57 -0
  608. package/dist/packages/index.js.map +1 -0
  609. package/dist/packages/installed-packages.d.ts +79 -0
  610. package/dist/packages/installed-packages.d.ts.map +1 -0
  611. package/dist/packages/installed-packages.js +312 -0
  612. package/dist/packages/installed-packages.js.map +1 -0
  613. package/dist/packages/package-entity-lookup.d.ts +120 -0
  614. package/dist/packages/package-entity-lookup.d.ts.map +1 -0
  615. package/dist/packages/package-entity-lookup.js +17 -0
  616. package/dist/packages/package-entity-lookup.js.map +1 -0
  617. package/dist/packages/package-runtime.d.ts +177 -0
  618. package/dist/packages/package-runtime.d.ts.map +1 -0
  619. package/dist/packages/package-runtime.js +386 -0
  620. package/dist/packages/package-runtime.js.map +1 -0
  621. package/dist/tenancy/derived-scope.d.ts +43 -0
  622. package/dist/tenancy/derived-scope.d.ts.map +1 -0
  623. package/dist/tenancy/derived-scope.js +76 -0
  624. package/dist/tenancy/derived-scope.js.map +1 -0
  625. package/dist/tenancy/escape-hatch.d.ts +30 -0
  626. package/dist/tenancy/escape-hatch.d.ts.map +1 -0
  627. package/dist/tenancy/escape-hatch.js +50 -0
  628. package/dist/tenancy/escape-hatch.js.map +1 -0
  629. package/dist/tenancy/filters.d.ts +87 -0
  630. package/dist/tenancy/filters.d.ts.map +1 -0
  631. package/dist/tenancy/filters.js +126 -0
  632. package/dist/tenancy/filters.js.map +1 -0
  633. package/dist/tenancy/index.d.ts +63 -0
  634. package/dist/tenancy/index.d.ts.map +1 -0
  635. package/dist/tenancy/index.js +61 -0
  636. package/dist/tenancy/index.js.map +1 -0
  637. package/dist/tenancy/org-scoped.decorator.d.ts +150 -0
  638. package/dist/tenancy/org-scoped.decorator.d.ts.map +1 -0
  639. package/dist/tenancy/org-scoped.decorator.js +339 -0
  640. package/dist/tenancy/org-scoped.decorator.js.map +1 -0
  641. package/dist/tenancy/org-write-guard.d.ts +106 -0
  642. package/dist/tenancy/org-write-guard.d.ts.map +1 -0
  643. package/dist/tenancy/org-write-guard.js +141 -0
  644. package/dist/tenancy/org-write-guard.js.map +1 -0
  645. package/dist/tenancy/resolve-tenant-context.d.ts +91 -0
  646. package/dist/tenancy/resolve-tenant-context.d.ts.map +1 -0
  647. package/dist/tenancy/resolve-tenant-context.js +85 -0
  648. package/dist/tenancy/resolve-tenant-context.js.map +1 -0
  649. package/dist/tenancy/scoped-em.d.ts +10 -0
  650. package/dist/tenancy/scoped-em.d.ts.map +1 -0
  651. package/dist/tenancy/scoped-em.js +11 -0
  652. package/dist/tenancy/scoped-em.js.map +1 -0
  653. package/dist/tenancy/tenant-context.d.ts +154 -0
  654. package/dist/tenancy/tenant-context.d.ts.map +1 -0
  655. package/dist/tenancy/tenant-context.js +109 -0
  656. package/dist/tenancy/tenant-context.js.map +1 -0
  657. package/package.json +123 -0
@@ -0,0 +1,170 @@
1
+ import type { Redis } from 'ioredis';
2
+ import type { SalesChannel } from './sales-channel.entity.js';
3
+ /**
4
+ * SalesChannelsCache — feature 005 / T012.
5
+ *
6
+ * Two-layer read-through cache used by the resolver service so that
7
+ * channel lookup costs <1 ms p95 even on hot paths (research R-11).
8
+ *
9
+ * 1. Per-process LRU (cap {@link LRU_MAX}, entries older than
10
+ * {@link SALES_CHANNELS_LRU_TTL_MS} ignored) — absorbs intra-request
11
+ * bursts and removes the Redis hop entirely on warm processes.
12
+ * 2. Redis (`sales-channels:v2:<code>`, TTL {@link TTL_SECONDS}) —
13
+ * cross-process consistency in multi-instance deployments.
14
+ *
15
+ * Invalidation flows write → drop in Redis → drop in LRU → announce. It is the
16
+ * same two-layer shape as `SettingsCache` and carries the same **three**
17
+ * obligations, for the same reasons (see {@link SharedDropMarks} and the TTL
18
+ * note there; the third is {@link SalesChannelsCacheInvalidation}, which D-93
19
+ * finally gave it):
20
+ *
21
+ * - the shared layer is dropped **first** and the prefix stays marked for
22
+ * the whole operation, so a read that lands mid-invalidation cannot
23
+ * re-pin the pre-drop value from Redis into the LRU, and a failed shared
24
+ * drop leaves reads failing closed to PostgreSQL rather than to a value
25
+ * the invalidation was supposed to remove;
26
+ * - the local layer expires, because a drop is in-process: a second instance
27
+ * that never ran it would otherwise serve the pre-change channel until
28
+ * capacity evicted it;
29
+ * - the drop is part of the **write**, not of the announcement.
30
+ *
31
+ * Cache values are JSON-serialised. The `null` sentinel is reserved
32
+ * for "no such channel"; absence of a key means "cache miss".
33
+ */
34
+ /** Shared with the operator-facing cache-clear surface, so the two cannot drift. */
35
+ export declare const SALES_CHANNELS_CACHE_KEY_PREFIX = "sales-channels:v2:";
36
+ export declare const SALES_CHANNELS_CACHE_NAMESPACE = "sales_channels";
37
+ /** Maximum age of an entry in the per-process layer; see `SETTINGS_LRU_TTL_MS`. */
38
+ export declare const SALES_CHANNELS_LRU_TTL_MS = 30000;
39
+ /** Plain serialisable view of a SalesChannel — what the resolver actually needs. */
40
+ export interface CachedChannel {
41
+ id: string;
42
+ code: string;
43
+ name: Record<string, string>;
44
+ active: boolean;
45
+ /** Price-visibility flag (display concern, distinct from resolution). */
46
+ isPublic: boolean;
47
+ systemDefault: boolean;
48
+ defaultLanguage: string;
49
+ defaultCurrency: string;
50
+ themeCode: string | null;
51
+ logoAssetId: string | null;
52
+ languages: string[];
53
+ currencies: string[];
54
+ version: number;
55
+ }
56
+ export declare function toCachedChannel(channel: SalesChannel): CachedChannel;
57
+ /**
58
+ * The invalidating half of the cache, as the **write seam** sees it (D-93,
59
+ * issue #160). The third obligation this cache's header already claimed from
60
+ * `SettingsCache` and had not been given.
61
+ *
62
+ * `SalesChannelsService` — the one place a channel's identity or lifecycle
63
+ * changes — takes this and awaits it before it emits, and `set-default` does
64
+ * the same after its Command commits. That is what makes the drop a property of
65
+ * the write instead of a property of the dispatch order: a caller that writes
66
+ * and reads back in the same tick, in the same `EventBus.run` scope, or with
67
+ * any number of module subscribers on the bus, cannot observe the pre-write
68
+ * channel.
69
+ *
70
+ * Both hazards were live here. `dictionaries` subscribes to the same two event
71
+ * names and rebuilds its own cache on receipt, so a handler ahead of the drop
72
+ * is the ordinary case rather than a thought experiment; and `set-default` is a
73
+ * Command, so its event rides the `event:` slot and dispatches only when
74
+ * `CommandBus.run`'s scope ends — after every read-back inside it.
75
+ *
76
+ * Narrow on purpose. The reader (`SalesChannelResolverService`) holds the whole
77
+ * {@link SalesChannelsCache}; the writer needs only these two, and a module that
78
+ * can only invalidate cannot accidentally seed the cache from the write path.
79
+ */
80
+ export interface SalesChannelsCacheInvalidation {
81
+ /**
82
+ * Drop one channel's cached entry, on behalf of a write that has **already
83
+ * committed**.
84
+ *
85
+ * Returns the number of shared keys deleted, or `null` when the shared layer
86
+ * could not be reached. The degrade lives here rather than in a `catch` at
87
+ * the call site, and it is in the return type on purpose: the row is written
88
+ * and audited, so a Redis blip must not fail the operator's request or make
89
+ * them retry a write that succeeded. Correctness does not rest on the number
90
+ * — {@link SharedDropMarks} has marked the prefix failed, so this process
91
+ * bypasses both layers for those keys and retries the drop on the next read.
92
+ */
93
+ invalidateAfterWrite(code: string): Promise<number | null>;
94
+ /**
95
+ * The same contract for a change that can move more than one channel's cached
96
+ * state: a delete that rebinds orphans, or the `system_default` flag moving,
97
+ * where the demoted channel's entry is stale too because `systemDefault`
98
+ * lives inside the cached value.
99
+ */
100
+ invalidateAllAfterWrite(): Promise<number | null>;
101
+ }
102
+ export declare class SalesChannelsCache implements SalesChannelsCacheInvalidation {
103
+ private readonly redis;
104
+ /** Injectable so a test can advance the TTL window without a real clock. */
105
+ private readonly now;
106
+ private readonly lru;
107
+ private readonly marks;
108
+ constructor(redis: Redis,
109
+ /** Injectable so a test can advance the TTL window without a real clock. */
110
+ now?: () => number);
111
+ private static composeKey;
112
+ /**
113
+ * Returns:
114
+ * - { hit: true; value: CachedChannel } when the channel is cached
115
+ * - { hit: true; value: null } when the cache positively knows it does not exist
116
+ * - { hit: false } when the caller must fall through to Postgres
117
+ */
118
+ get(code: string): Promise<{
119
+ hit: false;
120
+ } | {
121
+ hit: true;
122
+ value: CachedChannel | null;
123
+ }>;
124
+ set(code: string, channel: CachedChannel): Promise<void>;
125
+ /** Cache the "no such channel" outcome so repeated typos do not hammer Postgres. */
126
+ setNotFound(code: string): Promise<void>;
127
+ /**
128
+ * Drop one channel's cached entry across both layers. Returns how many
129
+ * shared keys were deleted.
130
+ */
131
+ invalidate(code: string): Promise<number>;
132
+ /**
133
+ * Drop every cached channel. Used on broad lifecycle changes and by the
134
+ * operator-facing cache clear. Returns how many shared keys were deleted.
135
+ */
136
+ invalidateAll(): Promise<number>;
137
+ /** {@inheritDoc SalesChannelsCacheInvalidation.invalidateAfterWrite} */
138
+ invalidateAfterWrite(code: string): Promise<number | null>;
139
+ /** {@inheritDoc SalesChannelsCacheInvalidation.invalidateAllAfterWrite} */
140
+ invalidateAllAfterWrite(): Promise<number | null>;
141
+ /**
142
+ * The one place the write seam's tolerance is written down.
143
+ *
144
+ * `drop` has already marked the prefix failed by the time it re-throws, so
145
+ * every read in this process bypasses both layers for those keys and retries
146
+ * the drop until Redis answers — the invariant is intact and the answer is
147
+ * "slower but correct". What is left of the throw is a report, and a report
148
+ * must not undo the write that produced it.
149
+ */
150
+ private afterWrite;
151
+ /**
152
+ * Drop both layers, shared layer first, with the prefix marked for the whole
153
+ * operation. `exact` distinguishes the two shapes: one channel's key is
154
+ * deleted directly (a SCAN on `<key>*` would also take every channel whose
155
+ * code extends it), while the namespace drop scans.
156
+ */
157
+ private drop;
158
+ /** SCAN + DEL, to avoid blocking on KEYS in production-sized databases. */
159
+ private dropShared;
160
+ private dropLocal;
161
+ /**
162
+ * True when neither layer may be trusted for this key: a drop is in flight,
163
+ * or an earlier drop failed and Redis was never cleaned. In the failed case
164
+ * the drop is retried here, so a transient outage costs the affected channels
165
+ * their caching until Redis answers again — not for the process lifetime.
166
+ */
167
+ private isBypassed;
168
+ private touchLru;
169
+ }
170
+ //# sourceMappingURL=sales-channels-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sales-channels-cache.d.ts","sourceRoot":"","sources":["../../../src/kernel/sales-channels/sales-channels-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAKH,oFAAoF;AACpF,eAAO,MAAM,+BAA+B,uBAAuB,CAAC;AACpE,eAAO,MAAM,8BAA8B,mBAAmB,CAAC;AAE/D,mFAAmF;AACnF,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAOhD,oFAAoF;AACpF,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,yEAAyE;IACzE,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,aAAa,CAgBpE;AAQD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,8BAA8B;IAC7C;;;;;;;;;;;OAWG;IACH,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC3D;;;;;OAKG;IACH,uBAAuB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACnD;AAED,qBAAa,kBAAmB,YAAW,8BAA8B;IAKrE,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,4EAA4E;IAC5E,OAAO,CAAC,QAAQ,CAAC,GAAG;IANtB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA+B;IACnD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;gBAG5B,KAAK,EAAE,KAAK;IAC7B,4EAA4E;IAC3D,GAAG,GAAE,MAAM,MAAyB;IAGvD,OAAO,CAAC,MAAM,CAAC,UAAU;IAIzB;;;;;OAKG;IACG,GAAG,CACP,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;QAAE,GAAG,EAAE,KAAK,CAAA;KAAE,GAAG;QAAE,GAAG,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAA;KAAE,CAAC;IA6BjE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAS9D,oFAAoF;IAC9E,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO9C;;;OAGG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI/C;;;OAGG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAItC,wEAAwE;IAClE,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIhE,2EAA2E;IACrE,uBAAuB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIvD;;;;;;;;OAQG;YACW,UAAU;IAQxB;;;;;OAKG;YACW,IAAI;IAmBlB,2EAA2E;YAC7D,UAAU;IAmBxB,OAAO,CAAC,SAAS;IAMjB;;;;;OAKG;YACW,UAAU;IAaxB,OAAO,CAAC,QAAQ;CASjB"}
@@ -0,0 +1,243 @@
1
+ import { SharedDropMarks } from '../cache/shared-drop-marks.js';
2
+ /**
3
+ * SalesChannelsCache — feature 005 / T012.
4
+ *
5
+ * Two-layer read-through cache used by the resolver service so that
6
+ * channel lookup costs <1 ms p95 even on hot paths (research R-11).
7
+ *
8
+ * 1. Per-process LRU (cap {@link LRU_MAX}, entries older than
9
+ * {@link SALES_CHANNELS_LRU_TTL_MS} ignored) — absorbs intra-request
10
+ * bursts and removes the Redis hop entirely on warm processes.
11
+ * 2. Redis (`sales-channels:v2:<code>`, TTL {@link TTL_SECONDS}) —
12
+ * cross-process consistency in multi-instance deployments.
13
+ *
14
+ * Invalidation flows write → drop in Redis → drop in LRU → announce. It is the
15
+ * same two-layer shape as `SettingsCache` and carries the same **three**
16
+ * obligations, for the same reasons (see {@link SharedDropMarks} and the TTL
17
+ * note there; the third is {@link SalesChannelsCacheInvalidation}, which D-93
18
+ * finally gave it):
19
+ *
20
+ * - the shared layer is dropped **first** and the prefix stays marked for
21
+ * the whole operation, so a read that lands mid-invalidation cannot
22
+ * re-pin the pre-drop value from Redis into the LRU, and a failed shared
23
+ * drop leaves reads failing closed to PostgreSQL rather than to a value
24
+ * the invalidation was supposed to remove;
25
+ * - the local layer expires, because a drop is in-process: a second instance
26
+ * that never ran it would otherwise serve the pre-change channel until
27
+ * capacity evicted it;
28
+ * - the drop is part of the **write**, not of the announcement.
29
+ *
30
+ * Cache values are JSON-serialised. The `null` sentinel is reserved
31
+ * for "no such channel"; absence of a key means "cache miss".
32
+ */
33
+ // v2 (feature 053): `isPublic` added to the cached shape so storefront
34
+ // consumers read price-visibility off the resolved channel instead of
35
+ // re-querying. Bumped from v1 so entries cached without the field are ignored.
36
+ /** Shared with the operator-facing cache-clear surface, so the two cannot drift. */
37
+ export const SALES_CHANNELS_CACHE_KEY_PREFIX = 'sales-channels:v2:';
38
+ export const SALES_CHANNELS_CACHE_NAMESPACE = 'sales_channels';
39
+ /** Maximum age of an entry in the per-process layer; see `SETTINGS_LRU_TTL_MS`. */
40
+ export const SALES_CHANNELS_LRU_TTL_MS = 30_000;
41
+ const KEY_PREFIX = SALES_CHANNELS_CACHE_KEY_PREFIX;
42
+ const TTL_SECONDS = 5 * 60;
43
+ const LRU_MAX = 256;
44
+ const NOT_FOUND_SENTINEL = '__sales_channel_not_found__';
45
+ export function toCachedChannel(channel) {
46
+ return {
47
+ id: channel.id,
48
+ code: channel.code,
49
+ name: channel.name,
50
+ active: channel.active,
51
+ isPublic: channel.isPublic,
52
+ systemDefault: channel.systemDefault,
53
+ defaultLanguage: channel.defaultLanguage,
54
+ defaultCurrency: channel.defaultCurrency,
55
+ themeCode: channel.themeCode ?? null,
56
+ logoAssetId: channel.logoAssetId ?? null,
57
+ languages: [...channel.languages],
58
+ currencies: [...channel.currencies],
59
+ version: channel.version,
60
+ };
61
+ }
62
+ export class SalesChannelsCache {
63
+ redis;
64
+ now;
65
+ lru = new Map();
66
+ marks = new SharedDropMarks();
67
+ constructor(redis,
68
+ /** Injectable so a test can advance the TTL window without a real clock. */
69
+ now = () => Date.now()) {
70
+ this.redis = redis;
71
+ this.now = now;
72
+ }
73
+ static composeKey(code) {
74
+ return `${KEY_PREFIX}${code}`;
75
+ }
76
+ /**
77
+ * Returns:
78
+ * - { hit: true; value: CachedChannel } when the channel is cached
79
+ * - { hit: true; value: null } when the cache positively knows it does not exist
80
+ * - { hit: false } when the caller must fall through to Postgres
81
+ */
82
+ async get(code) {
83
+ const key = SalesChannelsCache.composeKey(code);
84
+ if (await this.isBypassed(key))
85
+ return { hit: false };
86
+ const entry = this.lru.get(key);
87
+ if (entry !== undefined) {
88
+ if (this.now() - entry.storedAt < SALES_CHANNELS_LRU_TTL_MS) {
89
+ // Touch for eviction order only — the window is on the value's age, so
90
+ // a channel resolved on every request still ages out.
91
+ this.lru.delete(key);
92
+ this.lru.set(key, entry);
93
+ return { hit: true, value: entry.value };
94
+ }
95
+ this.lru.delete(key);
96
+ }
97
+ const raw = await this.redis.get(key);
98
+ if (raw === null)
99
+ return { hit: false };
100
+ if (raw === NOT_FOUND_SENTINEL) {
101
+ this.touchLru(key, null);
102
+ return { hit: true, value: null };
103
+ }
104
+ const decoded = JSON.parse(raw);
105
+ this.touchLru(key, decoded);
106
+ return { hit: true, value: decoded };
107
+ }
108
+ async set(code, channel) {
109
+ const key = SalesChannelsCache.composeKey(code);
110
+ // A read that started before the change resolved the pre-change row from
111
+ // Postgres. Caching it now would undo the invalidation in flight.
112
+ if (await this.isBypassed(key))
113
+ return;
114
+ this.touchLru(key, channel);
115
+ await this.redis.set(key, JSON.stringify(channel), 'EX', TTL_SECONDS);
116
+ }
117
+ /** Cache the "no such channel" outcome so repeated typos do not hammer Postgres. */
118
+ async setNotFound(code) {
119
+ const key = SalesChannelsCache.composeKey(code);
120
+ if (await this.isBypassed(key))
121
+ return;
122
+ this.touchLru(key, null);
123
+ await this.redis.set(key, NOT_FOUND_SENTINEL, 'EX', TTL_SECONDS);
124
+ }
125
+ /**
126
+ * Drop one channel's cached entry across both layers. Returns how many
127
+ * shared keys were deleted.
128
+ */
129
+ async invalidate(code) {
130
+ return this.drop(SalesChannelsCache.composeKey(code), true);
131
+ }
132
+ /**
133
+ * Drop every cached channel. Used on broad lifecycle changes and by the
134
+ * operator-facing cache clear. Returns how many shared keys were deleted.
135
+ */
136
+ async invalidateAll() {
137
+ return this.drop(KEY_PREFIX, false);
138
+ }
139
+ /** {@inheritDoc SalesChannelsCacheInvalidation.invalidateAfterWrite} */
140
+ async invalidateAfterWrite(code) {
141
+ return this.afterWrite(() => this.invalidate(code));
142
+ }
143
+ /** {@inheritDoc SalesChannelsCacheInvalidation.invalidateAllAfterWrite} */
144
+ async invalidateAllAfterWrite() {
145
+ return this.afterWrite(() => this.invalidateAll());
146
+ }
147
+ /**
148
+ * The one place the write seam's tolerance is written down.
149
+ *
150
+ * `drop` has already marked the prefix failed by the time it re-throws, so
151
+ * every read in this process bypasses both layers for those keys and retries
152
+ * the drop until Redis answers — the invariant is intact and the answer is
153
+ * "slower but correct". What is left of the throw is a report, and a report
154
+ * must not undo the write that produced it.
155
+ */
156
+ async afterWrite(drop) {
157
+ try {
158
+ return await drop();
159
+ }
160
+ catch {
161
+ return null;
162
+ }
163
+ }
164
+ /**
165
+ * Drop both layers, shared layer first, with the prefix marked for the whole
166
+ * operation. `exact` distinguishes the two shapes: one channel's key is
167
+ * deleted directly (a SCAN on `<key>*` would also take every channel whose
168
+ * code extends it), while the namespace drop scans.
169
+ */
170
+ async drop(prefix, exact) {
171
+ this.marks.begin(prefix);
172
+ try {
173
+ const deleted = exact
174
+ ? await this.redis.del(prefix)
175
+ : await this.dropShared(prefix);
176
+ this.marks.retireFailedUnder(prefix);
177
+ return deleted;
178
+ }
179
+ catch (err) {
180
+ // Fail closed: Redis may still serve the pre-invalidation value to this
181
+ // process, so keep reads off the cache until a later drop succeeds.
182
+ this.marks.markFailed(prefix);
183
+ throw err;
184
+ }
185
+ finally {
186
+ this.dropLocal(prefix);
187
+ this.marks.finish(prefix);
188
+ }
189
+ }
190
+ /** SCAN + DEL, to avoid blocking on KEYS in production-sized databases. */
191
+ async dropShared(prefix) {
192
+ let cursor = '0';
193
+ let deleted = 0;
194
+ do {
195
+ const [next, keys] = await this.redis.scan(cursor, 'MATCH', `${prefix}*`, 'COUNT', 500);
196
+ cursor = next;
197
+ if (keys.length > 0) {
198
+ deleted += await this.redis.del(...keys);
199
+ }
200
+ } while (cursor !== '0');
201
+ return deleted;
202
+ }
203
+ dropLocal(prefix) {
204
+ for (const k of this.lru.keys()) {
205
+ if (k.startsWith(prefix))
206
+ this.lru.delete(k);
207
+ }
208
+ }
209
+ /**
210
+ * True when neither layer may be trusted for this key: a drop is in flight,
211
+ * or an earlier drop failed and Redis was never cleaned. In the failed case
212
+ * the drop is retried here, so a transient outage costs the affected channels
213
+ * their caching until Redis answers again — not for the process lifetime.
214
+ */
215
+ async isBypassed(key) {
216
+ if (this.marks.isClean)
217
+ return false;
218
+ if (this.marks.isDraining(key))
219
+ return true;
220
+ const failed = this.marks.failedPrefixFor(key);
221
+ if (failed === undefined)
222
+ return false;
223
+ try {
224
+ await this.drop(failed, failed !== KEY_PREFIX);
225
+ }
226
+ catch {
227
+ // Still unreachable — stay off the cache and read through to Postgres.
228
+ }
229
+ return true;
230
+ }
231
+ touchLru(key, value) {
232
+ if (this.lru.has(key))
233
+ this.lru.delete(key);
234
+ this.lru.set(key, { value, storedAt: this.now() });
235
+ while (this.lru.size > LRU_MAX) {
236
+ const oldest = this.lru.keys().next().value;
237
+ if (oldest === undefined)
238
+ break;
239
+ this.lru.delete(oldest);
240
+ }
241
+ }
242
+ }
243
+ //# sourceMappingURL=sales-channels-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sales-channels-cache.js","sourceRoot":"","sources":["../../../src/kernel/sales-channels/sales-channels-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,153 @@
1
+ import type { RequestMeta, ScopeEntryPointKind } from '@endora-commerce/contracts';
2
+ import { type TenantContext } from '../tenancy/tenant-context.js';
3
+ import type { ResolvedChannel } from './ports/sales-channel.js';
4
+ import { type KernelContainer, type KernelCradle } from './container.js';
5
+ /**
6
+ * `enterPlatformScope` — the one entry into a scoped execution (feature 072,
7
+ * FR-015…FR-021). Six callers: the HTTP `onRequest` hook, BullMQ processors,
8
+ * the 15 CLI scripts, the four boot reconcilers, the four `setInterval` sweeps
9
+ * and — since issue #235 — the registry cache's Redis pub/sub handler.
10
+ *
11
+ * ## Three rules, none of them negotiable
12
+ *
13
+ * **1. AsyncLocalStorage stays the tenancy carrier.** `@OrgScoped` attaches a
14
+ * MikroORM filter with `args: false` whose `cond` is a zero-argument thunk that
15
+ * reads `getTenantContext()` **when the query is built**
16
+ * (`tenancy/org-scoped.decorator.ts` → `tenancy/filters.ts`). The EntityManager
17
+ * is therefore stateless with respect to tenancy, and that is exactly what makes
18
+ * `forkScopedEm(orm) = orm.em.fork()` correct. Registering tenancy in the
19
+ * container instead would require `setFilterParams` on a scoped EM and would
20
+ * break every `em.transactional` sub-fork and every service that forks its own
21
+ * manager. `test/integration/tenancy/fault-injection.test.ts` is this design's
22
+ * unit test: it calls one EM factory inside five different ambient stores and
23
+ * asserts five different result sets. Any design in which a scoped EM captures
24
+ * tenancy at construction inverts every assertion in that file.
25
+ *
26
+ * **2. The ALS `run()` is the outermost wrapper of the work.** It is the
27
+ * callback form (`storage.run`), never `storage.enterWith`: `enterWith` called
28
+ * inside an *async* Fastify hook does not propagate into the handler, and it
29
+ * fails **silently** (`tenancy/tenant-context.ts`). The consequence is
30
+ * structural — the awilix scope cannot be created in a separate, earlier hook,
31
+ * because its disposal and the store's lifetime would then not coincide.
32
+ *
33
+ * **3. The channel goes into the scope; tenancy does not.** The channel is
34
+ * already per-request and has no non-HTTP counterpart. Tenancy must stay
35
+ * establishable by CLI scripts, workers, boot reconcilers and interval timers
36
+ * that will never have a request scope.
37
+ *
38
+ * ## `onRequest` hook ordering is load-bearing
39
+ *
40
+ * The three global `onRequest` hooks run in array order (`http/server.ts`):
41
+ *
42
+ * auth → tenant → sales channel
43
+ *
44
+ * **This ordering is a constraint, not an accident of registration.** The
45
+ * channel resolver performs database reads through `emFactory`, and would throw
46
+ * `MissingTenantContextError` if it ran before the tenant hook and `SalesChannel`
47
+ * were tenant-scoped. `SalesChannel` is `@GlobalEntity` today, so either order
48
+ * survives — which is precisely why the kernel must not reorder them on the
49
+ * assumption that it is free. Classify `SalesChannel` any other way and the
50
+ * reversed order breaks every request.
51
+ *
52
+ * Three call sites already run inside a request but *before* tenancy exists and
53
+ * use `withSystemScope` for it: auth resolving the customer organisation, mfa,
54
+ * and `customer-rollup-scope.ts` called from inside the context builder itself.
55
+ * They are the precedent this ordering has to preserve.
56
+ *
57
+ * ## Using it from the HTTP hook
58
+ *
59
+ * The hook must call the next stage **synchronously inside** the store and keep
60
+ * the scope alive for the whole request, so the shape is a promise that settles
61
+ * when the response does:
62
+ *
63
+ * ```ts
64
+ * app.addHook('onRequest', (request, reply, done) => {
65
+ * buildTenantContext(request).then(
66
+ * (tenant) => {
67
+ * void enterPlatformScope(
68
+ * tenant,
69
+ * () =>
70
+ * new Promise<void>((resolve) => {
71
+ * reply.raw.once('close', resolve);
72
+ * done();
73
+ * }),
74
+ * { requestMeta: requestMetaOf(request) },
75
+ * );
76
+ * },
77
+ * (err: unknown) => done(err as Error),
78
+ * );
79
+ * });
80
+ * ```
81
+ *
82
+ * `done()` runs inside `storage.run`, so the store propagates across the
83
+ * handler's awaited continuations; `close` fires on success, on error and on
84
+ * client abort, so the scope is disposed in all three cases.
85
+ */
86
+ /** A scoped execution: an awilix child container plus the ambient tenant store. */
87
+ export interface PlatformScope {
88
+ /** Resolution surface for this execution. */
89
+ readonly cradle: KernelCradle;
90
+ /**
91
+ * The ambient tenant context. Present here for inspection only — it is **not**
92
+ * a container registration, and reading it back from a scope is never a
93
+ * substitute for `getTenantContext()`, which is what the ORM filter uses.
94
+ */
95
+ readonly tenant: TenantContext;
96
+ /** Which class of entry point opened this scope. */
97
+ readonly entryPoint: ScopeEntryPointKind;
98
+ /** The resolved sales channel; `null` until resolved, and outside HTTP forever. */
99
+ readonly channel: ResolvedChannel | null;
100
+ /** Correlation id and client info; absent outside HTTP. */
101
+ readonly requestMeta: RequestMeta | null;
102
+ /**
103
+ * Fill the channel slot. HTTP only, and called exactly once, by the
104
+ * sales-channel resolver hook.
105
+ *
106
+ * **Why the slot is mutable at all** — a correction to `contracts/request-scope.md`,
107
+ * which reads as though the channel is known when the scope opens. It is not:
108
+ * the hook order is auth → tenant → channel (see above), so the scope is
109
+ * already open when the resolver runs, and the resolver *must* run after
110
+ * tenancy because its refusal path writes an audit row. The alternatives are
111
+ * reordering the hooks (forbidden — the ordering is load-bearing) or opening a
112
+ * second scope for the channel (its disposal would no longer coincide with the
113
+ * store's lifetime, which rule 2 forbids).
114
+ */
115
+ setChannel(channel: ResolvedChannel): void;
116
+ dispose(): Promise<void>;
117
+ }
118
+ export interface EnterPlatformScopeOptions {
119
+ readonly channel?: ResolvedChannel | undefined;
120
+ readonly requestMeta?: RequestMeta | undefined;
121
+ /** Which class of entry point this is. Defaults to `'http'`. */
122
+ readonly entryPoint?: ScopeEntryPointKind | undefined;
123
+ /** Root to branch from. Defaults to the process-wide root container. */
124
+ readonly container?: KernelContainer | undefined;
125
+ }
126
+ /** The scope of the current execution, or `undefined` outside one. */
127
+ export declare function getCurrentPlatformScope(): PlatformScope | undefined;
128
+ /**
129
+ * How many scopes are currently open. Diagnostics only — the leak test asserts
130
+ * it returns to its pre-request value after success, error and client abort
131
+ * (FR-015).
132
+ */
133
+ export declare function openPlatformScopeCount(): number;
134
+ /**
135
+ * Run `run` inside a fresh resolution scope with `tenant` as the ambient tenant
136
+ * context. The scope is disposed when `run` settles — on success, on error and
137
+ * on abort.
138
+ */
139
+ export declare function enterPlatformScope<T>(tenant: TenantContext, run: (scope: PlatformScope) => T | Promise<T>, opts?: EnterPlatformScopeOptions): Promise<T>;
140
+ /**
141
+ * Open a scope that crosses every organisation, for an execution that has no
142
+ * caller to derive tenancy from: a worker job, a CLI script, a boot reconciler
143
+ * or an interval sweep.
144
+ *
145
+ * The difference from `withSystemScope` is which question it answers.
146
+ * `withSystemScope` **widens an execution that already has a context** (a
147
+ * request handler that must read across organisations); this **starts** one, and
148
+ * is therefore also where the resolution scope is created. Both emit the same
149
+ * escape-hatch audit record, so `reason` stays mandatory and the cross-org
150
+ * access stays observable.
151
+ */
152
+ export declare function enterSystemScope<T>(reason: string, run: (scope: PlatformScope) => T | Promise<T>, opts?: Omit<EnterPlatformScopeOptions, 'channel'>): Promise<T>;
153
+ //# sourceMappingURL=scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/kernel/scope.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACnF,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAGxF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAoB,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE3F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgFG;AAEH,mFAAmF;AACnF,MAAM,WAAW,aAAa;IAC5B,6CAA6C;IAC7C,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,oDAAoD;IACpD,QAAQ,CAAC,UAAU,EAAE,mBAAmB,CAAC;IACzC,mFAAmF;IACnF,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;IACzC,2DAA2D;IAC3D,QAAQ,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IACzC;;;;;;;;;;;;OAYG;IACH,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;IAC3C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAC/C,gEAAgE;IAChE,QAAQ,CAAC,UAAU,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;IACtD,wEAAwE;IACxE,QAAQ,CAAC,SAAS,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;CAClD;AAcD,sEAAsE;AACtE,wBAAgB,uBAAuB,IAAI,aAAa,GAAG,SAAS,CAEnE;AAID;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AA8GD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EACxC,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAC7C,IAAI,GAAE,yBAA8B,GACnC,OAAO,CAAC,CAAC,CAAC,CAeZ;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAC7C,IAAI,GAAE,IAAI,CAAC,yBAAyB,EAAE,SAAS,CAAM,GACpD,OAAO,CAAC,CAAC,CAAC,CAMZ"}