pipework 0.4.0 → 0.5.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 (365) hide show
  1. package/README.md +33 -60
  2. package/dist/audit/namespace.d.ts +2 -0
  3. package/dist/audit/namespace.d.ts.map +1 -1
  4. package/dist/audit/namespace.js +2 -0
  5. package/dist/audit/namespace.js.map +1 -1
  6. package/dist/auth/chain.d.ts +5 -0
  7. package/dist/auth/chain.d.ts.map +1 -1
  8. package/dist/auth/chain.js +1 -0
  9. package/dist/auth/chain.js.map +1 -1
  10. package/dist/auth/cookie.d.ts +6 -0
  11. package/dist/auth/cookie.d.ts.map +1 -1
  12. package/dist/auth/cookie.js +4 -0
  13. package/dist/auth/cookie.js.map +1 -1
  14. package/dist/auth/multi-org.d.ts +9 -0
  15. package/dist/auth/multi-org.d.ts.map +1 -1
  16. package/dist/auth/multi-org.js +1 -0
  17. package/dist/auth/multi-org.js.map +1 -1
  18. package/dist/auth/namespace.d.ts +8 -0
  19. package/dist/auth/namespace.d.ts.map +1 -1
  20. package/dist/auth/namespace.js +8 -0
  21. package/dist/auth/namespace.js.map +1 -1
  22. package/dist/auth/sessions.d.ts +6 -0
  23. package/dist/auth/sessions.d.ts.map +1 -1
  24. package/dist/auth/sessions.js +1 -0
  25. package/dist/auth/sessions.js.map +1 -1
  26. package/dist/auth/types.d.ts +4 -0
  27. package/dist/auth/types.d.ts.map +1 -1
  28. package/dist/behavior/namespace.d.ts +5 -0
  29. package/dist/behavior/namespace.d.ts.map +1 -1
  30. package/dist/behavior/namespace.js +5 -0
  31. package/dist/behavior/namespace.js.map +1 -1
  32. package/dist/cache/namespace.d.ts +3 -0
  33. package/dist/cache/namespace.d.ts.map +1 -1
  34. package/dist/cache/namespace.js +3 -0
  35. package/dist/cache/namespace.js.map +1 -1
  36. package/dist/cli/commands/add.d.ts +2 -0
  37. package/dist/cli/commands/add.d.ts.map +1 -0
  38. package/dist/cli/commands/add.js +98 -0
  39. package/dist/cli/commands/add.js.map +1 -0
  40. package/dist/cli/commands/check.d.ts.map +1 -1
  41. package/dist/cli/commands/check.js +40 -1
  42. package/dist/cli/commands/check.js.map +1 -1
  43. package/dist/cli/commands/dev.d.ts.map +1 -1
  44. package/dist/cli/commands/dev.js +37 -1
  45. package/dist/cli/commands/dev.js.map +1 -1
  46. package/dist/cli/commands/install.d.ts +2 -0
  47. package/dist/cli/commands/install.d.ts.map +1 -0
  48. package/dist/cli/commands/install.js +31 -0
  49. package/dist/cli/commands/install.js.map +1 -0
  50. package/dist/cli/commands/remove.d.ts +2 -0
  51. package/dist/cli/commands/remove.d.ts.map +1 -0
  52. package/dist/cli/commands/remove.js +60 -0
  53. package/dist/cli/commands/remove.js.map +1 -0
  54. package/dist/cli/commands/shared/find-config.d.ts +2 -0
  55. package/dist/cli/commands/shared/find-config.d.ts.map +1 -0
  56. package/dist/cli/commands/shared/find-config.js +19 -0
  57. package/dist/cli/commands/shared/find-config.js.map +1 -0
  58. package/dist/cli/commands/shared/load-config.d.ts +11 -0
  59. package/dist/cli/commands/shared/load-config.d.ts.map +1 -0
  60. package/dist/cli/commands/shared/load-config.js +25 -0
  61. package/dist/cli/commands/shared/load-config.js.map +1 -0
  62. package/dist/cli/commands/sync.d.ts +2 -0
  63. package/dist/cli/commands/sync.d.ts.map +1 -0
  64. package/dist/cli/commands/sync.js +28 -0
  65. package/dist/cli/commands/sync.js.map +1 -0
  66. package/dist/cli/dev-bootstrap.d.ts +2 -0
  67. package/dist/cli/dev-bootstrap.d.ts.map +1 -0
  68. package/dist/cli/dev-bootstrap.js +11 -0
  69. package/dist/cli/dev-bootstrap.js.map +1 -0
  70. package/dist/cli/index.d.ts.map +1 -1
  71. package/dist/cli/index.js +31 -1
  72. package/dist/cli/index.js.map +1 -1
  73. package/dist/config/env.d.ts.map +1 -1
  74. package/dist/config/env.js +20 -4
  75. package/dist/config/env.js.map +1 -1
  76. package/dist/config/namespace.d.ts +7 -0
  77. package/dist/config/namespace.d.ts.map +1 -1
  78. package/dist/config/namespace.js +5 -0
  79. package/dist/config/namespace.js.map +1 -1
  80. package/dist/config/schema.d.ts +2 -0
  81. package/dist/config/schema.d.ts.map +1 -1
  82. package/dist/config/schema.js +6 -0
  83. package/dist/config/schema.js.map +1 -1
  84. package/dist/context/types.d.ts +3 -0
  85. package/dist/context/types.d.ts.map +1 -1
  86. package/dist/db/namespace.d.ts +25 -0
  87. package/dist/db/namespace.d.ts.map +1 -1
  88. package/dist/db/namespace.js +17 -6
  89. package/dist/db/namespace.js.map +1 -1
  90. package/dist/db/types.d.ts +4 -0
  91. package/dist/db/types.d.ts.map +1 -1
  92. package/dist/di/builder.d.ts +7 -2
  93. package/dist/di/builder.d.ts.map +1 -1
  94. package/dist/di/builder.js +20 -1
  95. package/dist/di/builder.js.map +1 -1
  96. package/dist/di/types.d.ts +19 -0
  97. package/dist/di/types.d.ts.map +1 -1
  98. package/dist/di/types.js +1 -0
  99. package/dist/di/types.js.map +1 -1
  100. package/dist/domain/brand.d.ts +19 -0
  101. package/dist/domain/brand.d.ts.map +1 -0
  102. package/dist/domain/brand.js +2 -0
  103. package/dist/domain/brand.js.map +1 -0
  104. package/dist/domain/define.d.ts +5 -0
  105. package/dist/domain/define.d.ts.map +1 -0
  106. package/dist/domain/define.js +62 -0
  107. package/dist/domain/define.js.map +1 -0
  108. package/dist/domain/field.d.ts +34 -0
  109. package/dist/domain/field.d.ts.map +1 -0
  110. package/dist/domain/field.js +111 -0
  111. package/dist/domain/field.js.map +1 -0
  112. package/dist/domain/index.d.ts +7 -0
  113. package/dist/domain/index.d.ts.map +1 -0
  114. package/dist/domain/index.js +5 -0
  115. package/dist/domain/index.js.map +1 -0
  116. package/dist/domain/naming.d.ts +2 -0
  117. package/dist/domain/naming.d.ts.map +1 -0
  118. package/dist/domain/naming.js +7 -0
  119. package/dist/domain/naming.js.map +1 -0
  120. package/dist/domain/project-factory.d.ts +4 -0
  121. package/dist/domain/project-factory.d.ts.map +1 -0
  122. package/dist/domain/project-factory.js +136 -0
  123. package/dist/domain/project-factory.js.map +1 -0
  124. package/dist/domain/project-schema.d.ts +6 -0
  125. package/dist/domain/project-schema.d.ts.map +1 -0
  126. package/dist/domain/project-schema.js +118 -0
  127. package/dist/domain/project-schema.js.map +1 -0
  128. package/dist/domain/project-table.d.ts +30 -0
  129. package/dist/domain/project-table.d.ts.map +1 -0
  130. package/dist/domain/project-table.js +117 -0
  131. package/dist/domain/project-table.js.map +1 -0
  132. package/dist/domain/types.d.ts +68 -0
  133. package/dist/domain/types.d.ts.map +1 -0
  134. package/dist/{resource → domain}/types.js.map +1 -1
  135. package/dist/errors/namespace.d.ts +7 -0
  136. package/dist/errors/namespace.d.ts.map +1 -1
  137. package/dist/errors/namespace.js +7 -0
  138. package/dist/errors/namespace.js.map +1 -1
  139. package/dist/fitting/namespace.d.ts +2 -0
  140. package/dist/fitting/namespace.d.ts.map +1 -1
  141. package/dist/fitting/namespace.js +2 -0
  142. package/dist/fitting/namespace.js.map +1 -1
  143. package/dist/fixture/namespace.d.ts +8 -0
  144. package/dist/fixture/namespace.d.ts.map +1 -1
  145. package/dist/fixture/namespace.js +8 -0
  146. package/dist/fixture/namespace.js.map +1 -1
  147. package/dist/flow/namespace.d.ts +9 -0
  148. package/dist/flow/namespace.d.ts.map +1 -1
  149. package/dist/flow/namespace.js +9 -0
  150. package/dist/flow/namespace.js.map +1 -1
  151. package/dist/http/namespace.d.ts +2 -0
  152. package/dist/http/namespace.d.ts.map +1 -1
  153. package/dist/http/namespace.js +2 -0
  154. package/dist/http/namespace.js.map +1 -1
  155. package/dist/http/server.d.ts +2 -0
  156. package/dist/http/server.d.ts.map +1 -1
  157. package/dist/http/server.js +4 -1
  158. package/dist/http/server.js.map +1 -1
  159. package/dist/http/types.d.ts +13 -0
  160. package/dist/http/types.d.ts.map +1 -1
  161. package/dist/index.d.ts +3 -1
  162. package/dist/index.d.ts.map +1 -1
  163. package/dist/index.js +1 -0
  164. package/dist/index.js.map +1 -1
  165. package/dist/jobs/cron.d.ts +1 -0
  166. package/dist/jobs/cron.d.ts.map +1 -1
  167. package/dist/jobs/cron.js.map +1 -1
  168. package/dist/jobs/namespace.d.ts +5 -0
  169. package/dist/jobs/namespace.d.ts.map +1 -1
  170. package/dist/jobs/namespace.js +5 -0
  171. package/dist/jobs/namespace.js.map +1 -1
  172. package/dist/jobs/queue.d.ts +5 -0
  173. package/dist/jobs/queue.d.ts.map +1 -1
  174. package/dist/jobs/queue.js +2 -1
  175. package/dist/jobs/queue.js.map +1 -1
  176. package/dist/lifecycle/namespace.d.ts +2 -0
  177. package/dist/lifecycle/namespace.d.ts.map +1 -1
  178. package/dist/lifecycle/namespace.js +2 -0
  179. package/dist/lifecycle/namespace.js.map +1 -1
  180. package/dist/log/namespace.d.ts +6 -0
  181. package/dist/log/namespace.d.ts.map +1 -1
  182. package/dist/log/namespace.js +6 -0
  183. package/dist/log/namespace.js.map +1 -1
  184. package/dist/openapi/namespace.d.ts +2 -0
  185. package/dist/openapi/namespace.d.ts.map +1 -1
  186. package/dist/openapi/namespace.js +2 -0
  187. package/dist/openapi/namespace.js.map +1 -1
  188. package/dist/pipeline/namespace.d.ts +4 -0
  189. package/dist/pipeline/namespace.d.ts.map +1 -1
  190. package/dist/pipeline/namespace.js +4 -0
  191. package/dist/pipeline/namespace.js.map +1 -1
  192. package/dist/pipework.d.ts +38 -0
  193. package/dist/pipework.d.ts.map +1 -1
  194. package/dist/pipework.js +100 -2
  195. package/dist/pipework.js.map +1 -1
  196. package/dist/rbac/index.d.ts +1 -0
  197. package/dist/rbac/index.d.ts.map +1 -1
  198. package/dist/rbac/index.js +1 -0
  199. package/dist/rbac/index.js.map +1 -1
  200. package/dist/rbac/namespace.d.ts +6 -0
  201. package/dist/rbac/namespace.d.ts.map +1 -1
  202. package/dist/rbac/namespace.js +6 -0
  203. package/dist/rbac/namespace.js.map +1 -1
  204. package/dist/schema/namespace.d.ts +10 -0
  205. package/dist/schema/namespace.d.ts.map +1 -1
  206. package/dist/schema/namespace.js +12 -4
  207. package/dist/schema/namespace.js.map +1 -1
  208. package/dist/schema/types.d.ts +2 -0
  209. package/dist/schema/types.d.ts.map +1 -1
  210. package/dist/state-machine/namespace.d.ts +4 -0
  211. package/dist/state-machine/namespace.d.ts.map +1 -1
  212. package/dist/state-machine/namespace.js +4 -0
  213. package/dist/state-machine/namespace.js.map +1 -1
  214. package/dist/surface/http.d.ts +3 -0
  215. package/dist/surface/http.d.ts.map +1 -0
  216. package/dist/surface/http.js +84 -0
  217. package/dist/surface/http.js.map +1 -0
  218. package/dist/surface/index.d.ts +7 -0
  219. package/dist/surface/index.d.ts.map +1 -0
  220. package/dist/surface/index.js +6 -0
  221. package/dist/surface/index.js.map +1 -0
  222. package/dist/surface/namespace.d.ts +13 -0
  223. package/dist/surface/namespace.d.ts.map +1 -0
  224. package/dist/surface/namespace.js +13 -0
  225. package/dist/surface/namespace.js.map +1 -0
  226. package/dist/surface/script.d.ts +3 -0
  227. package/dist/surface/script.d.ts.map +1 -0
  228. package/dist/surface/script.js +24 -0
  229. package/dist/surface/script.js.map +1 -0
  230. package/dist/surface/start.d.ts +8 -0
  231. package/dist/surface/start.d.ts.map +1 -0
  232. package/dist/surface/start.js +64 -0
  233. package/dist/surface/start.js.map +1 -0
  234. package/dist/surface/types.d.ts +111 -0
  235. package/dist/surface/types.d.ts.map +1 -0
  236. package/dist/surface/types.js +2 -0
  237. package/dist/surface/types.js.map +1 -0
  238. package/dist/surface/validate.d.ts +5 -0
  239. package/dist/surface/validate.d.ts.map +1 -0
  240. package/dist/surface/validate.js +67 -0
  241. package/dist/surface/validate.js.map +1 -0
  242. package/dist/surface/worker.d.ts +3 -0
  243. package/dist/surface/worker.d.ts.map +1 -0
  244. package/dist/surface/worker.js +151 -0
  245. package/dist/surface/worker.js.map +1 -0
  246. package/dist/temporal/namespace.d.ts +8 -0
  247. package/dist/temporal/namespace.d.ts.map +1 -1
  248. package/dist/temporal/namespace.js +8 -0
  249. package/dist/temporal/namespace.js.map +1 -1
  250. package/dist/tenant/namespace.d.ts +9 -0
  251. package/dist/tenant/namespace.d.ts.map +1 -1
  252. package/dist/tenant/namespace.js +9 -0
  253. package/dist/tenant/namespace.js.map +1 -1
  254. package/dist/tenant/types.d.ts +2 -0
  255. package/dist/tenant/types.d.ts.map +1 -1
  256. package/dist/test/auto-setup.js +2 -1
  257. package/dist/test/auto-setup.js.map +1 -1
  258. package/dist/test/index.d.ts +2 -1
  259. package/dist/test/index.d.ts.map +1 -1
  260. package/dist/test/index.js +2 -1
  261. package/dist/test/index.js.map +1 -1
  262. package/dist/test/plugin.d.ts +5 -0
  263. package/dist/test/plugin.d.ts.map +1 -1
  264. package/dist/test/plugin.js +5 -0
  265. package/dist/test/plugin.js.map +1 -1
  266. package/dist/test/vitest-config.d.ts +2 -0
  267. package/dist/test/vitest-config.d.ts.map +1 -1
  268. package/dist/test/vitest-config.js +5 -2
  269. package/dist/test/vitest-config.js.map +1 -1
  270. package/dist/test/vitest-plugin.d.ts +3 -1
  271. package/dist/test/vitest-plugin.d.ts.map +1 -1
  272. package/dist/test/vitest-plugin.js +3 -2
  273. package/dist/test/vitest-plugin.js.map +1 -1
  274. package/dist/test/vitest.d.ts +2 -0
  275. package/dist/test/vitest.d.ts.map +1 -1
  276. package/dist/test/vitest.js +48 -4
  277. package/dist/test/vitest.js.map +1 -1
  278. package/dist/validation/connectivity.d.ts +4 -0
  279. package/dist/validation/connectivity.d.ts.map +1 -0
  280. package/dist/validation/connectivity.js +32 -0
  281. package/dist/validation/connectivity.js.map +1 -0
  282. package/dist/validation/domain.d.ts +4 -0
  283. package/dist/validation/domain.d.ts.map +1 -0
  284. package/dist/validation/domain.js +72 -0
  285. package/dist/validation/domain.js.map +1 -0
  286. package/dist/validation/index.d.ts +6 -0
  287. package/dist/validation/index.d.ts.map +1 -0
  288. package/dist/validation/index.js +6 -0
  289. package/dist/validation/index.js.map +1 -0
  290. package/dist/validation/startup.d.ts +12 -0
  291. package/dist/validation/startup.d.ts.map +1 -0
  292. package/dist/validation/startup.js +19 -0
  293. package/dist/validation/startup.js.map +1 -0
  294. package/dist/validation/surface.d.ts +4 -0
  295. package/dist/validation/surface.d.ts.map +1 -0
  296. package/dist/validation/surface.js +55 -0
  297. package/dist/validation/surface.js.map +1 -0
  298. package/dist/validation/types.d.ts +13 -0
  299. package/dist/validation/types.d.ts.map +1 -0
  300. package/dist/validation/types.js +13 -0
  301. package/dist/validation/types.js.map +1 -0
  302. package/dist/vector/namespace.d.ts +11 -0
  303. package/dist/vector/namespace.d.ts.map +1 -1
  304. package/dist/vector/namespace.js +11 -0
  305. package/dist/vector/namespace.js.map +1 -1
  306. package/dist/webhook/namespace.d.ts +7 -0
  307. package/dist/webhook/namespace.d.ts.map +1 -1
  308. package/dist/webhook/namespace.js +7 -0
  309. package/dist/webhook/namespace.js.map +1 -1
  310. package/dist/workspace/checksum.d.ts +4 -0
  311. package/dist/workspace/checksum.d.ts.map +1 -0
  312. package/dist/workspace/checksum.js +20 -0
  313. package/dist/workspace/checksum.js.map +1 -0
  314. package/dist/workspace/discover.d.ts +6 -0
  315. package/dist/workspace/discover.d.ts.map +1 -0
  316. package/dist/workspace/discover.js +43 -0
  317. package/dist/workspace/discover.js.map +1 -0
  318. package/dist/workspace/generate.d.ts +17 -0
  319. package/dist/workspace/generate.d.ts.map +1 -0
  320. package/dist/workspace/generate.js +153 -0
  321. package/dist/workspace/generate.js.map +1 -0
  322. package/dist/workspace/index.d.ts +5 -0
  323. package/dist/workspace/index.d.ts.map +1 -0
  324. package/dist/workspace/index.js +5 -0
  325. package/dist/workspace/index.js.map +1 -0
  326. package/dist/workspace/sync.d.ts +18 -0
  327. package/dist/workspace/sync.d.ts.map +1 -0
  328. package/dist/workspace/sync.js +58 -0
  329. package/dist/workspace/sync.js.map +1 -0
  330. package/package.json +7 -1
  331. package/dist/drizzle/index.d.ts +0 -3
  332. package/dist/drizzle/index.d.ts.map +0 -1
  333. package/dist/drizzle/index.js +0 -3
  334. package/dist/drizzle/index.js.map +0 -1
  335. package/dist/resource/batch.d.ts +0 -17
  336. package/dist/resource/batch.d.ts.map +0 -1
  337. package/dist/resource/batch.js +0 -47
  338. package/dist/resource/batch.js.map +0 -1
  339. package/dist/resource/builder.d.ts +0 -11
  340. package/dist/resource/builder.d.ts.map +0 -1
  341. package/dist/resource/builder.js +0 -12
  342. package/dist/resource/builder.js.map +0 -1
  343. package/dist/resource/errors.d.ts +0 -7
  344. package/dist/resource/errors.d.ts.map +0 -1
  345. package/dist/resource/errors.js +0 -9
  346. package/dist/resource/errors.js.map +0 -1
  347. package/dist/resource/index.d.ts +0 -9
  348. package/dist/resource/index.d.ts.map +0 -1
  349. package/dist/resource/index.js +0 -6
  350. package/dist/resource/index.js.map +0 -1
  351. package/dist/resource/paginate.d.ts +0 -13
  352. package/dist/resource/paginate.d.ts.map +0 -1
  353. package/dist/resource/paginate.js +0 -29
  354. package/dist/resource/paginate.js.map +0 -1
  355. package/dist/resource/register.d.ts +0 -16
  356. package/dist/resource/register.d.ts.map +0 -1
  357. package/dist/resource/register.js +0 -181
  358. package/dist/resource/register.js.map +0 -1
  359. package/dist/resource/types.d.ts +0 -69
  360. package/dist/resource/types.d.ts.map +0 -1
  361. package/dist/trunk.d.ts +0 -35
  362. package/dist/trunk.d.ts.map +0 -1
  363. package/dist/trunk.js +0 -102
  364. package/dist/trunk.js.map +0 -1
  365. /package/dist/{resource → domain}/types.js +0 -0
