@bgord/bun 1.4.4 → 1.4.7

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 (78) hide show
  1. package/dist/index.d.ts +4 -4
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +4 -4
  4. package/dist/index.js.map +1 -1
  5. package/dist/logger-noop.adapter.d.ts +1 -0
  6. package/dist/logger-noop.adapter.d.ts.map +1 -1
  7. package/dist/logger-noop.adapter.js +3 -0
  8. package/dist/logger-noop.adapter.js.map +1 -1
  9. package/dist/logger-winston-local.adapter.d.ts.map +1 -1
  10. package/dist/logger-winston-local.adapter.js +1 -0
  11. package/dist/logger-winston-local.adapter.js.map +1 -1
  12. package/dist/logger-winston-production.adapter.d.ts +0 -2
  13. package/dist/logger-winston-production.adapter.d.ts.map +1 -1
  14. package/dist/logger-winston-production.adapter.js +3 -6
  15. package/dist/logger-winston-production.adapter.js.map +1 -1
  16. package/dist/logger-winston.adapter.d.ts +4 -0
  17. package/dist/logger-winston.adapter.d.ts.map +1 -1
  18. package/dist/logger-winston.adapter.js +5 -0
  19. package/dist/logger-winston.adapter.js.map +1 -1
  20. package/dist/logger.port.d.ts +2 -0
  21. package/dist/logger.port.d.ts.map +1 -1
  22. package/dist/logger.port.js.map +1 -1
  23. package/dist/prerequisites/log-file.d.ts +2 -2
  24. package/dist/prerequisites/log-file.d.ts.map +1 -1
  25. package/dist/prerequisites/log-file.js +5 -3
  26. package/dist/prerequisites/log-file.js.map +1 -1
  27. package/dist/{shield-api-key.middleware.d.ts → shield-api-key.adapter.d.ts} +3 -2
  28. package/dist/shield-api-key.adapter.d.ts.map +1 -0
  29. package/dist/{shield-api-key.middleware.js → shield-api-key.adapter.js} +3 -3
  30. package/dist/shield-api-key.adapter.js.map +1 -0
  31. package/dist/shield-captcha-hcaptcha-local.adapter.d.ts +2 -2
  32. package/dist/shield-captcha-hcaptcha-local.adapter.d.ts.map +1 -1
  33. package/dist/shield-captcha-hcaptcha.adapter.d.ts +2 -2
  34. package/dist/shield-captcha-hcaptcha.adapter.d.ts.map +1 -1
  35. package/dist/shield-captcha-recaptcha.adapter.d.ts +2 -2
  36. package/dist/shield-captcha-recaptcha.adapter.d.ts.map +1 -1
  37. package/dist/shield-noop.adapter.d.ts +5 -0
  38. package/dist/shield-noop.adapter.d.ts.map +1 -0
  39. package/dist/{shield-captcha-noop.adapter.js → shield-noop.adapter.js} +2 -2
  40. package/dist/shield-noop.adapter.js.map +1 -0
  41. package/dist/{shield-rate-limit.middleware.d.ts → shield-rate-limit.adapter.d.ts} +9 -3
  42. package/dist/shield-rate-limit.adapter.d.ts.map +1 -0
  43. package/dist/shield-rate-limit.adapter.js +30 -0
  44. package/dist/shield-rate-limit.adapter.js.map +1 -0
  45. package/dist/shield.port.d.ts +5 -0
  46. package/dist/shield.port.d.ts.map +1 -0
  47. package/dist/shield.port.js +2 -0
  48. package/dist/shield.port.js.map +1 -0
  49. package/dist/tsconfig.tsbuildinfo +1 -1
  50. package/package.json +2 -2
  51. package/readme.md +4 -4
  52. package/src/index.ts +4 -4
  53. package/src/logger-noop.adapter.ts +4 -0
  54. package/src/logger-winston-local.adapter.ts +1 -0
  55. package/src/logger-winston-production.adapter.ts +7 -10
  56. package/src/logger-winston.adapter.ts +10 -0
  57. package/src/logger.port.ts +3 -0
  58. package/src/prerequisites/log-file.ts +8 -6
  59. package/src/{shield-api-key.middleware.ts → shield-api-key.adapter.ts} +3 -2
  60. package/src/shield-captcha-hcaptcha-local.adapter.ts +2 -2
  61. package/src/shield-captcha-hcaptcha.adapter.ts +2 -2
  62. package/src/shield-captcha-recaptcha.adapter.ts +2 -2
  63. package/src/shield-noop.adapter.ts +6 -0
  64. package/src/{shield-rate-limit.middleware.ts → shield-rate-limit.adapter.ts} +17 -11
  65. package/src/{shield-captcha.port.ts → shield.port.ts} +1 -1
  66. package/dist/shield-api-key.middleware.d.ts.map +0 -1
  67. package/dist/shield-api-key.middleware.js.map +0 -1
  68. package/dist/shield-captcha-noop.adapter.d.ts +0 -5
  69. package/dist/shield-captcha-noop.adapter.d.ts.map +0 -1
  70. package/dist/shield-captcha-noop.adapter.js.map +0 -1
  71. package/dist/shield-captcha.port.d.ts +0 -5
  72. package/dist/shield-captcha.port.d.ts.map +0 -1
  73. package/dist/shield-captcha.port.js +0 -2
  74. package/dist/shield-captcha.port.js.map +0 -1
  75. package/dist/shield-rate-limit.middleware.d.ts.map +0 -1
  76. package/dist/shield-rate-limit.middleware.js +0 -24
  77. package/dist/shield-rate-limit.middleware.js.map +0 -1
  78. package/src/shield-captcha-noop.adapter.ts +0 -6
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bgord/bun",
3
- "version": "1.4.4",
3
+ "version": "1.4.7",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "author": "Bartosz Gordon",
@@ -28,7 +28,7 @@
28
28
  "@types/nodemailer": "7.0.4",
