@heavybit/shared-lib 2.1.0 → 2.7.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 (296) hide show
  1. package/README.md +163 -2
  2. package/dist/cjs/access/index.js +9 -1
  3. package/dist/cjs/access/index.js.map +1 -1
  4. package/dist/cjs/approvals/index.js +137 -0
  5. package/dist/cjs/approvals/index.js.map +1 -0
  6. package/dist/cjs/audit/index.js +74 -0
  7. package/dist/cjs/audit/index.js.map +1 -0
  8. package/dist/cjs/cache/index.js +90 -16
  9. package/dist/cjs/cache/index.js.map +1 -1
  10. package/dist/cjs/cache/keyspace.js +101 -0
  11. package/dist/cjs/cache/keyspace.js.map +1 -0
  12. package/dist/cjs/common/circuit-breaker.js +74 -0
  13. package/dist/cjs/common/circuit-breaker.js.map +1 -0
  14. package/dist/cjs/common/index.js +4 -0
  15. package/dist/cjs/common/index.js.map +1 -1
  16. package/dist/cjs/common/internal-client.js +177 -0
  17. package/dist/cjs/common/internal-client.js.map +1 -0
  18. package/dist/cjs/common/internal-constants.js +12 -0
  19. package/dist/cjs/common/internal-constants.js.map +1 -0
  20. package/dist/cjs/common/internal-service-auth.js +160 -0
  21. package/dist/cjs/common/internal-service-auth.js.map +1 -0
  22. package/dist/cjs/common/money.js +215 -0
  23. package/dist/cjs/common/money.js.map +1 -0
  24. package/dist/cjs/common/phone.js +41 -22
  25. package/dist/cjs/common/phone.js.map +1 -1
  26. package/dist/cjs/common/time.js +28 -2
  27. package/dist/cjs/common/time.js.map +1 -1
  28. package/dist/cjs/config/index.js +139 -19
  29. package/dist/cjs/config/index.js.map +1 -1
  30. package/dist/cjs/contracts/notification-dispatch.js +1 -1
  31. package/dist/cjs/database/db.js +37 -0
  32. package/dist/cjs/database/db.js.map +1 -0
  33. package/dist/cjs/database/index.js +22 -51
  34. package/dist/cjs/database/index.js.map +1 -1
  35. package/dist/cjs/database/pagination.js +88 -0
  36. package/dist/cjs/database/pagination.js.map +1 -0
  37. package/dist/cjs/database/pool.js +60 -0
  38. package/dist/cjs/database/pool.js.map +1 -0
  39. package/dist/cjs/database/scoped-repository.js +132 -0
  40. package/dist/cjs/database/scoped-repository.js.map +1 -0
  41. package/dist/cjs/database/scopes.js +166 -0
  42. package/dist/cjs/database/scopes.js.map +1 -0
  43. package/dist/cjs/database/table-names.js +14 -0
  44. package/dist/cjs/database/table-names.js.map +1 -0
  45. package/dist/cjs/database/tables.js +71 -0
  46. package/dist/cjs/database/tables.js.map +1 -0
  47. package/dist/cjs/express/auth.js +64 -50
  48. package/dist/cjs/express/auth.js.map +1 -1
  49. package/dist/cjs/express/index.js +2 -0
  50. package/dist/cjs/express/index.js.map +1 -1
  51. package/dist/cjs/express/internal-caller.js +52 -0
  52. package/dist/cjs/express/internal-caller.js.map +1 -0
  53. package/dist/cjs/express/step-up.js +41 -0
  54. package/dist/cjs/express/step-up.js.map +1 -0
  55. package/dist/cjs/http/index.js +3 -71
  56. package/dist/cjs/http/index.js.map +1 -1
  57. package/dist/cjs/identity/index.js +269 -67
  58. package/dist/cjs/identity/index.js.map +1 -1
  59. package/dist/cjs/identity/step-up.js +52 -0
  60. package/dist/cjs/identity/step-up.js.map +1 -0
  61. package/dist/cjs/index.js +6 -0
  62. package/dist/cjs/index.js.map +1 -1
  63. package/dist/cjs/knex/columns.js +36 -0
  64. package/dist/cjs/knex/columns.js.map +1 -0
  65. package/dist/cjs/knex/index.js +26 -43
  66. package/dist/cjs/knex/index.js.map +1 -1
  67. package/dist/cjs/knex/migration-helpers.js +57 -0
  68. package/dist/cjs/knex/migration-helpers.js.map +1 -0
  69. package/dist/cjs/logging/redact.js +6 -11
  70. package/dist/cjs/logging/redact.js.map +1 -1
  71. package/dist/cjs/messaging/base-consumer.js +36 -0
  72. package/dist/cjs/messaging/base-consumer.js.map +1 -0
  73. package/dist/cjs/messaging/consumer.js +142 -73
  74. package/dist/cjs/messaging/consumer.js.map +1 -1
  75. package/dist/cjs/messaging/envelope.js +53 -10
  76. package/dist/cjs/messaging/envelope.js.map +1 -1
  77. package/dist/cjs/messaging/idempotency.js +95 -8
  78. package/dist/cjs/messaging/idempotency.js.map +1 -1
  79. package/dist/cjs/messaging/index.js +2 -1
  80. package/dist/cjs/messaging/index.js.map +1 -1
  81. package/dist/cjs/messaging/outbox.js +97 -55
  82. package/dist/cjs/messaging/outbox.js.map +1 -1
  83. package/dist/cjs/messaging/publisher.js +86 -38
  84. package/dist/cjs/messaging/publisher.js.map +1 -1
  85. package/dist/cjs/messaging/staff-notifier.js +4 -4
  86. package/dist/cjs/messaging/staff-notifier.js.map +1 -1
  87. package/dist/cjs/messaging/topology.js +41 -5
  88. package/dist/cjs/messaging/topology.js.map +1 -1
  89. package/dist/cjs/rate-limit/index.js +57 -6
  90. package/dist/cjs/rate-limit/index.js.map +1 -1
  91. package/dist/cjs/rate-limit/keys.js +47 -0
  92. package/dist/cjs/rate-limit/keys.js.map +1 -0
  93. package/dist/cjs/socket/index.js +127 -16
  94. package/dist/cjs/socket/index.js.map +1 -1
  95. package/dist/cjs/socket/ticket.js +124 -0
  96. package/dist/cjs/socket/ticket.js.map +1 -0
  97. package/dist/cjs/testing/index.js +23 -14
  98. package/dist/cjs/testing/index.js.map +1 -1
  99. package/dist/esm/access/index.js +9 -1
  100. package/dist/esm/access/index.js.map +1 -1
  101. package/dist/esm/approvals/index.js +127 -0
  102. package/dist/esm/approvals/index.js.map +1 -0
  103. package/dist/esm/audit/index.js +70 -0
  104. package/dist/esm/audit/index.js.map +1 -0
  105. package/dist/esm/cache/index.js +70 -13
  106. package/dist/esm/cache/index.js.map +1 -1
  107. package/dist/esm/cache/keyspace.js +95 -0
  108. package/dist/esm/cache/keyspace.js.map +1 -0
  109. package/dist/esm/common/circuit-breaker.js +70 -0
  110. package/dist/esm/common/circuit-breaker.js.map +1 -0
  111. package/dist/esm/common/index.js +4 -0
  112. package/dist/esm/common/index.js.map +1 -1
  113. package/dist/esm/common/internal-client.js +173 -0
  114. package/dist/esm/common/internal-client.js.map +1 -0
  115. package/dist/esm/common/internal-constants.js +9 -0
  116. package/dist/esm/common/internal-constants.js.map +1 -0
  117. package/dist/esm/common/internal-service-auth.js +150 -0
  118. package/dist/esm/common/internal-service-auth.js.map +1 -0
  119. package/dist/esm/common/money.js +207 -0
  120. package/dist/esm/common/money.js.map +1 -0
  121. package/dist/esm/common/phone.js +41 -22
  122. package/dist/esm/common/phone.js.map +1 -1
  123. package/dist/esm/common/time.js +27 -2
  124. package/dist/esm/common/time.js.map +1 -1
  125. package/dist/esm/config/index.js +135 -18
  126. package/dist/esm/config/index.js.map +1 -1
  127. package/dist/esm/contracts/notification-dispatch.js +1 -1
  128. package/dist/esm/database/db.js +32 -0
  129. package/dist/esm/database/db.js.map +1 -0
  130. package/dist/esm/database/index.js +9 -45
  131. package/dist/esm/database/index.js.map +1 -1
  132. package/dist/esm/database/pagination.js +81 -0
  133. package/dist/esm/database/pagination.js.map +1 -0
  134. package/dist/esm/database/pool.js +51 -0
  135. package/dist/esm/database/pool.js.map +1 -0
  136. package/dist/esm/database/scoped-repository.js +128 -0
  137. package/dist/esm/database/scoped-repository.js.map +1 -0
  138. package/dist/esm/database/scopes.js +157 -0
  139. package/dist/esm/database/scopes.js.map +1 -0
  140. package/dist/esm/database/table-names.js +11 -0
  141. package/dist/esm/database/table-names.js.map +1 -0
  142. package/dist/esm/database/tables.js +61 -0
  143. package/dist/esm/database/tables.js.map +1 -0
  144. package/dist/esm/express/auth.js +62 -48
  145. package/dist/esm/express/auth.js.map +1 -1
  146. package/dist/esm/express/index.js +2 -0
  147. package/dist/esm/express/index.js.map +1 -1
  148. package/dist/esm/express/internal-caller.js +49 -0
  149. package/dist/esm/express/internal-caller.js.map +1 -0
  150. package/dist/esm/express/step-up.js +38 -0
  151. package/dist/esm/express/step-up.js.map +1 -0
  152. package/dist/esm/http/index.js +3 -70
  153. package/dist/esm/http/index.js.map +1 -1
  154. package/dist/esm/identity/index.js +246 -64
  155. package/dist/esm/identity/index.js.map +1 -1
  156. package/dist/esm/identity/step-up.js +47 -0
  157. package/dist/esm/identity/step-up.js.map +1 -0
  158. package/dist/esm/index.js +6 -0
  159. package/dist/esm/index.js.map +1 -1
  160. package/dist/esm/knex/columns.js +28 -0
  161. package/dist/esm/knex/columns.js.map +1 -0
  162. package/dist/esm/knex/index.js +8 -34
  163. package/dist/esm/knex/index.js.map +1 -1
  164. package/dist/esm/knex/migration-helpers.js +51 -0
  165. package/dist/esm/knex/migration-helpers.js.map +1 -0
  166. package/dist/esm/logging/redact.js +3 -7
  167. package/dist/esm/logging/redact.js.map +1 -1
  168. package/dist/esm/messaging/base-consumer.js +32 -0
  169. package/dist/esm/messaging/base-consumer.js.map +1 -0
  170. package/dist/esm/messaging/consumer.js +139 -71
  171. package/dist/esm/messaging/consumer.js.map +1 -1
  172. package/dist/esm/messaging/envelope.js +50 -10
  173. package/dist/esm/messaging/envelope.js.map +1 -1
  174. package/dist/esm/messaging/idempotency.js +91 -7
  175. package/dist/esm/messaging/idempotency.js.map +1 -1
  176. package/dist/esm/messaging/index.js +2 -1
  177. package/dist/esm/messaging/index.js.map +1 -1
  178. package/dist/esm/messaging/outbox.js +97 -54
  179. package/dist/esm/messaging/outbox.js.map +1 -1
  180. package/dist/esm/messaging/publisher.js +86 -38
  181. package/dist/esm/messaging/publisher.js.map +1 -1
  182. package/dist/esm/messaging/staff-notifier.js +4 -4
  183. package/dist/esm/messaging/staff-notifier.js.map +1 -1
  184. package/dist/esm/messaging/topology.js +39 -4
  185. package/dist/esm/messaging/topology.js.map +1 -1
  186. package/dist/esm/rate-limit/index.js +41 -6
  187. package/dist/esm/rate-limit/index.js.map +1 -1
  188. package/dist/esm/rate-limit/keys.js +43 -0
  189. package/dist/esm/rate-limit/keys.js.map +1 -0
  190. package/dist/esm/socket/index.js +112 -17
  191. package/dist/esm/socket/index.js.map +1 -1
  192. package/dist/esm/socket/ticket.js +117 -0
  193. package/dist/esm/socket/ticket.js.map +1 -0
  194. package/dist/esm/testing/index.js +24 -15
  195. package/dist/esm/testing/index.js.map +1 -1
  196. package/dist/types/access/index.d.ts +9 -3
  197. package/dist/types/access/index.d.ts.map +1 -1
  198. package/dist/types/approvals/index.d.ts +99 -0
  199. package/dist/types/approvals/index.d.ts.map +1 -0
  200. package/dist/types/audit/index.d.ts +82 -0
  201. package/dist/types/audit/index.d.ts.map +1 -0
  202. package/dist/types/cache/index.d.ts +64 -14
  203. package/dist/types/cache/index.d.ts.map +1 -1
  204. package/dist/types/cache/keyspace.d.ts +84 -0
  205. package/dist/types/cache/keyspace.d.ts.map +1 -0
  206. package/dist/types/common/circuit-breaker.d.ts +51 -0
  207. package/dist/types/common/circuit-breaker.d.ts.map +1 -0
  208. package/dist/types/common/index.d.ts +4 -0
  209. package/dist/types/common/index.d.ts.map +1 -1
  210. package/dist/types/common/internal-client.d.ts +116 -0
  211. package/dist/types/common/internal-client.d.ts.map +1 -0
  212. package/dist/types/common/internal-constants.d.ts +9 -0
  213. package/dist/types/common/internal-constants.d.ts.map +1 -0
  214. package/dist/types/common/internal-service-auth.d.ts +102 -0
  215. package/dist/types/common/internal-service-auth.d.ts.map +1 -0
  216. package/dist/types/common/money.d.ts +104 -0
  217. package/dist/types/common/money.d.ts.map +1 -0
  218. package/dist/types/common/phone.d.ts +25 -15
  219. package/dist/types/common/phone.d.ts.map +1 -1
  220. package/dist/types/common/time.d.ts +20 -2
  221. package/dist/types/common/time.d.ts.map +1 -1
  222. package/dist/types/config/index.d.ts +251 -27
  223. package/dist/types/config/index.d.ts.map +1 -1
  224. package/dist/types/contracts/notification-dispatch.d.ts +13 -13
  225. package/dist/types/database/db.d.ts +46 -0
  226. package/dist/types/database/db.d.ts.map +1 -0
  227. package/dist/types/database/index.d.ts +9 -22
  228. package/dist/types/database/index.d.ts.map +1 -1
  229. package/dist/types/database/pagination.d.ts +68 -0
  230. package/dist/types/database/pagination.d.ts.map +1 -0
  231. package/dist/types/database/pool.d.ts +39 -0
  232. package/dist/types/database/pool.d.ts.map +1 -0
  233. package/dist/types/database/scoped-repository.d.ts +92 -0
  234. package/dist/types/database/scoped-repository.d.ts.map +1 -0
  235. package/dist/types/database/scopes.d.ts +159 -0
  236. package/dist/types/database/scopes.d.ts.map +1 -0
  237. package/dist/types/database/table-names.d.ts +13 -0
  238. package/dist/types/database/table-names.d.ts.map +1 -0
  239. package/dist/types/database/tables.d.ts +748 -0
  240. package/dist/types/database/tables.d.ts.map +1 -0
  241. package/dist/types/express/auth.d.ts +40 -24
  242. package/dist/types/express/auth.d.ts.map +1 -1
  243. package/dist/types/express/index.d.ts +2 -0
  244. package/dist/types/express/index.d.ts.map +1 -1
  245. package/dist/types/express/internal-caller.d.ts +53 -0
  246. package/dist/types/express/internal-caller.d.ts.map +1 -0
  247. package/dist/types/express/step-up.d.ts +38 -0
  248. package/dist/types/express/step-up.d.ts.map +1 -0
  249. package/dist/types/http/index.d.ts +3 -31
  250. package/dist/types/http/index.d.ts.map +1 -1
  251. package/dist/types/identity/index.d.ts +159 -21
  252. package/dist/types/identity/index.d.ts.map +1 -1
  253. package/dist/types/identity/step-up.d.ts +41 -0
  254. package/dist/types/identity/step-up.d.ts.map +1 -0
  255. package/dist/types/index.d.ts +6 -0
  256. package/dist/types/index.d.ts.map +1 -1
  257. package/dist/types/knex/columns.d.ts +15 -0
  258. package/dist/types/knex/columns.d.ts.map +1 -0
  259. package/dist/types/knex/index.d.ts +3 -11
  260. package/dist/types/knex/index.d.ts.map +1 -1
  261. package/dist/types/knex/migration-helpers.d.ts +28 -0
  262. package/dist/types/knex/migration-helpers.d.ts.map +1 -0
  263. package/dist/types/logging/redact.d.ts +2 -2
  264. package/dist/types/logging/redact.d.ts.map +1 -1
  265. package/dist/types/messaging/base-consumer.d.ts +33 -0
  266. package/dist/types/messaging/base-consumer.d.ts.map +1 -0
  267. package/dist/types/messaging/consumer.d.ts +59 -21
  268. package/dist/types/messaging/consumer.d.ts.map +1 -1
  269. package/dist/types/messaging/envelope.d.ts +50 -11
  270. package/dist/types/messaging/envelope.d.ts.map +1 -1
  271. package/dist/types/messaging/idempotency.d.ts +60 -3
  272. package/dist/types/messaging/idempotency.d.ts.map +1 -1
  273. package/dist/types/messaging/index.d.ts +7 -0
  274. package/dist/types/messaging/index.d.ts.map +1 -1
  275. package/dist/types/messaging/outbox.d.ts +62 -22
  276. package/dist/types/messaging/outbox.d.ts.map +1 -1
  277. package/dist/types/messaging/publisher.d.ts +54 -21
  278. package/dist/types/messaging/publisher.d.ts.map +1 -1
  279. package/dist/types/messaging/staff-notifier.d.ts +9 -9
  280. package/dist/types/messaging/staff-notifier.d.ts.map +1 -1
  281. package/dist/types/messaging/staff-recipients.d.ts +1 -1
  282. package/dist/types/messaging/topology.d.ts +40 -8
  283. package/dist/types/messaging/topology.d.ts.map +1 -1
  284. package/dist/types/rate-limit/index.d.ts +40 -4
  285. package/dist/types/rate-limit/index.d.ts.map +1 -1
  286. package/dist/types/rate-limit/keys.d.ts +52 -0
  287. package/dist/types/rate-limit/keys.d.ts.map +1 -0
  288. package/dist/types/socket/index.d.ts +86 -2
  289. package/dist/types/socket/index.d.ts.map +1 -1
  290. package/dist/types/socket/ticket.d.ts +90 -0
  291. package/dist/types/socket/ticket.d.ts.map +1 -0
  292. package/dist/types/testing/index.d.ts +31 -10
  293. package/dist/types/testing/index.d.ts.map +1 -1
  294. package/dist/types/types/index.d.ts +26 -14
  295. package/dist/types/types/index.d.ts.map +1 -1
  296. package/package.json +3 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scopes.js","sourceRoot":"","sources":["../../../src/database/scopes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OUTBOX_EXCHANGES = exports.SCHEDULER_RUN_STATUSES = exports.DEFAULT_SCHEDULER_RUNS_TABLE = exports.DEFAULT_PROCESSED_EVENTS_TABLE = exports.DEFAULT_OUTBOX_TABLE = void 0;