@@ -0,0 +1,64 @@
1
+ import { validateSurfaces, validateNoJobTypeDuplicates } from './validate.js';
2
+ import { getBaseLogger } from '../logging/index.js';
3
+ export async function startSurfaces(context, config, surfaces) {
4
+ const logger = getBaseLogger();
5
+ validateSurfaces(config, surfaces);
6
+ validateNoJobTypeDuplicates(surfaces);
7
+ const handles = new Map();
8
+ const startOrder = [];
9
+ const entries = Object.entries(surfaces);
10
+ const scripts = entries.filter(([, s]) => s.kind === 'script');
11
+ const workers = entries.filter(([, s]) => s.kind === 'worker');
12
+ const httpSurfaces = entries.filter(([, s]) => s.kind === 'http');
13
+ const ordered = [...scripts, ...workers, ...httpSurfaces];
14
+ for (const [name, surface] of ordered) {
15
+ logger.info({ surface: name, kind: surface.kind }, `Starting surface "${name}"`);
16
+ try {
17
+ const handle = await surface.start(context);
18
+ handles.set(name, handle);
19
+ startOrder.push(name);
20
+ if (handle.address !== undefined) {
21
+ logger.info({ surface: name, address: handle.address }, `Surface "${name}" listening`);
22
+ }
23
+ }
24
+ catch (err) {
25
+ logger.error({ surface: name, err }, `Failed to start surface "${name}"`);
26
+ for (const started of startOrder.reverse()) {
27
+ try {
28
+ await handles.get(started).stop();
29
+ }
30
+ catch (stopErr) {
31
+ logger.error({ surface: started, err: stopErr }, `Failed to stop surface "${started}" during rollback`);
32
+ }
33
+ }
34
+ throw new Error(`[pipework] Failed to start surface "${name}".\n\n` +
35
+ ` ${err instanceof Error ? err.message : String(err)}\n\n` +
36
+ ` Surfaces that were started have been stopped.\n`);
37
+ }
38
+ }
39
+ return {
40
+ handles,
41
+ async stop() {
42
+ const stopOrder = [...startOrder].reverse();
43
+ const errors = [];
44
+ for (const name of stopOrder) {
45
+ const handle = handles.get(name);
46
+ if (handle === undefined)
47
+ continue;
48
+ try {
49
+ logger.info({ surface: name }, `Stopping surface "${name}"`);
50
+ await handle.stop();
51
+ }
52
+ catch (err) {
53
+ logger.error({ surface: name, err }, `Error stopping surface "${name}"`);
54
+ errors.push({ name, error: err });
55
+ }
56
+ }
57
+ if (errors.length > 0) {
58
+ const details = errors.map(e => ` - ${e.name}: ${e.error instanceof Error ? e.error.message : String(e.error)}`).join('\n');
59
+ throw new Error(`[pipework] Errors occurred while stopping surfaces:\n\n${details}\n`);
60
+ }
61
+ },
62
+ };
63
+ }
64
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/surface/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ import type { Handler } from '../di/types.js';
2
+ import type { Resource } from '../fixture/types.js';
3
+ import type { ServerConfig } from '../http/types.js';
4
+ import type { QueueConfig, BackoffConfig } from '../jobs/queue.js';
5
+ export type SurfaceKind = 'http' | 'worker' | 'script';
6
+ export interface SurfaceManifest {
7
+ readonly databases: readonly string[];
8
+ readonly jobTypes: readonly string[];
9
+ readonly dependencies: Readonly<Record<string, string>>;
10
+ }
11
+ export interface SurfaceHandle {
12
+ readonly kind: SurfaceKind;
13
+ readonly address?: string;
14
+ stop(): Promise<void>;
15
+ }
16
+ export interface Surface {
17
+ readonly kind: SurfaceKind;
18
+ readonly manifest: SurfaceManifest;
19
+ start(context: SurfaceContext): Promise<SurfaceHandle>;
20
+ }
21
+ export interface SurfaceBuilder extends Surface {
22
+ dependencies(d: Record<string, string>): SurfaceBuilder;
23
+ }
24
+ export interface SurfaceContext {
25
+ readonly config: {
26
+ readonly environment: string;
27
+ database(name?: string): {
28
+ readonly name: string;
29
+ readonly url: string;
30
+ };
31
+ databases(): ReadonlyMap<string, {
32
+ readonly name: string;
33
+ }>;
34
+ databaseNames(): readonly string[];
35
+ defaultDatabaseName(): string;
36
+ readonly observability: {
37
+ readonly slowQueryMs: number;
38
+ readonly logAllQueries: boolean;
39
+ readonly poolMetricsInterval: number;
40
+ };
41
+ readonly raw: unknown;
42
+ };
43
+ readonly env: Readonly<Record<string, unknown>>;
44
+ readonly pool: {
45
+ getOrCreate(config: {
46
+ readonly name: string;
47
+ readonly url: string;
48
+ }): {
49
+ readonly drizzle: import('../db/index.js').DB;
50
+ close(): Promise<void>;
51
+ };
52
+ get(name: string): {
53
+ readonly drizzle: import('../db/index.js').DB;
54
+ close(): Promise<void>;
55
+ } | undefined;
56
+ closeAll(): Promise<void>;
57
+ count(): number;
58
+ };
59
+ readonly isolation: {
60
+ markBegin(): void;
61
+ markEnd(): void;
62
+ assertClean(): void;
63
+ };
64
+ readonly connections: {
65
+ track(id: string, name: string, context: string): void;
66
+ release(id: string): void;
67
+ activeCount(): number;
68
+ };
69
+ }
70
+ export interface HttpSurfaceConfig {
71
+ readonly handlers?: readonly Handler<Record<string, unknown>, unknown>[];
72
+ readonly resources?: readonly Resource<unknown>[];
73
+ readonly port?: number;
74
+ readonly host?: string;
75
+ readonly auth?: ServerConfig['auth'];
76
+ readonly tenant?: ServerConfig['tenant'];
77
+ readonly cors?: ServerConfig['cors'];
78
+ readonly security?: ServerConfig['security'];
79
+ readonly rateLimit?: ServerConfig['rateLimit'];
80
+ readonly openapi?: ServerConfig['openapi'];
81
+ readonly rbac?: ServerConfig['rbac'];
82
+ readonly transactionPerRequest?: ServerConfig['transactionPerRequest'];
83
+ readonly transactionTimeoutMs?: ServerConfig['transactionTimeoutMs'];
84
+ readonly healthChecks?: ServerConfig['healthChecks'];
85
+ readonly logging?: ServerConfig['logging'];
86
+ readonly logger?: ServerConfig['logger'];
87
+ readonly trustProxy?: ServerConfig['trustProxy'];
88
+ readonly gracefulShutdownMs?: number;
89
+ }
90
+ export interface RetryConfig {
91
+ readonly attempts: number;
92
+ readonly backoff?: BackoffConfig;
93
+ }
94
+ export interface WorkerSurfaceConfig {
95
+ readonly jobs: readonly Handler<Record<string, unknown>, unknown>[];
96
+ readonly database?: string;
97
+ readonly concurrency?: number;
98
+ readonly pollIntervalMs?: number;
99
+ readonly queue?: QueueConfig;
100
+ }
101
+ export interface ScriptSurfaceConfig {
102
+ readonly databases?: readonly string[];
103
+ readonly run: (context: ScriptContext) => Promise<void>;
104
+ }
105
+ export interface ScriptContext {
106
+ readonly config: SurfaceContext['config'];
107
+ readonly env: SurfaceContext['env'];
108
+ readonly pool: SurfaceContext['pool'];
109
+ }
110
+ export type SurfaceMap = Record<string, Surface>;
111
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/surface/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/surface/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import type { ResolvedConfig } from '../config/load.js';
2
+ import type { SurfaceMap } from './types.js';
3
+ export declare function validateSurfaces(config: ResolvedConfig, surfaces: SurfaceMap): void;
4
+ export declare function validateNoJobTypeDuplicates(surfaces: SurfaceMap): void;
5
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/surface/validate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAW,UAAU,EAAE,MAAM,YAAY,CAAA;AAGrD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,GAAG,IAAI,CAoCnF;AAwBD,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,UAAU,GAAG,IAAI,CAuBtE"}
@@ -0,0 +1,67 @@
1
+ import { DEFAULT_DB } from '../di/types.js';
2
+ export function validateSurfaces(config, surfaces) {
3
+ const problems = [];
4
+ const configuredDbs = new Set(config.databaseNames());
5
+ for (const [name, surface] of Object.entries(surfaces)) {
6
+ for (const db of surface.manifest.databases) {
7
+ if (db === DEFAULT_DB) {
8
+ if (configuredDbs.size > 1) {
9
+ try {
10
+ config.defaultDatabaseName();
11
+ }
12
+ catch {
13
+ problems.push(`Surface "${name}" uses the default database, but multiple databases are configured.\n` +
14
+ ` Configured: ${[...configuredDbs].join(', ')}\n` +
15
+ ` Fix: Pass an explicit database name — e.g., surface.worker({ database: "${[...configuredDbs][0]}" })`);
16
+ }
17
+ }
18
+ }
19
+ else if (!configuredDbs.has(db)) {
20
+ const available = [...configuredDbs].join(', ');
21
+ problems.push(`Surface "${name}" requires database "${db}" which is not configured.\n` +
22
+ ` Configured databases: ${available || '(none)'}\n` +
23
+ ` Fix: Add "${db}" to your databases config, or correct the name in the surface definition.`);
24
+ }
25
+ }
26
+ validateSurfaceKind(name, surface, problems);
27
+ }
28
+ if (problems.length > 0) {
29
+ throw new Error(`[pipework] Surface validation failed:\n\n${problems.map((p, i) => ` ${i + 1}. ${p}`).join('\n\n')}\n`);
30
+ }
31
+ }
32
+ function validateSurfaceKind(name, surface, problems) {
33
+ if (surface.kind === 'worker') {
34
+ if (surface.manifest.jobTypes.length === 0) {
35
+ problems.push(`Surface "${name}" is a worker with no job handlers.\n` +
36
+ ' Fix: Pass at least one job handler — surface.worker({ jobs: [myJob] })');
37
+ }
38
+ const seen = new Set();
39
+ for (const jobType of surface.manifest.jobTypes) {
40
+ if (seen.has(jobType)) {
41
+ problems.push(`Surface "${name}" has duplicate job type "${jobType}".\n` +
42
+ ' Each job type must have exactly one handler.');
43
+ }
44
+ seen.add(jobType);
45
+ }
46
+ }
47
+ }
48
+ export function validateNoJobTypeDuplicates(surfaces) {
49
+ const owners = new Map();
50
+ const problems = [];
51
+ for (const [name, surface] of Object.entries(surfaces)) {
52
+ for (const jobType of surface.manifest.jobTypes) {
53
+ const existing = owners.get(jobType);
54
+ if (existing !== undefined) {
55
+ problems.push(`Job type "${jobType}" is handled by both "${existing}" and "${name}".\n` +
56
+ ' Each job type must be handled by exactly one worker surface.');
57
+ }
58
+ else {
59
+ owners.set(jobType, name);
60
+ }
61
+ }
62
+ }
63
+ if (problems.length > 0) {
64
+ throw new Error(`[pipework] Job type conflict:\n\n${problems.map((p, i) => ` ${i + 1}. ${p}`).join('\n\n')}\n`);
65
+ }
66
+ }
67
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/surface/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { SurfaceBuilder, WorkerSurfaceConfig } from './types.js';
2
+ export declare function createWorkerSurface(config: WorkerSurfaceConfig): SurfaceBuilder;
3
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/surface/worker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAiB,mBAAmB,EAAkB,MAAM,YAAY,CAAA;AAQpG,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,cAAc,CA8F/E"}
@@ -0,0 +1,151 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { DEFAULT_DB } from '../di/types.js';
3
+ import { createQueue } from '../jobs/queue.js';
4
+ import { executeJob } from '../jobs/execute.js';
5
+ import { sql } from '../db/sql.js';
6
+ export function createWorkerSurface(config) {
7
+ const databases = collectWorkerDatabases(config);
8
+ const jobTypes = collectJobTypes(config.jobs);
9
+ validateJobHandlers(config.jobs);
10
+ const deps = {};
11
+ const surface = {
12
+ kind: 'worker',
13
+ manifest: { databases, jobTypes, dependencies: deps },
14
+ dependencies(d) {
15
+ Object.assign(deps, d);
16
+ return surface;
17
+ },
18
+ async start(context) {
19
+ const queue = createQueue(config.queue);
20
+ const dbName = config.database ?? context.config.defaultDatabaseName();
21
+ const dbConfig = context.config.database(dbName);
22
+ const conn = context.pool.getOrCreate(dbConfig);
23
+ const db = conn.drizzle;
24
+ await db.execute(sql `SELECT 1`);
25
+ const dispatch = buildDispatchTable(config.jobs);
26
+ const concurrency = config.concurrency ?? 1;
27
+ const pollIntervalMs = config.pollIntervalMs ?? 1000;
28
+ const shouldRun = { value: true };
29
+ const claimLoop = async () => {
30
+ const workerId = randomUUID();
31
+ while (shouldRun.value) {
32
+ try {
33
+ const claimed = await queue.claim(db, workerId);
34
+ if (claimed === null) {
35
+ await sleep(pollIntervalMs);
36
+ continue;
37
+ }
38
+ const handler = dispatch.get(claimed.type);
39
+ if (handler === undefined) {
40
+ await queue.fail(db, claimed.id, new Error(`[pipework] No handler registered for job type "${claimed.type}".\n\n` +
41
+ ` Registered types: ${[...dispatch.keys()].join(', ')}\n` +
42
+ ' This job was enqueued with a type that no handler recognizes.\n'));
43
+ continue;
44
+ }
45
+ const heartbeatInterval = setInterval(() => {
46
+ void queue.heartbeat(db, claimed.id);
47
+ }, 30_000);
48
+ try {
49
+ const timeoutMs = handler.meta.jobTimeout ?? undefined;
50
+ const result = await executeWithTimeout(() => executeJob(handler, {
51
+ instance: context,
52
+ jobId: claimed.id,
53
+ jobType: claimed.type,
54
+ input: claimed.payload,
55
+ }), timeoutMs, claimed.type, claimed.id);
56
+ await queue.complete(db, claimed.id, result);
57
+ }
58
+ catch (err) {
59
+ await queue.fail(db, claimed.id, err);
60
+ }
61
+ finally {
62
+ clearInterval(heartbeatInterval);
63
+ }
64
+ }
65
+ catch {
66
+ await sleep(pollIntervalMs);
67
+ }
68
+ }
69
+ };
70
+ const workers = Array.from({ length: concurrency }, () => claimLoop());
71
+ return {
72
+ kind: 'worker',
73
+ async stop() {
74
+ shouldRun.value = false;
75
+ await Promise.allSettled(workers);
76
+ },
77
+ };
78
+ },
79
+ };
80
+ return surface;
81
+ }
82
+ function buildDispatchTable(jobs) {
83
+ const table = new Map();
84
+ for (const job of jobs) {
85
+ const jobType = job.meta.jobType;
86
+ if (typeof jobType === 'string') {
87
+ table.set(jobType, job);
88
+ }
89
+ }
90
+ return table;
91
+ }
92
+ function validateJobHandlers(jobs) {
93
+ const seen = new Set();
94
+ for (const job of jobs) {
95
+ if (!job.meta.isJob || job.meta.jobType === null) {
96
+ throw new Error('[pipework] All handlers passed to surface.worker({ jobs }) must be created with .job("type-name").\n\n' +
97
+ ' Example:\n' +
98
+ ' fitting().use().job("send-email").input(schema).fit(handler)\n');
99
+ }
100
+ if (seen.has(job.meta.jobType)) {
101
+ throw new Error(`[pipework] Duplicate job type "${job.meta.jobType}" in worker surface.\n\n` +
102
+ ' Each job type must have exactly one handler. If you need multiple handlers,\n' +
103
+ ' create separate worker surfaces.\n');
104
+ }
105
+ seen.add(job.meta.jobType);
106
+ }
107
+ }
108
+ function collectWorkerDatabases(config) {
109
+ const dbs = new Set();
110
+ if (config.database !== undefined) {
111
+ dbs.add(config.database);
112
+ }
113
+ else {
114
+ dbs.add(DEFAULT_DB);
115
+ }
116
+ for (const job of config.jobs) {
117
+ for (const db of job.meta.databases) {
118
+ dbs.add(db);
119
+ }
120
+ }
121
+ return [...dbs];
122
+ }
123
+ function collectJobTypes(jobs) {
124
+ const types = [];
125
+ for (const j of jobs) {
126
+ if (typeof j.meta.jobType === 'string') {
127
+ types.push(j.meta.jobType);
128
+ }
129
+ }
130
+ return types;
131
+ }
132
+ async function executeWithTimeout(fn, timeoutMs, jobType, jobId) {
133
+ if (timeoutMs === undefined)
134
+ return fn();
135
+ const result = await Promise.race([
136
+ fn(),
137
+ new Promise((_, reject) => {
138
+ const timer = setTimeout(() => {
139
+ reject(new Error(`[pipework] Job "${jobType}" (${jobId}) timed out after ${timeoutMs}ms.\n\n` +
140
+ ' The job handler did not complete within the configured timeout.\n' +
141
+ ' Increase the timeout with .timeout(ms) or optimize the handler.\n'));
142
+ }, timeoutMs);
143
+ timer.unref();
144
+ }),
145
+ ]);
146
+ return result;
147
+ }
148
+ function sleep(ms) {
149
+ return new Promise(resolve => setTimeout(resolve, ms));
150
+ }
151
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/surface/worker.ts"],"names":[],"mappings":"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"}
@@ -4,13 +4,21 @@ import { close } from './close.js';
4
4
  import { getCurrent } from './get-current.js';
