@bgord/bun 1.19.13 → 1.19.14

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 (245) hide show
  1. package/dist/ab-hono-noop.middleware.d.ts +2 -3
  2. package/dist/ab-hono-noop.middleware.d.ts.map +1 -1
  3. package/dist/ab-hono-noop.middleware.js +4 -9
  4. package/dist/ab-hono-noop.middleware.js.map +1 -1
  5. package/dist/ab-variant-name.vo.d.ts +9 -0
  6. package/dist/ab-variant-name.vo.d.ts.map +1 -0
  7. package/dist/ab-variant-name.vo.js +10 -0
  8. package/dist/ab-variant-name.vo.js.map +1 -0
  9. package/dist/ab-variant.vo.d.ts +2 -1
  10. package/dist/ab-variant.vo.d.ts.map +1 -1
  11. package/dist/ab-variant.vo.js.map +1 -1
  12. package/dist/basic-auth-password.vo.d.ts +2 -1
  13. package/dist/basic-auth-password.vo.d.ts.map +1 -1
  14. package/dist/basic-auth-password.vo.js +2 -1
  15. package/dist/basic-auth-password.vo.js.map +1 -1
  16. package/dist/basic-auth-username.vo.d.ts +2 -1
  17. package/dist/basic-auth-username.vo.d.ts.map +1 -1
  18. package/dist/basic-auth-username.vo.js +2 -1
  19. package/dist/basic-auth-username.vo.js.map +1 -1
  20. package/dist/cache-repository-redis.adapter.d.ts +1 -2
  21. package/dist/cache-repository-redis.adapter.d.ts.map +1 -1
  22. package/dist/cache-repository-redis.adapter.js.map +1 -1
  23. package/dist/certificate-inspector-noop.adapter.d.ts +2 -1
  24. package/dist/certificate-inspector-noop.adapter.d.ts.map +1 -1
  25. package/dist/certificate-inspector-noop.adapter.js.map +1 -1
  26. package/dist/certificate-inspector-tls.adapter.d.ts +2 -1
  27. package/dist/certificate-inspector-tls.adapter.d.ts.map +1 -1
  28. package/dist/certificate-inspector-tls.adapter.js.map +1 -1
  29. package/dist/certificate-inspector.port.d.ts +2 -1
  30. package/dist/certificate-inspector.port.d.ts.map +1 -1
  31. package/dist/csv-stringifier.adapter.d.ts.map +1 -1
  32. package/dist/csv-stringifier.adapter.js +1 -0
  33. package/dist/csv-stringifier.adapter.js.map +1 -1
  34. package/dist/environment-loader-encrypted.adapter.d.ts +1 -1
  35. package/dist/environment-loader-encrypted.adapter.d.ts.map +1 -1
  36. package/dist/environment-loader-encrypted.adapter.js +5 -7
  37. package/dist/environment-loader-encrypted.adapter.js.map +1 -1
  38. package/dist/environment-loader-noop.adapter.d.ts +1 -1
  39. package/dist/environment-loader-noop.adapter.d.ts.map +1 -1
  40. package/dist/environment-loader-noop.adapter.js +5 -7
  41. package/dist/environment-loader-noop.adapter.js.map +1 -1
  42. package/dist/environment-loader-process-safe.adapter.d.ts +1 -1
  43. package/dist/environment-loader-process-safe.adapter.d.ts.map +1 -1
  44. package/dist/environment-loader-process-safe.adapter.js +2 -9
  45. package/dist/environment-loader-process-safe.adapter.js.map +1 -1
  46. package/dist/environment-loader-process.adapter.d.ts +1 -1
  47. package/dist/environment-loader-process.adapter.d.ts.map +1 -1
  48. package/dist/environment-loader-process.adapter.js +5 -7
  49. package/dist/environment-loader-process.adapter.js.map +1 -1
  50. package/dist/environment-loader.port.d.ts +0 -3
  51. package/dist/environment-loader.port.d.ts.map +1 -1
  52. package/dist/environment-loader.port.js +1 -1
  53. package/dist/environment-loader.port.js.map +1 -1
  54. package/dist/event-upcaster-chain.adapter.d.ts.map +1 -1
  55. package/dist/event-upcaster-chain.adapter.js +5 -0
  56. package/dist/event-upcaster-chain.adapter.js.map +1 -1
  57. package/dist/event-validator-registry.adapter.d.ts +1 -1
  58. package/dist/event-validator-registry.adapter.d.ts.map +1 -1
  59. package/dist/event-validator-registry.adapter.js +2 -7
  60. package/dist/event-validator-registry.adapter.js.map +1 -1
  61. package/dist/event-validator-registry.port.d.ts +0 -3
  62. package/dist/event-validator-registry.port.d.ts.map +1 -1
  63. package/dist/event-validator-registry.port.js +1 -1
  64. package/dist/event-validator-registry.port.js.map +1 -1
  65. package/dist/file-uploader-hono.middleware.d.ts.map +1 -1
  66. package/dist/file-uploader-hono.middleware.js +4 -13
  67. package/dist/file-uploader-hono.middleware.js.map +1 -1
  68. package/dist/file-uploader.middleware.d.ts.map +1 -1
  69. package/dist/file-uploader.middleware.js +1 -0
  70. package/dist/file-uploader.middleware.js.map +1 -1
  71. package/dist/graceful-shutdown.service.d.ts +8 -4
  72. package/dist/graceful-shutdown.service.d.ts.map +1 -1
  73. package/dist/graceful-shutdown.service.js +27 -26
  74. package/dist/graceful-shutdown.service.js.map +1 -1
  75. package/dist/hostname.vo.d.ts +8 -0
  76. package/dist/hostname.vo.d.ts.map +1 -0
  77. package/dist/hostname.vo.js +9 -0
  78. package/dist/hostname.vo.js.map +1 -0
  79. package/dist/http-logger.middleware.js +1 -1
  80. package/dist/http-logger.middleware.js.map +1 -1
  81. package/dist/image-blur.adapter.d.ts +2 -0
  82. package/dist/image-blur.adapter.d.ts.map +1 -1
  83. package/dist/image-blur.adapter.js +1 -1
  84. package/dist/image-blur.adapter.js.map +1 -1
  85. package/dist/image-compressor.adapter.d.ts +2 -0
  86. package/dist/image-compressor.adapter.d.ts.map +1 -1
  87. package/dist/image-compressor.adapter.js +1 -1
  88. package/dist/image-compressor.adapter.js.map +1 -1
  89. package/dist/image-exif-clear.adapter.d.ts +2 -0
  90. package/dist/image-exif-clear.adapter.d.ts.map +1 -1
  91. package/dist/image-exif-clear.adapter.js +1 -1
  92. package/dist/image-exif-clear.adapter.js.map +1 -1
  93. package/dist/image-formatter.adapter.d.ts +2 -0
  94. package/dist/image-formatter.adapter.d.ts.map +1 -1
  95. package/dist/image-formatter.adapter.js +1 -1
  96. package/dist/image-formatter.adapter.js.map +1 -1
  97. package/dist/image-generator-web-view.adapter.d.ts.map +1 -1
  98. package/dist/image-generator-web-view.adapter.js +1 -0
  99. package/dist/image-generator-web-view.adapter.js.map +1 -1
  100. package/dist/image-grayscale.adapter.d.ts +2 -0
  101. package/dist/image-grayscale.adapter.d.ts.map +1 -1
  102. package/dist/image-grayscale.adapter.js +1 -1
  103. package/dist/image-grayscale.adapter.js.map +1 -1
  104. package/dist/image-processor.adapter.d.ts +2 -0
  105. package/dist/image-processor.adapter.d.ts.map +1 -1
  106. package/dist/image-processor.adapter.js +1 -1
  107. package/dist/image-processor.adapter.js.map +1 -1
  108. package/dist/image-resizer.adapter.d.ts +2 -0
  109. package/dist/image-resizer.adapter.d.ts.map +1 -1
  110. package/dist/image-resizer.adapter.js +1 -1
  111. package/dist/image-resizer.adapter.js.map +1 -1
  112. package/dist/image.types.d.ts +1 -1
  113. package/dist/image.types.d.ts.map +1 -1
  114. package/dist/index.d.ts +2 -0
  115. package/dist/index.d.ts.map +1 -1
  116. package/dist/index.js +2 -0
  117. package/dist/index.js.map +1 -1
  118. package/dist/job-registry.adapter.d.ts +1 -1
  119. package/dist/job-registry.adapter.d.ts.map +1 -1
  120. package/dist/job-registry.adapter.js +2 -7
  121. package/dist/job-registry.adapter.js.map +1 -1
  122. package/dist/job-registry.port.d.ts +0 -3
  123. package/dist/job-registry.port.d.ts.map +1 -1
  124. package/dist/job-registry.port.js +1 -1
  125. package/dist/job-registry.port.js.map +1 -1
  126. package/dist/prerequisite-verifier-binary.adapter.js +1 -1
  127. package/dist/prerequisite-verifier-binary.adapter.js.map +1 -1
  128. package/dist/prerequisite-verifier-dns.adapter.d.ts +2 -1
  129. package/dist/prerequisite-verifier-dns.adapter.d.ts.map +1 -1
  130. package/dist/prerequisite-verifier-dns.adapter.js.map +1 -1
  131. package/dist/prerequisite-verifier-ssl-certificate-expiry.adapter.d.ts +2 -1
  132. package/dist/prerequisite-verifier-ssl-certificate-expiry.adapter.d.ts.map +1 -1
  133. package/dist/prerequisite-verifier-ssl-certificate-expiry.adapter.js.map +1 -1
  134. package/dist/prerequisite-verifier-translations.adapter.js +5 -5
  135. package/dist/prerequisite-verifier-translations.adapter.js.map +1 -1
  136. package/dist/reactive-config-file-json.adapter.d.ts +1 -1
  137. package/dist/reactive-config-file-json.adapter.d.ts.map +1 -1
  138. package/dist/reactive-config-file-json.adapter.js +2 -7
  139. package/dist/reactive-config-file-json.adapter.js.map +1 -1
  140. package/dist/reactive-config-noop.adapter.d.ts +1 -1
  141. package/dist/reactive-config-noop.adapter.d.ts.map +1 -1
  142. package/dist/reactive-config-noop.adapter.js +2 -7
  143. package/dist/reactive-config-noop.adapter.js.map +1 -1
  144. package/dist/reactive-config-with-fallback.adapter.d.ts +1 -1
  145. package/dist/reactive-config-with-fallback.adapter.d.ts.map +1 -1
  146. package/dist/reactive-config-with-fallback.adapter.js +2 -7
  147. package/dist/reactive-config-with-fallback.adapter.js.map +1 -1
  148. package/dist/reactive-config.port.d.ts +0 -3
  149. package/dist/reactive-config.port.d.ts.map +1 -1
  150. package/dist/reactive-config.port.js +1 -1
  151. package/dist/reactive-config.port.js.map +1 -1
  152. package/dist/remote-file-storage-disk.adapter.d.ts +2 -0
  153. package/dist/remote-file-storage-disk.adapter.d.ts.map +1 -1
  154. package/dist/remote-file-storage-disk.adapter.js +1 -1
  155. package/dist/remote-file-storage-disk.adapter.js.map +1 -1
  156. package/dist/shield-api-key.strategy.d.ts.map +1 -1
  157. package/dist/shield-api-key.strategy.js +6 -1
  158. package/dist/shield-api-key.strategy.js.map +1 -1
  159. package/dist/shield-basic-auth.strategy.d.ts.map +1 -1
  160. package/dist/shield-basic-auth.strategy.js +3 -2
  161. package/dist/shield-basic-auth.strategy.js.map +1 -1
  162. package/dist/shield-recaptcha.strategy.js +1 -1
  163. package/dist/shield-recaptcha.strategy.js.map +1 -1
  164. package/dist/sitemap-entry.vo.d.ts +1 -0
  165. package/dist/sitemap-entry.vo.d.ts.map +1 -1
  166. package/dist/sitemap-entry.vo.js +9 -1
  167. package/dist/sitemap-entry.vo.js.map +1 -1
  168. package/dist/standard-schema-validator.service.d.ts +5 -0
  169. package/dist/standard-schema-validator.service.d.ts.map +1 -0
  170. package/dist/standard-schema-validator.service.js +14 -0
  171. package/dist/standard-schema-validator.service.js.map +1 -0
  172. package/dist/subject-application-resolver.vo.d.ts +0 -1
  173. package/dist/subject-application-resolver.vo.d.ts.map +1 -1
  174. package/dist/subject-application-resolver.vo.js +2 -3
  175. package/dist/subject-application-resolver.vo.js.map +1 -1
  176. package/dist/subject-request-resolver.vo.d.ts +0 -1
  177. package/dist/subject-request-resolver.vo.d.ts.map +1 -1
  178. package/dist/subject-request-resolver.vo.js +2 -3
  179. package/dist/subject-request-resolver.vo.js.map +1 -1
  180. package/dist/temporary-file-absolute.adapter.d.ts +2 -0
  181. package/dist/temporary-file-absolute.adapter.d.ts.map +1 -1
  182. package/dist/temporary-file-absolute.adapter.js +1 -1
  183. package/dist/temporary-file-absolute.adapter.js.map +1 -1
  184. package/dist/timing.middleware.d.ts.map +1 -1
  185. package/dist/timing.middleware.js +1 -2
  186. package/dist/timing.middleware.js.map +1 -1
  187. package/dist/woodchopper-sampling-every-nth.strategy.d.ts.map +1 -1
  188. package/dist/woodchopper-sampling-every-nth.strategy.js +1 -3
  189. package/dist/woodchopper-sampling-every-nth.strategy.js.map +1 -1
  190. package/package.json +7 -7
  191. package/readme.md +3 -0
  192. package/src/ab-hono-noop.middleware.ts +2 -13
  193. package/src/ab-variant-name.vo.ts +17 -0
  194. package/src/ab-variant.vo.ts +2 -1
  195. package/src/basic-auth-password.vo.ts +5 -0
  196. package/src/basic-auth-username.vo.ts +5 -0
  197. package/src/cache-repository-redis.adapter.ts +1 -2
  198. package/src/certificate-inspector-noop.adapter.ts +2 -1
  199. package/src/certificate-inspector-tls.adapter.ts +2 -1
  200. package/src/certificate-inspector.port.ts +2 -1
  201. package/src/csv-stringifier.adapter.ts +1 -0
  202. package/src/environment-loader-encrypted.adapter.ts +9 -9
  203. package/src/environment-loader-noop.adapter.ts +9 -9
  204. package/src/environment-loader-process-safe.adapter.ts +8 -11
  205. package/src/environment-loader-process.adapter.ts +9 -9
  206. package/src/environment-loader.port.ts +0 -2
  207. package/src/event-upcaster-chain.adapter.ts +5 -0
  208. package/src/event-validator-registry.adapter.ts +3 -9
  209. package/src/event-validator-registry.port.ts +0 -2
  210. package/src/file-uploader-hono.middleware.ts +3 -17
  211. package/src/file-uploader.middleware.ts +1 -0
  212. package/src/graceful-shutdown.service.ts +27 -28
  213. package/src/hostname.vo.ts +15 -0
  214. package/src/http-logger.middleware.ts +1 -1
  215. package/src/image-blur.adapter.ts +9 -2
  216. package/src/image-compressor.adapter.ts +9 -2
  217. package/src/image-exif-clear.adapter.ts +9 -2
  218. package/src/image-formatter.adapter.ts +5 -1
  219. package/src/image-generator-web-view.adapter.ts +1 -0
  220. package/src/image-grayscale.adapter.ts +9 -2
  221. package/src/image-processor.adapter.ts +5 -1
  222. package/src/image-resizer.adapter.ts +9 -2
  223. package/src/image.types.ts +1 -1
  224. package/src/index.ts +2 -0
  225. package/src/job-registry.adapter.ts +3 -6
  226. package/src/job-registry.port.ts +0 -2
  227. package/src/prerequisite-verifier-binary.adapter.ts +1 -1
  228. package/src/prerequisite-verifier-dns.adapter.ts +2 -1
  229. package/src/prerequisite-verifier-ssl-certificate-expiry.adapter.ts +2 -1
  230. package/src/prerequisite-verifier-translations.adapter.ts +4 -4
  231. package/src/reactive-config-file-json.adapter.ts +3 -9
  232. package/src/reactive-config-noop.adapter.ts +3 -9
  233. package/src/reactive-config-with-fallback.adapter.ts +3 -9
  234. package/src/reactive-config.port.ts +0 -2
  235. package/src/remote-file-storage-disk.adapter.ts +5 -1
  236. package/src/shield-api-key.strategy.ts +7 -1
  237. package/src/shield-basic-auth.strategy.ts +4 -2
  238. package/src/shield-recaptcha.strategy.ts +1 -1
  239. package/src/sitemap-entry.vo.ts +11 -4
  240. package/src/standard-schema-validator.service.ts +15 -0
  241. package/src/subject-application-resolver.vo.ts +2 -6
  242. package/src/subject-request-resolver.vo.ts +2 -6
  243. package/src/temporary-file-absolute.adapter.ts +6 -1
  244. package/src/timing.middleware.ts +1 -3
  245. package/src/woodchopper-sampling-every-nth.strategy.ts +1 -2