29
29
  "@types/yazl": "3.3.0",
30
30
  "cspell": "9.4.0",
31
- "knip": "5.73.0",
31
+ "knip": "5.73.3",
32
32
  "lefthook": "2.0.9",
33
33
  "only-allow": "1.2.2",
34
34
  "sharp": "0.34.5",
package/readme.md CHANGED
@@ -237,14 +237,14 @@ src/
237
237
  ├── secret-manager.port.ts
238
238
  ├── secret.vo.ts
239
239
  ├── setup.service.ts
240
- ├── shield-api-key.middleware.ts
240
+ ├── shield-api-key.adapter.ts
241
241
  ├── shield-auth.middleware.ts
242
242
  ├── shield-captcha-hcaptcha-local.adapter.ts
243
243
  ├── shield-captcha-hcaptcha.adapter.ts
244
- ├── shield-captcha-noop.adapter.ts
245
244
  ├── shield-captcha-recaptcha.adapter.ts
246
- ├── shield-captcha.port.ts
247
- ├── shield-rate-limit.middleware.ts
245
+ ├── shield-noop.adapter.ts
246
+ ├── shield-rate-limit.adapter.ts
247
+ ├── shield.port.ts
248
248
  ├── simulated-error.middleware.ts
249
249
  ├── slower.middleware.ts
250
250
  ├── static-files.service.ts
package/src/index.ts CHANGED
@@ -158,14 +158,14 @@ export * from "./secret.vo";
158
158
  export * from "./secret-manager.port";
159
159
  export * from "./secret-manager-noop.adapter";
160
160
  export * from "./setup.service";
161
- export * from "./shield-api-key.middleware";
161
+ export * from "./shield.port";
162
+ export * from "./shield-api-key.adapter";
162
163
  export * from "./shield-auth.middleware";
163
- export * from "./shield-captcha.port";
164
164
  export * from "./shield-captcha-hcaptcha.adapter";
165
165
  export * from "./shield-captcha-hcaptcha-local.adapter";
166
- export * from "./shield-captcha-noop.adapter";
167
166
  export * from "./shield-captcha-recaptcha.adapter";