5
5
  import { atTime, between } from './query.js';
6
6
  import { TemporalIntegrityError } from './errors.js';
7
+ /** Temporal (bitemporal) data namespace — version history with effective date ranges. */
7
8
  export declare const temporal: {
9
+ /** Returns the standard temporal column definitions (effectiveFrom, effectiveTo, version, createdBy) for table schemas. */
8
10
  columns: typeof temporalColumns;
11
+ /** Creates a new version of a temporal record, closing the previous version's effectiveTo. */
9
12
  revise: typeof revise;
13
+ /** Closes a temporal record by setting effectiveTo to now. Returns number of rows affected. */
10
14
  close: typeof close;
15
+ /** Fetches the currently-effective version of a temporal record (effectiveTo IS NULL). */
11
16
  current: typeof getCurrent;
17
+ /** Returns a SQL condition for records effective at a specific point in time. */
12
18
  atTime: typeof atTime;
19
+ /** Returns a SQL condition for records overlapping a date range. */
13
20
  between: typeof between;
21
+ /** Thrown when a temporal operation would violate version continuity. */
14
22
  TemporalIntegrityError: typeof TemporalIntegrityError;
15
23
  };
16
24
  //# sourceMappingURL=namespace.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../src/temporal/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAEpD,eAAO,MAAM,QAAQ;;;;;;;;CAQpB,CAAA"}