4
+ /** Default name of the transactional outbox table. */
5
+ exports.DEFAULT_OUTBOX_TABLE = 'event_outbox';
6
+ /** Default name of the consumer idempotency ledger. */
7
+ exports.DEFAULT_PROCESSED_EVENTS_TABLE = 'processed_events';
8
+ /** Default name of the scheduled-job runs table. */
9
+ exports.DEFAULT_SCHEDULER_RUNS_TABLE = 'scheduler_runs';
10
+ /** Scheduler run states, shared by the Drizzle table and the Knex helper. */
11
+ exports.SCHEDULER_RUN_STATUSES = ['running', 'succeeded', 'failed'];
12
+ /** Logical exchanges an outbox row can target: topic events or direct commands. */
13
+ exports.OUTBOX_EXCHANGES = ['events', 'commands'];
14
+ //# sourceMappingURL=table-names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-names.js","sourceRoot":"","sources":["../../../src/database/table-names.ts"],"names":[],"mappings":";;;AAAA,sDAAsD;AACzC,QAAA,oBAAoB,GAAG,cAAc,CAAC;AACnD,uDAAuD;AAC1C,QAAA,8BAA8B,GAAG,kBAAkB,CAAC;AACjE,oDAAoD;AACvC,QAAA,4BAA4B,GAAG,gBAAgB,CAAC;AAC7D,6EAA6E;AAChE,QAAA,sBAAsB,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAU,CAAC;AAClF,mFAAmF;AACtE,QAAA,gBAAgB,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAU,CAAC"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.schedulerRuns = exports.processedEvents = exports.outbox = exports.SCHEDULER_RUN_STATUSES = exports.OUTBOX_EXCHANGES = exports.DEFAULT_SCHEDULER_RUNS_TABLE = exports.DEFAULT_PROCESSED_EVENTS_TABLE = exports.DEFAULT_OUTBOX_TABLE = void 0;
4
+ exports.outboxTable = outboxTable;
5
+ exports.processedEventsTable = processedEventsTable;
6
+ exports.schedulerRunsTable = schedulerRunsTable;
7
+ const drizzle_orm_1 = require("drizzle-orm");
8
+ const table_names_js_1 = require("./table-names.js");
9
+ Object.defineProperty(exports, "DEFAULT_OUTBOX_TABLE", { enumerable: true, get: function () { return table_names_js_1.DEFAULT_OUTBOX_TABLE; } });
10
+ Object.defineProperty(exports, "DEFAULT_PROCESSED_EVENTS_TABLE", { enumerable: true, get: function () { return table_names_js_1.DEFAULT_PROCESSED_EVENTS_TABLE; } });
11
+ Object.defineProperty(exports, "DEFAULT_SCHEDULER_RUNS_TABLE", { enumerable: true, get: function () { return table_names_js_1.DEFAULT_SCHEDULER_RUNS_TABLE; } });
12
+ Object.defineProperty(exports, "OUTBOX_EXCHANGES", { enumerable: true, get: function () { return table_names_js_1.OUTBOX_EXCHANGES; } });
13
+ Object.defineProperty(exports, "SCHEDULER_RUN_STATUSES", { enumerable: true, get: function () { return table_names_js_1.SCHEDULER_RUN_STATUSES; } });
14
+ const mysql_core_1 = require("drizzle-orm/mysql-core");
15
+ /**
16
+ * Drizzle definitions of the infrastructure tables every service may own. Each matches the Knex
17
+ * helper of the same name in `@heavybit/shared-lib/knex` (`outboxColumns`, `processedEventsColumns`,
18
+ * `schedulerRunsColumns`); a test keeps the two in step. Pass a custom name when a service needs one.
19
+ */
20
+ const ms = (name) => (0, mysql_core_1.datetime)(name, { mode: 'date', fsp: 3 });
21
+ const createdNow = (name) => ms(name).notNull().default((0, drizzle_orm_1.sql) `CURRENT_TIMESTAMP(3)`);
22
+ /** Transactional outbox (`event_outbox` by default): domain change and message in one transaction. */
23
+ function outboxTable(name = table_names_js_1.DEFAULT_OUTBOX_TABLE) {
24
+ return (0, mysql_core_1.mysqlTable)(name, {
25
+ id: (0, mysql_core_1.char)('id', { length: 26 }).primaryKey(),
26
+ routingKey: (0, mysql_core_1.varchar)('routing_key', { length: 191 }).notNull(),
27
+ /** Logical exchange: `events` (topic fan-out) or `commands` (direct, one owner). */
28
+ exchange: (0, mysql_core_1.mysqlEnum)('exchange', table_names_js_1.OUTBOX_EXCHANGES).notNull().default('events'),
29
+ payload: (0, mysql_core_1.json)('payload').notNull(),
30
+ /** Correlation id of the request that staged the row; the relay sends it as `x-correlation-id`. */
31
+ correlationId: (0, mysql_core_1.varchar)('correlation_id', { length: 64 }),
32
+ attempts: (0, mysql_core_1.int)('attempts', { unsigned: true }).notNull().default(0),
33
+ lastError: (0, mysql_core_1.varchar)('last_error', { length: 500 }),
34
+ createdAt: createdNow('created_at'),
35
+ publishedAt: ms('published_at'),
36
+ }, (t) => [(0, mysql_core_1.index)(`${name}_published_at_id_index`).on(t.publishedAt, t.id)]);
37
+ }
38
+ /** Consumer idempotency ledger: one row per (consumer, event id). */
39
+ function processedEventsTable(name = table_names_js_1.DEFAULT_PROCESSED_EVENTS_TABLE) {
40
+ return (0, mysql_core_1.mysqlTable)(name, {
41
+ id: (0, mysql_core_1.char)('id', { length: 26 }).primaryKey(),
42
+ consumer: (0, mysql_core_1.varchar)('consumer', { length: 191 }).notNull(),
43
+ eventId: (0, mysql_core_1.varchar)('event_id', { length: 64 }).notNull(),
44
+ processedAt: createdNow('processed_at'),
45
+ }, (t) => [
46
+ (0, mysql_core_1.uniqueIndex)(`${name}_consumer_event_id_unique`).on(t.consumer, t.eventId),
47
+ (0, mysql_core_1.index)(`${name}_processed_at_index`).on(t.processedAt),
48
+ ]);
49
+ }
50
+ /** Scheduled-job runs: one row per (job, run key), so a run is never executed twice. */
51
+ function schedulerRunsTable(name = table_names_js_1.DEFAULT_SCHEDULER_RUNS_TABLE) {
52
+ return (0, mysql_core_1.mysqlTable)(name, {
53
+ id: (0, mysql_core_1.char)('id', { length: 26 }).primaryKey(),
54
+ job: (0, mysql_core_1.varchar)('job', { length: 191 }).notNull(),
55
+ runKey: (0, mysql_core_1.varchar)('run_key', { length: 191 }).notNull(),
56
+ status: (0, mysql_core_1.mysqlEnum)('status', table_names_js_1.SCHEDULER_RUN_STATUSES).notNull().default('running'),
57
+ error: (0, mysql_core_1.varchar)('error', { length: 500 }),
58
+ startedAt: createdNow('started_at'),
59
+ finishedAt: ms('finished_at'),
60
+ }, (t) => [
61
+ (0, mysql_core_1.uniqueIndex)(`${name}_job_run_key_unique`).on(t.job, t.runKey),
62
+ (0, mysql_core_1.index)(`${name}_job_started_at_index`).on(t.job, t.startedAt),
63
+ ]);
64
+ }
65
+ /** `event_outbox` with the default name. */
66
+ exports.outbox = outboxTable();
67
+ /** `processed_events` with the default name. */
68
+ exports.processedEvents = processedEventsTable();
69
+ /** `scheduler_runs` with the default name. */
70
+ exports.schedulerRuns = schedulerRunsTable();
71
+ //# sourceMappingURL=tables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tables.js","sourceRoot":"","sources":["../../../src/database/tables.ts"],"names":[],"mappings":"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"}
@@ -1,63 +1,82 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.requireRole = exports.requireAllPermissions = exports.requirePermission = void 0;
3
+ exports.requireRole = exports.requireOtpVerified = exports.requireAllPermissions = exports.requirePermission = void 0;
4
4
  exports.authenticateFromGateway = authenticateFromGateway;
