@bgord/bun 1.20.3 → 1.20.5

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 (41) hide show
  1. package/dist/file-uploader-hono.middleware.d.ts +1 -4
  2. package/dist/file-uploader-hono.middleware.d.ts.map +1 -1
  3. package/dist/file-uploader-hono.middleware.js +4 -6
  4. package/dist/file-uploader-hono.middleware.js.map +1 -1
  5. package/dist/file-uploader.middleware.d.ts +3 -1
  6. package/dist/file-uploader.middleware.d.ts.map +1 -1
  7. package/dist/file-uploader.middleware.js +4 -2
  8. package/dist/file-uploader.middleware.js.map +1 -1
  9. package/dist/request-context-hono.adapter.d.ts +1 -0
  10. package/dist/request-context-hono.adapter.d.ts.map +1 -1
  11. package/dist/request-context-hono.adapter.js +19 -0
  12. package/dist/request-context-hono.adapter.js.map +1 -1
  13. package/dist/request-context.port.d.ts +33 -0
  14. package/dist/request-context.port.d.ts.map +1 -1
  15. package/dist/shield-hcaptcha-hono-local.strategy.d.ts.map +1 -1
  16. package/dist/shield-hcaptcha-hono-local.strategy.js +5 -2
  17. package/dist/shield-hcaptcha-hono-local.strategy.js.map +1 -1
  18. package/dist/shield-hcaptcha-hono.strategy.d.ts.map +1 -1
  19. package/dist/shield-hcaptcha-hono.strategy.js +3 -3
  20. package/dist/shield-hcaptcha-hono.strategy.js.map +1 -1
  21. package/dist/shield-hcaptcha.strategy.d.ts +3 -1
  22. package/dist/shield-hcaptcha.strategy.d.ts.map +1 -1
  23. package/dist/shield-hcaptcha.strategy.js +5 -2
  24. package/dist/shield-hcaptcha.strategy.js.map +1 -1
  25. package/dist/shield-recaptcha-hono.strategy.d.ts.map +1 -1
  26. package/dist/shield-recaptcha-hono.strategy.js +1 -2
  27. package/dist/shield-recaptcha-hono.strategy.js.map +1 -1
  28. package/dist/shield-recaptcha.strategy.d.ts +3 -2
  29. package/dist/shield-recaptcha.strategy.d.ts.map +1 -1
  30. package/dist/shield-recaptcha.strategy.js +4 -1
  31. package/dist/shield-recaptcha.strategy.js.map +1 -1
  32. package/package.json +2 -2
  33. package/src/file-uploader-hono.middleware.ts +5 -5
  34. package/src/file-uploader.middleware.ts +7 -3
  35. package/src/request-context-hono.adapter.ts +20 -0
  36. package/src/request-context.port.ts +24 -0
  37. package/src/shield-hcaptcha-hono-local.strategy.ts +7 -2
  38. package/src/shield-hcaptcha-hono.strategy.ts +3 -3
  39. package/src/shield-hcaptcha.strategy.ts +8 -2
  40. package/src/shield-recaptcha-hono.strategy.ts +1 -2
  41. package/src/shield-recaptcha.strategy.ts +6 -2
@@ -1,11 +1,8 @@
1
1
  import { type FileUploaderConfig } from "./file-uploader.middleware";
2
2
  import type { MiddlewareHonoPort } from "./middleware-hono.port";
3
3
  export declare class FileUploaderHonoMiddleware implements MiddlewareHonoPort {
4
- private readonly config;
5
4
  private readonly middleware;
6
- constructor(config: FileUploaderConfig & {
7
- field: string;
8
- });
5
+ constructor(config: FileUploaderConfig);
9
6
  handle(): import("hono").MiddlewareHandler<any, string, {}, Response>;
10
7
  }
11
8
  //# sourceMappingURL=file-uploader-hono.middleware.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-uploader-hono.middleware.d.ts","sourceRoot":"","sources":["../src/file-uploader-hono.middleware.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,kBAAkB,EAA0B,MAAM,4BAA4B,CAAC;AAC7F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,qBAAa,0BAA2B,YAAW,kBAAkB;IAGvD,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IAEpD,YAA6B,MAAM,EAAE,kBAAkB,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,EAE1E;IAED,MAAM,gEAUL;CACF"}