1
+ {"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../src/temporal/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAEpD,yFAAyF;AACzF,eAAO,MAAM,QAAQ;IACnB,2HAA2H;;IAE3H,8FAA8F;;IAE9F,+FAA+F;;IAE/F,0FAA0F;;IAE1F,iFAAiF;;IAEjF,oEAAoE;;IAEpE,yEAAyE;;CAE1E,CAAA"}
@@ -4,13 +4,21 @@ import { close } from './close.js';
4
4
  import { getCurrent } from './get-current.js';
5
5
  import { atTime, between } from './query.js';
6
6
  import { TemporalIntegrityError } from './errors.js';
7
+ /** Temporal (bitemporal) data namespace — version history with effective date ranges. */
7
8
  export const temporal = {
9
+ /** Returns the standard temporal column definitions (effectiveFrom, effectiveTo, version, createdBy) for table schemas. */
8
10
  columns: temporalColumns,
11
+ /** Creates a new version of a temporal record, closing the previous version's effectiveTo. */
9
12
  revise,
13
+ /** Closes a temporal record by setting effectiveTo to now. Returns number of rows affected. */
10
14
  close,
15
+ /** Fetches the currently-effective version of a temporal record (effectiveTo IS NULL). */
11
16
  current: getCurrent,
17
+ /** Returns a SQL condition for records effective at a specific point in time. */
12
18
  atTime,
19
+ /** Returns a SQL condition for records overlapping a date range. */
13
20
  between,
21
+ /** Thrown when a temporal operation would violate version continuity. */
14
22
  TemporalIntegrityError,
15
23
  };