168
- export * from "./shield-rate-limit.middleware";
167
+ export * from "./shield-noop.adapter";
168
+ export * from "./shield-rate-limit.adapter";
169
169
  export * from "./simulated-error.middleware";
170
170
  export * from "./slower.middleware";
171
171
  export * from "./static-files.service";
@@ -10,4 +10,8 @@ export class LoggerNoopAdapter implements LoggerPort {
10
10
  silly: LoggerPort["silly"] = (_log) => {};
11
11
 
12
12
  setSilent: LoggerPort["setSilent"] = (_silent) => {};
13
+
14
+ getFilePath() {
15
+ return null;
16
+ }
13
17
  }
@@ -16,6 +16,7 @@ export class LoggerWinstonLocalAdapter {
16
16
  level,
17
17
  redactor: this.config.redactor,
18
18
  formats: [winston.format.prettyPrint()],
19
+ filePath: null,
19
20
  });
20
21
  }
21
22
  }
@@ -13,15 +13,15 @@ type LoggerWinstonProductionAdapterConfigType = {
13
13
  };
14
14
 
15
15
  export class LoggerWinstonProductionAdapter {
16
- readonly prodLogFile: string;
17
-
18
- constructor(private readonly config: LoggerWinstonProductionAdapterConfigType) {
19
- this.prodLogFile = this.createProdLogFile();
20
- }
16
+ constructor(private readonly config: LoggerWinstonProductionAdapterConfigType) {}
21
17
 
22
18
  create(level: LogLevelEnum): LoggerPort {
19
+ const filePath = tools.FilePathAbsolute.fromString(
20
+ `/var/log/${this.config.app}-${NodeEnvironmentEnum.production}.log`,
21
+ );
22
+
23
23
  const file = new winston.transports.File({
24
- filename: this.prodLogFile,
24
+ filename: filePath.get(),
25
25
  maxsize: tools.Size.fromMB(100).toBytes(),
26
26
  maxFiles: 3,
27
27
  tailable: true,
@@ -38,10 +38,7 @@ export class LoggerWinstonProductionAdapter {
38
38
  : undefined,
39
39
  ].filter((adapter) => adapter !== undefined),
40
40
  redactor: this.config.redactor,
41
+ filePath,
41
42
  });
42
43
  }
43
-
44
- private createProdLogFile() {
45
- return `/var/log/${this.config.app}-${NodeEnvironmentEnum.production}.log`;
46
- }
47
44
  }
@@ -1,3 +1,4 @@
1
+ import type * as tools from "@bgord/tools";
1
2
  import * as winston from "winston";
2
3
  import { type LogAppType, type LoggerPort, LogLevelEnum } from "./logger.port";
3
4
  import type { NodeEnvironmentEnum } from "./node-env.vo";
@@ -10,11 +11,14 @@ type WinstonLoggerOptions = {
10
11
  redactor: RedactorPort;
11
12
  formats?: winston.Logform.Format[];
12
13
  transports?: winston.transport[];
14
+ filePath: tools.FilePathAbsolute | null;
13
15
  };
14
16
 