5
5
  exports.optionalAuthFromGateway = optionalAuthFromGateway;
6
- exports.requireInternalServiceSecret = requireInternalServiceSecret;
7
6
  const index_js_1 = require("../access/index.js");
8
- const crypto_js_1 = require("../common/crypto.js");
9
7
  const response_js_1 = require("../common/response.js");
10
8
  const middleware_js_1 = require("./middleware.js");
11
- const index_js_2 = require("../identity/index.js");
12
- function resolveIdentity(req, options) {
13
- const result = (0, index_js_2.verifyIdentityHeaders)(req.headers, options.secret, { maxSkewMs: options.maxSkewMs });
14
- if (result.status === 'authenticated') {
15
- req.user = result.user;
16
- return 'ok';
17
- }
18
- if (result.status === 'invalid') {
19
- options.logger?.warn('Rejected forged or stale gateway identity', { reason: result.reason, path: req.path });
20
- return 'invalid';
21
- }
22
- return 'anonymous';
9
+ const index_js_2 = require("../context/index.js");
10
+ const index_js_3 = require("../identity/index.js");
11
+ /** Collapses the user's scope id lists into the request context's `key → id` map (lists are comma-joined). */
12
+ function contextScopes(user) {
13
+ return Object.fromEntries(Object.entries(user.scopes).filter(([, ids]) => ids.length).map(([key, ids]) => [key, ids.join(',')]));
23
14
  }
15
+ function createResolver(options) {
16
+ const secret = (0, index_js_3.assertGatewaySecret)(options.secret ?? process.env.GATEWAY_SIGNING_SECRET);
17
+ const reject = (req, reason) => {
18
+ const event = { reason, method: req.method, path: (0, index_js_3.canonicalPath)(req.originalUrl), requestId: (0, middleware_js_1.correlationId)(req) };
19
+ options.logger?.warn('Rejected gateway identity', { reason, method: event.method, path: event.path });
20
+ if (!options.onRejected)
21
+ return;
22
+ Promise.resolve()
23
+ .then(() => options.onRejected?.(event, req))
24
+ .catch((error) => options.logger?.error('Identity onRejected hook failed', { error: error.message }));
25
+ };
26
+ return (req) => {
27
+ const result = (0, index_js_3.verifyGatewayIdentity)({
28
+ headers: req.headers, method: req.method, path: req.originalUrl, secret, protocol: options.protocol,
29
+ maxAgeMs: options.maxAgeMs, maxFutureMs: options.maxFutureMs,
30
+ });
31
+ if (result.status === 'authenticated') {
32
+ req.user = result.user;
33
+ (0, index_js_2.updateRequestContext)({ userId: result.user.id, scopes: contextScopes(result.user) });
34
+ return 'ok';
35
+ }
36
+ if (result.status === 'invalid')
37
+ reject(req, result.reason);
38
+ return result.status === 'invalid' ? 'invalid' : 'anonymous';
39
+ };
40
+ }
41
+ const unauthenticated = (req, res, message = 'Authentication required') => res.status(401).json((0, response_js_1.errorBody)('UNAUTHENTICATED', message, { requestId: (0, middleware_js_1.correlationId)(req) }));
24
42
  /**
25
- * Requires a valid gateway-signed identity and sets `req.user`; 401 UNAUTHENTICATED (with `requestId`) otherwise.
43
+ * Requires a valid gateway-signed (v2) identity and sets `req.user`; 401 UNAUTHENTICATED (with `requestId`)
44
+ * otherwise. Also fills the request context's `userId` and `scopes` so log lines carry them.
45
+ * Throws at startup when the secret is missing or shorter than 32 characters.
26
46
  *
27
- * @param options Secret, skew window and logger.
47
+ * @param options Protocol, secret, replay window, logger and rejection hook.
28
48
  * @returns Express middleware.
29
- * @example router.use(authenticateFromGateway({ secret: config.gatewaySecret, logger }));
49
+ * @example router.use(authenticateFromGateway({ protocol, logger, onRejected: publishSecurityEvent }));
30
50
  */
31
51
  function authenticateFromGateway(options) {
52
+ const resolve = createResolver(options);
32
53
  return (req, res, next) => {
33
- if (resolveIdentity(req, options) === 'ok')
54
+ if (resolve(req) === 'ok')
34
55
  return next();
35
- res.status(401).json((0, response_js_1.errorBody)('UNAUTHENTICATED', 'Authentication required', { requestId: (0, middleware_js_1.correlationId)(req) }));
56
+ unauthenticated(req, res);
36
57
  };
37
58
  }
38
59
  /**
39
- * Attaches `req.user` when a valid identity is present and continues anonymously when none is sent.
40
- * A forged or stale identity is still rejected with 401, never downgraded to anonymous.
60
+ * Attaches `req.user` when a valid identity is present and continues anonymously when none is sent,
61
+ * for public routes that personalise. A forged or stale identity is still rejected with 401, never
62
+ * downgraded to anonymous.
41
63
  *
42
- * @param options Secret, skew window and logger.
64
+ * @param options Same as {@link authenticateFromGateway}.
43
65
  * @returns Express middleware.
44
- * @example router.get('/products', optionalAuthFromGateway({ secret }), controller.list);
66
+ * @example router.get('/items', optionalAuthFromGateway({ protocol }), controller.list);
45
67
  */
46
68
  function optionalAuthFromGateway(options) {
69
+ const resolve = createResolver(options);
47
70
  return (req, res, next) => {
48
- if (resolveIdentity(req, options) === 'invalid') {
49
- res.status(401).json((0, response_js_1.errorBody)('UNAUTHENTICATED', 'Invalid identity', { requestId: (0, middleware_js_1.correlationId)(req) }));
50
- return;
51
- }
71
+ if (resolve(req) === 'invalid')
72
+ return unauthenticated(req, res, 'Invalid identity');
52
73
  next();
53
74
  };
54
75
  }
55
76
  function guard(check, message = 'You do not have permission to perform this action') {
56
77
  return (req, res, next) => {
57
- if (!req.user) {
58
- res.status(401).json((0, response_js_1.errorBody)('UNAUTHENTICATED', 'Authentication required', { requestId: (0, middleware_js_1.correlationId)(req) }));
59
- return;
60
- }
78
+ if (!req.user)
79
+ return unauthenticated(req, res);
61
80
  if (!check(req.user)) {
62
81
  res.status(403).json((0, response_js_1.errorBody)('FORBIDDEN', message, { requestId: (0, middleware_js_1.correlationId)(req) }));
63
82
  return;
@@ -67,18 +86,29 @@ function guard(check, message = 'You do not have permission to perform this acti
67
86
  }
68
87
  /**
69
88
  * Allows callers holding any of `permissions` (401 without identity, 403 FORBIDDEN otherwise).
89
+ * A super admin passes every permission guard.
70
90
  *
71
91
  * @example router.post('/refunds', requirePermission('refunds.create'), controller.create);
72
92
  */
73
93
  const requirePermission = (...permissions) => guard((u) => (0, index_js_1.hasPermission)(u, ...permissions));
74
94
  exports.requirePermission = requirePermission;
75
95
  /**
76
- * Allows callers holding every one of `permissions`.
96
+ * Allows callers holding every one of `permissions`. Accepts a list or rest arguments.
77
97
  *
78
98
  * @example router.delete('/x/:id', requireAllPermissions('x.read', 'x.delete'), controller.remove);
79
99
  */
80
- const requireAllPermissions = (...permissions) => guard((u) => (0, index_js_1.hasAllPermissions)(u, ...permissions));
100
+ const requireAllPermissions = (...permissions) => {
101
+ const required = permissions.flat();
102
+ return guard((u) => (0, index_js_1.hasAllPermissions)(u, ...required));
103
+ };
81
104
  exports.requireAllPermissions = requireAllPermissions;
105
+ /**
106
+ * Allows callers whose session passed the one-time-code (second factor) check; 403 FORBIDDEN otherwise.
107
+ *
108
+ * @example router.post('/security/settings', requireOtpVerified(), controller.update);
109
+ */
110
+ const requireOtpVerified = () => guard((u) => u.otpVerified === true, 'One-time code verification is required');
111
+ exports.requireOtpVerified = requireOtpVerified;
82
112
  /**
83
113
  * Allows callers with any of `roles`. Prefer permissions; roles are for coarse gates only.
84
114
  *
@@ -86,20 +116,4 @@ exports.requireAllPermissions = requireAllPermissions;
86
116
  */
87
117
  const requireRole = (...roles) => guard((u) => (0, index_js_1.hasRole)(u, ...roles), 'Insufficient role');
88
118
  exports.requireRole = requireRole;
89
- /**
90
- * Guards `/internal/*` routes: requires the service secret header (constant-time compare);
91
- * 401 UNAUTHENTICATED with `requestId` otherwise.
92
- *
93
- * @param secret The expected `x-internal-service-secret`; an empty secret rejects every call (fail closed).
94
- * @returns Express middleware.
95
- * @example router.use('/internal', requireInternalServiceSecret(config.internalSecret));
96
- */
97
- function requireInternalServiceSecret(secret) {
98
- return (req, res, next) => {
99
- const provided = req.headers[index_js_2.CONTEXT_HEADERS.INTERNAL_SECRET];
100
- if (typeof provided === 'string' && secret && (0, crypto_js_1.safeEqual)(provided, secret))
101
- return next();
102
- res.status(401).json((0, response_js_1.errorBody)('UNAUTHENTICATED', 'Invalid internal service credentials', { requestId: (0, middleware_js_1.correlationId)(req) }));
103
- };
104
- }
105
119
  //# sourceMappingURL=auth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/express/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/express/auth.ts"],"names":[],"mappings":"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"}
@@ -19,4 +19,6 @@ __exportStar(require("./middleware.js"), exports);
19
19
  __exportStar(require("./health.js"), exports);
20
20
  __exportStar(require("./security.js"), exports);
21
21
  __exportStar(require("./respond.js"), exports);
22
+ __exportStar(require("./step-up.js"), exports);
23
+ __exportStar(require("./internal-caller.js"), exports);
22
24
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/express/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAA0B;AAC1B,kDAAgC;AAChC,8CAA4B;AAC5B,gDAA8B;AAC9B,+CAA6B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/express/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAA0B;AAC1B,kDAAgC;AAChC,8CAA4B;AAC5B,gDAA8B;AAC9B,+CAA6B;AAC7B,+CAA6B;AAC7B,uDAAqC"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createInternalCallerGuards = createInternalCallerGuards;
4
+ const response_js_1 = require("../common/response.js");
5
+ const internal_service_auth_js_1 = require("../common/internal-service-auth.js");
6
+ const index_js_1 = require("../identity/index.js");
7
+ const middleware_js_1 = require("./middleware.js");
8
+ const isUnderPrefix = (path, prefix) => path === prefix || path.startsWith(`${prefix}/`);
9
+ /**
10
+ * Builds the internal-caller guard for a service, bound to its internal path prefix and accepted credentials.
11
+ *
12
+ * @param options Path prefix, credentials and logger.
13
+ * @returns `{ requireInternalCaller }`.
14
+ * @throws Error when the prefix is not an absolute path; ConfigError when env credentials are malformed.
15
+ * @example
16
+ * const { requireInternalCaller } = createInternalCallerGuards({ pathPrefix: '/internal', logger });
17
+ * router.get('/internal/records/:id', requireInternalCaller(['alpha-service']), controller.get);
18
+ */
19
+ function createInternalCallerGuards(options) {
20
+ const prefix = options.pathPrefix.replace(/\/+$/, '');
21
+ if (!prefix.startsWith('/'))
22
+ throw new Error('createInternalCallerGuards: pathPrefix must be an absolute path such as /internal');
23
+ const credentials = options.credentials ?? (0, internal_service_auth_js_1.internalServiceAuthConfigFromEnv)().credentials;
24
+ return {
25
+ requireInternalCaller(allowed) {
26
+ if (!allowed.length)
27
+ throw new Error('requireInternalCaller: list at least one caller');
28
+ const callers = [...allowed];
29
+ return (req, res, next) => {
30
+ const path = (0, index_js_1.canonicalPath)(req.originalUrl);
31
+ const requestId = (0, middleware_js_1.correlationId)(req);
32
+ if (!isUnderPrefix(path, prefix)) {
33
+ options.logger?.warn('Internal guard outside the internal prefix', { path });
34
+ res.status(403).json((0, response_js_1.errorBody)('FORBIDDEN', 'Not an internal route', { requestId }));
35
+ return;
36
+ }
37
+ const verdict = (0, internal_service_auth_js_1.verifyInternalCaller)({ headers: req.headers, credentials, allowed: callers });
38
+ if (verdict.ok) {
39
+ req.internalCaller = verdict.caller;
40
+ return next();
41
+ }
42
+ options.logger?.warn('Rejected internal caller', { reason: verdict.reason, caller: verdict.caller, path });
43
+ if (verdict.status === 401) {
44
+ res.status(401).json((0, response_js_1.errorBody)('UNAUTHENTICATED', 'Invalid internal service credentials', { requestId }));
45
+ return;
46
+ }
47
+ res.status(403).json((0, response_js_1.errorBody)('FORBIDDEN', 'This service may not call this route', { requestId }));
48
+ };
49
+ },
50
+ };
51
+ }
52
+ //# sourceMappingURL=internal-caller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal-caller.js","sourceRoot":"","sources":["../../../src/express/internal-caller.ts"],"names":[],"mappings":";;AA8DA,gEA+BC;AAjFD,uDAAkD;AAClD,iFAA4G;AAC5G,mDAAqD;AAErD,mDAAgD;AAkChD,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,MAAc,EAAW,EAAE,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC;AAElH;;;;;;;;;GASG;AACH,SAAgB,0BAA0B,CAAC,OAAmC;IAC5E,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAC;IAClI,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,IAAA,2DAAgC,GAAE,CAAC,WAAW,CAAC;IAE1F,OAAO;QACL,qBAAqB,CAAC,OAAO;YAC3B,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;YACxF,MAAM,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;YAC7B,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;gBACzD,MAAM,IAAI,GAAG,IAAA,wBAAa,EAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBAC5C,MAAM,SAAS,GAAG,IAAA,6BAAa,EAAC,GAAG,CAAC,CAAC;gBACrC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;oBACjC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,4CAA4C,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC7E,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAA,uBAAS,EAAC,WAAW,EAAE,uBAAuB,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;oBACrF,OAAO;gBACT,CAAC;gBACD,MAAM,OAAO,GAAG,IAAA,+CAAoB,EAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC9F,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;oBACf,GAAG,CAAC,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;oBACpC,OAAO,IAAI,EAAE,CAAC;gBAChB,CAAC;gBACD,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,0BAA0B,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC3G,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBAC3B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAA,uBAAS,EAAC,iBAAiB,EAAE,sCAAsC,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;oBAC1G,OAAO;gBACT,CAAC;gBACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAA,uBAAS,EAAC,WAAW,EAAE,sCAAsC,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;YACtG,CAAC,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createStepUpGuards = createStepUpGuards;
4
+ const response_js_1 = require("../common/response.js");
5
+ const step_up_js_1 = require("../identity/step-up.js");
6
+ const middleware_js_1 = require("./middleware.js");
7
+ /**
8
+ * Builds the step-up guard for an app's catalogue. Must run after `authenticateFromGateway`, which sets
9
+ * `req.user.stepUpAt` only from the signed `x-step-up-at` header. Single-use proofs are consumed by the
10
+ * gateway; the service sees only the verified time. Throws at startup for an unknown scope or a bad window.
11
+ *
12
+ * @param options Catalogue, freshness window and clock.
13
+ * @returns `requireStepUp(scope, route?)` and `declaredStepUpRoutes()`.
14
+ * @example
15
+ * const { requireStepUp } = createStepUpGuards({ catalogue: stepUpScopes });
16
+ * router.post('/refunds/:id', requirePermission('refunds.create'), requireStepUp('refund-large', 'POST /refunds/:id'), controller.refund);
17
+ */
18
+ function createStepUpGuards(options) {
19
+ const windowMs = options.windowMs ?? step_up_js_1.DEFAULT_STEP_UP_WINDOW_MS;
20
+ if (!Number.isFinite(windowMs) || windowMs <= 0)
21
+ throw new Error(`createStepUpGuards: windowMs must be positive (got ${windowMs})`);
22
+ const now = options.now ?? Date.now;
23
+ const declared = [];
24
+ const requireStepUp = (scope, route) => {
25
+ const rules = options.catalogue[scope];
26
+ if (!rules)
27
+ throw new Error(`requireStepUp: unknown step-up scope "${scope}"`);
28
+ declared.push({ scope, singleUse: rules.singleUse === true, ...(route ? { route } : {}) });
29
+ return (req, res, next) => {
30
+ if (!req.user) {
31
+ res.status(401).json((0, response_js_1.errorBody)('UNAUTHENTICATED', 'Authentication required', { requestId: (0, middleware_js_1.correlationId)(req) }));
32
+ return;
33
+ }
34
+ if ((0, step_up_js_1.stepUpStatus)(req.user.stepUpAt, windowMs, now()) === 'fresh')
35
+ return next();
36
+ res.status(403).json({ ...(0, response_js_1.errorBody)(step_up_js_1.STEP_UP_REQUIRED_CODE, 'Please confirm it is you to continue', { requestId: (0, middleware_js_1.correlationId)(req) }), scope });
37
+ };
38
+ };
39
+ return { requireStepUp, declaredStepUpRoutes: () => declared.map((entry) => ({ ...entry })) };
40
+ }
41
+ //# sourceMappingURL=step-up.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-up.js","sourceRoot":"","sources":["../../../src/express/step-up.ts"],"names":[],"mappings":";;AA4CA,gDAqBC;AAhED,uDAAkD;AAClD,uDAEgC;AAChC,mDAAgD;AA4BhD;;;;;;;;;;GAUG;AACH,SAAgB,kBAAkB,CAAmB,OAA8B;IACjF,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,sCAAyB,CAAC;IAC/D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sDAAsD,QAAQ,GAAG,CAAC,CAAC;IACpI,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACpC,MAAM,QAAQ,GAAkC,EAAE,CAAC;IAEnD,MAAM,aAAa,GAAG,CAAC,KAAQ,EAAE,KAAc,EAAkB,EAAE;QACjE,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,KAAK,GAAG,CAAC,CAAC;QAC/E,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3F,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;YACzD,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBACd,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAA,uBAAS,EAAC,iBAAiB,EAAE,yBAAyB,EAAE,EAAE,SAAS,EAAE,IAAA,6BAAa,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBACjH,OAAO;YACT,CAAC;YACD,IAAI,IAAA,yBAAY,EAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO;gBAAE,OAAO,IAAI,EAAE,CAAC;YAChF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,IAAA,uBAAS,EAAC,kCAAqB,EAAE,sCAAsC,EAAE,EAAE,SAAS,EAAE,IAAA,6BAAa,EAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAClJ,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;AAChG,CAAC"}
@@ -14,77 +14,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.createServiceClient = createServiceClient;
18
- const errors_js_1 = require("../common/errors.js");
19
- const async_js_1 = require("../common/async.js");
20
- const index_js_1 = require("../identity/index.js");
21
- const index_js_2 = require("../logging/index.js");
22
- __exportStar(require("./safe-fetch.js"), exports);
23
- const RETRYABLE_STATUS = new Set([502, 503, 504]);
24
- const IDEMPOTENT = new Set(['GET', 'PUT', 'DELETE']);
25
17
  /**
26
- * Typed client for `/internal/*` calls between services. Unwraps the `{ success, data }`
27
- * envelope, maps upstream errors to AppErrors with the same status, and turns network failures
28
- * and timeouts into 503s.
18
+ * Outbound HTTP helpers. Service-to-service calls use `createInternalClient` (root export); calls to
19
+ * tenant-supplied URLs go through the SSRF-guarded {@link createSafeFetcher}.
29
20
  */
30
- function createServiceClient(options) {
31
- const logger = options.logger ?? index_js_2.silentLogger;
32
- const base = options.baseUrl.replace(/\/+$/, '');
33
- async function request(method, path, opts = {}) {
34
- const url = new URL(base + path);
35
- for (const [key, value] of Object.entries(opts.query ?? {}))
36
- if (value !== undefined)
37
- url.searchParams.set(key, String(value));
38
- const retries = IDEMPOTENT.has(method) ? options.retries ?? 2 : 0;
39
- for (let attempt = 0;; attempt += 1) {
40
- const controller = new AbortController();
41
- const timer = setTimeout(() => controller.abort(), opts.timeoutMs ?? options.timeoutMs ?? 5000);
42
- try {
43
- const response = await fetch(url, {
44
- method,
45
- signal: controller.signal,
46
- headers: {
47
- accept: 'application/json',
48
- ...(opts.body !== undefined ? { 'content-type': 'application/json' } : {}),
49
- [index_js_1.CONTEXT_HEADERS.INTERNAL_SECRET]: options.internalSecret,
50
- [index_js_1.CONTEXT_HEADERS.CALLER_SERVICE]: options.callerService,
51
- ...(opts.correlationId ? { [index_js_1.CONTEXT_HEADERS.CORRELATION_ID]: opts.correlationId } : {}),
52
- ...opts.headers,
53
- },
54
- body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined,
55
- });
56
- if (RETRYABLE_STATUS.has(response.status) && attempt < retries) {
57
- await (0, async_js_1.sleep)(200 * 2 ** attempt);
58
- continue;
59
- }
60
- const text = await response.text();
61
- const payload = text ? JSON.parse(text) : { success: response.ok, message: '' };
62
- if (!response.ok) {
63
- throw new errors_js_1.AppError(response.status, payload.message || `Upstream error ${response.status}`, { code: payload.code, errors: payload.errors });
64
- }
65
- return (payload.data ?? payload);
66
- }
67
- catch (error) {
68
- if (error instanceof errors_js_1.AppError)
69
- throw error;
70
- if (attempt < retries) {
71
- await (0, async_js_1.sleep)(200 * 2 ** attempt);
72
- continue;
73
- }
74
- logger.warn('Internal call failed', { method, url: url.pathname, error: error.message });
75
- throw new errors_js_1.ServiceUnavailableError('Upstream service unavailable', { cause: error });
76
- }
77
- finally {
78
- clearTimeout(timer);
79
- }
80
- }
81
- }
82
- return {
83
- get: (path, opts) => request('GET', path, opts),
84
- post: (path, opts) => request('POST', path, opts),
85
- put: (path, opts) => request('PUT', path, opts),
86
- patch: (path, opts) => request('PATCH', path, opts),
87
- delete: (path, opts) => request('DELETE', path, opts),
88
- };
89
- }
21
+ __exportStar(require("./safe-fetch.js"), exports);
90
22
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/http/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/http/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;GAGG;AACH,kDAAgC"}