16
24
  //# sourceMappingURL=namespace.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../src/temporal/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAEpD,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,OAAO,EAAE,eAAe;IACxB,MAAM;IACN,KAAK;IACL,OAAO,EAAE,UAAU;IACnB,MAAM;IACN,OAAO;IACP,sBAAsB;CACvB,CAAA"}
1
+ {"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../src/temporal/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAEpD,yFAAyF;AACzF,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,2HAA2H;IAC3H,OAAO,EAAE,eAAe;IACxB,8FAA8F;IAC9F,MAAM;IACN,+FAA+F;IAC/F,KAAK;IACL,0FAA0F;IAC1F,OAAO,EAAE,UAAU;IACnB,iFAAiF;IACjF,MAAM;IACN,oEAAoE;IACpE,OAAO;IACP,yEAAyE;IACzE,sBAAsB;CACvB,CAAA"}
@@ -3,14 +3,23 @@ import { enableTenantRls, tenantIsolationPolicy, verifyTenantContext } from './r
3
3
  import { propagateTenantLocals } from './propagate.js';
4
4
  import { extractTenant } from './extract.js';
5
5
  import { scopeTable, isTenantScoped } from './scope.js';
6
+ /** Multi-tenant isolation namespace — RLS policies, tenant extraction, Postgres-side verification. */
6
7
  export declare const tenant: {
8
+ /** Validates a tenant ID format (non-empty string, safe characters). */
7
9
  validate: typeof validateTenantId;
10
+ /** Enables RLS on a table and creates the tenant isolation policy in Postgres. */
8
11
  rls: typeof enableTenantRls;
12
+ /** Returns the SQL string for a tenant isolation RLS policy — use in migrations. */
9
13
  policy: typeof tenantIsolationPolicy;
14
+ /** Cross-checks ALS tenant against Postgres set_config('pipework.tenant_id') — defense-in-depth. */
10
15
  verify: typeof verifyTenantContext;
16
+ /** Sets pipework.tenant_id on the Postgres connection via set_config(). */
11
17
  propagate: typeof propagateTenantLocals;
18
+ /** Extracts tenant ID from auth context using the configured extraction strategy. */
12
19
  extract: typeof extractTenant;
20
+ /** Marks a table as tenant-scoped — pipe() will auto-filter by tenant_id. */
13
21
  scoped: typeof scopeTable;
22
+ /** Returns true if a table has been marked as tenant-scoped. */
14
23
  isTenantScoped: typeof isTenantScoped;
15
24
  };