1
+ {"version":3,"file":"file-uploader-hono.middleware.d.ts","sourceRoot":"","sources":["../src/file-uploader-hono.middleware.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,kBAAkB,EAA0B,MAAM,4BAA4B,CAAC;AAC7F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAGjE,qBAAa,0BAA2B,YAAW,kBAAkB;IACnE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IAEpD,YAAY,MAAM,EAAE,kBAAkB,EAErC;IAED,MAAM,gEASL;CACF"}
@@ -1,18 +1,16 @@
1
1
  import { createMiddleware } from "hono/factory";
2
2
  import { HTTPException } from "hono/http-exception";
3
3
  import { FileUploaderMiddleware } from "./file-uploader.middleware";
4
+ import { RequestContextHonoAdapter } from "./request-context-hono.adapter";
4
5
  export class FileUploaderHonoMiddleware {
5
- config;
6
6
  middleware;
7
7
  constructor(config) {
8
- this.config = config;
9
8
  this.middleware = new FileUploaderMiddleware(config);
10
9
  }
11
10
  handle() {
12
- return createMiddleware(async (context, next) => {
13
- const body = await context.req.raw.clone().formData();
14
- const file = body.get(this.config.field);
15
- const result = this.middleware.validate(file instanceof File ? file : null);
11
+ return createMiddleware(async (c, next) => {
12
+ const context = new RequestContextHonoAdapter(c);
13
+ const result = await this.middleware.validate(context);
16
14
  if (result.valid === false)
17
15
  throw new HTTPException(400, { message: result.error });
18
16
  return next();
@@ -1 +1 @@
1
- {"version":3,"file":"file-uploader-hono.middleware.js","sourceRoot":"","sources":["../src/file-uploader-hono.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAA2B,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAG7F,MAAM,OAAO,0BAA0B;IAGR,MAAM;IAFlB,UAAU,CAAyB;IAEpD,YAA6B,MAA8C;sBAA9C,MAAM;QACjC,IAAI,CAAC,UAAU,GAAG,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC;IAED,MAAM;QACJ,OAAO,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;YAC9C,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC;YACtD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAEzC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAE5E,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK;gBAAE,MAAM,IAAI,aAAa,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACpF,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
1
+ {"version":3,"file":"file-uploader-hono.middleware.js","sourceRoot":"","sources":["../src/file-uploader-hono.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAA2B,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAE7F,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,MAAM,OAAO,0BAA0B;IACpB,UAAU,CAAyB;IAEpD,YAAY,MAA0B;QACpC,IAAI,CAAC,UAAU,GAAG,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC;IAED,MAAM;QACJ,OAAO,gBAAgB,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;YACxC,MAAM,OAAO,GAAG,IAAI,yBAAyB,CAAC,CAAC,CAAC,CAAC;YAEjD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAEvD,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK;gBAAE,MAAM,IAAI,aAAa,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACpF,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -1,7 +1,9 @@
1
1
  import * as tools from "@bgord/tools";
2
+ import type { HasRequestForm } from "./request-context.port";
2
3
  export type FileUploaderConfig = {
3
4
  MimeRegistry: tools.MimeRegistry;
4
5
  maxSize: tools.Size;
6
+ field: string;
5
7
  };
6
8
  export declare const FileUploaderError: {
7
9
  readonly MissingFile: "file.uploader.missing.file";
@@ -19,6 +21,6 @@ export type FileValidationResult = {
19
21
  export declare class FileUploaderMiddleware {
20
22
  private readonly config;
21
23
  constructor(config: FileUploaderConfig);
22
- validate(file: File | null): FileValidationResult;
24
+ validate(context: HasRequestForm): Promise<FileValidationResult>;
23
25
  }
24
26
  //# sourceMappingURL=file-uploader.middleware.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-uploader.middleware.d.ts","sourceRoot":"","sources":["../src/file-uploader.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,MAAM,MAAM,kBAAkB,GAAG;IAAE,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC;IAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAA;CAAE,CAAC;AAE3F,eAAO,MAAM,iBAAiB;aAC5B,WAAW,EAAE,4BAA4B;aACzC,SAAS,EAAE,0BAA0B;aACrC,WAAW,EAAE,4BAA4B;aACzC,SAAS,EAAE,0BAA0B;CAC7B,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,OAAO,iBAAiB,CAAC,CAAC;AAE7F,MAAM,MAAM,oBAAoB,GAAG;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAElG,qBAAa,sBAAsB;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAnC,YAA6B,MAAM,EAAE,kBAAkB,EAAI;IAE3D,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,oBAAoB,CAehD;CACF"}
1
+ {"version":3,"file":"file-uploader.middleware.d.ts","sourceRoot":"","sources":["../src/file-uploader.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,MAAM,kBAAkB,GAAG;IAAE,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC;IAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1G,eAAO,MAAM,iBAAiB;aAC5B,WAAW,EAAE,4BAA4B;aACzC,SAAS,EAAE,0BAA0B;aACrC,WAAW,EAAE,4BAA4B;aACzC,SAAS,EAAE,0BAA0B;CAC7B,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,OAAO,iBAAiB,CAAC,CAAC;AAE7F,MAAM,MAAM,oBAAoB,GAAG;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAElG,qBAAa,sBAAsB;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAnC,YAA6B,MAAM,EAAE,kBAAkB,EAAI;IAErD,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAkBrE;CACF"}
@@ -10,8 +10,10 @@ export class FileUploaderMiddleware {
10
10
  constructor(config) {
11
11
  this.config = config;
12
12
  }
13
- validate(file) {
14
- if (!file)
13
+ async validate(context) {
14
+ const form = await context.request.form();
15
+ const file = form.get(this.config.field);
16
+ if (!(file instanceof File))
15
17
  return { valid: false, error: FileUploaderError.MissingFile };
16
18
  if (file.size === 0)
17
19
  return { valid: false, error: FileUploaderError.EmptyFile };
@@ -1 +1 @@
1
- {"version":3,"file":"file-uploader.middleware.js","sourceRoot":"","sources":["../src/file-uploader.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAItC,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,WAAW,EAAE,4BAA4B;IACzC,SAAS,EAAE,0BAA0B;IACrC,WAAW,EAAE,4BAA4B;IACzC,SAAS,EAAE,0BAA0B;CAC7B,CAAC;AAMX,MAAM,OAAO,sBAAsB;IACJ,MAAM;IAAnC,YAA6B,MAA0B;sBAA1B,MAAM;IAAuB,CAAC;IAE3D,QAAQ,CAAC,IAAiB;QACxB,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,CAAC,WAAW,EAAE,CAAC;QACzE,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,CAAC,SAAS,EAAE,CAAC;QAEjF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7C,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,CAAC,SAAS,EAAE,CAAC;QAEzG,oEAAoE;QACpE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE9C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,CAAC,WAAW,EAAE,CAAC;QAChE,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;CACF"}
1
+ {"version":3,"file":"file-uploader.middleware.js","sourceRoot":"","sources":["../src/file-uploader.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAKtC,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,WAAW,EAAE,4BAA4B;IACzC,SAAS,EAAE,0BAA0B;IACrC,WAAW,EAAE,4BAA4B;IACzC,SAAS,EAAE,0BAA0B;CAC7B,CAAC;AAMX,MAAM,OAAO,sBAAsB;IACJ,MAAM;IAAnC,YAA6B,MAA0B;sBAA1B,MAAM;IAAuB,CAAC;IAE3D,KAAK,CAAC,QAAQ,CAAC,OAAuB;QACpC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEzC,IAAI,CAAC,CAAC,IAAI,YAAY,IAAI,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,CAAC,WAAW,EAAE,CAAC;QAC3F,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,CAAC,SAAS,EAAE,CAAC;QAEjF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7C,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,CAAC,SAAS,EAAE,CAAC;QAEzG,oEAAoE;QACpE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE9C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,CAAC,WAAW,EAAE,CAAC;QAChE,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;CACF"}
@@ -3,6 +3,7 @@ import type { RequestContext } from "./request-context.port";
3
3
  export declare class RequestContextHonoAdapter implements RequestContext {
4
4
  readonly request: RequestContext["request"];
5
5
  readonly identity: RequestContext["identity"];
6
+ readonly middleware: RequestContext["middleware"];
6
7
  constructor(context: Context);
7
8
  }
8
9
  //# sourceMappingURL=request-context-hono.adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"request-context-hono.adapter.d.ts","sourceRoot":"","sources":["../src/request-context-hono.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAGpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,qBAAa,yBAA0B,YAAW,cAAc;IAC9D,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IAE9C,YAAY,OAAO,EAAE,OAAO,EAiD3B;CACF"}
1
+ {"version":3,"file":"request-context-hono.adapter.d.ts","sourceRoot":"","sources":["../src/request-context-hono.adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAGpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,qBAAa,yBAA0B,YAAW,cAAc;IAC9D,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC,YAAY,CAAC,CAAC;IAElD,YAAY,OAAO,EAAE,OAAO,EAmE3B;CACF"}
@@ -1,8 +1,10 @@
1
+ import * as tools from "@bgord/tools";
1
2
  import { getConnInfo } from "hono/bun";
2
3
  import { getCookie } from "hono/cookie";
3
4
  export class RequestContextHonoAdapter {
4
5
  request;
5
6
  identity;
7
+ middleware;
6
8
  constructor(context) {
7
9
  this.request = {
8
10
  path: context.req.path,
@@ -40,6 +42,15 @@ export class RequestContextHonoAdapter {
40
42
  return "";
41
43
  }
42
44
  },
45
+ form: async () => {
46
+ try {
47
+ const request = context.req.raw.clone();
48
+ return await request.formData();
49
+ }
50
+ catch {
51
+ return new FormData();
52
+ }
53
+ },
43
54
  };
44
55
  this.identity = {
45
56
  userId: () => context.get("user")?.id,
@@ -48,6 +59,14 @@ export class RequestContextHonoAdapter {
48
59
  getConnInfo(context).remote.address,
49
60
  ua: () => context.req.header("user-agent"),
50
61
  };
62
+ this.middleware = {
63
+ revision: {
64
+ fromWeakETag: () => tools.Revision.fromWeakETag(context.get("WeakETag")),
65
+ fromETag: () => tools.Revision.fromETag(context.get("ETag")),
66
+ },
67
+ timeZoneOffset: () => context.get("timeZoneOffset"),
68
+ language: () => context.get("language"),
69
+ };
51
70
  }
52
71
  }
53
72
  //# sourceMappingURL=request-context-hono.adapter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"request-context-hono.adapter.js","sourceRoot":"","sources":["../src/request-context-hono.adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,MAAM,OAAO,yBAAyB;IAC3B,OAAO,CAA4B;IACnC,QAAQ,CAA6B;IAE9C,YAAY,OAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG;YACb,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI;YACtB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM;YAC1B,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG;YAC1B,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;YAC1C,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO;YACtC,aAAa,EAAE,GAAG,EAAE;gBAClB,MAAM,OAAO,GAA2B,EAAE,CAAC;gBAE3C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;oBAC7C,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBACvB,CAAC,CAAC,CAAC;gBAEH,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE;YAChC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE;YACjC,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YAChD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;YAC1C,IAAI,EAAE,KAAK,IAAI,EAAE;gBACf,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;oBAExC,OAAO,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;gBAC9B,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC;YACD,IAAI,EAAE,KAAK,IAAI,EAAE;gBACf,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;oBAExC,OAAO,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;gBAC9B,CAAC;gBAAC,MAAM,CAAC;oBACP,0CAA0C;oBAC1C,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC;SACF,CAAC;QAEF,IAAI,CAAC,QAAQ,GAAG;YACd,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE;YACrC,EAAE,EAAE,GAAG,EAAE,CACP,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;gBAC5D,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO;YACrC,EAAE,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC;SAC3C,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"request-context-hono.adapter.js","sourceRoot":"","sources":["../src/request-context-hono.adapter.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type * as tools from "@bgord/tools";
1
2
  import type { UUIDType } from "./uuid.vo";
2
3
  export interface RequestContext {
3
4
  readonly request: {
@@ -11,6 +12,7 @@ export interface RequestContext {
11
12
  cookie(name: string): string | undefined;
12
13
  json(): Promise<Record<string, unknown>>;
13
14
  text(): Promise<string>;
15
+ form(): Promise<FormData>;
14
16
  headers: () => Headers;
15
17
  headersObject: () => Record<string, string>;
16
18
  };
@@ -19,6 +21,14 @@ export interface RequestContext {
19
21
  ip(): string | undefined;
20
22
  ua(): string | undefined;
21
23
  };
24
+ readonly middleware: {
25
+ revision: {
26
+ fromWeakETag(): tools.Revision;
27
+ fromETag(): tools.Revision;
28
+ };
29
+ timeZoneOffset(): tools.Duration;
30
+ language(): tools.LanguageType;
31
+ };
22
32
  }
23
33
  export interface HasRequestUrl {
24
34
  readonly request: {
@@ -80,6 +90,11 @@ export interface HasRequestText {
80
90
  text(): Promise<string>;
81
91
  };
82
92
  }
93
+ export interface HasRequestForm {
94
+ readonly request: {
95
+ form(): Promise<FormData>;
96
+ };
97
+ }
83
98
  export interface HasIdentityUserId {
84
99
  readonly identity: {
85
100
  userId(): UUIDType | undefined;
@@ -95,4 +110,22 @@ export interface HasIdentityUa {
95
110
  ua(): string | undefined;
96
111
  };
97
112
  }
113
+ export interface HasMiddlewareRevision {
114
+ readonly middleware: {
115
+ revision: {
116
+ fromWeakETag(): tools.Revision;
117
+ fromETag(): tools.Revision;
118
+ };
119
+ };
120
+ }
121
+ export interface HasMiddlewareTimeZoneOffset {
122
+ readonly middleware: {
123
+ timeZoneOffset(): tools.Duration;
124
+ };
125
+ }
126
+ export interface HasMiddlewareLanguage {
127
+ readonly middleware: {
128
+ language(): tools.LanguageType;
129
+ };
130
+ }
98
131
  //# sourceMappingURL=request-context.port.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"request-context.port.d.ts","sourceRoot":"","sources":["../src/request-context.port.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,GAAG,IAAI,MAAM,CAAC;QACd,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;QACzC,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;QACxC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;QACzC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QACzC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;QACxB,OAAO,EAAE,MAAM,OAAO,CAAC;QACvB,aAAa,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC7C,CAAC;IAEF,QAAQ,CAAC,QAAQ,EAAE;QACjB,MAAM,IAAI,QAAQ,GAAG,SAAS,CAAC;QAC/B,EAAE,IAAI,MAAM,GAAG,SAAS,CAAC;QACzB,EAAE,IAAI,MAAM,GAAG,SAAS,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE;QAAE,GAAG,IAAI,MAAM,CAAA;KAAE,CAAC;CACrC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/C;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE;QAAE,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;CAChE;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,OAAO,CAAA;KAAE,CAAC;CAC9C;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE;QAAE,aAAa,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;CACnE;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE;QAAE,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;CACvD;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE;QAAE,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;CACxD;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE;QAAE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;CAC/D;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE;QAAE,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;CAChE;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE;QAAE,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;KAAE,CAAC;CAChE;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE;QAAE,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;KAAE,CAAC;CAC/C;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE;QAAE,MAAM,IAAI,QAAQ,GAAG,SAAS,CAAA;KAAE,CAAC;CACvD;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE;QAAE,EAAE,IAAI,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;CACjD;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE;QAAE,EAAE,IAAI,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;CACjD"}
1
+ {"version":3,"file":"request-context.port.d.ts","sourceRoot":"","sources":["../src/request-context.port.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"shield-hcaptcha-hono-local.strategy.d.ts","sourceRoot":"","sources":["../src/shield-hcaptcha-hono-local.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAI9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAGjE,eAAO,MAAM,gCAAgC;IAAK,QAAQ;CAAoC,CAAC;AAE/F,qBAAa,+BAAgC,YAAW,kBAAkB;IACxE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAElD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAGtC;IAEF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAA0C;IAE7E,cAEC;IAED,MAAM,IAAI,iBAAiB,CAK1B;CACF"}
1
+ {"version":3,"file":"shield-hcaptcha-hono-local.strategy.d.ts","sourceRoot":"","sources":["../src/shield-hcaptcha-hono-local.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAI9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAIjE,eAAO,MAAM,gCAAgC;IAAK,QAAQ;CAAoC,CAAC;AAE/F,qBAAa,+BAAgC,YAAW,kBAAkB;IACxE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAElD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAGtC;IAEF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAA0C;IAE7E,cAEC;IAED,MAAM,IAAI,iBAAiB,CAS1B;CACF"}
@@ -1,7 +1,7 @@
1
1
  import { HTTPException } from "hono/http-exception";
2
2
  import * as v from "valibot";
3
3
  import { HCaptchaSecretKey } from "./hcaptcha-secret-key.vo";
4
- import { ShieldHcaptchaStrategy } from "./shield-hcaptcha.strategy";
4
+ import { ShieldHcaptchaStrategy, ShieldHcaptchaStrategyField } from "./shield-hcaptcha.strategy";
5
5
  export const ShieldHcaptchaLocalStrategyError = { Rejected: "shield.hcaptcha.local.rejected" };
6
6
  export class ShieldHcaptchaLocalHonoStrategy {
7
7
  strategy;
@@ -12,7 +12,10 @@ export class ShieldHcaptchaLocalHonoStrategy {
12
12
  }
13
13
  handle() {
14
14
  return async (_c, next) => {
15
- if (await this.strategy.evaluate(ShieldHcaptchaLocalHonoStrategy.TOKEN_LOCAL))
15
+ const form = new FormData();
16
+ form.set(ShieldHcaptchaStrategyField, ShieldHcaptchaLocalHonoStrategy.TOKEN_LOCAL);
17
+ const context = { request: { form: async () => form } };
18
+ if (await this.strategy.evaluate(context))
16
19
  return next();
17
20
  throw new HTTPException(403, { message: ShieldHcaptchaLocalStrategyError.Rejected });
18
21
  };
@@ -1 +1 @@
1
- {"version":3,"file":"shield-hcaptcha-hono-local.strategy.js","sourceRoot":"","sources":["../src/shield-hcaptcha-hono-local.strategy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,CAAC,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,MAAM,CAAC,MAAM,gCAAgC,GAAG,EAAE,QAAQ,EAAE,gCAAgC,EAAE,CAAC;AAE/F,MAAM,OAAO,+BAA+B;IACzB,QAAQ,CAAyB;IAE1C,MAAM,CAAU,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAChD,iBAAiB,EACjB,4CAA4C,CAC7C,CAAC;IAEM,MAAM,CAAU,WAAW,GAAG,sCAAsC,CAAC;IAE7E;QACE,IAAI,CAAC,QAAQ,GAAG,IAAI,sBAAsB,CAAC,+BAA+B,CAAC,gBAAgB,CAAC,CAAC;IAC/F,CAAC;IAED,MAAM;QACJ,OAAO,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;YACxB,IAAI,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,+BAA+B,CAAC,WAAW,CAAC;gBAAE,OAAO,IAAI,EAAE,CAAC;YAC7F,MAAM,IAAI,aAAa,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,gCAAgC,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvF,CAAC,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"shield-hcaptcha-hono-local.strategy.js","sourceRoot":"","sources":["../src/shield-hcaptcha-hono-local.strategy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,CAAC,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAG7D,OAAO,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AAEjG,MAAM,CAAC,MAAM,gCAAgC,GAAG,EAAE,QAAQ,EAAE,gCAAgC,EAAE,CAAC;AAE/F,MAAM,OAAO,+BAA+B;IACzB,QAAQ,CAAyB;IAE1C,MAAM,CAAU,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAChD,iBAAiB,EACjB,4CAA4C,CAC7C,CAAC;IAEM,MAAM,CAAU,WAAW,GAAG,sCAAsC,CAAC;IAE7E;QACE,IAAI,CAAC,QAAQ,GAAG,IAAI,sBAAsB,CAAC,+BAA+B,CAAC,gBAAgB,CAAC,CAAC;IAC/F,CAAC;IAED,MAAM;QACJ,OAAO,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;YACxB,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,2BAA2B,EAAE,+BAA+B,CAAC,WAAW,CAAC,CAAC;YACnF,MAAM,OAAO,GAAmB,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;YAExE,IAAI,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,EAAE,CAAC;YACzD,MAAM,IAAI,aAAa,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,gCAAgC,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvF,CAAC,CAAC;IACJ,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"shield-hcaptcha-hono.strategy.d.ts","sourceRoot":"","sources":["../src/shield-hcaptcha-hono.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAE9C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAGjE,qBAAa,0BAA2B,YAAW,kBAAkB;IACnE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAElD,YAAY,SAAS,EAAE,qBAAqB,EAE3C;IAED,MAAM,IAAI,iBAAiB,CAQ1B;CACF"}
1
+ {"version":3,"file":"shield-hcaptcha-hono.strategy.d.ts","sourceRoot":"","sources":["../src/shield-hcaptcha-hono.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAE9C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAIjE,qBAAa,0BAA2B,YAAW,kBAAkB;IACnE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAElD,YAAY,SAAS,EAAE,qBAAqB,EAE3C;IAED,MAAM,IAAI,iBAAiB,CAO1B;CACF"}
@@ -1,4 +1,5 @@
1
1
  import { HTTPException } from "hono/http-exception";
2
+ import { RequestContextHonoAdapter } from "./request-context-hono.adapter";
2
3
  import { ShieldHcaptchaStrategy, ShieldHcaptchaStrategyError } from "./shield-hcaptcha.strategy";
3
4
  export class ShieldHcaptchaHonoStrategy {
4
5
  strategy;
@@ -7,9 +8,8 @@ export class ShieldHcaptchaHonoStrategy {
7
8
  }
8
9
  handle() {
9
10
  return async (c, next) => {
10
- const form = await c.req.formData();
11
- const token = form.get("h-captcha-response")?.toString();
12
- if (await this.strategy.evaluate(token))
11
+ const context = new RequestContextHonoAdapter(c);
12
+ if (await this.strategy.evaluate(context))
13
13
  return next();
14
14
  throw new HTTPException(403, { message: ShieldHcaptchaStrategyError.Rejected });
15
15
  };
@@ -1 +1 @@
1
- {"version":3,"file":"shield-hcaptcha-hono.strategy.js","sourceRoot":"","sources":["../src/shield-hcaptcha-hono.strategy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AAEjG,MAAM,OAAO,0BAA0B;IACpB,QAAQ,CAAyB;IAElD,YAAY,SAAgC;QAC1C,IAAI,CAAC,QAAQ,GAAG,IAAI,sBAAsB,CAAC,SAAS,CAAC,CAAC;IACxD,CAAC;IAED,MAAM;QACJ,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;YACvB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,QAAQ,EAAE,CAAC;YAEzD,IAAI,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,OAAO,IAAI,EAAE,CAAC;YACvD,MAAM,IAAI,aAAa,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,2BAA2B,CAAC,QAAQ,EAAE,CAAC,CAAC;QAClF,CAAC,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"shield-hcaptcha-hono.strategy.js","sourceRoot":"","sources":["../src/shield-hcaptcha-hono.strategy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AAEjG,MAAM,OAAO,0BAA0B;IACpB,QAAQ,CAAyB;IAElD,YAAY,SAAgC;QAC1C,IAAI,CAAC,QAAQ,GAAG,IAAI,sBAAsB,CAAC,SAAS,CAAC,CAAC;IACxD,CAAC;IAED,MAAM;QACJ,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;YACvB,MAAM,OAAO,GAAG,IAAI,yBAAyB,CAAC,CAAC,CAAC,CAAC;YAEjD,IAAI,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,EAAE,CAAC;YACzD,MAAM,IAAI,aAAa,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,2BAA2B,CAAC,QAAQ,EAAE,CAAC,CAAC;QAClF,CAAC,CAAC;IACJ,CAAC;CACF"}
@@ -1,11 +1,13 @@
1
1
  import type { HCaptchaSecretKeyType } from "./hcaptcha-secret-key.vo";
2
+ import type { HasRequestForm } from "./request-context.port";
2
3
  export declare const ShieldHcaptchaStrategyError: {
3
4
  Rejected: string;
4
5
  };
6
+ export declare const ShieldHcaptchaStrategyField = "h-captcha-response";
5
7
  export declare class ShieldHcaptchaStrategy {
6
8
  private readonly secretKey;
7
9
  private readonly hcaptcha;
8
10
  constructor(secretKey: HCaptchaSecretKeyType);
9
- evaluate(token: string | undefined): Promise<boolean>;
11
+ evaluate(context: HasRequestForm): Promise<boolean>;
10
12
  }
11
13
  //# sourceMappingURL=shield-hcaptcha.strategy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shield-hcaptcha.strategy.d.ts","sourceRoot":"","sources":["../src/shield-hcaptcha.strategy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEtE,eAAO,MAAM,2BAA2B;IAAK,QAAQ;CAA8B,CAAC;AAEpF,qBAAa,sBAAsB;IAGrB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAFtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAElD,YAA6B,SAAS,EAAE,qBAAqB,EAAI;IAE3D,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ1D;CACF"}
1
+ {"version":3,"file":"shield-hcaptcha.strategy.d.ts","sourceRoot":"","sources":["../src/shield-hcaptcha.strategy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,eAAO,MAAM,2BAA2B;IAAK,QAAQ;CAA8B,CAAC;AAEpF,eAAO,MAAM,2BAA2B,uBAAuB,CAAC;AAEhE,qBAAa,sBAAsB;IAGrB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAFtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAElD,YAA6B,SAAS,EAAE,qBAAqB,EAAI;IAE3D,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAWxD;CACF"}
@@ -1,14 +1,17 @@
1
1
  import { HCaptchaService } from "./hcaptcha.service";
2
2
  export const ShieldHcaptchaStrategyError = { Rejected: "shield.hcaptcha.rejected" };
3
+ export const ShieldHcaptchaStrategyField = "h-captcha-response";
3
4
  export class ShieldHcaptchaStrategy {
4
5
  secretKey;
5
6
  hcaptcha = new HCaptchaService();
6
7
  constructor(secretKey) {
7
8
  this.secretKey = secretKey;
8
9
  }
9
- async evaluate(token) {
10
+ async evaluate(context) {
10
11
  try {
11
- const result = await this.hcaptcha.verify(this.secretKey, token);
12
+ const form = await context.request.form();
13
+ const token = form.get(ShieldHcaptchaStrategyField);
14
+ const result = await this.hcaptcha.verify(this.secretKey, token?.toString());
12
15
  return result.success;
13
16
  }
14
17
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"shield-hcaptcha.strategy.js","sourceRoot":"","sources":["../src/shield-hcaptcha.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,QAAQ,EAAE,0BAA0B,EAAE,CAAC;AAEpF,MAAM,OAAO,sBAAsB;IAGJ,SAAS;IAFrB,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IAElD,YAA6B,SAAgC;yBAAhC,SAAS;IAA0B,CAAC;IAEjE,KAAK,CAAC,QAAQ,CAAC,KAAyB;QACtC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAEjE,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"shield-hcaptcha.strategy.js","sourceRoot":"","sources":["../src/shield-hcaptcha.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAIrD,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,QAAQ,EAAE,0BAA0B,EAAE,CAAC;AAEpF,MAAM,CAAC,MAAM,2BAA2B,GAAG,oBAAoB,CAAC;AAEhE,MAAM,OAAO,sBAAsB;IAGJ,SAAS;IAFrB,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IAElD,YAA6B,SAAgC;yBAAhC,SAAS;IAA0B,CAAC;IAEjE,KAAK,CAAC,QAAQ,CAAC,OAAuB;QACpC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;YAEpD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAE7E,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"shield-recaptcha-hono.strategy.d.ts","sourceRoot":"","sources":["../src/shield-recaptcha-hono.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAE9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,OAAO,EACL,KAAK,qBAAqB,EAG3B,MAAM,6BAA6B,CAAC;AAErC,qBAAa,2BAA4B,YAAW,kBAAkB;IACpE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0B;IAEnD,YAAY,MAAM,EAAE,qBAAqB,EAExC;IAED,MAAM,IAAI,iBAAiB,CAS1B;CACF"}
1
+ {"version":3,"file":"shield-recaptcha-hono.strategy.d.ts","sourceRoot":"","sources":["../src/shield-recaptcha-hono.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAE9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,OAAO,EACL,KAAK,qBAAqB,EAG3B,MAAM,6BAA6B,CAAC;AAErC,qBAAa,2BAA4B,YAAW,kBAAkB;IACpE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0B;IAEnD,YAAY,MAAM,EAAE,qBAAqB,EAExC;IAED,MAAM,IAAI,iBAAiB,CAQ1B;CACF"}
@@ -9,8 +9,7 @@ export class ShieldRecaptchaHonoStrategy {
9
9
  handle() {
10
10
  return async (c, next) => {
11
11
  const context = new RequestContextHonoAdapter(c);
12
- const token = (await c.req.formData()).get("g-recaptcha-response")?.toString() ?? null;
13
- if (await this.strategy.evaluate(context, token))
12
+ if (await this.strategy.evaluate(context))
14
13
  return next();
15
14
  throw new HTTPException(403, { message: ShieldRecaptchaStrategyError.Rejected });
16
15
  };
@@ -1 +1 @@
1
- {"version":3,"file":"shield-recaptcha-hono.strategy.js","sourceRoot":"","sources":["../src/shield-recaptcha-hono.strategy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAEL,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,6BAA6B,CAAC;AAErC,MAAM,OAAO,2BAA2B;IACrB,QAAQ,CAA0B;IAEnD,YAAY,MAA6B;QACvC,IAAI,CAAC,QAAQ,GAAG,IAAI,uBAAuB,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IAED,MAAM;QACJ,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;YACvB,MAAM,OAAO,GAAG,IAAI,yBAAyB,CAAC,CAAC,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC;YAEvF,IAAI,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;gBAAE,OAAO,IAAI,EAAE,CAAC;YAEhE,MAAM,IAAI,aAAa,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,4BAA4B,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnF,CAAC,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"shield-recaptcha-hono.strategy.js","sourceRoot":"","sources":["../src/shield-recaptcha-hono.strategy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAEL,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,6BAA6B,CAAC;AAErC,MAAM,OAAO,2BAA2B;IACrB,QAAQ,CAA0B;IAEnD,YAAY,MAA6B;QACvC,IAAI,CAAC,QAAQ,GAAG,IAAI,uBAAuB,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IAED,MAAM;QACJ,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;YACvB,MAAM,OAAO,GAAG,IAAI,yBAAyB,CAAC,CAAC,CAAC,CAAC;YAEjD,IAAI,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,EAAE,CAAC;YAEzD,MAAM,IAAI,aAAa,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,4BAA4B,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnF,CAAC,CAAC;IACJ,CAAC;CACF"}
@@ -1,5 +1,5 @@
1
1
  import type { RecaptchaSecretKeyType } from "./recaptcha-secret-key.vo";
2
- import type { HasRequestHeader, HasRequestQuery } from "./request-context.port";
2
+ import type { HasRequestForm, HasRequestHeader, HasRequestQuery } from "./request-context.port";
3
3
  export type ShieldRecaptchaConfig = {
4
4
  secretKey: RecaptchaSecretKeyType;
5
5
  threshold?: number;
@@ -11,11 +11,12 @@ export type RecaptchaResult = {
11
11
  export declare const ShieldRecaptchaStrategyError: {
12
12
  Rejected: string;
13
13
  };
14
+ export declare const ShieldRecaptchaStrategyField = "g-recaptcha-response";
14
15
  export declare class ShieldRecaptchaStrategy {
15
16
  private readonly config;
16
17
  private static readonly URL;
17
18
  private static readonly DEFAULT_THRESHOLD;
18
19
  constructor(config: ShieldRecaptchaConfig);
19
- evaluate(context: HasRequestHeader & HasRequestQuery, formToken: string | null): Promise<boolean>;
20
+ evaluate(context: HasRequestHeader & HasRequestQuery & HasRequestForm): Promise<boolean>;
20
21
  }
21
22
  //# sourceMappingURL=shield-recaptcha.strategy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shield-recaptcha.strategy.d.ts","sourceRoot":"","sources":["../src/shield-recaptcha.strategy.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEhF,MAAM,MAAM,qBAAqB,GAAG;IAAE,SAAS,EAAE,sBAAsB,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAC9F,MAAM,MAAM,eAAe,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAElE,eAAO,MAAM,4BAA4B;IAAK,QAAQ;CAA+B,CAAC;AAEtF,qBAAa,uBAAuB;IAQtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAPnC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAGzB;IAEF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAO;IAEhD,YAA6B,MAAM,EAAE,qBAAqB,EAAI;IAExD,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,eAAe,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CA2BtG;CACF"}
1
+ {"version":3,"file":"shield-recaptcha.strategy.d.ts","sourceRoot":"","sources":["../src/shield-recaptcha.strategy.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEhG,MAAM,MAAM,qBAAqB,GAAG;IAAE,SAAS,EAAE,sBAAsB,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAC9F,MAAM,MAAM,eAAe,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAElE,eAAO,MAAM,4BAA4B;IAAK,QAAQ;CAA+B,CAAC;AAEtF,eAAO,MAAM,4BAA4B,yBAAyB,CAAC;AAEnE,qBAAa,uBAAuB;IAQtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAPnC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAGzB;IAEF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAO;IAEhD,YAA6B,MAAM,EAAE,qBAAqB,EAAI;IAExD,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,eAAe,GAAG,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CA6B7F;CACF"}
@@ -2,6 +2,7 @@
2
2
  import * as tools from "@bgord/tools";
3
3
  import * as v from "valibot";
4
4
  export const ShieldRecaptchaStrategyError = { Rejected: "shield.recaptcha.rejected" };
5
+ export const ShieldRecaptchaStrategyField = "g-recaptcha-response";
5
6
  export class ShieldRecaptchaStrategy {
6
7
  config;
7
8
  static URL = v.parse(tools.UrlWithoutSlash, "https://www.google.com/recaptcha/api/siteverify");
@@ -9,12 +10,14 @@ export class ShieldRecaptchaStrategy {
9
10
  constructor(config) {
10
11
  this.config = config;
11
12
  }
12
- async evaluate(context, formToken) {
13
+ async evaluate(context) {
13
14
  const threshold = this.config.threshold ?? ShieldRecaptchaStrategy.DEFAULT_THRESHOLD;
14
15
  try {
15
16
  const header = context.request.header("x-recaptcha-token");
16
17
  const query = context.request.query()["recaptchaToken"];
17
18
  const remoteip = context.request.header("x-forwarded-for")?.split(",")[0] ?? "";
19
+ const form = await context.request.form();
20
+ const formToken = form.get(ShieldRecaptchaStrategyField)?.toString();
18
21
  const token = header ?? query ?? formToken;
19
22
  if (!token)
20
23
  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,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"}
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,CAAC,MAAM,4BAA4B,GAAG,sBAAsB,CAAC;AAEnE,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,OAA4D;QACzE,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;YAChF,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,4BAA4B,CAAC,EAAE,QAAQ,EAAE,CAAC;YAErE,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bgord/bun",
3
- "version": "1.20.3",
3
+ "version": "1.20.5",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "author": "Bartosz Gordon",
@@ -31,7 +31,7 @@
31
31
  "croner": "10.0.1",
32
32
  "cspell": "10.0.1",
33
33
  "csv": "6.6.1",
34
- "fallow": "3.9.1",
34
+ "fallow": "3.10.0",
35
35
  "lefthook": "2.1.10",
36
36
  "lockfile-lint": "5.0.0",
37
37
  "nodemailer": "9.0.3",
@@ -2,20 +2,20 @@ import { createMiddleware } from "hono/factory";
2
2
  import { HTTPException } from "hono/http-exception";
3
3
  import { type FileUploaderConfig, FileUploaderMiddleware } from "./file-uploader.middleware";
4
4
  import type { MiddlewareHonoPort } from "./middleware-hono.port";
5
+ import { RequestContextHonoAdapter } from "./request-context-hono.adapter";
5
6
 
6
7
  export class FileUploaderHonoMiddleware implements MiddlewareHonoPort {
7
8
  private readonly middleware: FileUploaderMiddleware;
8
9
 
9
- constructor(private readonly config: FileUploaderConfig & { field: string }) {
10
+ constructor(config: FileUploaderConfig) {
10
11
  this.middleware = new FileUploaderMiddleware(config);
11
12
  }
12
13
 
13
14
  handle() {
14
- return createMiddleware(async (context, next) => {
15
- const body = await context.req.raw.clone().formData();
16
- const file = body.get(this.config.field);
15
+ return createMiddleware(async (c, next) => {
16
+ const context = new RequestContextHonoAdapter(c);
17
17
 
18
- const result = this.middleware.validate(file instanceof File ? file : null);
18
+ const result = await this.middleware.validate(context);
19
19
 
20
20
  if (result.valid === false) throw new HTTPException(400, { message: result.error });
21
21
  return next();
@@ -1,6 +1,7 @@
1
1
  import * as tools from "@bgord/tools";
2
+ import type { HasRequestForm } from "./request-context.port";
2
3
 
3
- export type FileUploaderConfig = { MimeRegistry: tools.MimeRegistry; maxSize: tools.Size };
4
+ export type FileUploaderConfig = { MimeRegistry: tools.MimeRegistry; maxSize: tools.Size; field: string };
4
5
 
5
6
  export const FileUploaderError = {
6
7
  MissingFile: "file.uploader.missing.file",
@@ -16,8 +17,11 @@ export type FileValidationResult = { valid: true } | { valid: false; error: File
16
17
  export class FileUploaderMiddleware {
17
18
  constructor(private readonly config: FileUploaderConfig) {}
18
19
 
19
- validate(file: File | null): FileValidationResult {
20
- if (!file) return { valid: false, error: FileUploaderError.MissingFile };
20
+ async validate(context: HasRequestForm): Promise<FileValidationResult> {
21
+ const form = await context.request.form();
22
+ const file = form.get(this.config.field);
23
+
24
+ if (!(file instanceof File)) return { valid: false, error: FileUploaderError.MissingFile };
21
25
  if (file.size === 0) return { valid: false, error: FileUploaderError.EmptyFile };
22
26
 
23
27
  const size = tools.Size.fromBytes(file.size);
@@ -1,3 +1,4 @@
1
+ import * as tools from "@bgord/tools";
1
2
  import type { Context } from "hono";
2
3
  import { getConnInfo } from "hono/bun";
3
4
  import { getCookie } from "hono/cookie";
@@ -6,6 +7,7 @@ import type { RequestContext } from "./request-context.port";
6
7
  export class RequestContextHonoAdapter implements RequestContext {
7
8
  readonly request: RequestContext["request"];
8
9
  readonly identity: RequestContext["identity"];
10
+ readonly middleware: RequestContext["middleware"];
9
11
 
10
12
  constructor(context: Context) {
11
13
  this.request = {
@@ -46,6 +48,15 @@ export class RequestContextHonoAdapter implements RequestContext {
46
48
  return "";
47
49
  }
48
50
  },
51
+ form: async () => {
52
+ try {
53
+ const request = context.req.raw.clone();
54
+
55
+ return await request.formData();
56
+ } catch {
57
+ return new FormData();
58
+ }
59
+ },
49
60
  };
50
61
 
51
62
  this.identity = {
@@ -56,5 +67,14 @@ export class RequestContextHonoAdapter implements RequestContext {
56
67
  getConnInfo(context).remote.address,
57
68
  ua: () => context.req.header("user-agent"),
58
69
  };
70
+
71
+ this.middleware = {
72
+ revision: {
73
+ fromWeakETag: () => tools.Revision.fromWeakETag(context.get("WeakETag")),
74
+ fromETag: () => tools.Revision.fromETag(context.get("ETag")),
75
+ },
76
+ timeZoneOffset: () => context.get("timeZoneOffset"),
77
+ language: () => context.get("language"),
78
+ };
59
79
  }
60
80
  }
@@ -1,3 +1,4 @@
1
+ import type * as tools from "@bgord/tools";
1
2
  import type { UUIDType } from "./uuid.vo";
2
3
 
3
4
  export interface RequestContext {
@@ -12,6 +13,7 @@ export interface RequestContext {
12
13
  cookie(name: string): string | undefined;
13
14
  json(): Promise<Record<string, unknown>>;
14
15
  text(): Promise<string>;
16
+ form(): Promise<FormData>;
15
17
  headers: () => Headers;
16
18
  headersObject: () => Record<string, string>;
17
19
  };
@@ -21,6 +23,12 @@ export interface RequestContext {
21
23
  ip(): string | undefined;
22
24
  ua(): string | undefined;
23
25
  };
26
+
27
+ readonly middleware: {
28
+ revision: { fromWeakETag(): tools.Revision; fromETag(): tools.Revision };
29
+ timeZoneOffset(): tools.Duration;
30
+ language(): tools.LanguageType;
31
+ };
24
32
  }
25
33
 
26
34
  export interface HasRequestUrl {
@@ -71,6 +79,10 @@ export interface HasRequestText {
71
79
  readonly request: { text(): Promise<string> };
72
80
  }
73
81
 
82
+ export interface HasRequestForm {
83
+ readonly request: { form(): Promise<FormData> };
84
+ }
85
+
74
86
  export interface HasIdentityUserId {
75
87
  readonly identity: { userId(): UUIDType | undefined };
76
88
  }
@@ -82,3 +94,15 @@ export interface HasIdentityIp {
82
94
  export interface HasIdentityUa {
83
95
  readonly identity: { ua(): string | undefined };
84
96
  }
97
+
98
+ export interface HasMiddlewareRevision {
99
+ readonly middleware: { revision: { fromWeakETag(): tools.Revision; fromETag(): tools.Revision } };
100
+ }
101
+
102
+ export interface HasMiddlewareTimeZoneOffset {
103
+ readonly middleware: { timeZoneOffset(): tools.Duration };
104
+ }
105
+
106
+ export interface HasMiddlewareLanguage {
107
+ readonly middleware: { language(): tools.LanguageType };
108
+ }
@@ -3,7 +3,8 @@ import { HTTPException } from "hono/http-exception";
3
3
  import * as v from "valibot";
4
4
  import { HCaptchaSecretKey } from "./hcaptcha-secret-key.vo";
5
5
  import type { MiddlewareHonoPort } from "./middleware-hono.port";
6
- import { ShieldHcaptchaStrategy } from "./shield-hcaptcha.strategy";
6
+ import type { HasRequestForm } from "./request-context.port";
7
+ import { ShieldHcaptchaStrategy, ShieldHcaptchaStrategyField } from "./shield-hcaptcha.strategy";
7
8
 
8
9
  export const ShieldHcaptchaLocalStrategyError = { Rejected: "shield.hcaptcha.local.rejected" };
9
10
 
@@ -23,7 +24,11 @@ export class ShieldHcaptchaLocalHonoStrategy implements MiddlewareHonoPort {
23
24
 
24
25
  handle(): MiddlewareHandler {
25
26
  return async (_c, next) => {
26
- if (await this.strategy.evaluate(ShieldHcaptchaLocalHonoStrategy.TOKEN_LOCAL)) return next();
27
+ const form = new FormData();
28
+ form.set(ShieldHcaptchaStrategyField, ShieldHcaptchaLocalHonoStrategy.TOKEN_LOCAL);
29
+ const context: HasRequestForm = { request: { form: async () => form } };
30
+
31
+ if (await this.strategy.evaluate(context)) return next();
27
32
  throw new HTTPException(403, { message: ShieldHcaptchaLocalStrategyError.Rejected });
28
33
  };
29
34
  }
@@ -2,6 +2,7 @@ import type { MiddlewareHandler } from "hono";
2
2
  import { HTTPException } from "hono/http-exception";
3
3
  import type { HCaptchaSecretKeyType } from "./hcaptcha-secret-key.vo";
4
4
  import type { MiddlewareHonoPort } from "./middleware-hono.port";
5
+ import { RequestContextHonoAdapter } from "./request-context-hono.adapter";
5
6
  import { ShieldHcaptchaStrategy, ShieldHcaptchaStrategyError } from "./shield-hcaptcha.strategy";
6
7
 
7
8
  export class ShieldHcaptchaHonoStrategy implements MiddlewareHonoPort {
@@ -13,10 +14,9 @@ export class ShieldHcaptchaHonoStrategy implements MiddlewareHonoPort {
13
14
 
14
15
  handle(): MiddlewareHandler {
15
16
  return async (c, next) => {
16
- const form = await c.req.formData();
17
- const token = form.get("h-captcha-response")?.toString();
17
+ const context = new RequestContextHonoAdapter(c);
18
18
 
19
- if (await this.strategy.evaluate(token)) return next();
19
+ if (await this.strategy.evaluate(context)) return next();
20
20
  throw new HTTPException(403, { message: ShieldHcaptchaStrategyError.Rejected });
21
21
  };
22
22
  }
@@ -1,16 +1,22 @@
1
1
  import { HCaptchaService } from "./hcaptcha.service";
2
2
  import type { HCaptchaSecretKeyType } from "./hcaptcha-secret-key.vo";
3
+ import type { HasRequestForm } from "./request-context.port";
3
4
 
4
5
  export const ShieldHcaptchaStrategyError = { Rejected: "shield.hcaptcha.rejected" };
5
6
 
7
+ export const ShieldHcaptchaStrategyField = "h-captcha-response";
8
+
6
9
  export class ShieldHcaptchaStrategy {
7
10
  private readonly hcaptcha = new HCaptchaService();
8
11
 
9
12
  constructor(private readonly secretKey: HCaptchaSecretKeyType) {}
10
13
 
11
- async evaluate(token: string | undefined): Promise<boolean> {
14
+ async evaluate(context: HasRequestForm): Promise<boolean> {
12
15
  try {
13
- const result = await this.hcaptcha.verify(this.secretKey, token);
16
+ const form = await context.request.form();
17
+ const token = form.get(ShieldHcaptchaStrategyField);
18
+
19
+ const result = await this.hcaptcha.verify(this.secretKey, token?.toString());
14
20
 
15
21
  return result.success;
16
22
  } catch {
@@ -18,9 +18,8 @@ export class ShieldRecaptchaHonoStrategy implements MiddlewareHonoPort {
18
18
  handle(): MiddlewareHandler {
19
19
  return async (c, next) => {
20
20
  const context = new RequestContextHonoAdapter(c);
21
- const token = (await c.req.formData()).get("g-recaptcha-response")?.toString() ?? null;
22
21
 
23
- if (await this.strategy.evaluate(context, token)) return next();
22
+ if (await this.strategy.evaluate(context)) return next();
24
23
 
25
24
  throw new HTTPException(403, { message: ShieldRecaptchaStrategyError.Rejected });
26
25
  };
@@ -2,13 +2,15 @@
2
2
  import * as tools from "@bgord/tools";
3
3
  import * as v from "valibot";
4
4
  import type { RecaptchaSecretKeyType } from "./recaptcha-secret-key.vo";
5
- import type { HasRequestHeader, HasRequestQuery } from "./request-context.port";
5
+ import type { HasRequestForm, HasRequestHeader, HasRequestQuery } from "./request-context.port";
6
6
 
7
7
  export type ShieldRecaptchaConfig = { secretKey: RecaptchaSecretKeyType; threshold?: number };
8
8
  export type RecaptchaResult = { success: boolean; score: number };
9
9
 
10
10
  export const ShieldRecaptchaStrategyError = { Rejected: "shield.recaptcha.rejected" };
11
11
 
12
+ export const ShieldRecaptchaStrategyField = "g-recaptcha-response";
13
+
12
14
  export class ShieldRecaptchaStrategy {
13
15
  private static readonly URL = v.parse(
14
16
  tools.UrlWithoutSlash,
@@ -19,13 +21,15 @@ export class ShieldRecaptchaStrategy {
19
21
 
20
22
  constructor(private readonly config: ShieldRecaptchaConfig) {}
21
23
 
22
- async evaluate(context: HasRequestHeader & HasRequestQuery, formToken: string | null): Promise<boolean> {
24
+ async evaluate(context: HasRequestHeader & HasRequestQuery & HasRequestForm): Promise<boolean> {
23
25
  const threshold = this.config.threshold ?? ShieldRecaptchaStrategy.DEFAULT_THRESHOLD;
24
26
 
25
27
  try {
26
28
  const header = context.request.header("x-recaptcha-token");
27
29
  const query = context.request.query()["recaptchaToken"];
28
30
  const remoteip = context.request.header("x-forwarded-for")?.split(",")[0] ?? "";
31
+ const form = await context.request.form();
32
+ const formToken = form.get(ShieldRecaptchaStrategyField)?.toString();
29
33
 
30
34
  const token = header ?? query ?? formToken;
31
35