@@ -1 +1 @@
1
- {"version":3,"file":"shield-api-key.strategy.d.ts","sourceRoot":"","sources":["../src/shield-api-key.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,MAAM,MAAM,kBAAkB,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC,UAAU,CAAA;CAAE,CAAC;AAE/D,eAAO,MAAM,yBAAyB;IAAK,QAAQ;CAA6B,CAAC;AAEjF,qBAAa,oBAAoB;IAGnB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,MAAM,CAAC,QAAQ,CAAC,WAAW,aAAa;IAExC,YAA6B,MAAM,EAAE,kBAAkB,EAAI;IAE3D,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAE3C;CACF"}
1
+ {"version":3,"file":"shield-api-key.strategy.d.ts","sourceRoot":"","sources":["../src/shield-api-key.strategy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,MAAM,MAAM,kBAAkB,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC,UAAU,CAAA;CAAE,CAAC;AAE/D,eAAO,MAAM,yBAAyB;IAAK,QAAQ;CAA6B,CAAC;AAEjF,qBAAa,oBAAoB;IAGnB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,MAAM,CAAC,QAAQ,CAAC,WAAW,aAAa;IAExC,YAA6B,MAAM,EAAE,kBAAkB,EAAI;IAE3D,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAO3C;CACF"}
@@ -1,3 +1,4 @@
1
+ import { timingSafeEqual } from "node:crypto";
1
2
  export const ShieldApiKeyStrategyError = { Rejected: "shield.api.key.rejected" };
2
3
  export class ShieldApiKeyStrategy {
3
4
  config;
@@ -6,7 +7,11 @@ export class ShieldApiKeyStrategy {
6
7
  this.config = config;
7
8
  }
8
9
  evaluate(context) {
9
- return context.request.header(ShieldApiKeyStrategy.HEADER_NAME) === this.config.API_KEY;
10
+ const header = context.request.header(ShieldApiKeyStrategy.HEADER_NAME);
11
+ const config = this.config.API_KEY;
12
+ if (header?.length !== config.length)
13
+ return false;
14
+ return timingSafeEqual(Buffer.from(header), Buffer.from(config));
10
15
  }
11
16
  }
12
17
  //# sourceMappingURL=shield-api-key.strategy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shield-api-key.strategy.js","sourceRoot":"","sources":["../src/shield-api-key.strategy.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,QAAQ,EAAE,yBAAyB,EAAE,CAAC;AAEjF,MAAM,OAAO,oBAAoB;IAGF,MAAM;IAFnC,MAAM,CAAU,WAAW,GAAG,SAAS,CAAC;IAExC,YAA6B,MAA0B;sBAA1B,MAAM;IAAuB,CAAC;IAE3D,QAAQ,CAAC,OAAyB;QAChC,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IAC1F,CAAC;CACF"}
1
+ {"version":3,"file":"shield-api-key.strategy.js","sourceRoot":"","sources":["../src/shield-api-key.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAM9C,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,QAAQ,EAAE,yBAAyB,EAAE,CAAC;AAEjF,MAAM,OAAO,oBAAoB;IAGF,MAAM;IAFnC,MAAM,CAAU,WAAW,GAAG,SAAS,CAAC;IAExC,YAA6B,MAA0B;sBAA1B,MAAM;IAAuB,CAAC;IAE3D,QAAQ,CAAC,OAAyB;QAChC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;QACxE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QAEnC,IAAI,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAEnD,OAAO,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACnE,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"shield-basic-auth.strategy.d.ts","sourceRoot":"","sources":["../src/shield-basic-auth.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,MAAM,MAAM,qBAAqB,GAAG;IAAE,QAAQ,EAAE,qBAAqB,CAAC;IAAC,QAAQ,EAAE,qBAAqB,CAAA;CAAE,CAAC;AAEzG,eAAO,MAAM,4BAA4B;IAAK,QAAQ;CAAgC,CAAC;AAEvF,qBAAa,uBAAuB;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAnC,YAA6B,MAAM,EAAE,qBAAqB,EAAI;IAE9D,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAe3C;CACF"}
1
+ {"version":3,"file":"shield-basic-auth.strategy.d.ts","sourceRoot":"","sources":["../src/shield-basic-auth.strategy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,MAAM,MAAM,qBAAqB,GAAG;IAAE,QAAQ,EAAE,qBAAqB,CAAC;IAAC,QAAQ,EAAE,qBAAqB,CAAA;CAAE,CAAC;AAEzG,eAAO,MAAM,4BAA4B;IAAK,QAAQ;CAAgC,CAAC;AAEvF,qBAAa,uBAAuB;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAnC,YAA6B,MAAM,EAAE,qBAAqB,EAAI;IAE9D,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAgB3C;CACF"}
@@ -1,3 +1,4 @@
1
+ import { timingSafeEqual } from "node:crypto";
1
2
  export const ShieldBasicAuthStrategyError = { Rejected: "shield.basic.auth.rejected" };
2
3
  export class ShieldBasicAuthStrategy {
3
4
  config;
@@ -11,9 +12,9 @@ export class ShieldBasicAuthStrategy {
11
12
  const [username, password] = credentials.split(":");
12
13
  if (username !== this.config.username)
13
14
  return false;
14
- if (password !== this.config.password)
15
+ if (password?.length !== this.config.password.length)
15
16
  return false;
16
- return true;
17
+ return timingSafeEqual(Buffer.from(password), Buffer.from(this.config.password));
17
18
  }
18
19
  catch {
19
20
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"shield-basic-auth.strategy.js","sourceRoot":"","sources":["../src/shield-basic-auth.strategy.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,QAAQ,EAAE,4BAA4B,EAAE,CAAC;AAEvF,MAAM,OAAO,uBAAuB;IACL,MAAM;IAAnC,YAA6B,MAA6B;sBAA7B,MAAM;IAA0B,CAAC;IAE9D,QAAQ,CAAC,OAAyB;QAChC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAEvD,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;YAE/D,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAEpD,IAAI,QAAQ,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAAE,OAAO,KAAK,CAAC;YACpD,IAAI,QAAQ,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAEpD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"shield-basic-auth.strategy.js","sourceRoot":"","sources":["../src/shield-basic-auth.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAO9C,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,QAAQ,EAAE,4BAA4B,EAAE,CAAC;AAEvF,MAAM,OAAO,uBAAuB;IACL,MAAM;IAAnC,YAA6B,MAA6B;sBAA7B,MAAM;IAA0B,CAAC;IAE9D,QAAQ,CAAC,OAAyB;QAChC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAEvD,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;YAE/D,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAEpD,IAAI,QAAQ,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAEpD,IAAI,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM;gBAAE,OAAO,KAAK,CAAC;YAEnE,OAAO,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
@@ -14,7 +14,7 @@ export class ShieldRecaptchaStrategy {
14
14
  try {
15
15
  const header = context.request.header("x-recaptcha-token");
16
16
  const query = context.request.query()["recaptchaToken"];
17
- const remoteip = context.request.header("x-forwarded-for") ?? "";
17
+ const remoteip = context.request.header("x-forwarded-for")?.split(",")[0] ?? "";
18
18
  const token = header ?? query ?? formToken;
19
19
  if (!token)
20
20
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"shield-recaptcha.strategy.js","sourceRoot":"","sources":["../src/shield-recaptcha.strategy.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,CAAC,MAAM,SAAS,CAAC;AAO7B,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,QAAQ,EAAE,2BAA2B,EAAE,CAAC;AAEtF,MAAM,OAAO,uBAAuB;IAQL,MAAM;IAP3B,MAAM,CAAU,GAAG,GAAG,CAAC,CAAC,KAAK,CACnC,KAAK,CAAC,eAAe,EACrB,iDAAiD,CAClD,CAAC;IAEM,MAAM,CAAU,iBAAiB,GAAG,GAAG,CAAC;IAEhD,YAA6B,MAA6B;sBAA7B,MAAM;IAA0B,CAAC;IAE9D,KAAK,CAAC,QAAQ,CAAC,OAA2C,EAAE,SAAwB;QAClF,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,uBAAuB,CAAC,iBAAiB,CAAC;QAErF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;YAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,gBAAgB,CAAC,CAAC;YACxD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC;YAEjE,MAAM,KAAK,GAAG,MAAM,IAAI,KAAK,IAAI,SAAS,CAAC;YAE3C,IAAI,CAAC,KAAK;gBAAE,OAAO,KAAK,CAAC;YAEzB,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAEjG,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,uBAAuB,CAAC,GAAG,EAAE;gBACxD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;gBAChE,IAAI,EAAE,MAAM;aACb,CAAC,CAAC;YAEH,MAAM,MAAM,GAAoB,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAEtD,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,GAAG,SAAS;gBAAE,OAAO,KAAK,CAAC;YAC9D,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"shield-recaptcha.strategy.js","sourceRoot":"","sources":["../src/shield-recaptcha.strategy.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,CAAC,MAAM,SAAS,CAAC;AAO7B,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,QAAQ,EAAE,2BAA2B,EAAE,CAAC;AAEtF,MAAM,OAAO,uBAAuB;IAQL,MAAM;IAP3B,MAAM,CAAU,GAAG,GAAG,CAAC,CAAC,KAAK,CACnC,KAAK,CAAC,eAAe,EACrB,iDAAiD,CAClD,CAAC;IAEM,MAAM,CAAU,iBAAiB,GAAG,GAAG,CAAC;IAEhD,YAA6B,MAA6B;sBAA7B,MAAM;IAA0B,CAAC;IAE9D,KAAK,CAAC,QAAQ,CAAC,OAA2C,EAAE,SAAwB;QAClF,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,uBAAuB,CAAC,iBAAiB,CAAC;QAErF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;YAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,gBAAgB,CAAC,CAAC;YACxD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAEhF,MAAM,KAAK,GAAG,MAAM,IAAI,KAAK,IAAI,SAAS,CAAC;YAE3C,IAAI,CAAC,KAAK;gBAAE,OAAO,KAAK,CAAC;YAEzB,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAEjG,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,uBAAuB,CAAC,GAAG,EAAE;gBACxD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;gBAChE,IAAI,EAAE,MAAM;aACb,CAAC,CAAC;YAEH,MAAM,MAAM,GAAoB,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAEtD,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,GAAG,SAAS;gBAAE,OAAO,KAAK,CAAC;YAC9D,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
@@ -11,6 +11,7 @@ export type SitemapEntryType = {
11
11
  export declare class SitemapEntry {
12
12
  private readonly entry;
13
13
  constructor(entry: SitemapEntryType);
14
+ private escapeXml;
14
15
  toXml(): string;
15
16
  }
16
17
  //# sourceMappingURL=sitemap-entry.vo.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sitemap-entry.vo.d.ts","sourceRoot":"","sources":["../src/sitemap-entry.vo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,cAAc,CAAC;IACpB,OAAO,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC;IAC7B,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,QAAQ,CAAC,EAAE,mBAAmB,CAAC;CAChC,CAAC;AAEF,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,KAAK;IAAlC,YAA6B,KAAK,EAAE,gBAAgB,EAAI;IAExD,KAAK,IAAI,MAAM,CAWd;CACF"}
1
+ {"version":3,"file":"sitemap-entry.vo.d.ts","sourceRoot":"","sources":["../src/sitemap-entry.vo.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,cAAc,CAAC;IACpB,OAAO,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC;IAC7B,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,QAAQ,CAAC,EAAE,mBAAmB,CAAC;CAChC,CAAC;AAEF,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,KAAK;IAAlC,YAA6B,KAAK,EAAE,gBAAgB,EAAI;IAExD,OAAO,CAAC,SAAS;IASjB,KAAK,IAAI,MAAM,CAQd;CACF"}
@@ -3,11 +3,19 @@ export class SitemapEntry {
3
3
  constructor(entry) {
4
4
  this.entry = entry;
5
5
  }
6
+ escapeXml(str) {
7
+ return str
8
+ .replace(/&/g, "&")
9
+ .replace(/</g, "&lt;")
10
+ .replace(/>/g, "&gt;")
11
+ .replace(/"/g, "&quot;")
12
+ .replace(/'/g, "&apos;");
13
+ }
6
14
  toXml() {
15
+ const loc = `<loc>${this.escapeXml(this.entry.loc)}</loc>`;
7
16
  const lastmod = this.entry.lastmod ? `<lastmod>${this.entry.lastmod}</lastmod>` : "";
8
17
  const changefreq = this.entry.changefreq ? `<changefreq>${this.entry.changefreq}</changefreq>` : "";
9
18
  const priority = this.entry.priority !== undefined ? `<priority>${this.entry.priority.toFixed(1)}</priority>` : "";
10
- const loc = `<loc>${this.entry.loc}</loc>`;
11
19
  return ["<url>", loc, lastmod, changefreq, priority, "</url>"].join("");
12
20
  }
13
21
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sitemap-entry.vo.js","sourceRoot":"","sources":["../src/sitemap-entry.vo.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,YAAY;IACM,KAAK;IAAlC,YAA6B,KAAuB;qBAAvB,KAAK;IAAqB,CAAC;IAExD,KAAK;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QAErF,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,KAAK,CAAC,UAAU,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;QAEpG,MAAM,QAAQ,GACZ,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QAEpG,MAAM,GAAG,GAAG,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC;QAE3C,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC;CACF"}
1
+ {"version":3,"file":"sitemap-entry.vo.js","sourceRoot":"","sources":["../src/sitemap-entry.vo.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,YAAY;IACM,KAAK;IAAlC,YAA6B,KAAuB;qBAAvB,KAAK;IAAqB,CAAC;IAEhD,SAAS,CAAC,GAAW;QAC3B,OAAO,GAAG;aACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;aACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;aACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;aACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;aACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK;QACH,MAAM,GAAG,GAAG,QAAQ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QACrF,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,KAAK,CAAC,UAAU,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;QACpG,MAAM,QAAQ,GACZ,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QAEpG,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ import type { StandardSchemaV1 } from "@standard-schema/spec";
2
+ export declare class StandardSchemaValidator {
3
+ static validate<Output>(schema: StandardSchemaV1<unknown, Output>, raw: unknown): Output;
4
+ }
5
+ //# sourceMappingURL=standard-schema-validator.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standard-schema-validator.service.d.ts","sourceRoot":"","sources":["../src/standard-schema-validator.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAM9D,qBAAa,uBAAuB;IAClC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,GAAG,MAAM,CAMvF;CACF"}
@@ -0,0 +1,14 @@
1
+ const StandardSchemaValidatorError = {
2
+ NoAsyncSchema: "standard.schema.validate.error.no.async.schema",
3
+ };
4
+ export class StandardSchemaValidator {
5
+ static validate(schema, raw) {
6
+ const result = schema["~standard"].validate(raw);
7
+ if (result instanceof Promise)
8
+ throw new Error(StandardSchemaValidatorError.NoAsyncSchema);
9
+ if (result.issues)
10
+ throw new Error(result.issues[0]?.message);
11
+ return result.value;
12
+ }
13
+ }
14
+ //# sourceMappingURL=standard-schema-validator.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standard-schema-validator.service.js","sourceRoot":"","sources":["../src/standard-schema-validator.service.ts"],"names":[],"mappings":"AAEA,MAAM,4BAA4B,GAAG;IACnC,aAAa,EAAE,gDAAgD;CAChE,CAAC;AAEF,MAAM,OAAO,uBAAuB;IAClC,MAAM,CAAC,QAAQ,CAAS,MAAyC,EAAE,GAAY;QAC7E,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAEjD,IAAI,MAAM,YAAY,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,aAAa,CAAC,CAAC;QAC3F,IAAI,MAAM,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC9D,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;CACF"}
@@ -12,7 +12,6 @@ export declare const SubjectApplicationResolverError: {
12
12
  export declare class SubjectApplicationResolver {
13
13
  private readonly segments;
14
14
  private readonly deps;
15
- private readonly SEPARATOR;
16
15
  constructor(segments: ReadonlyArray<SubjectSegmentApplicationStrategy>, deps: Dependencies);
17
16
  resolve(): Promise<{
18
17
  hex: Hash;
@@ -1 +1 @@
1
- {"version":3,"file":"subject-application-resolver.vo.d.ts","sourceRoot":"","sources":["../src/subject-application-resolver.vo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,wCAAwC,CAAC;AAChG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAE7E,KAAK,YAAY,GAAG;IAAE,WAAW,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAEzD,eAAO,MAAM,+BAA+B;IAC1C,UAAU;IACV,eAAe;CAChB,CAAC;AAEF,qBAAa,0BAA0B;IAInC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAO;IAEjC,YACmB,QAAQ,EAAE,aAAa,CAAC,iCAAiC,CAAC,EAC1D,IAAI,EAAE,YAAY,EAIpC;IAEK,OAAO,IAAI,OAAO,CAAC;QAAE,GAAG,EAAE,IAAI,CAAC;QAAC,GAAG,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAA;KAAE,CAAC,CAS9E;CACF"}
1
+ {"version":3,"file":"subject-application-resolver.vo.d.ts","sourceRoot":"","sources":["../src/subject-application-resolver.vo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,wCAAwC,CAAC;AAChG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAE7E,KAAK,YAAY,GAAG;IAAE,WAAW,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAEzD,eAAO,MAAM,+BAA+B;IAC1C,UAAU;IACV,eAAe;CAChB,CAAC;AAEF,qBAAa,0BAA0B;IAEnC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFvB,YACmB,QAAQ,EAAE,aAAa,CAAC,iCAAiC,CAAC,EAC1D,IAAI,EAAE,YAAY,EAIpC;IAEK,OAAO,IAAI,OAAO,CAAC;QAAE,GAAG,EAAE,IAAI,CAAC;QAAC,GAAG,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAA;KAAE,CAAC,CAO9E;CACF"}
@@ -5,7 +5,6 @@ export const SubjectApplicationResolverError = {
5
5
  export class SubjectApplicationResolver {
6
6
  segments;
7
7
  deps;
8
- SEPARATOR = "|";
9
8
  constructor(segments, deps) {
10
9
  this.segments = segments;
11
10
  this.deps = deps;
@@ -15,8 +14,8 @@ export class SubjectApplicationResolver {
15
14
  throw new Error(SubjectApplicationResolverError.TooManySegments);
16
15
  }
17
16
  async resolve() {
18
- const segments = this.segments.map((segment) => segment.create().replaceAll(this.SEPARATOR, encodeURIComponent(this.SEPARATOR)));
19
- const subject = segments.join(this.SEPARATOR);
17
+ const segments = this.segments.map((segment) => segment.create());
18
+ const subject = JSON.stringify(segments);
20
19
  const hex = await this.deps.HashContent.hash(subject);
21
20
  return { hex, raw: segments };
22
21
  }
@@ -1 +1 @@
1
- {"version":3,"file":"subject-application-resolver.vo.js","sourceRoot":"","sources":["../src/subject-application-resolver.vo.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,+BAA+B,GAAG;IAC7C,UAAU,EAAE,iCAAiC;IAC7C,eAAe,EAAE,uCAAuC;CACzD,CAAC;AAEF,MAAM,OAAO,0BAA0B;IAIlB,QAAQ;IACR,IAAI;IAJN,SAAS,GAAG,GAAG,CAAC;IAEjC,YACmB,QAA0D,EAC1D,IAAkB;wBADlB,QAAQ;oBACR,IAAI;QAErB,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,UAAU,CAAC,CAAC;QAC5F,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,eAAe,CAAC,CAAC;IAClG,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAC7C,OAAO,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAChF,CAAC;QACF,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE9C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEtD,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;IAChC,CAAC;CACF"}
1
+ {"version":3,"file":"subject-application-resolver.vo.js","sourceRoot":"","sources":["../src/subject-application-resolver.vo.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,+BAA+B,GAAG;IAC7C,UAAU,EAAE,iCAAiC;IAC7C,eAAe,EAAE,uCAAuC;CACzD,CAAC;AAEF,MAAM,OAAO,0BAA0B;IAElB,QAAQ;IACR,IAAI;IAFvB,YACmB,QAA0D,EAC1D,IAAkB;wBADlB,QAAQ;oBACR,IAAI;QAErB,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,UAAU,CAAC,CAAC;QAC5F,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,eAAe,CAAC,CAAC;IAClG,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAEzC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEtD,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;IAChC,CAAC;CACF"}
@@ -12,7 +12,6 @@ export declare const SubjectRequestResolverError: {
12
12
  export declare class SubjectRequestResolver {
13
13
  private readonly segments;
14
14
  private readonly deps;
15
- private readonly SEPARATOR;
16
15
  constructor(segments: ReadonlyArray<SubjectSegmentRequestStrategy>, deps: Dependencies);
17
16
  resolve(context: RequestContext): Promise<{
18
17
  hex: Hash;
@@ -1 +1 @@
1
- {"version":3,"file":"subject-request-resolver.vo.d.ts","sourceRoot":"","sources":["../src/subject-request-resolver.vo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,6BAA6B,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAE5G,KAAK,YAAY,GAAG;IAAE,WAAW,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAEzD,eAAO,MAAM,2BAA2B;IACtC,UAAU;IACV,eAAe;CAChB,CAAC;AAEF,qBAAa,sBAAsB;IAI/B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAO;IAEjC,YACmB,QAAQ,EAAE,aAAa,CAAC,6BAA6B,CAAC,EACtD,IAAI,EAAE,YAAY,EAIpC;IAEK,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,IAAI,CAAC;QAAC,GAAG,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAA;KAAE,CAAC,CASrG;CACF"}
1
+ {"version":3,"file":"subject-request-resolver.vo.d.ts","sourceRoot":"","sources":["../src/subject-request-resolver.vo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,6BAA6B,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAE5G,KAAK,YAAY,GAAG;IAAE,WAAW,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAEzD,eAAO,MAAM,2BAA2B;IACtC,UAAU;IACV,eAAe;CAChB,CAAC;AAEF,qBAAa,sBAAsB;IAE/B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFvB,YACmB,QAAQ,EAAE,aAAa,CAAC,6BAA6B,CAAC,EACtD,IAAI,EAAE,YAAY,EAIpC;IAEK,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,IAAI,CAAC;QAAC,GAAG,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAA;KAAE,CAAC,CAOrG;CACF"}
@@ -5,7 +5,6 @@ export const SubjectRequestResolverError = {
5
5
  export class SubjectRequestResolver {
6
6
  segments;
7
7
  deps;
8
- SEPARATOR = "|";
9
8
  constructor(segments, deps) {
10
9
  this.segments = segments;
11
10
  this.deps = deps;
@@ -15,8 +14,8 @@ export class SubjectRequestResolver {
15
14
  throw new Error(SubjectRequestResolverError.TooManySegments);
16
15
  }
17
16
  async resolve(context) {
18
- const segments = this.segments.map((segment) => segment.create(context).replaceAll(this.SEPARATOR, encodeURIComponent(this.SEPARATOR)));
19
- const subject = segments.join(this.SEPARATOR);
17
+ const segments = this.segments.map((segment) => segment.create(context));
18
+ const subject = JSON.stringify(segments);
20
19
  const hex = await this.deps.HashContent.hash(subject);
21
20
  return { hex, raw: segments };
22
21
  }
@@ -1 +1 @@
1
- {"version":3,"file":"subject-request-resolver.vo.js","sourceRoot":"","sources":["../src/subject-request-resolver.vo.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,UAAU,EAAE,6BAA6B;IACzC,eAAe,EAAE,mCAAmC;CACrD,CAAC;AAEF,MAAM,OAAO,sBAAsB;IAId,QAAQ;IACR,IAAI;IAJN,SAAS,GAAG,GAAG,CAAC;IAEjC,YACmB,QAAsD,EACtD,IAAkB;wBADlB,QAAQ;oBACR,IAAI;QAErB,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC;QACxF,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,eAAe,CAAC,CAAC;IAC9F,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAC7C,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CACvF,CAAC;QACF,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE9C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEtD,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;IAChC,CAAC;CACF"}
1
+ {"version":3,"file":"subject-request-resolver.vo.js","sourceRoot":"","sources":["../src/subject-request-resolver.vo.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,UAAU,EAAE,6BAA6B;IACzC,eAAe,EAAE,mCAAmC;CACrD,CAAC;AAEF,MAAM,OAAO,sBAAsB;IAEd,QAAQ;IACR,IAAI;IAFvB,YACmB,QAAsD,EACtD,IAAkB;wBADlB,QAAQ;oBACR,IAAI;QAErB,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC;QACxF,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,eAAe,CAAC,CAAC;IAC9F,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QACzE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAEzC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEtD,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;IAChC,CAAC;CACF"}
@@ -2,11 +2,13 @@ import * as tools from "@bgord/tools";
2
2
  import type { FileCleanerPort } from "./file-cleaner.port";
3
3
  import type { FileRenamerPort } from "./file-renamer.port";
4
4
  import type { FileWriterPort } from "./file-writer.port";
5
+ import type { NonceProviderPort } from "./nonce-provider.port";
5
6
  import type { TemporaryFilePort } from "./temporary-file.port";
6
7
  type Dependencies = {
7
8
  FileCleaner: FileCleanerPort;
8
9
  FileRenamer: FileRenamerPort;
9
10
  FileWriter: FileWriterPort;
11
+ NonceProvider: NonceProviderPort;
10
12
  };
11
13
  export declare class TemporaryFileAbsoluteAdapter implements TemporaryFilePort {
12
14
  private readonly directory;
@@ -1 +1 @@
1
- {"version":3,"file":"temporary-file-absolute.adapter.d.ts","sourceRoot":"","sources":["../src/temporary-file-absolute.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,KAAK,YAAY,GAAG;IAClB,WAAW,EAAE,eAAe,CAAC;IAC7B,WAAW,EAAE,eAAe,CAAC;IAC7B,UAAU,EAAE,cAAc,CAAC;CAC5B,CAAC;AAEF,qBAAa,4BAA6B,YAAW,iBAAiB;IAElE,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFvB,YACmB,SAAS,EAAE,KAAK,CAAC,yBAAyB,EAC1C,IAAI,EAAE,YAAY,EACjC;IAEE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAcpF;IAEK,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAErD;IAED,IAAI,IAAI,IAAI,KAAK,CAAC,yBAAyB,CAE1C;CACF"}
1
+ {"version":3,"file":"temporary-file-absolute.adapter.d.ts","sourceRoot":"","sources":["../src/temporary-file-absolute.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,KAAK,YAAY,GAAG;IAClB,WAAW,EAAE,eAAe,CAAC;IAC7B,WAAW,EAAE,eAAe,CAAC;IAC7B,UAAU,EAAE,cAAc,CAAC;IAC3B,aAAa,EAAE,iBAAiB,CAAC;CAClC,CAAC;AAEF,qBAAa,4BAA6B,YAAW,iBAAiB;IAElE,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFvB,YACmB,SAAS,EAAE,KAAK,CAAC,yBAAyB,EAC1C,IAAI,EAAE,YAAY,EACjC;IAEE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAiBpF;IAEK,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAErD;IAED,IAAI,IAAI,IAAI,KAAK,CAAC,yBAAyB,CAE1C;CACF"}
@@ -7,7 +7,7 @@ export class TemporaryFileAbsoluteAdapter {
7
7
  this.deps = deps;
8
8
  }
9
9
  async write(filename, content) {
10
- const temporary = tools.FilePathAbsolute.fromPartsSafe(this.directory, filename.withSuffix("-part"));
10
+ const temporary = tools.FilePathAbsolute.fromPartsSafe(this.directory, filename.withSuffix(`-part-${this.deps.NonceProvider.generate()}`));
11
11
  const final = tools.FilePathAbsolute.fromPartsSafe(this.directory, filename);
12
12
  await this.deps.FileWriter.write(temporary.get(), content);
13
13
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"temporary-file-absolute.adapter.js","sourceRoot":"","sources":["../src/temporary-file-absolute.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAYtC,MAAM,OAAO,4BAA4B;IAEpB,SAAS;IACT,IAAI;IAFvB,YACmB,SAA0C,EAC1C,IAAkB;yBADlB,SAAS;oBACT,IAAI;IACpB,CAAC;IAEJ,KAAK,CAAC,KAAK,CAAC,QAAwB,EAAE,OAAa;QACjD,MAAM,SAAS,GAAG,KAAK,CAAC,gBAAgB,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;QACrG,MAAM,KAAK,GAAG,KAAK,CAAC,gBAAgB,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAE7E,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;QAE3D,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC9C,MAAM,KAAK,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,QAAwB;QACpC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrG,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF"}
1
+ {"version":3,"file":"temporary-file-absolute.adapter.js","sourceRoot":"","sources":["../src/temporary-file-absolute.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AActC,MAAM,OAAO,4BAA4B;IAEpB,SAAS;IACT,IAAI;IAFvB,YACmB,SAA0C,EAC1C,IAAkB;yBADlB,SAAS;oBACT,IAAI;IACpB,CAAC;IAEJ,KAAK,CAAC,KAAK,CAAC,QAAwB,EAAE,OAAa;QACjD,MAAM,SAAS,GAAG,KAAK,CAAC,gBAAgB,CAAC,aAAa,CACpD,IAAI,CAAC,SAAS,EACd,QAAQ,CAAC,UAAU,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC,CACnE,CAAC;QACF,MAAM,KAAK,GAAG,KAAK,CAAC,gBAAgB,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAE7E,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;QAE3D,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC9C,MAAM,KAAK,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,QAAwB;QACpC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrG,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"timing.middleware.d.ts","sourceRoot":"","sources":["../src/timing.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG7D,KAAK,YAAY,GAAG;IAAE,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC;AAEzC,qBAAa,gBAAgB;IAGf,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,MAAM,CAAC,QAAQ,CAAC,WAAW,mBAAmB;IAE9C,YAA6B,IAAI,EAAE,YAAY,EAAI;IAE7C,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAUjG;CACF"}
1
+ {"version":3,"file":"timing.middleware.d.ts","sourceRoot":"","sources":["../src/timing.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG7D,KAAK,YAAY,GAAG;IAAE,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC;AAEzC,qBAAa,gBAAgB;IAGf,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,MAAM,CAAC,QAAQ,CAAC,WAAW,mBAAmB;IAE9C,YAA6B,IAAI,EAAE,YAAY,EAAI;IAE7C,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQjG;CACF"}
@@ -6,8 +6,7 @@ export class TimingMiddleware {
6
6
  this.deps = deps;
7
7
  }
8
8
  async measure(context, action) {
9
- const header = context.request.header("accept");
10
- if (header === "text/event-stream")
9
+ if (context.request.header("accept")?.toLowerCase().startsWith("text/event-stream"))
11
10
  return null;
12
11
  const stopwatch = new Stopwatch(this.deps);
13
12
  await action();
@@ -1 +1 @@
1
- {"version":3,"file":"timing.middleware.js","sourceRoot":"","sources":["../src/timing.middleware.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIhD,MAAM,OAAO,gBAAgB;IAGE,IAAI;IAFjC,MAAM,CAAU,WAAW,GAAG,eAAe,CAAC;IAE9C,YAA6B,IAAkB;oBAAlB,IAAI;IAAiB,CAAC;IAEnD,KAAK,CAAC,OAAO,CAAC,OAAuB,EAAE,MAAkC;QACvE,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEhD,IAAI,MAAM,KAAK,mBAAmB;YAAE,OAAO,IAAI,CAAC;QAEhD,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE3C,MAAM,MAAM,EAAE,CAAC;QAEf,OAAO,aAAa,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;IAC5C,CAAC;CACF"}
1
+ {"version":3,"file":"timing.middleware.js","sourceRoot":"","sources":["../src/timing.middleware.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIhD,MAAM,OAAO,gBAAgB;IAGE,IAAI;IAFjC,MAAM,CAAU,WAAW,GAAG,eAAe,CAAC;IAE9C,YAA6B,IAAkB;oBAAlB,IAAI;IAAiB,CAAC;IAEnD,KAAK,CAAC,OAAO,CAAC,OAAuB,EAAE,MAAkC;QACvE,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC;YAAE,OAAO,IAAI,CAAC;QAEjG,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE3C,MAAM,MAAM,EAAE,CAAC;QAEf,OAAO,aAAa,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;IAC5C,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"woodchopper-sampling-every-nth.strategy.d.ts","sourceRoot":"","sources":["../src/woodchopper-sampling-every-nth.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AAEnF,KAAK,MAAM,GAAG;IAAE,CAAC,EAAE,KAAK,CAAC,mBAAmB,CAAA;CAAE,CAAC;AAE/C,qBAAa,2BAA4B,YAAW,2BAA2B;IACjE,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAnC,YAA6B,MAAM,EAAE,MAAM,EAAI;IAE/C,OAAO,CAAC,OAAO,CAAK;IAEpB,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAOnC;CACF"}
1
+ {"version":3,"file":"woodchopper-sampling-every-nth.strategy.d.ts","sourceRoot":"","sources":["../src/woodchopper-sampling-every-nth.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AAEnF,KAAK,MAAM,GAAG;IAAE,CAAC,EAAE,KAAK,CAAC,mBAAmB,CAAA;CAAE,CAAC;AAE/C,qBAAa,2BAA4B,YAAW,2BAA2B;IACjE,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAnC,YAA6B,MAAM,EAAE,MAAM,EAAI;IAE/C,OAAO,CAAC,OAAO,CAAK;IAEpB,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAMnC;CACF"}
@@ -8,9 +8,7 @@ export class WoodchopperSamplingEveryNth {
8
8
  // Stryker disable all
9
9
  this.counter++;
10
10
  // Stryker restore all
11
- if (this.counter % this.config.n !== 0)
12
- return false;
13
- return true;
11
+ return this.counter % this.config.n === 0;
14
12
  }
15
13
  }
16
14
  //# sourceMappingURL=woodchopper-sampling-every-nth.strategy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"woodchopper-sampling-every-nth.strategy.js","sourceRoot":"","sources":["../src/woodchopper-sampling-every-nth.strategy.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,2BAA2B;IACT,MAAM;IAAnC,YAA6B,MAAc;sBAAd,MAAM;IAAW,CAAC;IAEvC,OAAO,GAAG,CAAC,CAAC;IAEpB,MAAM,CAAC,MAAmB;QACxB,sBAAsB;QACtB,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,sBAAsB;QAEtB,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
1
+ {"version":3,"file":"woodchopper-sampling-every-nth.strategy.js","sourceRoot":"","sources":["../src/woodchopper-sampling-every-nth.strategy.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,2BAA2B;IACT,MAAM;IAAnC,YAA6B,MAAc;sBAAd,MAAM;IAAW,CAAC;IAEvC,OAAO,GAAG,CAAC,CAAC;IAEpB,MAAM,CAAC,MAAmB;QACxB,sBAAsB;QACtB,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,sBAAsB;QAEtB,OAAO,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bgord/bun",
3
- "version": "1.19.13",
3
+ "version": "1.19.14",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "author": "Bartosz Gordon",
@@ -20,18 +20,18 @@
20
20
  "build": "bash scripts/package-build.sh"
21
21
  },
22
22
  "devDependencies": {
23
- "@biomejs/biome": "2.5.0",
23
+ "@biomejs/biome": "2.5.1",
24
24
  "@standard-schema/spec": "1.1.0",
25
25
  "@stryker-mutator/core": "9.6.1",
26
26
  "@stryker-mutator/typescript-checker": "9.6.1",
27
27
  "@types/bun": "1.3.14",
28
28
  "@types/nodemailer": "8.0.1",
29
29
  "@types/yazl": "3.3.1",
30
- "better-auth": "1.6.19",
30
+ "better-auth": "1.6.22",
31
31
  "croner": "10.0.1",
32
32
  "cspell": "10.0.1",
33
33
  "csv": "6.6.0",
34
- "fallow": "2.96.0",
34
+ "fallow": "2.103.0",
35
35
  "lefthook": "2.1.9",
36
36
  "lockfile-lint": "5.0.0",
37
37
  "nodemailer": "9.0.1",
@@ -41,13 +41,13 @@
41
41
  "yazl": "3.3.1"
42
42
  },
43
43
  "dependencies": {
44
- "@bgord/tools": "1.5.18",
44
+ "@bgord/tools": "1.5.19",
45
45
  "emittery": "2.0.0",
46
- "hono": "4.12.25",
46
+ "hono": "4.12.27",
47
47
  "node-cache": "5.1.2"
48
48
  },
49
49
  "peerDependencies": {
50
- "better-auth": "1.6.19",
50
+ "better-auth": "1.6.22",
51
51
  "csv": "6.6.0",
52
52
  "croner": "10.0.1",
53
53
  "nodemailer": "9.0.1",
package/readme.md CHANGED
@@ -33,6 +33,7 @@ src/
33
33
  ├── ab-assignment.strategy.ts
34
34
  ├── ab-hono-noop.middleware.ts
35
35
  ├── ab-hono.middleware.ts
36
+ ├── ab-variant-name.vo.ts
36
37
  ├── ab-variant-selector.service.ts
37
38
  ├── ab-variant-weight.vo.ts
38
39
  ├── ab-variant.vo.ts
@@ -226,6 +227,7 @@ src/
226
227
  ├── hcaptcha.service.ts
227
228
  ├── healthcheck-hono.handler.ts
228
229
  ├── healthcheck.handler.ts
230
+ ├── hostname.vo.ts
229
231
  ├── http-logger-hono.middleware.ts
230
232
  ├── http-logger.middleware.ts
231
233
  ├── id-provider-crypto.adapter.ts
@@ -577,6 +579,7 @@ src/
577
579
  ├── ssr-bun.service.ts
578
580
  ├── ssr-csp.ts
579
581
  ├── ssr.service.ts
582
+ ├── standard-schema-validator.service.ts
580
583
  ├── static-files-hono.service.ts
581
584
  ├── stopwatch.service.ts
582
585
  ├── subject-application-resolver.vo.ts
@@ -1,24 +1,13 @@
1
1
  import type { MiddlewareHandler } from "hono";
2
- import { AbMiddleware } from "./ab.middleware";
3
- import { AbAssignmentFixedStrategy } from "./ab-assignment-fixed.strategy";
4
2
  import type { AbVariant } from "./ab-variant.vo";
5
- import type { AbVariants } from "./ab-variants.vo";
6
3
  import type { MiddlewareHonoPort } from "./middleware-hono.port";
7
- import { RequestContextHonoAdapter } from "./request-context-hono.adapter";
8
4
 
9
5
  export class AbHonoNoopMiddleware implements MiddlewareHonoPort {
10
- private readonly middleware: AbMiddleware;
11
-
12
- constructor(variants: AbVariants, variant: AbVariant) {
13
- this.middleware = new AbMiddleware(variants, new AbAssignmentFixedStrategy(variant));
14
- }
6
+ constructor(private readonly variant: AbVariant) {}
15
7
 
16
8
  handle(): MiddlewareHandler {
17
9
  return async (c, next) => {
18
- const context = new RequestContextHonoAdapter(c);
19
- const variant = await this.middleware.evaluate(context);
20
-
21
- c.set("abVariant", variant);
10
+ c.set("abVariant", this.variant);
22
11
 
23
12
  return next();
24
13
  };
@@ -0,0 +1,17 @@
1
+ import * as v from "valibot";
2
+
3
+ export const AbVariantNameError = {
4
+ Type: "ab.variant.name.type",
5
+ Empty: "ab.variant.name.empty",
6
+ TooLong: "ab.variant.name.too.long",
7
+ };
8
+
9
+ export const AbVariantName = v.pipe(
10
+ v.string(AbVariantNameError.Type),
11
+ v.minLength(1, AbVariantNameError.Empty),
12
+ v.maxLength(128, AbVariantNameError.TooLong),
13
+ // Stryker disable next-line StringLiteral
14
+ v.brand("AbVariantName"),
15
+ );
16
+
17
+ export type AbVariantNameType = v.InferOutput<typeof AbVariantName>;
@@ -1,6 +1,7 @@
1
+ import type { AbVariantNameType } from "./ab-variant-name.vo";
1
2
  import type { AbVariantWeightType } from "./ab-variant-weight.vo";
2
3
 
3
- type Config = { name: string; weight: AbVariantWeightType };
4
+ type Config = { name: AbVariantNameType; weight: AbVariantWeightType };
4
5
 
5
6
  export class AbVariant {
6
7
  constructor(readonly config: Config) {}
@@ -4,12 +4,17 @@ export const BasicAuthPasswordError = {
4
4
  Type: "basic.auth.password.type",
5
5
  Empty: "basic.auth.password.empty",
6
6
  TooLong: "basic.auth.password.too.long",
7
+ NonLatin: "basic.auth.password.non.latin",
7
8
  };
8
9
 
9
10
  export const BasicAuthPassword = v.pipe(
10
11
  v.string(BasicAuthPasswordError.Type),
11
12
  v.minLength(1, BasicAuthPasswordError.Empty),
12
13
  v.maxLength(128, BasicAuthPasswordError.TooLong),
14
+ v.check(
15
+ (value) => [...value].every((character) => character.charCodeAt(0) < 256),
16
+ BasicAuthPasswordError.NonLatin,
17
+ ),
13
18
  // Stryker disable next-line StringLiteral
14
19
  v.brand("BasicAuthPassword"),
15
20
  );
@@ -4,12 +4,17 @@ export const BasicAuthUsernameError = {
4
4
  Type: "basic.auth.username.type",
5
5
  Empty: "basic.auth.username.empty",
6
6
  TooLong: "basic.auth.username.too.long",
7
+ NonLatin: "basic.auth.username.non.latin",
7
8
  };
8
9
 
9
10
  export const BasicAuthUsername = v.pipe(
10
11
  v.string(BasicAuthUsernameError.Type),
11
12
  v.minLength(1, BasicAuthUsernameError.Empty),
12
13
  v.maxLength(128, BasicAuthUsernameError.TooLong),
14
+ v.check(
15
+ (value) => [...value].every((character) => character.charCodeAt(0) < 256),
16
+ BasicAuthUsernameError.NonLatin,
17
+ ),
13
18
  // Stryker disable next-line StringLiteral
14
19
  v.brand("BasicAuthUsername"),
15
20
  );
@@ -1,11 +1,10 @@
1
1
  // cSpell:ignore setex
2
- import type { RedisClient } from "bun";
3
2
  import type { CacheRepositoryPort, CacheRepositoryTtlType } from "./cache-repository.port";
4
3
  import type { Hash } from "./hash.vo";
5
4
 
6
5
  export class CacheRepositoryRedisAdapter implements CacheRepositoryPort {
7
6
  constructor(
8
- private readonly client: RedisClient,
7
+ private readonly client: Bun.RedisClient,
9
8
  private readonly config: CacheRepositoryTtlType,
10
9
  ) {}
11
10
 
@@ -1,10 +1,11 @@
1
1
  import type * as tools from "@bgord/tools";
2
2
  import type { CertificateInspection, CertificateInspectorPort } from "./certificate-inspector.port";
3
+ import type { HostnameType } from "./hostname.vo";
3
4
 
4
5
  export class CertificateInspectorNoopAdapter implements CertificateInspectorPort {
5
6
  constructor(private readonly remaining: tools.Duration) {}
6
7
 
7
- async inspect(_hostname: string): Promise<CertificateInspection> {
8
+ async inspect(_hostname: HostnameType): Promise<CertificateInspection> {
8
9
  return { success: true, remaining: this.remaining };
9
10
  }
10
11
  }
@@ -2,13 +2,14 @@ import tls from "node:tls";
2
2
  import * as tools from "@bgord/tools";
3
3
  import type { CertificateInspection, CertificateInspectorPort } from "./certificate-inspector.port";
4
4
  import type { ClockPort } from "./clock.port";
5
+ import type { HostnameType } from "./hostname.vo";
5
6
 
6
7
  type Dependencies = { Clock: ClockPort };
7
8
 
8
9
  export class CertificateInspectorTLSAdapter implements CertificateInspectorPort {
9
10
  constructor(private readonly deps: Dependencies) {}
10
11
 
11
- async inspect(hostname: string): Promise<CertificateInspection> {
12
+ async inspect(hostname: HostnameType): Promise<CertificateInspection> {
12
13
  return new Promise((resolve) => {
13
14
  // Stryker disable all
14
15
  const cleanup = (socket: tls.TLSSocket) => socket.destroy();
@@ -1,7 +1,8 @@
1
1
  import type * as tools from "@bgord/tools";
2
+ import type { HostnameType } from "./hostname.vo";
2
3
 
3
4
  export type CertificateInspection = { success: true; remaining: tools.Duration } | { success: false };
4
5
 
5
6
  export interface CertificateInspectorPort {
6
- inspect(hostname: string): Promise<CertificateInspection>;
7
+ inspect(hostname: HostnameType): Promise<CertificateInspection>;
7
8
  }
@@ -24,6 +24,7 @@ export class CsvStringifierAdapter implements CsvStringifierPort {
24
24
  }
25
25
 
26
26
  async process(columns: ReadonlyArray<CsvColumnType>, data: Array<CsvRowType>): Promise<string> {
27
+ // TODO: Potential formula injection
27
28
  return text(this.csv.stringify(data, { header: true, columns }));
28
29
  }
29
30
  }
@@ -1,12 +1,12 @@
1
1
  import util from "node:util";
2
2
  import type * as tools from "@bgord/tools";
3
3
  import type { EncryptionPort } from "./encryption.port";
4
- import {
5
- type EnvironmentLoaderConfig,
6
- EnvironmentLoaderError,
7
- type EnvironmentLoaderPort,
8
- type EnvironmentResultType,
4
+ import type {
5
+ EnvironmentLoaderConfig,
6
+ EnvironmentLoaderPort,
7
+ EnvironmentResultType,
9
8
  } from "./environment-loader.port";
9
+ import { StandardSchemaValidator } from "./standard-schema-validator.service";
10
10
 
11
11
  type Dependencies = { Encryption: EncryptionPort };
12
12
 
@@ -22,9 +22,9 @@ export class EnvironmentLoaderEncryptedAdapter<T extends object> implements Envi
22
22
  const plaintext = new TextDecoder().decode(file);
23
23
  const env = util.parseEnv(plaintext);
24
24
 
25
- const result = this.config.EnvironmentSchema["~standard"].validate(env);
26
- if (result instanceof Promise) throw new Error(EnvironmentLoaderError.NoAsyncSchema);
27
- if (result.issues) throw new Error(result.issues[0]?.message);
28
- return Object.freeze({ ...result.value, type: this.config.type });
25
+ return Object.freeze({
26
+ ...StandardSchemaValidator.validate(this.config.EnvironmentSchema, env),
27
+ type: this.config.type,
28
+ });
29
29
  }
30
30
  }