16
25
  //# sourceMappingURL=namespace.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../src/tenant/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEvD,eAAO,MAAM,MAAM;;;;;;;;;CASlB,CAAA"}
1
+ {"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../src/tenant/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEvD,sGAAsG;AACtG,eAAO,MAAM,MAAM;IACjB,wEAAwE;;IAExE,kFAAkF;;IAElF,oFAAoF;;IAEpF,oGAAoG;;IAEpG,2EAA2E;;IAE3E,qFAAqF;;IAErF,6EAA6E;;IAE7E,gEAAgE;;CAEjE,CAAA"}
@@ -3,14 +3,23 @@ import { enableTenantRls, tenantIsolationPolicy, verifyTenantContext } from './r
3
3
  import { propagateTenantLocals } from './propagate.js';
4
4
  import { extractTenant } from './extract.js';
5
5
  import { scopeTable, isTenantScoped } from './scope.js';
6
+ /** Multi-tenant isolation namespace — RLS policies, tenant extraction, Postgres-side verification. */
6
7
  export const tenant = {
8
+ /** Validates a tenant ID format (non-empty string, safe characters). */
7
9
  validate: validateTenantId,
10
+ /** Enables RLS on a table and creates the tenant isolation policy in Postgres. */
8
11
  rls: enableTenantRls,
12
+ /** Returns the SQL string for a tenant isolation RLS policy — use in migrations. */
9
13
  policy: tenantIsolationPolicy,
14
+ /** Cross-checks ALS tenant against Postgres set_config('pipework.tenant_id') — defense-in-depth. */
10
15
  verify: verifyTenantContext,
16
+ /** Sets pipework.tenant_id on the Postgres connection via set_config(). */
11
17
  propagate: propagateTenantLocals,
18
+ /** Extracts tenant ID from auth context using the configured extraction strategy. */
12
19
  extract: extractTenant,
20
+ /** Marks a table as tenant-scoped — pipe() will auto-filter by tenant_id. */
13
21
  scoped: scopeTable,
22
+ /** Returns true if a table has been marked as tenant-scoped. */
14
23
  isTenantScoped,
15
24
  };
