@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
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cache/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cache/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sensitivePart = exports.HASHED_PART_PREFIX = exports.MAX_PLAIN_KEY_PART_LENGTH = exports.DEFAULT_KEY_ENV = void 0;
4
+ exports.encodeKeyPart = encodeKeyPart;
5
+ exports.createRedisKeyspace = createRedisKeyspace;
6
+ const node_crypto_1 = require("node:crypto");
7
+ const index_js_1 = require("../config/index.js");
8
+ /** Environment segment used outside staging and production when none is given. */
9
+ exports.DEFAULT_KEY_ENV = 'dev';
10
+ /** Parts longer than this are hashed. */
11
+ exports.MAX_PLAIN_KEY_PART_LENGTH = 64;
12
+ /** Marker that starts every hashed part. */
13
+ exports.HASHED_PART_PREFIX = 'h.';
14
+ const SEGMENT_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
15
+ const EMAIL_LIKE = /@/;
16
+ const PHONE_LIKE = /^\+?\d{9,15}$/;
17
+ function assertSegment(kind, value) {
18
+ if (!SEGMENT_PATTERN.test(value))
19
+ throw new index_js_1.ConfigError(`Redis keyspace: invalid ${kind} "${value}" (lower-case kebab-case [a-z0-9-] only)`);
20
+ return value;
21
+ }
22
+ /**
23
+ * Marks a key part as personal data or a secret so the keyspace always hashes it.
24
+ *
25
+ * @param value Raw value (e.g. an email address or a token).
26
+ * @returns A part the keyspace hashes.
27
+ * @example ks.key('otp', sensitivePart(email))
28
+ */
29
+ const sensitivePart = (value) => ({ sensitive: value });
30
+ exports.sensitivePart = sensitivePart;
31
+ /**
32
+ * Percent-encodes a plain key part, including the glob characters SCAN interprets.
33
+ *
34
+ * @param value Part text (non-empty).
35
+ * @returns The encoded part.
36
+ * @throws ConfigError when the part is empty.
37
+ * @example encodeKeyPart('a:b*') // 'a%3Ab%2A'
38
+ */
39
+ function encodeKeyPart(value) {
40
+ if (!value)
41
+ throw new index_js_1.ConfigError('Redis keyspace: key parts must not be empty');
42
+ return encodeURIComponent(value).replace(/[*?[\]!'()]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`);
43
+ }
44
+ function hashValue(value, secret) {
45
+ const digest = secret ? (0, node_crypto_1.createHmac)('sha256', secret).update(value).digest('hex') : (0, node_crypto_1.createHash)('sha256').update(value).digest('hex');
46
+ return `${exports.HASHED_PART_PREFIX}${digest}`;
47
+ }
48
+ function shouldHash(value) {
49
+ return value.length > exports.MAX_PLAIN_KEY_PART_LENGTH || EMAIL_LIKE.test(value) || PHONE_LIKE.test(value) || value.startsWith(exports.HASHED_PART_PREFIX);
50
+ }
51
+ function renderPart(part, secret) {
52
+ if (typeof part === 'object') {
53
+ if (!part.sensitive)
54
+ throw new index_js_1.ConfigError('Redis keyspace: key parts must not be empty');
55
+ return hashValue(part.sensitive, secret);
56
+ }
57
+ const value = String(part);
58
+ return shouldHash(value) ? hashValue(value, secret) : encodeKeyPart(value);
59
+ }
60
+ function resolveEnv(env, nodeEnv) {
61
+ const explicit = env?.trim();
62
+ if (explicit)
63
+ return assertSegment('env', explicit);
64
+ if ((0, index_js_1.isDeployedNodeEnv)(nodeEnv))
65
+ throw new index_js_1.ConfigError(`Redis keyspace: CACHE_KEY_PREFIX must be set when NODE_ENV=${(nodeEnv ?? '').trim()}`);
66
+ return exports.DEFAULT_KEY_ENV;
67
+ }
68
+ /**
69
+ * Creates the keyspace for one service.
70
+ *
71
+ * @param options App slug, service, env segment (`CACHE_KEY_PREFIX`), optional hash secret.
72
+ * @returns A {@link RedisKeyspace}.
73
+ * @throws ConfigError on an invalid segment, or when `env` is missing in staging/production.
74
+ * @example
75
+ * const ks = createRedisKeyspace({ app: 'myapp', service: 'widget-service', env: config.CACHE_KEY_PREFIX });
76
+ * ks.key('widget', widgetId) // 'myapp:prod:widget-service:widget:01J…'
77
+ */
78
+ function createRedisKeyspace(options) {
79
+ const app = assertSegment('app', options.app);
80
+ const service = assertSegment('service', options.service);
81
+ const env = resolveEnv(options.env, options.nodeEnv ?? process.env.NODE_ENV);
82
+ const prefix = `${app}:${env}:${service}:`;
83
+ const secret = options.hashSecret;
84
+ return Object.freeze({
85
+ app,
86
+ env,
87
+ service,
88
+ prefix,
89
+ key(purpose, ...parts) {
90
+ const head = `${prefix}${assertSegment('purpose', purpose)}`;
91
+ return (parts.length ? `${head}:${parts.map((p) => renderPart(p, secret)).join(':')}` : head);
92
+ },
93
+ pattern(purpose, suffix = '*') {
94
+ return `${prefix}${assertSegment('purpose', purpose)}:${suffix}`;
95
+ },
96
+ owns(key) {
97
+ return key.startsWith(prefix) && key.length > prefix.length;
98
+ },
99
+ });
100
+ }
101
+ //# sourceMappingURL=keyspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyspace.js","sourceRoot":"","sources":["../../../src/cache/keyspace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ /**
3
+ * A minimal in-process circuit breaker for outbound calls.
4
+ *
5
+ * Layer: plumbing. States: `closed` (calls flow) → `open` after `failureThreshold` consecutive failures
6
+ * (calls are refused without touching the network) → `half-open` once `resetAfterMs` has passed, when exactly
7
+ * one trial call is let through: success closes the circuit, failure re-opens it for another `resetAfterMs`.
8
+ * State is per instance (per process), so each client owns its breaker; nothing is shared between targets.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.CircuitBreaker = void 0;
12
+ /**
13
+ * Counts consecutive failures and refuses calls while open.
14
+ *
15
+ * @example
16
+ * const breaker = new CircuitBreaker({ failureThreshold: 5, resetAfterMs: 30_000 });
17
+ * if (!breaker.tryAcquire()) throw new TargetUnavailableError();
18
+ * try { const r = await call(); breaker.onSuccess(); return r; } catch (e) { breaker.onFailure(); throw e; }
19
+ */
20
+ class CircuitBreaker {
21
+ failureThreshold;
22
+ resetAfterMs;
23
+ now;
24
+ failures = 0;
25
+ openedAt = 0;
26
+ current = 'closed';
27
+ trialInFlight = false;
28
+ /** @param options Threshold, reset time and clock. @throws Error when a setting is not a positive number. */
29
+ constructor(options = {}) {
30
+ this.failureThreshold = options.failureThreshold ?? 5;
31
+ this.resetAfterMs = options.resetAfterMs ?? 30_000;
32
+ this.now = options.now ?? Date.now;
33
+ if (!(this.failureThreshold >= 1) || !(this.resetAfterMs > 0))
34
+ throw new Error('CircuitBreaker: failureThreshold must be ≥ 1 and resetAfterMs > 0');
35
+ }
36
+ /** The current state (an open circuit whose reset time has passed reports `half-open`). */
37
+ get state() {
38
+ if (this.current === 'open' && this.now() - this.openedAt >= this.resetAfterMs)
39
+ return 'half-open';
40
+ return this.current;
41
+ }
42
+ /**
43
+ * Asks to make a call. While half-open only the first caller gets the trial; the rest are refused until it settles.
44
+ *
45
+ * @returns True when the call may go ahead; the caller must then report {@link onSuccess} or {@link onFailure}.
46
+ */
47
+ tryAcquire() {
48
+ const state = this.state;
49
+ if (state === 'closed')
50
+ return true;
51
+ if (state === 'open' || this.trialInFlight)
52
+ return false;
53
+ this.current = 'half-open';
54
+ this.trialInFlight = true;
55
+ return true;
56
+ }
57
+ /** Records a successful call: closes the circuit and clears the failure count. */
58
+ onSuccess() {
59
+ this.failures = 0;
60
+ this.trialInFlight = false;
61
+ this.current = 'closed';
62
+ }
63
+ /** Records a failed call: a failed trial re-opens at once; otherwise opens after `failureThreshold` in a row. */
64
+ onFailure() {
65
+ this.failures += 1;
66
+ if (this.current === 'half-open' || this.failures >= this.failureThreshold) {
67
+ this.current = 'open';
68
+ this.openedAt = this.now();
69
+ }
70
+ this.trialInFlight = false;
71
+ }
72
+ }
73
+ exports.CircuitBreaker = CircuitBreaker;
74
+ //# sourceMappingURL=circuit-breaker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../../src/common/circuit-breaker.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAeH;;;;;;;GAOG;AACH,MAAa,cAAc;IACR,gBAAgB,CAAS;IACzB,YAAY,CAAS;IACrB,GAAG,CAAe;IAC3B,QAAQ,GAAG,CAAC,CAAC;IACb,QAAQ,GAAG,CAAC,CAAC;IACb,OAAO,GAAiB,QAAQ,CAAC;IACjC,aAAa,GAAG,KAAK,CAAC;IAE9B,6GAA6G;IAC7G,YAAY,UAAiC,EAAE;QAC7C,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,CAAC,CAAC;QACtD,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,MAAM,CAAC;QACnD,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;QACnC,IAAI,CAAC,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACtJ,CAAC;IAED,2FAA2F;IAC3F,IAAI,KAAK;QACP,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO,WAAW,CAAC;QACnG,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACH,UAAU;QACR,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,KAAK,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACpC,IAAI,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,aAAa;YAAE,OAAO,KAAK,CAAC;QACzD,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC;QAC3B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kFAAkF;IAClF,SAAS;QACP,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;IAC1B,CAAC;IAED,iHAAiH;IACjH,SAAS;QACP,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;QACnB,IAAI,IAAI,CAAC,OAAO,KAAK,WAAW,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3E,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;YACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC7B,CAAC;CACF;AArDD,wCAqDC"}
@@ -23,6 +23,10 @@ __exportStar(require("./jwt.js"), exports);
23
23
  __exportStar(require("./text.js"), exports);
24
24
  __exportStar(require("./async.js"), exports);
25
25
  __exportStar(require("./phone.js"), exports);
26
+ __exportStar(require("./money.js"), exports);
26
27
  __exportStar(require("./time.js"), exports);
27
28
  __exportStar(require("./audit.js"), exports);
29
+ __exportStar(require("./circuit-breaker.js"), exports);
30
+ __exportStar(require("./internal-service-auth.js"), exports);
31
+ __exportStar(require("./internal-client.js"), exports);
28
32
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,8CAA4B;AAC5B,gDAA8B;AAC9B,8CAA4B;AAC5B,gDAA8B;AAC9B,2CAAyB;AACzB,4CAA0B;AAC1B,6CAA2B;AAC3B,6CAA2B;AAC3B,4CAA0B;AAC1B,6CAA2B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,8CAA4B;AAC5B,gDAA8B;AAC9B,8CAA4B;AAC5B,gDAA8B;AAC9B,2CAAyB;AACzB,4CAA0B;AAC1B,6CAA2B;AAC3B,6CAA2B;AAC3B,6CAA2B;AAC3B,4CAA0B;AAC1B,6CAA2B;AAC3B,uDAAqC;AACrC,6DAA2C;AAC3C,uDAAqC"}
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeUnavailableError = makeUnavailableError;
4
+ exports.createInternalClient = createInternalClient;
5
+ const async_js_1 = require("./async.js");
6
+ const circuit_breaker_js_1 = require("./circuit-breaker.js");
7
+ const errors_js_1 = require("./errors.js");
8
+ const internal_service_auth_js_1 = require("./internal-service-auth.js");
9
+ const index_js_1 = require("../config/index.js");
10
+ const index_js_2 = require("../context/index.js");
11
+ const index_js_3 = require("../identity/index.js");
12
+ const unavailableClasses = new Map();
13
+ const pascalCase = (value) => value.split(/[^A-Za-z0-9]+/).filter(Boolean).map((part) => part[0].toUpperCase() + part.slice(1)).join('');
14
+ /**
15
+ * Returns the `{Target}UnavailableError` class for a target service (the same class on every call, so
16
+ * `instanceof` works anywhere in the process).
17
+ *
18
+ * @param target The target service name, e.g. `records-service`.
19
+ * @returns A class named e.g. `RecordsServiceUnavailableError`, extending `ServiceUnavailableError` (503).
20
+ * @example
21
+ * const RecordsUnavailable = makeUnavailableError('records-service');
22
+ * try { await records.get('/records/1'); } catch (e) { if (e instanceof RecordsUnavailable) useCachedCopy(); }
23
+ */
24
+ function makeUnavailableError(target) {
25
+ const existing = unavailableClasses.get(target);
26
+ if (existing)
27
+ return existing;
28
+ const TargetUnavailableError = class extends errors_js_1.ServiceUnavailableError {
29
+ target = target;
30
+ constructor(message = `${target} is unavailable`, options = {}) {
31
+ super(message, { cause: options.cause });
32
+ }
33
+ };
34
+ // AppError takes `name` from the constructor, so naming the class names every instance.
35
+ Object.defineProperty(TargetUnavailableError, 'name', { value: `${pascalCase(target)}UnavailableError` });
36
+ unavailableClasses.set(target, TargetUnavailableError);
37
+ return TargetUnavailableError;
38
+ }
39
+ const RETRYABLE_METHODS = new Set(['GET']);
40
+ const RETRYABLE_STATUS = new Set([502, 503, 504]);
41
+ /** Why an attempt counted as unavailable; logged, never sent to the end user. */
42
+ class AttemptFailure extends Error {
43
+ reason;
44
+ retryable;
45
+ constructor(reason, retryable, options) {
46
+ super(reason, options);
47
+ this.reason = reason;
48
+ this.retryable = retryable;
49
+ }
50
+ }
51
+ /**
52
+ * Creates a client for one target service.
53
+ *
54
+ * @param options Target, base URL, caller credential, timeout, retry, breaker and logger settings.
55
+ * @returns An {@link InternalClient}.
56
+ * @throws ConfigError when the caller name or credential is missing.
57
+ * @example
58
+ * // src/clients/records.client.ts
59
+ * const http = createInternalClient({ target: 'records-service', baseUrl: config.RECORDS_INTERNAL_URL, logger });
60
+ * export const getRecord = (id: string) => http.get(`/records/${id}`, { schema: recordSchema });
61
+ */
62
+ function createInternalClient(options) {
63
+ const caller = options.caller ?? (() => {
64
+ const env = (0, internal_service_auth_js_1.internalServiceAuthConfigFromEnv)();
65
+ return { name: env.name, secret: env.credential };
66
+ })();
67
+ if (!caller.name || !caller.secret) {
68
+ throw new index_js_1.ConfigError(`createInternalClient(${options.target}): INTERNAL_SERVICE_NAME and INTERNAL_SERVICE_CREDENTIAL are required`);
69
+ }
70
+ const UnavailableError = makeUnavailableError(options.target);
71
+ const breaker = new circuit_breaker_js_1.CircuitBreaker(options.breaker);
72
+ const doFetch = options.fetch ?? fetch;
73
+ const base = options.baseUrl.replace(/\/+$/, '');
74
+ const backoff = options.backoffMs?.length ? options.backoffMs : [100, 400];
75
+ const buildUrl = (path, query) => {
76
+ const url = new URL(base + (path.startsWith('/') ? path : `/${path}`));
77
+ for (const [key, value] of Object.entries(query ?? {}))
78
+ if (value !== undefined)
79
+ url.searchParams.set(key, String(value));
80
+ return url;
81
+ };
82
+ const buildHeaders = (opts) => {
83
+ const correlationId = opts.correlationId ?? (0, index_js_2.getRequestContext)()?.correlationId;
84
+ return {
85
+ accept: 'application/json',
86
+ ...(opts.body !== undefined ? { 'content-type': 'application/json' } : {}),
87
+ ...opts.identityHeaders,
88
+ ...(correlationId ? { [index_js_3.CONTEXT_HEADERS.CORRELATION_ID]: correlationId } : {}),
89
+ ...(opts.idempotencyKey ? { [index_js_3.CONTEXT_HEADERS.IDEMPOTENCY_KEY]: opts.idempotencyKey } : {}),
90
+ // Last, so nothing passed in can replace the caller's own credential.
91
+ ...(0, internal_service_auth_js_1.internalServiceHeaders)(caller),
92
+ };
93
+ };
94
+ /** One HTTP attempt: resolves with status + body text for any answer below 500, throws AttemptFailure otherwise. */
95
+ const attempt = async (method, url, init, timeoutMs) => {
96
+ const controller = new AbortController();
97
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
98
+ try {
99
+ const response = await doFetch(url, { ...init, method, signal: controller.signal });
100
+ const text = await response.text();
101
+ if (response.status >= 500)
102
+ throw new AttemptFailure(`status ${response.status}`, RETRYABLE_STATUS.has(response.status));
103
+ return { status: response.status, text };
104
+ }
105
+ catch (error) {
106
+ if (error instanceof AttemptFailure)
107
+ throw error;
108
+ throw new AttemptFailure(controller.signal.aborted ? 'timeout' : 'network error', true, { cause: error });
109
+ }
110
+ finally {
111
+ clearTimeout(timer);
112
+ }
113
+ };
114
+ /** Runs attempts with GET-only retries; throws AttemptFailure when the target never answered below 500. */
115
+ const send = async (method, url, init, timeoutMs) => {
116
+ const retries = RETRYABLE_METHODS.has(method) ? options.retries ?? 2 : 0;
117
+ for (let n = 0;; n += 1) {
118
+ try {
119
+ return await attempt(method, url, init, timeoutMs);
120
+ }
121
+ catch (error) {
122
+ const failure = error;
123
+ if (!failure.retryable || n >= retries)
124
+ throw failure;
125
+ await (0, async_js_1.sleep)(backoff[Math.min(n, backoff.length - 1)] ?? 0);
126
+ }
127
+ }
128
+ };
129
+ const unavailable = (method, url, reason, cause) => {
130
+ options.logger?.warn('Internal call unavailable', { target: options.target, method, path: url.pathname, reason });
131
+ return new UnavailableError(`${options.target} unavailable: ${reason}`, { cause });
132
+ };
133
+ async function request(method, path, opts = {}) {
134
+ const url = buildUrl(path, opts.query);
135
+ if (!breaker.tryAcquire())
136
+ throw unavailable(method, url, 'circuit open');
137
+ const init = { headers: buildHeaders(opts), body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined };
138
+ let answer;
139
+ try {
140
+ answer = await send(method, url, init, opts.timeoutMs ?? options.timeoutMs ?? 3000);
141
+ }
142
+ catch (error) {
143
+ breaker.onFailure();
144
+ throw unavailable(method, url, error.reason, error);
145
+ }
146
+ breaker.onSuccess();
147
+ let payload = {};
148
+ try {
149
+ payload = answer.text ? JSON.parse(answer.text) : {};
150
+ }
151
+ catch (error) {
152
+ // A 4xx without a JSON body still maps to a plain AppError below; a 2xx must be readable.
153
+ if (answer.status < 400)
154
+ throw unavailable(method, url, 'unreadable response body', error);
155
+ }
156
+ if (answer.status >= 400) {
157
+ throw new errors_js_1.AppError(answer.status, payload.message || `${options.target} rejected the request`, { code: payload.code, errors: payload.errors });
158
+ }
159
+ if (!opts.schema)
160
+ return payload.data;
161
+ const parsed = opts.schema.safeParse(payload.data);
162
+ if (!parsed.success)
163
+ throw unavailable(method, url, 'response did not match the expected schema', parsed.error);
164
+ return parsed.data;
165
+ }
166
+ return {
167
+ target: options.target,
168
+ UnavailableError,
169
+ get circuitState() { return breaker.state; },
170
+ get: (path, opts) => request('GET', path, opts),
171
+ post: (path, opts) => request('POST', path, opts),
172
+ put: (path, opts) => request('PUT', path, opts),
173
+ patch: (path, opts) => request('PATCH', path, opts),
174
+ delete: (path, opts) => request('DELETE', path, opts),
175
+ };
176
+ }
177
+ //# sourceMappingURL=internal-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal-client.js","sourceRoot":"","sources":["../../../src/common/internal-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ /**
3
+ * Leaf constants for internal-service auth, shared by `common/internal-service-auth` and the `config` env blocks
4
+ * (kept dependency-free so neither module imports the other).
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.SERVICE_NAME_PATTERN = exports.MIN_INTERNAL_CREDENTIAL_LENGTH = void 0;
8
+ /** Shortest internal credential accepted in staging and production. */
9
+ exports.MIN_INTERNAL_CREDENTIAL_LENGTH = 32;
10
+ /** Service names are compose-style: lower-case letters, digits and hyphens, starting with a letter. */
11
+ exports.SERVICE_NAME_PATTERN = /^[a-z][a-z0-9-]{0,62}$/;
12
+ //# sourceMappingURL=internal-constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal-constants.js","sourceRoot":"","sources":["../../../src/common/internal-constants.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,uEAAuE;AAC1D,QAAA,8BAA8B,GAAG,EAAE,CAAC;AACjD,uGAAuG;AAC1F,QAAA,oBAAoB,GAAG,wBAAwB,CAAC"}
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SERVICE_NAME_PATTERN = exports.MIN_INTERNAL_CREDENTIAL_LENGTH = exports.INTERNAL_SERVICE_SECRET_HEADER = exports.INTERNAL_SERVICE_NAME_HEADER = void 0;
4
+ exports.parseInternalServiceCredentials = parseInternalServiceCredentials;
5
+ exports.internalServiceAuthConfigFromEnv = internalServiceAuthConfigFromEnv;
6
+ exports.internalServiceHeaders = internalServiceHeaders;
7
+ exports.assertInternalServiceAuthConfigured = assertInternalServiceAuthConfigured;
8
+ exports.verifyInternalCaller = verifyInternalCaller;
9
+ /**
10
+ * Per-caller service-to-service credentials.
11
+ *
12
+ * Layer: plumbing (no HTTP framework). Key rules:
13
+ * - Every calling service has its **own** secret (`INTERNAL_SERVICE_CREDENTIAL`) and sends it with its name
14
+ * (`INTERNAL_SERVICE_NAME`). A receiving service holds `INTERNAL_SERVICE_CREDENTIALS`, a JSON map of
15
+ * caller name → the secret it accepts from that caller, and each internal route lists the callers it allows.
16
+ * One leaked credential therefore reaches only the routes meant for that one caller.
17
+ * - Secrets are compared in constant time (SHA-256 digests + `timingSafeEqual`, so lengths don't leak) and
18
+ * are never logged or put in error messages.
19
+ * - Staging and production refuse to start without the credentials a service needs
20
+ * ({@link assertInternalServiceAuthConfigured}); development and test may run without them.
21
+ *
22
+ * App-independent: caller names are whatever the app's compose service names are.
23
+ */
24
+ const node_crypto_1 = require("node:crypto");
25
+ const index_js_1 = require("../config/index.js");
26
+ const index_js_2 = require("../identity/index.js");
27
+ const internal_constants_js_1 = require("./internal-constants.js");
28
+ /** Header carrying the calling service's name. */
29
+ exports.INTERNAL_SERVICE_NAME_HEADER = index_js_2.CONTEXT_HEADERS.INTERNAL_SERVICE_NAME;
30
+ /** Header carrying the calling service's own secret. */
31
+ exports.INTERNAL_SERVICE_SECRET_HEADER = index_js_2.CONTEXT_HEADERS.INTERNAL_SECRET;
32
+ var internal_constants_js_2 = require("./internal-constants.js");
33
+ Object.defineProperty(exports, "MIN_INTERNAL_CREDENTIAL_LENGTH", { enumerable: true, get: function () { return internal_constants_js_2.MIN_INTERNAL_CREDENTIAL_LENGTH; } });
34
+ Object.defineProperty(exports, "SERVICE_NAME_PATTERN", { enumerable: true, get: function () { return internal_constants_js_2.SERVICE_NAME_PATTERN; } });
35
+ /** Environments where missing or weak internal credentials stop the service from starting. */
36
+ const STRICT_ENVIRONMENTS = new Set(['staging', 'production']);
37
+ const read = (env, key) => {
38
+ const value = env[key];
39
+ return typeof value === 'string' ? value.trim() : '';
40
+ };
41
+ /**
42
+ * Parses `INTERNAL_SERVICE_CREDENTIALS` (a JSON object of caller name → secret).
43
+ *
44
+ * @param raw The env value; empty or undefined gives `{}`.
45
+ * @returns A frozen map of caller name → secret.
46
+ * @throws ConfigError when the JSON is malformed, not an object, a name is not a valid service name, or a
47
+ * secret is not a non-empty string. The message names the bad key, never a secret.
48
+ * @example parseInternalServiceCredentials('{"alpha-service":"<secret>"}') // { 'alpha-service': '<secret>' }
49
+ */
50
+ function parseInternalServiceCredentials(raw) {
51
+ if (!raw?.trim())
52
+ return Object.freeze({});
53
+ let parsed;
54
+ try {
55
+ parsed = JSON.parse(raw);
56
+ }
57
+ catch {
58
+ throw new index_js_1.ConfigError('INTERNAL_SERVICE_CREDENTIALS must be a JSON object of service name to secret');
59
+ }
60
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
61
+ throw new index_js_1.ConfigError('INTERNAL_SERVICE_CREDENTIALS must be a JSON object of service name to secret');
62
+ }
63
+ const credentials = {};
64
+ for (const [name, secret] of Object.entries(parsed)) {
65
+ if (!internal_constants_js_1.SERVICE_NAME_PATTERN.test(name))
66
+ throw new index_js_1.ConfigError(`INTERNAL_SERVICE_CREDENTIALS has an invalid service name: "${name}"`);
67
+ if (typeof secret !== 'string' || !secret)
68
+ throw new index_js_1.ConfigError(`INTERNAL_SERVICE_CREDENTIALS has an empty or non-string secret for "${name}"`);
69
+ credentials[name] = secret;
70
+ }
71
+ return Object.freeze(credentials);
72
+ }
73
+ /**
74
+ * Reads `INTERNAL_SERVICE_NAME`, `INTERNAL_SERVICE_CREDENTIAL` and `INTERNAL_SERVICE_CREDENTIALS`.
75
+ *
76
+ * @param env process.env (default) or a parsed config object.
77
+ * @returns The settings; missing values are empty.
78
+ * @throws ConfigError when `INTERNAL_SERVICE_CREDENTIALS` is malformed.
79
+ * @example const internalAuth = internalServiceAuthConfigFromEnv();
80
+ */
81
+ function internalServiceAuthConfigFromEnv(env = process.env) {
82
+ return {
83
+ name: read(env, 'INTERNAL_SERVICE_NAME'),
84
+ credential: read(env, 'INTERNAL_SERVICE_CREDENTIAL'),
85
+ credentials: parseInternalServiceCredentials(read(env, 'INTERNAL_SERVICE_CREDENTIALS')),
86
+ };
87
+ }
88
+ /**
89
+ * The headers a service adds to every internal call it makes.
90
+ *
91
+ * @param caller This service's name and secret.
92
+ * @returns `{ 'x-internal-service-name', 'x-internal-service-secret' }`.
93
+ * @example fetch(url, { headers: { ...internalServiceHeaders({ name, secret }) } });
94
+ */
95
+ function internalServiceHeaders(caller) {
96
+ return { [exports.INTERNAL_SERVICE_NAME_HEADER]: caller.name, [exports.INTERNAL_SERVICE_SECRET_HEADER]: caller.secret };
97
+ }
98
+ /**
99
+ * Startup guard. In staging and production it refuses to start when a calling service lacks a valid name or a
100
+ * credential of at least 32 characters, or when a serving service has no accepted callers or any accepted
101
+ * secret shorter than 32 characters. In other environments it only checks that what is set parses.
102
+ *
103
+ * @param options Whether the service calls and/or serves internal routes.
104
+ * @throws ConfigError listing every problem (names only, never secret values).
105
+ * @example assertInternalServiceAuthConfigured({ calls: true, serves: true });
106
+ */
107
+ function assertInternalServiceAuthConfigured(options) {
108
+ const env = options.env ?? process.env;
109
+ const config = internalServiceAuthConfigFromEnv(env);
110
+ if (!STRICT_ENVIRONMENTS.has(options.nodeEnv ?? read(env, 'NODE_ENV')))
111
+ return;
112
+ const problems = [];
113
+ if (options.calls) {
114
+ if (!internal_constants_js_1.SERVICE_NAME_PATTERN.test(config.name))
115
+ problems.push('INTERNAL_SERVICE_NAME is missing or not a valid service name');
116
+ if (config.credential.length < internal_constants_js_1.MIN_INTERNAL_CREDENTIAL_LENGTH) {
117
+ problems.push(`INTERNAL_SERVICE_CREDENTIAL must be at least ${internal_constants_js_1.MIN_INTERNAL_CREDENTIAL_LENGTH} characters`);
118
+ }
119
+ }
120
+ if (options.serves) {
121
+ const callers = Object.keys(config.credentials);
122
+ if (!callers.length)
123
+ problems.push('INTERNAL_SERVICE_CREDENTIALS is empty: no internal caller can authenticate');
124
+ const weak = callers.filter((name) => (config.credentials[name] ?? '').length < internal_constants_js_1.MIN_INTERNAL_CREDENTIAL_LENGTH);
125
+ if (weak.length)
126
+ problems.push(`INTERNAL_SERVICE_CREDENTIALS has secrets shorter than ${internal_constants_js_1.MIN_INTERNAL_CREDENTIAL_LENGTH} characters for: ${weak.join(', ')}`);
127
+ }
128
+ if (problems.length)
129
+ throw new index_js_1.ConfigError(`Refusing to start: ${problems.join('; ')}`);
130
+ }
131
+ const digest = (value) => (0, node_crypto_1.createHash)('sha256').update(value).digest();
132
+ /** A fixed value to compare against when the caller is unknown, so unknown and known callers take the same time. */
133
+ const UNKNOWN_CALLER_DIGEST = digest('unknown-caller');
134
+ const header = (headers, name) => {
135
+ const value = headers[name];
136
+ return typeof value === 'string' ? value : '';
137
+ };
138
+ /**
139
+ * Checks the internal headers against the accepted credentials and the route's caller list.
140
+ * 401 when the name or secret is missing, the name is unknown or the secret is wrong; 403 when a correctly
141
+ * authenticated caller is not in `allowed`.
142
+ *
143
+ * @param input Request headers, accepted credentials and the route's allowed callers.
144
+ * @returns A verdict; the caller name is included when one was sent (safe to log), the secret never is.
145
+ * @example verifyInternalCaller({ headers: req.headers, credentials, allowed: ['alpha-service'] });
146
+ */
147
+ function verifyInternalCaller(input) {
148
+ const caller = header(input.headers, exports.INTERNAL_SERVICE_NAME_HEADER);
149
+ const secret = header(input.headers, exports.INTERNAL_SERVICE_SECRET_HEADER);
150
+ if (!caller || !secret)
151
+ return { ok: false, status: 401, reason: 'missing-credentials', caller: caller || undefined };
152
+ const expected = Object.prototype.hasOwnProperty.call(input.credentials, caller) ? input.credentials[caller] : undefined;
153
+ const matches = (0, node_crypto_1.timingSafeEqual)(digest(secret), expected ? digest(expected) : UNKNOWN_CALLER_DIGEST) && expected !== undefined;
154
+ if (!matches)
155
+ return { ok: false, status: 401, reason: 'invalid-credentials', caller };
156
+ if (!input.allowed.includes(caller))
157
+ return { ok: false, status: 403, reason: 'caller-not-allowed', caller };
158
+ return { ok: true, caller };
159
+ }
160
+ //# sourceMappingURL=internal-service-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal-service-auth.js","sourceRoot":"","sources":["../../../src/common/internal-service-auth.ts"],"names":[],"mappings":"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"}