15
17
  export class LoggerWinstonAdapter implements LoggerPort {
16
18
  private readonly logger: winston.Logger;
17
19
 
20
+ private readonly filePath: tools.FilePathAbsolute | null;
21
+
18
22
  constructor(options: WinstonLoggerOptions) {
19
23
  const format = winston.format.combine(
20
24
  winston.format((info) => options.redactor.redact(info))(),
@@ -33,6 +37,8 @@ export class LoggerWinstonAdapter implements LoggerPort {
33
37
  format,
34
38
  transports: [new winston.transports.Console(), ...(options.transports ?? [])],
35
39
  });
40
+
41
+ this.filePath = options.filePath;
36
42
  }
37
43
 
38
44
  warn: LoggerPort["warn"] = (log) => this.logger.log({ level: LogLevelEnum.warn, ...log });
@@ -46,4 +52,8 @@ export class LoggerWinstonAdapter implements LoggerPort {
46
52
  setSilent: LoggerPort["setSilent"] = (silent) => {
47
53
  this.logger.silent = silent;
48
54
  };
55
+
56
+ getFilePath() {
57
+ return this.filePath;
58
+ }
49
59
  }
@@ -1,3 +1,4 @@
1
+ import type * as tools from "@bgord/tools";
1
2
  import { z } from "zod/v4";
2
3
  import type { CorrelationIdType } from "./correlation-id.vo";
3
4
  import type { NodeEnvironmentEnum } from "./node-env.vo";
@@ -58,4 +59,6 @@ export interface LoggerPort {
58
59
  silly(entry: Omit<LogCoreType, AdapterInjectedFields>): void;
59
60
 
60
61
  setSilent(silent: boolean): void;
62
+
63
+ getFilePath(): tools.FilePathAbsolute | null;
61
64
  }
@@ -1,6 +1,6 @@
1
1
  import * as tools from "@bgord/tools";
2
2
  import type { ClockPort } from "../clock.port";
3
- import type { LoggerWinstonProductionAdapter } from "../logger-winston-production.adapter";
3
+ import type { LoggerPort } from "../logger.port";
4
4
  import * as prereqs from "../prerequisites.service";
5
5
 
6
6
  export class PrerequisiteLogFile implements prereqs.Prerequisite {
@@ -8,9 +8,9 @@ export class PrerequisiteLogFile implements prereqs.Prerequisite {
8
8
  readonly label: prereqs.PrerequisiteLabelType;
9
9
  readonly enabled?: boolean = true;
10
10
 
11
- private readonly Logger: LoggerWinstonProductionAdapter;
11
+ private readonly Logger: LoggerPort;
12
12
 
13
- constructor(config: prereqs.PrerequisiteConfigType & { Logger: LoggerWinstonProductionAdapter }) {
13
+ constructor(config: prereqs.PrerequisiteConfigType & { Logger: LoggerPort }) {
14
14
  this.label = config.label;
15
15
  this.enabled = config.enabled === undefined ? true : config.enabled;
16
16
 
@@ -23,11 +23,13 @@ export class PrerequisiteLogFile implements prereqs.Prerequisite {
23
23
  if (!this.enabled) return prereqs.Verification.undetermined(stopwatch.stop());
24
24
 
25
25
  try {
26
- const path = this.Logger.prodLogFile;
27
- const result = await Bun.file(path).exists();
26
+ const path = this.Logger.getFilePath();
27
+ if (!path) return prereqs.Verification.undetermined(stopwatch.stop());
28
+
29
+ const result = await Bun.file(path.get()).exists();
28
30
 
29
31
  if (result) return prereqs.Verification.success(stopwatch.stop());
30
- return prereqs.Verification.failure(stopwatch.stop(), { message: `Missing file: ${path}` });
32
+ return prereqs.Verification.failure(stopwatch.stop(), { message: `Missing file: ${path.get()}` });
31
33
  } catch (error) {
32
34
  return prereqs.Verification.failure(stopwatch.stop(), error as Error);
33
35
  }
@@ -1,18 +1,19 @@
1
1
  import type * as tools from "@bgord/tools";
2
2
  import { createMiddleware } from "hono/factory";
3
3
  import { HTTPException } from "hono/http-exception";
4
+ import type { ShieldPort } from "./shield.port";
4
5
 
5
6
  type ApiKeyShieldConfigType = { API_KEY: tools.ApiKeyType };
6
7
 
7
8
  export const AccessDeniedApiKeyError = new HTTPException(403, { message: "access_denied_api_key" });
8
9
 
9
- export class ShieldApiKey {
10
+ export class ShieldApiKeyAdapter implements ShieldPort {
10
11
  static readonly HEADER_NAME = "bgord-api-key";
11
12
 
12
13
  constructor(private readonly config: ApiKeyShieldConfigType) {}
13
14
 
14
15
  verify = createMiddleware(async (c, next) => {
15
- if (c.req.header(ShieldApiKey.HEADER_NAME) === this.config.API_KEY) return next();
16
+ if (c.req.header(ShieldApiKeyAdapter.HEADER_NAME) === this.config.API_KEY) return next();
16
17
 
17
18
  throw AccessDeniedApiKeyError;
18
19
  });
@@ -2,13 +2,13 @@ import hcaptcha from "hcaptcha";
2
2
  import { createMiddleware } from "hono/factory";
3
3
  import { HTTPException } from "hono/http-exception";
4
4
  import type { HCaptchaSecretKeyType } from "./hcaptcha-secret-key.vo";
5
- import type { ShieldCaptchaPort } from "./shield-captcha.port";
5
+ import type { ShieldPort } from "./shield.port";
6
6
 
7
7
  export const AccessDeniedHcaptchaLocalError = new HTTPException(403, {
8
8
  message: "access_denied_hcaptcha_local",
9
9
  });
10
10
 
11
- export class ShieldCaptchaHcaptchaLocalAdapter implements ShieldCaptchaPort {
11
+ export class ShieldCaptchaHcaptchaLocalAdapter implements ShieldPort {
12
12
  constructor(private readonly secretKey: HCaptchaSecretKeyType) {}
13
13
 
14
14
  verify = createMiddleware(async (_c, next) => {
@@ -2,11 +2,11 @@ import hcaptcha from "hcaptcha";
2
2
  import { createMiddleware } from "hono/factory";
3
3
  import { HTTPException } from "hono/http-exception";
4
4
  import type { HCaptchaSecretKeyType } from "./hcaptcha-secret-key.vo";
5
- import type { ShieldCaptchaPort } from "./shield-captcha.port";
5
+ import type { ShieldPort } from "./shield.port";
6
6
 
7
7
  export const AccessDeniedHcaptchaError = new HTTPException(403, { message: "access_denied_hcaptcha" });
8
8
 
9
- export class ShieldCaptchaHcaptchaAdapter implements ShieldCaptchaPort {
9
+ export class ShieldCaptchaHcaptchaAdapter implements ShieldPort {
10
10
  constructor(private readonly secretKey: HCaptchaSecretKeyType) {}
11
11
 
12
12
  verify = createMiddleware(async (c, next) => {
@@ -1,14 +1,14 @@
1
1
  import { createMiddleware } from "hono/factory";
2
2
  import { HTTPException } from "hono/http-exception";
3
3
  import type { RecaptchaSecretKeyType } from "./recaptcha-secret-key.vo";
4
- import type { ShieldCaptchaPort } from "./shield-captcha.port";
4
+ import type { ShieldPort } from "./shield.port";
5
5
 
6
6
  export type RecaptchaVerifierConfigType = { secretKey: RecaptchaSecretKeyType };
7
7
  export type RecaptchaResultType = { success: boolean; score: number };
8
8
 
9
9
  export const AccessDeniedRecaptchaError = new HTTPException(403, { message: "access_denied_recaptcha" });
10
10
 
11
- export class ShieldCaptchaRecaptchaAdapter implements ShieldCaptchaPort {
11
+ export class ShieldCaptchaRecaptchaAdapter implements ShieldPort {
12
12
  constructor(private readonly config: RecaptchaVerifierConfigType) {}
13
13
 
14
14
  verify = createMiddleware(async (c, next) => {
@@ -0,0 +1,6 @@
1
+ import { createMiddleware } from "hono/factory";
2
+ import type { ShieldPort } from "./shield.port";
3
+
4
+ export class ShieldNoopAdapter implements ShieldPort {
5
+ verify = createMiddleware(async (_c, next) => next());
6
+ }
@@ -4,9 +4,10 @@ import { createMiddleware } from "hono/factory";
4
4
  import { HTTPException } from "hono/http-exception";
5
5
  import type { ClockPort } from "./clock.port";
6
6
  import type { RateLimitStorePort } from "./rate-limit-store.port";
7
+ import type { ShieldPort } from "./shield.port";
7
8
 
8
9
  type SubjectResolver = (c: Context) => string;
9
- type RateLimitShieldOptionsType = { enabled: boolean; store: RateLimitStorePort; subject: SubjectResolver };
10
+ type ShieldRateLimitOptionsType = { enabled: boolean; store: RateLimitStorePort; subject: SubjectResolver };
10
11
 
11
12
  type Dependencies = { Clock: ClockPort };
12
13
 
@@ -15,25 +16,30 @@ export const UserSubjectResolver: SubjectResolver = (c) => c.get("user")?.id ??
15
16
 
16
17
  export const TooManyRequestsError = new HTTPException(429, { message: "app.too_many_requests" });
17
18
 
18
- export const ShieldRateLimit = (options: RateLimitShieldOptionsType, deps: Dependencies) => {
19
- return createMiddleware(async (c, next) => {
20
- if (!options.enabled) return next();
19
+ export class ShieldRateLimitAdapter implements ShieldPort {
20
+ constructor(
21
+ private readonly options: ShieldRateLimitOptionsType,
22
+ private readonly deps: Dependencies,
23
+ ) {}
21
24
 
22
- const subject = options.subject(c);
25
+ verify = createMiddleware(async (c, next) => {
26
+ if (!this.options.enabled) return next();
23
27
 
24
- let limiter = await options.store.get(subject);
28
+ const subject = this.options.subject(c);
29
+
30
+ let limiter = await this.options.store.get(subject);
25
31
 
26
32
  if (!limiter) {
27
- limiter = new tools.RateLimiter(options.store.ttl);
28
- options.store.set(subject, limiter);
33
+ limiter = new tools.RateLimiter(this.options.store.ttl);
34
+ this.options.store.set(subject, limiter);
29
35
  }
30
36
 
31
- const check = limiter.verify(deps.Clock.now());
37
+ const check = limiter.verify(this.deps.Clock.now());
32
38
 
33
39
  if (!check.allowed) throw TooManyRequestsError;
34
40
 
35
- options.store.set(subject, limiter);
41
+ this.options.store.set(subject, limiter);
36
42
 
37
43
  return next();
38
44
  });
39
- };
45
+ }
@@ -1,5 +1,5 @@
1
1
  import type { MiddlewareHandler } from "hono";
2
2
 
3
- export interface ShieldCaptchaPort {
3
+ export interface ShieldPort {
4
4
  verify: MiddlewareHandler;
5
5
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"shield-api-key.middleware.d.ts","sourceRoot":"","sources":["../src/shield-api-key.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,KAAK,sBAAsB,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC,UAAU,CAAA;CAAE,CAAC;AAE5D,eAAO,MAAM,uBAAuB,eAA+D,CAAC;AAEpG,qBAAa,YAAY;IAGX,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,MAAM,CAAC,QAAQ,CAAC,WAAW,mBAAmB;gBAEjB,MAAM,EAAE,sBAAsB;IAE3D,MAAM,8DAIH;CACJ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"shield-api-key.middleware.js","sourceRoot":"","sources":["../src/shield-api-key.middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIpD,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,aAAa,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC;AAEpG,MAAM,OAAO,YAAY;IAGM;IAF7B,MAAM,CAAU,WAAW,GAAG,eAAe,CAAC;IAE9C,YAA6B,MAA8B;QAA9B,WAAM,GAAN,MAAM,CAAwB;IAAG,CAAC;IAE/D,MAAM,GAAG,gBAAgB,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QAC1C,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,IAAI,EAAE,CAAC;QAElF,MAAM,uBAAuB,CAAC;IAChC,CAAC,CAAC,CAAC"}
@@ -1,5 +0,0 @@
1
- import type { ShieldCaptchaPort } from "./shield-captcha.port";
2
- export declare class ShieldCaptchaNoopAdapter implements ShieldCaptchaPort {
3
- verify: import("hono").MiddlewareHandler<any, string, {}, Response>;
4
- }
5
- //# sourceMappingURL=shield-captcha-noop.adapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shield-captcha-noop.adapter.d.ts","sourceRoot":"","sources":["../src/shield-captcha-noop.adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,qBAAa,wBAAyB,YAAW,iBAAiB;IAChE,MAAM,8DAAgD;CACvD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"shield-captcha-noop.adapter.js","sourceRoot":"","sources":["../src/shield-captcha-noop.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,OAAO,wBAAwB;IACnC,MAAM,GAAG,gBAAgB,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;CACvD"}
@@ -1,5 +0,0 @@
1
- import type { MiddlewareHandler } from "hono";
2
- export interface ShieldCaptchaPort {
3
- verify: MiddlewareHandler;
4
- }
5
- //# sourceMappingURL=shield-captcha.port.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shield-captcha.port.d.ts","sourceRoot":"","sources":["../src/shield-captcha.port.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAE9C,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,iBAAiB,CAAC;CAC3B"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=shield-captcha.port.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shield-captcha.port.js","sourceRoot":"","sources":["../src/shield-captcha.port.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"shield-rate-limit.middleware.d.ts","sourceRoot":"","sources":["../src/shield-rate-limit.middleware.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,KAAK,eAAe,GAAG,CAAC,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC;AAC9C,KAAK,0BAA0B,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,CAAC;AAE5G,KAAK,YAAY,GAAG;IAAE,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC;AAEzC,eAAO,MAAM,mBAAmB,EAAE,eAA8B,CAAC;AACjE,eAAO,MAAM,mBAAmB,EAAE,eAAoD,CAAC;AAEvF,eAAO,MAAM,oBAAoB,eAA+D,CAAC;AAEjG,eAAO,MAAM,eAAe,GAAI,SAAS,0BAA0B,EAAE,MAAM,YAAY,gEAqBtF,CAAC"}
@@ -1,24 +0,0 @@
1
- import * as tools from "@bgord/tools";
2
- import { createMiddleware } from "hono/factory";
3
- import { HTTPException } from "hono/http-exception";
4
- export const AnonSubjectResolver = () => "anon";
5
- export const UserSubjectResolver = (c) => c.get("user")?.id ?? "anon";
6
- export const TooManyRequestsError = new HTTPException(429, { message: "app.too_many_requests" });
7
- export const ShieldRateLimit = (options, deps) => {
8
- return createMiddleware(async (c, next) => {
9
- if (!options.enabled)
10
- return next();
11
- const subject = options.subject(c);
12
- let limiter = await options.store.get(subject);
13
- if (!limiter) {
14
- limiter = new tools.RateLimiter(options.store.ttl);
15
- options.store.set(subject, limiter);
16
- }
17
- const check = limiter.verify(deps.Clock.now());
18
- if (!check.allowed)
19
- throw TooManyRequestsError;
20
- options.store.set(subject, limiter);
21
- return next();
22
- });
23
- };
24
- //# sourceMappingURL=shield-rate-limit.middleware.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shield-rate-limit.middleware.js","sourceRoot":"","sources":["../src/shield-rate-limit.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AASpD,MAAM,CAAC,MAAM,mBAAmB,GAAoB,GAAG,EAAE,CAAC,MAAM,CAAC;AACjE,MAAM,CAAC,MAAM,mBAAmB,GAAoB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,MAAM,CAAC;AAEvF,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,aAAa,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC;AAEjG,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAmC,EAAE,IAAkB,EAAE,EAAE;IACzF,OAAO,gBAAgB,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACxC,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,OAAO,IAAI,EAAE,CAAC;QAEpC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAEnC,IAAI,OAAO,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAE/C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,IAAI,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnD,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QAE/C,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,MAAM,oBAAoB,CAAC;QAE/C,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEpC,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -1,6 +0,0 @@
1
- import { createMiddleware } from "hono/factory";
2
- import type { ShieldCaptchaPort } from "./shield-captcha.port";
3
-
4
- export class ShieldCaptchaNoopAdapter implements ShieldCaptchaPort {
5
- verify = createMiddleware(async (_c, next) => next());
6
- }