16
25
  //# sourceMappingURL=namespace.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../src/tenant/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEvD,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,QAAQ,EAAE,gBAAgB;IAC1B,GAAG,EAAE,eAAe;IACpB,MAAM,EAAE,qBAAqB;IAC7B,MAAM,EAAE,mBAAmB;IAC3B,SAAS,EAAE,qBAAqB;IAChC,OAAO,EAAE,aAAa;IACtB,MAAM,EAAE,UAAU;IAClB,cAAc;CACf,CAAA"}
1
+ {"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../src/tenant/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEvD,sGAAsG;AACtG,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,wEAAwE;IACxE,QAAQ,EAAE,gBAAgB;IAC1B,kFAAkF;IAClF,GAAG,EAAE,eAAe;IACpB,oFAAoF;IACpF,MAAM,EAAE,qBAAqB;IAC7B,oGAAoG;IACpG,MAAM,EAAE,mBAAmB;IAC3B,2EAA2E;IAC3E,SAAS,EAAE,qBAAqB;IAChC,qFAAqF;IACrF,OAAO,EAAE,aAAa;IACtB,6EAA6E;IAC7E,MAAM,EAAE,UAAU;IAClB,gEAAgE;IAChE,cAAc;CACf,CAAA"}
@@ -1,9 +1,11 @@
1
+ /** Configuration for tenant extraction and isolation strategy. */
1
2
  export interface TenantConfig {
2
3
  readonly extract: (auth: unknown) => string | null;
3
4
  readonly sessionVars?: Record<string, (ctx: TenantContext) => string>;
4
5
  readonly validate?: (tenantId: string) => boolean;
5
6
  readonly required?: boolean;
6
7
  }
8
+ /** Resolved tenant context — tenant ID, request ID, and user ID. */
7
9
  export interface TenantContext {
8
10
  readonly tenant: string;
9
11
  readonly requestId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tenant/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,CAAA;IAClD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,MAAM,CAAC,CAAA;IACrE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IACjD,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAC/B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tenant/types.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,CAAA;IAClD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,MAAM,CAAC,CAAA;IACrE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IACjD,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAC5B;AAED,oEAAoE;AACpE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAC/B"}
@@ -3,7 +3,7 @@ import { loadEnvFiles } from '../config/env.js';
3
3
  import { discoverInstance } from '../config/discover.js';
4
4
  import { setupTestDatabases, teardownTestDatabases } from './setup.js';
5
5
  import { beginTestIsolation, endTestIsolation } from './plugin.js';
6
- import { _setTestState, useTestDb } from './vitest.js';
6
+ import { _setTestState, _closeSetupConnections, useTestDb } from './vitest.js';
7
7
  loadEnvFiles();
8
8
  let _testContext = null;
9
9
  const instance = await discoverInstance();
@@ -17,6 +17,7 @@ beforeAll(async () => {
17
17
  await setupTestDatabases(instance);
18
18
  });
19
19
  afterAll(async () => {
20
+ await _closeSetupConnections();
20
21
  await instance.pool.closeAll();
21
22
  await teardownTestDatabases();
22
23
  });
@@ -1 +1 @@
1
- {"version":3,"file":"auto-setup.js","sourceRoot":"","sources":["../../src/test/auto-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AACtE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAoB,MAAM,aAAa,CAAA;AACpF,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEtD,YAAY,EAAE,CAAA;AAEd,IAAI,YAAY,GAAuB,IAAI,CAAA;AAE3C,MAAM,QAAQ,GAAG,MAAM,gBAAgB,EAAE,CAAA;AAEzC,aAAa,CAAC,QAAQ,CAAC,CAAA;AAEvB,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,CAAA;AAC/C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IACzB,CAAC;IAAC,UAAsC,CAAC,IAAI,CAAC,GAAG,SAAS,EAAE,CAAA;AAC9D,CAAC;AAED,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAA;AACpC,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,KAAK,IAAI,EAAE;IAClB,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAA;IAC9B,MAAM,qBAAqB,EAAE,CAAA;AAC/B,CAAC,CAAC,CAAA;AAEF,UAAU,CAAC,KAAK,IAAI,EAAE;IACpB,YAAY,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAA;IACjD,aAAa,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;AACvC,CAAC,CAAC,CAAA;AAEF,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;QAC9C,YAAY,GAAG,IAAI,CAAA;QACnB,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAC/B,CAAC;AACH,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"auto-setup.js","sourceRoot":"","sources":["../../src/test/auto-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AACtE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAoB,MAAM,aAAa,CAAA;AACpF,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAE9E,YAAY,EAAE,CAAA;AAEd,IAAI,YAAY,GAAuB,IAAI,CAAA;AAE3C,MAAM,QAAQ,GAAG,MAAM,gBAAgB,EAAE,CAAA;AAEzC,aAAa,CAAC,QAAQ,CAAC,CAAA;AAEvB,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,CAAA;AAC/C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IACzB,CAAC;IAAC,UAAsC,CAAC,IAAI,CAAC,GAAG,SAAS,EAAE,CAAA;AAC9D,CAAC;AAED,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAA;AACpC,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,KAAK,IAAI,EAAE;IAClB,MAAM,sBAAsB,EAAE,CAAA;IAC9B,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAA;IAC9B,MAAM,qBAAqB,EAAE,CAAA;AAC/B,CAAC,CAAC,CAAA;AAEF,UAAU,CAAC,KAAK,IAAI,EAAE;IACpB,YAAY,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAA;IACjD,aAAa,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;AACvC,CAAC,CAAC,CAAA;AAEF,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;QAC9C,YAAY,GAAG,IAAI,CAAA;QACnB,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAC/B,CAAC;AACH,CAAC,CAAC,CAAA"}