@bgord/bun 0.3.5 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api-key-shield.d.ts +14 -13
- package/dist/api-key-shield.d.ts.map +1 -0
- package/dist/api-key-shield.js +19 -0
- package/dist/api-key-shield.js.map +1 -0
- package/dist/api-version.d.ts +6 -5
- package/dist/api-version.d.ts.map +1 -0
- package/dist/api-version.js +12 -0
- package/dist/api-version.js.map +1 -0
- package/dist/auth-shield.d.ts +30 -29
- package/dist/auth-shield.d.ts.map +1 -0
- package/dist/auth-shield.js +90 -0
- package/dist/auth-shield.js.map +1 -0
- package/dist/bgord-bun.cjs +1 -1
- package/dist/bgord-bun.cjs.map +1 -1
- package/dist/bgord-bun.modern.js +1 -1
- package/dist/bgord-bun.modern.js.map +1 -1
- package/dist/bgord-bun.module.js +1 -1
- package/dist/bgord-bun.module.js.map +1 -1
- package/dist/bgord-bun.umd.js +1 -1
- package/dist/bgord-bun.umd.js.map +1 -1
- package/dist/cache-response.d.ts +13 -12
- package/dist/cache-response.d.ts.map +1 -0
- package/dist/cache-response.js +29 -0
- package/dist/cache-response.js.map +1 -0
- package/dist/cache-static-files.d.ts +9 -8
- package/dist/cache-static-files.d.ts.map +1 -0
- package/dist/cache-static-files.js +25 -0
- package/dist/cache-static-files.js.map +1 -0
- package/dist/context.d.ts +10 -9
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +11 -0
- package/dist/context.js.map +1 -0
- package/dist/download-file.d.ts +12 -12
- package/dist/download-file.d.ts.map +1 -0
- package/dist/download-file.js +11 -0
- package/dist/download-file.js.map +1 -0
- package/dist/etag-extractor.d.ts +16 -15
- package/dist/etag-extractor.d.ts.map +1 -0
- package/dist/etag-extractor.js +33 -0
- package/dist/etag-extractor.js.map +1 -0
- package/dist/file-uploader.d.ts +13 -12
- package/dist/file-uploader.d.ts.map +1 -0
- package/dist/file-uploader.js +35 -0
- package/dist/file-uploader.js.map +1 -0
- package/dist/graceful-shutdown.d.ts +7 -6
- package/dist/graceful-shutdown.d.ts.map +1 -0
- package/dist/graceful-shutdown.js +32 -0
- package/dist/graceful-shutdown.js.map +1 -0
- package/dist/healthcheck.d.ts +21 -20
- package/dist/healthcheck.d.ts.map +1 -0
- package/dist/healthcheck.js +31 -0
- package/dist/healthcheck.js.map +1 -0
- package/dist/http-logger.d.ts +7 -7
- package/dist/http-logger.d.ts.map +1 -0
- package/dist/http-logger.js +88 -0
- package/dist/http-logger.js.map +1 -0
- package/dist/i18n.d.ts +27 -26
- package/dist/i18n.d.ts.map +1 -0
- package/dist/i18n.js +50 -0
- package/dist/i18n.js.map +1 -0
- package/dist/image-processor.d.ts +5 -4
- package/dist/image-processor.d.ts.map +1 -0
- package/dist/image-processor.js +5 -0
- package/dist/image-processor.js.map +1 -0
- package/dist/index.d.ts +18 -17
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/rate-limit-shield.d.ts +9 -8
- package/dist/rate-limit-shield.d.ts.map +1 -0
- package/dist/rate-limit-shield.js +18 -0
- package/dist/rate-limit-shield.js.map +1 -0
- package/dist/setup.d.ts +8 -7
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +34 -0
- package/dist/setup.js.map +1 -0
- package/dist/time-zone-offset.d.ts +15 -14
- package/dist/time-zone-offset.d.ts.map +1 -0
- package/dist/time-zone-offset.js +22 -0
- package/dist/time-zone-offset.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +15 -21
- package/src/http-logger.ts +1 -1
- package/src/i18n.ts +2 -1
- package/src/setup.ts +2 -1
package/dist/api-key-shield.d.ts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import * as bg from "@bgord/node";
|
|
2
|
-
import { HTTPException } from "hono/http-exception";
|
|
3
|
-
|
|
4
|
-
API_KEY: bg.Schema.ApiKeyType;
|
|
5
|
-
};
|
|
6
|
-
export declare const AccessDeniedApiKeyError: HTTPException;
|
|
7
|
-
export declare class ApiKeyShield {
|
|
8
|
-
private readonly config;
|
|
9
|
-
static readonly HEADER_NAME = "bgord-api-key";
|
|
10
|
-
constructor(config: ApiKeyShieldConfigType);
|
|
11
|
-
verify: import("hono").MiddlewareHandler<any, string, {}>;
|
|
12
|
-
}
|
|
13
|
-
export {};
|
|
1
|
+
import * as bg from "@bgord/node";
|
|
2
|
+
import { HTTPException } from "hono/http-exception";
|
|
3
|
+
type ApiKeyShieldConfigType = {
|
|
4
|
+
API_KEY: bg.Schema.ApiKeyType;
|
|
5
|
+
};
|
|
6
|
+
export declare const AccessDeniedApiKeyError: HTTPException;
|
|
7
|
+
export declare class ApiKeyShield {
|
|
8
|
+
private readonly config;
|
|
9
|
+
static readonly HEADER_NAME = "bgord-api-key";
|
|
10
|
+
constructor(config: ApiKeyShieldConfigType);
|
|
11
|
+
verify: import("hono").MiddlewareHandler<any, string, {}>;
|
|
12
|
+
}
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=api-key-shield.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-key-shield.d.ts","sourceRoot":"","sources":["../src/api-key-shield.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAElC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,KAAK,sBAAsB,GAAG;IAAE,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAA;CAAE,CAAC;AAEhE,eAAO,MAAM,uBAAuB,eAElC,CAAC;AAEH,qBAAa,YAAY;IAGX,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,MAAM,CAAC,QAAQ,CAAC,WAAW,mBAAmB;gBAEjB,MAAM,EAAE,sBAAsB;IAE3D,MAAM,oDAMH;CACJ"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createMiddleware } from "hono/factory";
|
|
2
|
+
import { HTTPException } from "hono/http-exception";
|
|
3
|
+
export const AccessDeniedApiKeyError = new HTTPException(403, {
|
|
4
|
+
message: "access_denied_api_key",
|
|
5
|
+
});
|
|
6
|
+
export class ApiKeyShield {
|
|
7
|
+
config;
|
|
8
|
+
static HEADER_NAME = "bgord-api-key";
|
|
9
|
+
constructor(config) {
|
|
10
|
+
this.config = config;
|
|
11
|
+
}
|
|
12
|
+
verify = createMiddleware(async (c, next) => {
|
|
13
|
+
if (c.req.header(ApiKeyShield.HEADER_NAME) === this.config.API_KEY) {
|
|
14
|
+
return next();
|
|
15
|
+
}
|
|
16
|
+
throw AccessDeniedApiKeyError;
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=api-key-shield.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-key-shield.js","sourceRoot":"","sources":["../src/api-key-shield.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;IAC5D,OAAO,EAAE,uBAAuB;CACjC,CAAC,CAAC;AAEH,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,EAAE,CAAC;YACnE,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,MAAM,uBAAuB,CAAC;IAChC,CAAC,CAAC,CAAC"}
|
package/dist/api-version.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
export declare class ApiVersion {
|
|
2
|
-
static HEADER_NAME: string;
|
|
3
|
-
static DEFAULT_API_VERSION: string;
|
|
4
|
-
static attach: import("hono").MiddlewareHandler<any, string, {}>;
|
|
5
|
-
}
|
|
1
|
+
export declare class ApiVersion {
|
|
2
|
+
static HEADER_NAME: string;
|
|
3
|
+
static DEFAULT_API_VERSION: string;
|
|
4
|
+
static attach: import("hono").MiddlewareHandler<any, string, {}>;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=api-version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-version.d.ts","sourceRoot":"","sources":["../src/api-version.ts"],"names":[],"mappings":"AAGA,qBAAa,UAAU;IACrB,MAAM,CAAC,WAAW,SAAiB;IAEnC,MAAM,CAAC,mBAAmB,SAAa;IAEvC,MAAM,CAAC,MAAM,oDAMV;CACJ"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as bg from "@bgord/node";
|
|
2
|
+
import { createMiddleware } from "hono/factory";
|
|
3
|
+
export class ApiVersion {
|
|
4
|
+
static HEADER_NAME = "api-version";
|
|
5
|
+
static DEFAULT_API_VERSION = "unknown";
|
|
6
|
+
static attach = createMiddleware(async (c, next) => {
|
|
7
|
+
const build = await bg.BuildInfoRepository.extract();
|
|
8
|
+
c.res.headers.set(ApiVersion.HEADER_NAME, build.BUILD_VERSION ?? ApiVersion.DEFAULT_API_VERSION);
|
|
9
|
+
await next();
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=api-version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-version.js","sourceRoot":"","sources":["../src/api-version.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,OAAO,UAAU;IACrB,MAAM,CAAC,WAAW,GAAG,aAAa,CAAC;IAEnC,MAAM,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAEvC,MAAM,CAAC,MAAM,GAAG,gBAAgB,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACjD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;QAErD,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC,aAAa,IAAI,UAAU,CAAC,mBAAmB,CAAC,CAAC;QAEjG,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC,CAAC"}
|
package/dist/auth-shield.d.ts
CHANGED
|
@@ -1,29 +1,30 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
Username: typeof bgn.Username;
|
|
7
|
-
Password: typeof bgn.Password;
|
|
8
|
-
HashedPassword: typeof bgn.HashedPassword;
|
|
9
|
-
lucia: Lucia;
|
|
10
|
-
findUniqueUserOrThrow: (username: bgn.Username) => Promise<T>;
|
|
11
|
-
};
|
|
12
|
-
export declare const AccessDeniedAuthShieldError: HTTPException;
|
|
13
|
-
export declare class AuthShield<T extends {
|
|
14
|
-
password: bgn.PasswordType;
|
|
15
|
-
id: bgn.IdType;
|
|
16
|
-
}> {
|
|
17
|
-
private readonly config;
|
|
18
|
-
constructor(overrides: Omit<AuthShieldConfigType<T>, "Username" | "Password" | "HashedPassword"> & {
|
|
19
|
-
Username?: typeof bgn.Username;
|
|
20
|
-
Password?: typeof bgn.Password;
|
|
21
|
-
HashedPassword?: typeof bgn.HashedPassword;
|
|
22
|
-
});
|
|
23
|
-
verify: hono.MiddlewareHandler<any, any, {}>;
|
|
24
|
-
reverse: hono.MiddlewareHandler<any, any, {}>;
|
|
25
|
-
detach: hono.MiddlewareHandler<any, any, {}>;
|
|
26
|
-
build: hono.MiddlewareHandler<any, any, {}>;
|
|
27
|
-
attach: hono.MiddlewareHandler<any, any, {}>;
|
|
28
|
-
}
|
|
29
|
-
export {};
|
|
1
|
+
import * as bgn from "@bgord/node";
|
|
2
|
+
import hono from "hono";
|
|
3
|
+
import { HTTPException } from "hono/http-exception";
|
|
4
|
+
import { Lucia } from "lucia";
|
|
5
|
+
type AuthShieldConfigType<T> = {
|
|
6
|
+
Username: typeof bgn.Username;
|
|
7
|
+
Password: typeof bgn.Password;
|
|
8
|
+
HashedPassword: typeof bgn.HashedPassword;
|
|
9
|
+
lucia: Lucia;
|
|
10
|
+
findUniqueUserOrThrow: (username: bgn.Username) => Promise<T>;
|
|
11
|
+
};
|
|
12
|
+
export declare const AccessDeniedAuthShieldError: HTTPException;
|
|
13
|
+
export declare class AuthShield<T extends {
|
|
14
|
+
password: bgn.PasswordType;
|
|
15
|
+
id: bgn.IdType;
|
|
16
|
+
}> {
|
|
17
|
+
private readonly config;
|
|
18
|
+
constructor(overrides: Omit<AuthShieldConfigType<T>, "Username" | "Password" | "HashedPassword"> & {
|
|
19
|
+
Username?: typeof bgn.Username;
|
|
20
|
+
Password?: typeof bgn.Password;
|
|
21
|
+
HashedPassword?: typeof bgn.HashedPassword;
|
|
22
|
+
});
|
|
23
|
+
verify: hono.MiddlewareHandler<any, any, {}>;
|
|
24
|
+
reverse: hono.MiddlewareHandler<any, any, {}>;
|
|
25
|
+
detach: hono.MiddlewareHandler<any, any, {}>;
|
|
26
|
+
build: hono.MiddlewareHandler<any, any, {}>;
|
|
27
|
+
attach: hono.MiddlewareHandler<any, any, {}>;
|
|
28
|
+
}
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=auth-shield.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-shield.d.ts","sourceRoot":"","sources":["../src/auth-shield.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,aAAa,CAAC;AACnC,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAc9B,KAAK,oBAAoB,CAAC,CAAC,IAAI;IAC7B,QAAQ,EAAE,OAAO,GAAG,CAAC,QAAQ,CAAC;IAC9B,QAAQ,EAAE,OAAO,GAAG,CAAC,QAAQ,CAAC;IAC9B,cAAc,EAAE,OAAO,GAAG,CAAC,cAAc,CAAC;IAC1C,KAAK,EAAE,KAAK,CAAC;IACb,qBAAqB,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;CAC/D,CAAC;AAEF,eAAO,MAAM,2BAA2B,eAEtC,CAAC;AAEH,qBAAa,UAAU,CAAC,CAAC,SAAS;IAAE,QAAQ,EAAE,GAAG,CAAC,YAAY,CAAC;IAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAA;CAAE;IAC9E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;gBAG/C,SAAS,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,gBAAgB,CAAC,GAAG;QACrF,QAAQ,CAAC,EAAE,OAAO,GAAG,CAAC,QAAQ,CAAC;QAC/B,QAAQ,CAAC,EAAE,OAAO,GAAG,CAAC,QAAQ,CAAC;QAC/B,cAAc,CAAC,EAAE,OAAO,GAAG,CAAC,cAAc,CAAC;KAC5C;IAaH,MAAM,uCAQH;IAEH,OAAO,uCAQJ;IAEH,MAAM,uCAUH;IAEH,KAAK,uCA6BF;IAEH,MAAM,uCAqBH;CACJ"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import * as bgn from "@bgord/node";
|
|
2
|
+
import { createMiddleware } from "hono/factory";
|
|
3
|
+
import { HTTPException } from "hono/http-exception";
|
|
4
|
+
class SessionId {
|
|
5
|
+
value;
|
|
6
|
+
constructor(cookie, lucia) {
|
|
7
|
+
this.value = lucia.readSessionCookie(cookie ?? "");
|
|
8
|
+
}
|
|
9
|
+
get() {
|
|
10
|
+
return this.value;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export const AccessDeniedAuthShieldError = new HTTPException(403, {
|
|
14
|
+
message: "access_denied_auth_shield",
|
|
15
|
+
});
|
|
16
|
+
export class AuthShield {
|
|
17
|
+
config;
|
|
18
|
+
constructor(overrides) {
|
|
19
|
+
const config = {
|
|
20
|
+
Username: overrides.Username ?? bgn.Username,
|
|
21
|
+
Password: overrides.Password ?? bgn.Password,
|
|
22
|
+
HashedPassword: overrides.HashedPassword ?? bgn.HashedPassword,
|
|
23
|
+
lucia: overrides.lucia,
|
|
24
|
+
findUniqueUserOrThrow: overrides.findUniqueUserOrThrow,
|
|
25
|
+
};
|
|
26
|
+
this.config = config;
|
|
27
|
+
}
|
|
28
|
+
verify = createMiddleware(async (c, next) => {
|
|
29
|
+
const user = c.get("user");
|
|
30
|
+
if (!user) {
|
|
31
|
+
throw AccessDeniedAuthShieldError;
|
|
32
|
+
}
|
|
33
|
+
return next();
|
|
34
|
+
});
|
|
35
|
+
reverse = createMiddleware(async (c, next) => {
|
|
36
|
+
const user = c.get("user");
|
|
37
|
+
if (user) {
|
|
38
|
+
throw AccessDeniedAuthShieldError;
|
|
39
|
+
}
|
|
40
|
+
return next();
|
|
41
|
+
});
|
|
42
|
+
detach = createMiddleware(async (c, next) => {
|
|
43
|
+
const cookie = c.req.header("cookie");
|
|
44
|
+
const sessionId = new SessionId(cookie, this.config.lucia).get();
|
|
45
|
+
if (!sessionId)
|
|
46
|
+
return next();
|
|
47
|
+
await this.config.lucia.invalidateSession(sessionId);
|
|
48
|
+
return next();
|
|
49
|
+
});
|
|
50
|
+
build = createMiddleware(async (c, next) => {
|
|
51
|
+
const cookie = c.req.header("cookie");
|
|
52
|
+
const sessionId = new SessionId(cookie, this.config.lucia).get();
|
|
53
|
+
if (!sessionId) {
|
|
54
|
+
c.set("user", null);
|
|
55
|
+
c.set("session", null);
|
|
56
|
+
return next();
|
|
57
|
+
}
|
|
58
|
+
const { session, user } = await this.config.lucia.validateSession(sessionId);
|
|
59
|
+
if (!session) {
|
|
60
|
+
c.res.headers.set("Set-Cookie", this.config.lucia.createBlankSessionCookie().serialize());
|
|
61
|
+
c.set("user", null);
|
|
62
|
+
c.set("session", null);
|
|
63
|
+
return next();
|
|
64
|
+
}
|
|
65
|
+
if (session.fresh) {
|
|
66
|
+
c.res.headers.set("Set-Cookie", this.config.lucia.createSessionCookie(session.id).serialize());
|
|
67
|
+
}
|
|
68
|
+
c.set("user", user);
|
|
69
|
+
c.set("session", session);
|
|
70
|
+
return next();
|
|
71
|
+
});
|
|
72
|
+
attach = createMiddleware(async (c, next) => {
|
|
73
|
+
try {
|
|
74
|
+
const body = await c.req.raw.clone().formData();
|
|
75
|
+
const username = new this.config.Username(body.get("username"));
|
|
76
|
+
const password = new this.config.Password(body.get("password"));
|
|
77
|
+
const user = await this.config.findUniqueUserOrThrow(username);
|
|
78
|
+
const hashedPassword = await this.config.HashedPassword.fromHash(user.password);
|
|
79
|
+
await hashedPassword.matchesOrThrow(password);
|
|
80
|
+
const session = await this.config.lucia.createSession(user.id, {});
|
|
81
|
+
const sessionCookie = this.config.lucia.createSessionCookie(session.id);
|
|
82
|
+
c.res.headers.set("Set-Cookie", sessionCookie.serialize());
|
|
83
|
+
return next();
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
throw AccessDeniedAuthShieldError;
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=auth-shield.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-shield.js","sourceRoot":"","sources":["../src/auth-shield.ts"],"names":[],"mappings":"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"}
|
package/dist/bgord-bun.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e=require("hono/factory"),r=require("hono/http-exception"),t=require("@bgord/node"),n=require("hono/bun"),o=require("lodash"),i=require("node:path"),s=require("hono/cookie"),a=require("hono/body-limit"),c=require("sharp"),u=require("hono/cors"),l=require("hono/secure-headers"),h=require("hono/request-id"),f=require("hono/timing");function d(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function m(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach(function(t){if("default"!==t){var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:function(){return e[t]}})}}),r.default=e,r}var v,p=/*#__PURE__*/m(t),g=/*#__PURE__*/d(o),y=/*#__PURE__*/d(i),E=/*#__PURE__*/d(c),P=new r.HTTPException(403,{message:"access_denied_api_key"}),w=function r(t){var n=this;this.config=void 0,this.verify=e.createMiddleware(function(e,t){try{if(e.req.header(r.HEADER_NAME)===n.config.API_KEY)return Promise.resolve(t());throw P}catch(e){return Promise.reject(e)}}),this.config=t};w.HEADER_NAME="bgord-api-key";var T=function(){};v=T,T.HEADER_NAME="api-version",T.DEFAULT_API_VERSION="unknown",T.attach=e.createMiddleware(function(e,r){try{return Promise.resolve(p.BuildInfoRepository.extract()).then(function(t){var n;return e.res.headers.set(v.HEADER_NAME,null!=(n=t.BUILD_VERSION)?n:v.DEFAULT_API_VERSION),Promise.resolve(r()).then(function(){})})}catch(e){return Promise.reject(e)}});var S=/*#__PURE__*/function(){function e(e,r){this.value=void 0,this.value=r.readSessionCookie(null!=e?e:"")}return e.prototype.get=function(){return this.value},e}(),A=new r.HTTPException(403,{message:"access_denied_auth_shield"}),_=function(){};_.attach=e.createMiddleware(function(e,r){try{return e.set("context",{requestId:e.get("requestId"),timeZoneOffset:e.get("timeZoneOffset")}),Promise.resolve(r()).then(function(){})}catch(e){return Promise.reject(e)}});var x=function(){};x.attach=e.createMiddleware(function(e,r){try{try{var t=String(e.req.header(p.ETag.IF_MATCH_HEADER_NAME));e.set("ETag",t&&"undefined"!==t?p.ETag.fromHeader(t):null)}catch(r){e.set("ETag",null)}return Promise.resolve(r()).then(function(){})}catch(e){return Promise.reject(e)}});var H=function(){};H.attach=e.createMiddleware(function(e,r){try{try{var t=String(e.req.header(p.WeakETag.IF_MATCH_HEADER_NAME));e.set("WeakETag",t&&"undefined"!==t?p.WeakETag.fromHeader(t):null)}catch(r){e.set("WeakETag",null)}return Promise.resolve(r()).then(function(){})}catch(e){return Promise.reject(e)}});var q=/*#__PURE__*/function(){function e(){}return e.shutdown=function(e,r){try{return void 0===r&&(r=p.noop),e.stop(),Promise.resolve(r()).then(function(){console.log("HTTP server closed")})}catch(e){return Promise.reject(e)}},e.applyTo=function(r,t){void 0===t&&(t=p.noop),process.on("SIGTERM",function(){try{return console.log("SIGTERM signal received: closing HTTP server"),Promise.resolve(e.shutdown(r,t)).then(function(){process.exit(0)})}catch(e){return Promise.reject(e)}}),process.on("SIGINT",function(){try{return console.log("SIGINT signal received: closing HTTP server"),Promise.resolve(e.shutdown(r,t)).then(function(){process.exit(0)})}catch(e){return Promise.reject(e)}}),process.on("unhandledRejection",function(n){try{return console.log("UnhandledPromiseRejectionWarning received: closing HTTP server"),console.log(JSON.stringify(n)),Promise.resolve(e.shutdown(r,t)).then(function(){process.exit(1)})}catch(e){return Promise.reject(e)}})},e}();function M(){return M=Object.assign?Object.assign.bind():function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)({}).hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e},M.apply(null,arguments)}var C="undefined"!=typeof Symbol?Symbol.iterator||(Symbol.iterator=Symbol("Symbol.iterator")):"@@iterator";function j(e,r,t){if(!e.s){if(t instanceof b){if(!t.s)return void(t.o=j.bind(null,e,r));1&r&&(r=t.s),t=t.v}if(t&&t.then)return void t.then(j.bind(null,e,r),j.bind(null,e,2));e.s=r,e.v=t;var n=e.o;n&&n(e)}}var b=/*#__PURE__*/function(){function e(){}return e.prototype.then=function(r,t){var n=new e,o=this.s;if(o){var i=1&o?r:t;if(i){try{j(n,1,i(this.v))}catch(e){j(n,2,e)}return n}return this}return this.o=function(e){try{var o=e.v;1&e.s?j(n,1,r?r(o):o):t?j(n,1,t(o)):j(n,2,o)}catch(e){j(n,2,e)}},n},e}();function I(e){return e instanceof b&&1&e.s}var O,N=e.createFactory(),L=function(){};function D(e,r){try{var t=e()}catch(e){return r(e)}return t&&t.then?t.then(void 0,r):t}L.build=function(e){return N.createHandlers(function(r){try{var t=new p.Stopwatch;return Promise.resolve(p.BuildInfoRepository.extract()).then(function(n){function o(){var e,o=i.every(function(e){return e.status!==p.PrerequisiteStatusEnum.failure})?p.PrerequisiteStatusEnum.success:p.PrerequisiteStatusEnum.failure,s=o===p.PrerequisiteStatusEnum.success?200:424,a=M({ok:o,details:i,version:null!=(e=n.BUILD_VERSION)?e:p.Schema.BuildVersion.parse("unknown"),uptime:p.Uptime.get(),memory:{bytes:p.MemoryConsumption.get().toBytes(),formatted:p.MemoryConsumption.get().format(p.SizeUnit.MB)}},t.stop());return r.json(a,s)}var i=[],s=function(e,r){if("function"==typeof e[C]){var t,n,o,i=e[C]();if(function e(s){try{for(;!(t=i.next()).done;)if((s=r(t.value))&&s.then){if(!I(s))return void s.then(e,o||(o=j.bind(null,n=new b,2)));s=s.v}n?j(n,1,s):n=s}catch(e){j(n||(n=new b),2,e)}}(),i.return){var s=function(e){try{t.done||i.return()}catch(e){}return e};if(n&&n.then)return n.then(s,function(e){throw s(e)});s()}return n}if(!("length"in e))throw new TypeError("Object is not iterable");for(var a=[],c=0;c<e.length;c++)a.push(e[c]);return function(e,r){var t,n,o=-1;return function i(s){try{for(;++o<e.length;)if((s=r(o))&&s.then){if(!I(s))return void s.then(i,n||(n=j.bind(null,t=new b,2)));s=s.v}t?j(t,1,s):t=s}catch(e){j(t||(t=new b),2,e)}}(),t}(a,function(e){return r(a[e])})}(e,function(e){return Promise.resolve(e.verify()).then(function(r){i.push({label:e.label,status:r})})});return s&&s.then?s.then(o):o()})}catch(e){return Promise.reject(e)}})};var k=/*#__PURE__*/function(){function e(){}return e.simplify=function(e){var r=JSON.stringify(e,function(e,r){return Array.isArray(r)?{type:"Array",length:r.length}:r});return JSON.parse(r)},e}();O=k,k.uninformativeHeaders=["accept","accept-encoding","cache-control","connection","content-length","content-type","cookie","dnt","host","origin","pragma","sec-fetch-dest","sec-fetch-mode","sec-fetch-site","sec-fetch-user","sec-gpc","upgrade-insecure-requests","user-agent","if-none-match"],k.build=function(r){return e.createMiddleware(function(e,t){try{var o,i=function(){var n={params:e.req.param(),headers:g.default.omit(e.req.raw.clone().headers.toJSON(),O.uninformativeHeaders),body:o,query:e.req.queries()};return r.http({operation:"http_request_before",correlationId:s,message:"request",method:u,url:c,client:l,metadata:g.default.pickBy(n,function(e){return!g.default.isEmpty(e)})}),Promise.resolve(t()).then(function(){function t(){var t,i={response:n,cacheHit:o},a=e.res.clone().headers.get("Server-Timing"),h=null!=(t=null==a?void 0:a.match(/dur=([0-9]*\.?[0-9]+)/))?t:void 0,f=null!=h&&h[1]?Number(h[1]):void 0;r.http({operation:"http_request_after",correlationId:s,message:"response",method:u,url:c,responseCode:e.res.status,durationMs:f,client:l,metadata:O.simplify(i)})}var n,o=e.res.clone().headers.get(p.CacheResponse.CACHE_HIT_HEADER)===p.CacheHitEnum.hit?p.CacheHitEnum.hit:void 0,i=D(function(){return Promise.resolve(e.res.clone().json()).then(function(e){n=e})},function(){});return i&&i.then?i.then(t):t()})},s=e.get("requestId"),a=n.getConnInfo(e),c=e.req.url,u=e.req.method,l={ip:e.req.header("x-real-ip")||e.req.header("x-forwarded-for")||a.remote.address,userAgent:e.req.header("user-agent")},h=D(function(){return Promise.resolve(e.req.raw.clone().json()).then(function(e){o=e})},function(){});return Promise.resolve(h&&h.then?h.then(i):i())}catch(e){return Promise.reject(e)}})};var F,R,U=new r.HTTPException(429,{message:"app.too_many_requests"}),B=/*#__PURE__*/function(){function e(){}return e.adjustTimestamp=function(e,r){return e-r},e.adjustDate=function(e,r){return new Date(e-r)},e}();F=B,B.TIME_ZONE_OFFSET_HEADER_NAME="time-zone-offset",B.attach=e.createMiddleware(function(e,r){try{var t=p.Schema.TimeZoneOffsetHeaderValue.parse(e.req.header(F.TIME_ZONE_OFFSET_HEADER_NAME)),n={minutes:t,seconds:p.Time.Minutes(t).seconds,miliseconds:p.Time.Minutes(t).ms};return e.set("timeZoneOffset",n),Promise.resolve(r()).then(function(){})}catch(e){return Promise.reject(e)}}),exports.CacheStaticFilesStrategy=void 0,(R=exports.CacheStaticFilesStrategy||(exports.CacheStaticFilesStrategy={})).never="never",R.always="always",R.five_minutes="five_minutes";var G,z=/*#__PURE__*/function(){function r(){}return r.handle=function(r){return e.createMiddleware(function(e,t){try{return r===exports.CacheStaticFilesStrategy.never&&e.res.headers.set("cache-control","private, no-cache, no-store, must-revalidate"),r===exports.CacheStaticFilesStrategy.always&&e.res.headers.set("cache-control","public, max-age="+p.Time.Days(365).seconds+", immutable"),r===exports.CacheStaticFilesStrategy.five_minutes&&e.res.headers.set("cache-control","public, max-age="+p.Time.Minutes(5).seconds),Promise.resolve(t())}catch(e){return Promise.reject(e)}})},r}();exports.CacheHitEnum=void 0,(G=exports.CacheHitEnum||(exports.CacheHitEnum={})).hit="hit",G.miss="miss";var K=function r(t){var n=this,o=this;this.cache=void 0,this.handle=e.createMiddleware(function(e,t){try{var o=g.default.escape(e.req.url);return n.cache.has(o)?(e.res.headers.set(r.CACHE_HIT_HEADER,exports.CacheHitEnum.hit),Promise.resolve(e.json(n.cache.get(o)))):(e.res.headers.set(r.CACHE_HIT_HEADER,exports.CacheHitEnum.miss),Promise.resolve(t()))}catch(e){return Promise.reject(e)}}),this.clear=e.createMiddleware(function(e,r){try{return o.cache.flushAll(),Promise.resolve(r())}catch(e){return Promise.reject(e)}}),this.cache=t};K.CACHE_HIT_HEADER="Cache-Hit";var Z=/*#__PURE__*/function(){function e(){}return e.attach=function(e){return{headers:new Headers({"Content-Disposition":'attachment; filename="'+e.filename+'"',"Content-Type":e.mime.raw})}},e}(),V=/*#__PURE__*/function(){function r(){}return r.applyTo=function(t){return e.createMiddleware(function(e,n){try{var o,i,a,c=null!=(o=null==t?void 0:t.translationsPath)?o:r.DEFAULT_TRANSLATIONS_PATH,u=null!=(i=null==t?void 0:t.defaultLanguage)?i:r.FALLBACK_LANGUAGE,l=null!=(a=s.getCookie(e,r.LANGUAGE_COOKIE_NAME))?a:u,h=Object.keys(t.supportedLanguages).find(function(e){return e===l})?l:r.FALLBACK_LANGUAGE;return e.set("supportedLanguages",Object.keys(t.supportedLanguages)),e.set("language",h),e.set("translationsPath",c),Promise.resolve(n())}catch(e){return Promise.reject(e)}})},r.getTranslations=function(e,t){try{try{return Promise.resolve(Bun.file(r.getTranslationPathForLanguage(e,t)).json())}catch(e){return console.log("I18n#getTranslations",e),Promise.resolve({})}}catch(e){return Promise.reject(e)}},r.useTranslations=function(e){return function(r,t){var n=e[r];return n?t?Object.entries(t).reduce(function(e,r){return e.replace("{{"+r[0]+"}}",String(r[1]))},n):n:(console.warn("[@bgord/node] missing translation for key: "+r),r)}},r.getTranslationPathForLanguage=function(e,t){return void 0===t&&(t=r.DEFAULT_TRANSLATIONS_PATH),p.Schema.Path.parse(y.default.join(t,e+".json"))},r}();V.LANGUAGE_COOKIE_NAME="accept-language",V.DEFAULT_TRANSLATIONS_PATH=p.Schema.Path.parse("infra/translations"),V.FALLBACK_LANGUAGE="en";var W=new r.HTTPException(400,{message:"invalid_file_mime_type_error"}),J=new r.HTTPException(400,{message:"file_too_big_error"}),Y=/*#__PURE__*/function(){function r(){}return r.validate=function(r){return[a.bodyLimit({maxSize:r.maxFilesSize,onError:function(){throw J}}),e.createMiddleware(function(e,t){try{return Promise.resolve(e.req.raw.clone().formData()).then(function(e){var n=e.get("file");if(!(n instanceof File))throw W;var o=new p.Mime(n.type);if(!r.mimeTypes.some(function(e){return new p.Mime(e).isSatisfiedBy(o)}))throw W;return t()})}catch(e){return Promise.reject(e)}})]},r}(),X=function(){};X.sharp=E.default;var Q=new p.Size({value:128,unit:p.SizeUnit.kB}).toBytes(),$=/*#__PURE__*/function(){function e(){}return e.essentials=function(e){return[l.secureHeaders(),a.bodyLimit({maxSize:Q}),T.attach,u.cors({origin:"*"}),h.requestId(),B.attach,_.attach,H.attach,x.attach,k.build(e),f.timing()]},e}();exports.AccessDeniedApiKeyError=P,exports.AccessDeniedAuthShieldError=A,exports.ApiKeyShield=w,exports.ApiVersion=T,exports.AuthShield=function(r){var t,n,o,i=this,s=this,a=this;this.config=void 0,this.verify=e.createMiddleware(function(e,r){try{if(!e.get("user"))throw A;return Promise.resolve(r())}catch(e){return Promise.reject(e)}}),this.reverse=e.createMiddleware(function(e,r){try{if(e.get("user"))throw A;return Promise.resolve(r())}catch(e){return Promise.reject(e)}}),this.detach=e.createMiddleware(function(e,r){try{var t=e.req.header("cookie"),n=new S(t,i.config.lucia).get();return n?Promise.resolve(i.config.lucia.invalidateSession(n)).then(function(){return r()}):Promise.resolve(r())}catch(e){return Promise.reject(e)}}),this.build=e.createMiddleware(function(e,r){try{var t=e.req.header("cookie"),n=new S(t,s.config.lucia).get();return n?Promise.resolve(s.config.lucia.validateSession(n)).then(function(t){var n=t.session,o=t.user;return n?(n.fresh&&e.res.headers.set("Set-Cookie",s.config.lucia.createSessionCookie(n.id).serialize()),e.set("user",o),e.set("session",n),r()):(e.res.headers.set("Set-Cookie",s.config.lucia.createBlankSessionCookie().serialize()),e.set("user",null),e.set("session",null),r())}):(e.set("user",null),e.set("session",null),Promise.resolve(r()))}catch(e){return Promise.reject(e)}}),this.attach=e.createMiddleware(function(e,r){try{return Promise.resolve(function(t,n){try{var o=Promise.resolve(e.req.raw.clone().formData()).then(function(t){var n=new a.config.Username(t.get("username")),o=new a.config.Password(t.get("password"));return Promise.resolve(a.config.findUniqueUserOrThrow(n)).then(function(t){return Promise.resolve(a.config.HashedPassword.fromHash(t.password)).then(function(n){return Promise.resolve(n.matchesOrThrow(o)).then(function(){return Promise.resolve(a.config.lucia.createSession(t.id,{})).then(function(t){var n=a.config.lucia.createSessionCookie(t.id);return e.res.headers.set("Set-Cookie",n.serialize()),r()})})})})})}catch(e){return n()}return o&&o.then?o.then(void 0,n):o}(0,function(){throw A}))}catch(e){return Promise.reject(e)}});var c={Username:null!=(t=r.Username)?t:p.Username,Password:null!=(n=r.Password)?n:p.Password,HashedPassword:null!=(o=r.HashedPassword)?o:p.HashedPassword,lucia:r.lucia,findUniqueUserOrThrow:r.findUniqueUserOrThrow};this.config=c},exports.BODY_LIMIT_MAX_SIZE=Q,exports.CacheResponse=K,exports.CacheStaticFiles=z,exports.Context=_,exports.DownloadFile=Z,exports.ETagExtractor=x,exports.FileTooBigError=J,exports.FileUploader=Y,exports.GracefulShutdown=q,exports.Healthcheck=L,exports.HttpLogger=k,exports.I18n=V,exports.ImageProcessor=X,exports.InvalidFileMimeTypeError=W,exports.Setup=$,exports.TimeZoneOffset=B,exports.TooManyRequestsError=U,exports.WeakETagExtractor=H,exports.rateLimitShield=function(r){var t=new p.RateLimiter(r);return e.createMiddleware(function(e,r){try{var n=Date.now();if(!t.verify(n).allowed)throw U;return Promise.resolve(r())}catch(e){return Promise.reject(e)}})};
|
|
1
|
+
var e=require("hono/factory"),r=require("hono/http-exception"),t=require("@bgord/node"),n=require("hono/bun"),o=require("lodash"),i=require("node:path"),s=require("hono/cookie"),a=require("hono/body-limit"),c=require("sharp"),u=require("hono/cors"),l=require("hono/request-id"),h=require("hono/secure-headers"),f=require("hono/timing");function d(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function m(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach(function(t){if("default"!==t){var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:function(){return e[t]}})}}),r.default=e,r}var v,p=/*#__PURE__*/m(t),g=/*#__PURE__*/d(o),y=/*#__PURE__*/d(i),E=/*#__PURE__*/d(c),P=new r.HTTPException(403,{message:"access_denied_api_key"}),w=function r(t){var n=this;this.config=void 0,this.verify=e.createMiddleware(function(e,t){try{if(e.req.header(r.HEADER_NAME)===n.config.API_KEY)return Promise.resolve(t());throw P}catch(e){return Promise.reject(e)}}),this.config=t};w.HEADER_NAME="bgord-api-key";var T=function(){};v=T,T.HEADER_NAME="api-version",T.DEFAULT_API_VERSION="unknown",T.attach=e.createMiddleware(function(e,r){try{return Promise.resolve(p.BuildInfoRepository.extract()).then(function(t){var n;return e.res.headers.set(v.HEADER_NAME,null!=(n=t.BUILD_VERSION)?n:v.DEFAULT_API_VERSION),Promise.resolve(r()).then(function(){})})}catch(e){return Promise.reject(e)}});var S=/*#__PURE__*/function(){function e(e,r){this.value=void 0,this.value=r.readSessionCookie(null!=e?e:"")}return e.prototype.get=function(){return this.value},e}(),A=new r.HTTPException(403,{message:"access_denied_auth_shield"}),_=function(){};_.attach=e.createMiddleware(function(e,r){try{return e.set("context",{requestId:e.get("requestId"),timeZoneOffset:e.get("timeZoneOffset")}),Promise.resolve(r()).then(function(){})}catch(e){return Promise.reject(e)}});var x=function(){};x.attach=e.createMiddleware(function(e,r){try{try{var t=String(e.req.header(p.ETag.IF_MATCH_HEADER_NAME));e.set("ETag",t&&"undefined"!==t?p.ETag.fromHeader(t):null)}catch(r){e.set("ETag",null)}return Promise.resolve(r()).then(function(){})}catch(e){return Promise.reject(e)}});var H=function(){};H.attach=e.createMiddleware(function(e,r){try{try{var t=String(e.req.header(p.WeakETag.IF_MATCH_HEADER_NAME));e.set("WeakETag",t&&"undefined"!==t?p.WeakETag.fromHeader(t):null)}catch(r){e.set("WeakETag",null)}return Promise.resolve(r()).then(function(){})}catch(e){return Promise.reject(e)}});var q=/*#__PURE__*/function(){function e(){}return e.shutdown=function(e,r){try{return void 0===r&&(r=p.noop),e.stop(),Promise.resolve(r()).then(function(){console.log("HTTP server closed")})}catch(e){return Promise.reject(e)}},e.applyTo=function(r,t){void 0===t&&(t=p.noop),process.on("SIGTERM",function(){try{return console.log("SIGTERM signal received: closing HTTP server"),Promise.resolve(e.shutdown(r,t)).then(function(){process.exit(0)})}catch(e){return Promise.reject(e)}}),process.on("SIGINT",function(){try{return console.log("SIGINT signal received: closing HTTP server"),Promise.resolve(e.shutdown(r,t)).then(function(){process.exit(0)})}catch(e){return Promise.reject(e)}}),process.on("unhandledRejection",function(n){try{return console.log("UnhandledPromiseRejectionWarning received: closing HTTP server"),console.log(JSON.stringify(n)),Promise.resolve(e.shutdown(r,t)).then(function(){process.exit(1)})}catch(e){return Promise.reject(e)}})},e}();function M(){return M=Object.assign?Object.assign.bind():function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)({}).hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e},M.apply(null,arguments)}var C="undefined"!=typeof Symbol?Symbol.iterator||(Symbol.iterator=Symbol("Symbol.iterator")):"@@iterator";function j(e,r,t){if(!e.s){if(t instanceof b){if(!t.s)return void(t.o=j.bind(null,e,r));1&r&&(r=t.s),t=t.v}if(t&&t.then)return void t.then(j.bind(null,e,r),j.bind(null,e,2));e.s=r,e.v=t;var n=e.o;n&&n(e)}}var b=/*#__PURE__*/function(){function e(){}return e.prototype.then=function(r,t){var n=new e,o=this.s;if(o){var i=1&o?r:t;if(i){try{j(n,1,i(this.v))}catch(e){j(n,2,e)}return n}return this}return this.o=function(e){try{var o=e.v;1&e.s?j(n,1,r?r(o):o):t?j(n,1,t(o)):j(n,2,o)}catch(e){j(n,2,e)}},n},e}();function I(e){return e instanceof b&&1&e.s}var O,N=e.createFactory(),L=function(){};function D(e,r){try{var t=e()}catch(e){return r(e)}return t&&t.then?t.then(void 0,r):t}L.build=function(e){return N.createHandlers(function(r){try{var t=new p.Stopwatch;return Promise.resolve(p.BuildInfoRepository.extract()).then(function(n){function o(){var e,o=i.every(function(e){return e.status!==p.PrerequisiteStatusEnum.failure})?p.PrerequisiteStatusEnum.success:p.PrerequisiteStatusEnum.failure,s=o===p.PrerequisiteStatusEnum.success?200:424,a=M({ok:o,details:i,version:null!=(e=n.BUILD_VERSION)?e:p.Schema.BuildVersion.parse("unknown"),uptime:p.Uptime.get(),memory:{bytes:p.MemoryConsumption.get().toBytes(),formatted:p.MemoryConsumption.get().format(p.SizeUnit.MB)}},t.stop());return r.json(a,s)}var i=[],s=function(e,r){if("function"==typeof e[C]){var t,n,o,i=e[C]();if(function e(s){try{for(;!(t=i.next()).done;)if((s=r(t.value))&&s.then){if(!I(s))return void s.then(e,o||(o=j.bind(null,n=new b,2)));s=s.v}n?j(n,1,s):n=s}catch(e){j(n||(n=new b),2,e)}}(),i.return){var s=function(e){try{t.done||i.return()}catch(e){}return e};if(n&&n.then)return n.then(s,function(e){throw s(e)});s()}return n}if(!("length"in e))throw new TypeError("Object is not iterable");for(var a=[],c=0;c<e.length;c++)a.push(e[c]);return function(e,r){var t,n,o=-1;return function i(s){try{for(;++o<e.length;)if((s=r(o))&&s.then){if(!I(s))return void s.then(i,n||(n=j.bind(null,t=new b,2)));s=s.v}t?j(t,1,s):t=s}catch(e){j(t||(t=new b),2,e)}}(),t}(a,function(e){return r(a[e])})}(e,function(e){return Promise.resolve(e.verify()).then(function(r){i.push({label:e.label,status:r})})});return s&&s.then?s.then(o):o()})}catch(e){return Promise.reject(e)}})};var k=/*#__PURE__*/function(){function e(){}return e.simplify=function(e){var r=JSON.stringify(e,function(e,r){return Array.isArray(r)?{type:"Array",length:r.length}:r});return JSON.parse(r)},e}();O=k,k.uninformativeHeaders=["accept","accept-encoding","cache-control","connection","content-length","content-type","cookie","dnt","host","origin","pragma","sec-fetch-dest","sec-fetch-mode","sec-fetch-site","sec-fetch-user","sec-gpc","upgrade-insecure-requests","user-agent","if-none-match"],k.build=function(r){return e.createMiddleware(function(e,t){try{var o,i=function(){var n={params:e.req.param(),headers:g.default.omit(e.req.raw.clone().headers.toJSON(),O.uninformativeHeaders),body:o,query:e.req.queries()};return r.http({operation:"http_request_before",correlationId:s,message:"request",method:u,url:c,client:l,metadata:g.default.pickBy(n,function(e){return!g.default.isEmpty(e)})}),Promise.resolve(t()).then(function(){function t(){var t,i={response:n,cacheHit:o},a=e.res.clone().headers.get("Server-Timing"),h=null!=(t=null==a?void 0:a.match(/dur=([0-9]*\.?[0-9]+)/))?t:void 0,f=null!=h&&h[1]?Number(h[1]):void 0;r.http({operation:"http_request_after",correlationId:s,message:"response",method:u,url:c,responseCode:e.res.status,durationMs:f,client:l,metadata:O.simplify(i)})}var n,o=e.res.clone().headers.get(p.CacheResponse.CACHE_HIT_HEADER)===p.CacheHitEnum.hit?p.CacheHitEnum.hit:void 0,i=D(function(){return Promise.resolve(e.res.clone().json()).then(function(e){n=e})},function(){});return i&&i.then?i.then(t):t()})},s=e.get("requestId"),a=n.getConnInfo(e),c=e.req.url,u=e.req.method,l={ip:e.req.header("x-real-ip")||e.req.header("x-forwarded-for")||a.remote.address,userAgent:e.req.header("user-agent")},h=D(function(){return Promise.resolve(e.req.raw.clone().json()).then(function(e){o=e})},function(){});return Promise.resolve(h&&h.then?h.then(i):i())}catch(e){return Promise.reject(e)}})};var F,R,U=new r.HTTPException(429,{message:"app.too_many_requests"}),B=/*#__PURE__*/function(){function e(){}return e.adjustTimestamp=function(e,r){return e-r},e.adjustDate=function(e,r){return new Date(e-r)},e}();F=B,B.TIME_ZONE_OFFSET_HEADER_NAME="time-zone-offset",B.attach=e.createMiddleware(function(e,r){try{var t=p.Schema.TimeZoneOffsetHeaderValue.parse(e.req.header(F.TIME_ZONE_OFFSET_HEADER_NAME)),n={minutes:t,seconds:p.Time.Minutes(t).seconds,miliseconds:p.Time.Minutes(t).ms};return e.set("timeZoneOffset",n),Promise.resolve(r()).then(function(){})}catch(e){return Promise.reject(e)}}),exports.CacheStaticFilesStrategy=void 0,(R=exports.CacheStaticFilesStrategy||(exports.CacheStaticFilesStrategy={})).never="never",R.always="always",R.five_minutes="five_minutes";var G,z=/*#__PURE__*/function(){function r(){}return r.handle=function(r){return e.createMiddleware(function(e,t){try{return r===exports.CacheStaticFilesStrategy.never&&e.res.headers.set("cache-control","private, no-cache, no-store, must-revalidate"),r===exports.CacheStaticFilesStrategy.always&&e.res.headers.set("cache-control","public, max-age="+p.Time.Days(365).seconds+", immutable"),r===exports.CacheStaticFilesStrategy.five_minutes&&e.res.headers.set("cache-control","public, max-age="+p.Time.Minutes(5).seconds),Promise.resolve(t())}catch(e){return Promise.reject(e)}})},r}();exports.CacheHitEnum=void 0,(G=exports.CacheHitEnum||(exports.CacheHitEnum={})).hit="hit",G.miss="miss";var K=function r(t){var n=this,o=this;this.cache=void 0,this.handle=e.createMiddleware(function(e,t){try{var o=g.default.escape(e.req.url);return n.cache.has(o)?(e.res.headers.set(r.CACHE_HIT_HEADER,exports.CacheHitEnum.hit),Promise.resolve(e.json(n.cache.get(o)))):(e.res.headers.set(r.CACHE_HIT_HEADER,exports.CacheHitEnum.miss),Promise.resolve(t()))}catch(e){return Promise.reject(e)}}),this.clear=e.createMiddleware(function(e,r){try{return o.cache.flushAll(),Promise.resolve(r())}catch(e){return Promise.reject(e)}}),this.cache=t};K.CACHE_HIT_HEADER="Cache-Hit";var Z=/*#__PURE__*/function(){function e(){}return e.attach=function(e){return{headers:new Headers({"Content-Disposition":'attachment; filename="'+e.filename+'"',"Content-Type":e.mime.raw})}},e}(),V=/*#__PURE__*/function(){function r(){}return r.applyTo=function(t){return e.createMiddleware(function(e,n){try{var o,i,a,c=null!=(o=null==t?void 0:t.translationsPath)?o:r.DEFAULT_TRANSLATIONS_PATH,u=null!=(i=null==t?void 0:t.defaultLanguage)?i:r.FALLBACK_LANGUAGE,l=null!=(a=s.getCookie(e,r.LANGUAGE_COOKIE_NAME))?a:u,h=Object.keys(t.supportedLanguages).find(function(e){return e===l})?l:r.FALLBACK_LANGUAGE;return e.set("supportedLanguages",Object.keys(t.supportedLanguages)),e.set("language",h),e.set("translationsPath",c),Promise.resolve(n())}catch(e){return Promise.reject(e)}})},r.getTranslations=function(e,t){try{try{return Promise.resolve(Bun.file(r.getTranslationPathForLanguage(e,t)).json())}catch(e){return console.log("I18n#getTranslations",e),Promise.resolve({})}}catch(e){return Promise.reject(e)}},r.useTranslations=function(e){return function(r,t){var n=e[r];return n?t?Object.entries(t).reduce(function(e,r){return e.replace("{{"+r[0]+"}}",String(r[1]))},n):n:(console.warn("[@bgord/node] missing translation for key: "+r),r)}},r.getTranslationPathForLanguage=function(e,t){return void 0===t&&(t=r.DEFAULT_TRANSLATIONS_PATH),p.Schema.Path.parse(y.default.join(t,e+".json"))},r}();V.LANGUAGE_COOKIE_NAME="accept-language",V.DEFAULT_TRANSLATIONS_PATH=p.Schema.Path.parse("infra/translations"),V.FALLBACK_LANGUAGE="en";var W=new r.HTTPException(400,{message:"invalid_file_mime_type_error"}),J=new r.HTTPException(400,{message:"file_too_big_error"}),Y=/*#__PURE__*/function(){function r(){}return r.validate=function(r){return[a.bodyLimit({maxSize:r.maxFilesSize,onError:function(){throw J}}),e.createMiddleware(function(e,t){try{return Promise.resolve(e.req.raw.clone().formData()).then(function(e){var n=e.get("file");if(!(n instanceof File))throw W;var o=new p.Mime(n.type);if(!r.mimeTypes.some(function(e){return new p.Mime(e).isSatisfiedBy(o)}))throw W;return t()})}catch(e){return Promise.reject(e)}})]},r}(),X=function(){};X.sharp=E.default;var Q=new p.Size({value:128,unit:p.SizeUnit.kB}).toBytes(),$=/*#__PURE__*/function(){function e(){}return e.essentials=function(e){return[h.secureHeaders(),a.bodyLimit({maxSize:Q}),T.attach,u.cors({origin:"*"}),l.requestId(),B.attach,_.attach,H.attach,x.attach,k.build(e),f.timing()]},e}();exports.AccessDeniedApiKeyError=P,exports.AccessDeniedAuthShieldError=A,exports.ApiKeyShield=w,exports.ApiVersion=T,exports.AuthShield=function(r){var t,n,o,i=this,s=this,a=this;this.config=void 0,this.verify=e.createMiddleware(function(e,r){try{if(!e.get("user"))throw A;return Promise.resolve(r())}catch(e){return Promise.reject(e)}}),this.reverse=e.createMiddleware(function(e,r){try{if(e.get("user"))throw A;return Promise.resolve(r())}catch(e){return Promise.reject(e)}}),this.detach=e.createMiddleware(function(e,r){try{var t=e.req.header("cookie"),n=new S(t,i.config.lucia).get();return n?Promise.resolve(i.config.lucia.invalidateSession(n)).then(function(){return r()}):Promise.resolve(r())}catch(e){return Promise.reject(e)}}),this.build=e.createMiddleware(function(e,r){try{var t=e.req.header("cookie"),n=new S(t,s.config.lucia).get();return n?Promise.resolve(s.config.lucia.validateSession(n)).then(function(t){var n=t.session,o=t.user;return n?(n.fresh&&e.res.headers.set("Set-Cookie",s.config.lucia.createSessionCookie(n.id).serialize()),e.set("user",o),e.set("session",n),r()):(e.res.headers.set("Set-Cookie",s.config.lucia.createBlankSessionCookie().serialize()),e.set("user",null),e.set("session",null),r())}):(e.set("user",null),e.set("session",null),Promise.resolve(r()))}catch(e){return Promise.reject(e)}}),this.attach=e.createMiddleware(function(e,r){try{return Promise.resolve(function(t,n){try{var o=Promise.resolve(e.req.raw.clone().formData()).then(function(t){var n=new a.config.Username(t.get("username")),o=new a.config.Password(t.get("password"));return Promise.resolve(a.config.findUniqueUserOrThrow(n)).then(function(t){return Promise.resolve(a.config.HashedPassword.fromHash(t.password)).then(function(n){return Promise.resolve(n.matchesOrThrow(o)).then(function(){return Promise.resolve(a.config.lucia.createSession(t.id,{})).then(function(t){var n=a.config.lucia.createSessionCookie(t.id);return e.res.headers.set("Set-Cookie",n.serialize()),r()})})})})})}catch(e){return n()}return o&&o.then?o.then(void 0,n):o}(0,function(){throw A}))}catch(e){return Promise.reject(e)}});var c={Username:null!=(t=r.Username)?t:p.Username,Password:null!=(n=r.Password)?n:p.Password,HashedPassword:null!=(o=r.HashedPassword)?o:p.HashedPassword,lucia:r.lucia,findUniqueUserOrThrow:r.findUniqueUserOrThrow};this.config=c},exports.BODY_LIMIT_MAX_SIZE=Q,exports.CacheResponse=K,exports.CacheStaticFiles=z,exports.Context=_,exports.DownloadFile=Z,exports.ETagExtractor=x,exports.FileTooBigError=J,exports.FileUploader=Y,exports.GracefulShutdown=q,exports.Healthcheck=L,exports.HttpLogger=k,exports.I18n=V,exports.ImageProcessor=X,exports.InvalidFileMimeTypeError=W,exports.Setup=$,exports.TimeZoneOffset=B,exports.TooManyRequestsError=U,exports.WeakETagExtractor=H,exports.rateLimitShield=function(r){var t=new p.RateLimiter(r);return e.createMiddleware(function(e,r){try{var n=Date.now();if(!t.verify(n).allowed)throw U;return Promise.resolve(r())}catch(e){return Promise.reject(e)}})};
|
|
2
2
|
//# sourceMappingURL=bgord-bun.cjs.map
|
package/dist/bgord-bun.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bgord-bun.cjs","sources":["../src/api-key-shield.ts","../src/api-version.ts","../src/auth-shield.ts","../src/context.ts","../src/etag-extractor.ts","../src/graceful-shutdown.ts","../src/healthcheck.ts","../src/http-logger.ts","../src/rate-limit-shield.ts","../src/time-zone-offset.ts","../src/cache-static-files.ts","../src/cache-response.ts","../src/download-file.ts","../src/i18n.ts","../src/file-uploader.ts","../src/image-processor.ts","../src/setup.ts"],"sourcesContent":["import * as bg from \"@bgord/node\";\nimport { createMiddleware } from \"hono/factory\";\nimport { HTTPException } from \"hono/http-exception\";\n\ntype ApiKeyShieldConfigType = { API_KEY: bg.Schema.ApiKeyType };\n\nexport const AccessDeniedApiKeyError = new HTTPException(403, {\n message: \"access_denied_api_key\",\n});\n\nexport class ApiKeyShield {\n static readonly HEADER_NAME = \"bgord-api-key\";\n\n constructor(private readonly config: ApiKeyShieldConfigType) {}\n\n verify = createMiddleware(async (c, next) => {\n if (c.req.header(ApiKeyShield.HEADER_NAME) === this.config.API_KEY) {\n return next();\n }\n\n throw AccessDeniedApiKeyError;\n });\n}\n","import * as bg from \"@bgord/node\";\nimport { createMiddleware } from \"hono/factory\";\n\nexport class ApiVersion {\n static HEADER_NAME = \"api-version\";\n\n static DEFAULT_API_VERSION = \"unknown\";\n\n static attach = createMiddleware(async (c, next) => {\n const build = await bg.BuildInfoRepository.extract();\n\n c.res.headers.set(\n ApiVersion.HEADER_NAME,\n build.BUILD_VERSION ?? ApiVersion.DEFAULT_API_VERSION\n );\n\n await next();\n });\n}\n","import hono from \"hono\";\nimport * as bgn from \"@bgord/node\";\nimport { Lucia } from \"lucia\";\nimport { createMiddleware } from \"hono/factory\";\nimport { HTTPException } from \"hono/http-exception\";\n\nclass SessionId {\n private value: string | null;\n\n constructor(cookie: string | undefined, lucia: Lucia) {\n this.value = lucia.readSessionCookie(cookie ?? \"\");\n }\n\n get(): SessionId[\"value\"] {\n return this.value;\n }\n}\n\ntype AuthShieldConfigType<T> = {\n Username: typeof bgn.Username;\n Password: typeof bgn.Password;\n HashedPassword: typeof bgn.HashedPassword;\n lucia: Lucia;\n findUniqueUserOrThrow: (username: bgn.Username) => Promise<T>;\n};\n\nexport const AccessDeniedAuthShieldError = new HTTPException(403, {\n message: \"access_denied_auth_shield\",\n});\n\nexport class AuthShield<\n T extends { password: bgn.PasswordType; id: bgn.IdType }\n> {\n private readonly config: AuthShieldConfigType<T>;\n\n constructor(\n overrides: Omit<\n AuthShieldConfigType<T>,\n \"Username\" | \"Password\" | \"HashedPassword\"\n > & {\n Username?: typeof bgn.Username;\n Password?: typeof bgn.Password;\n HashedPassword?: typeof bgn.HashedPassword;\n }\n ) {\n const config = {\n Username: overrides.Username ?? bgn.Username,\n Password: overrides.Password ?? bgn.Password,\n HashedPassword: overrides.HashedPassword ?? bgn.HashedPassword,\n lucia: overrides.lucia,\n findUniqueUserOrThrow: overrides.findUniqueUserOrThrow,\n };\n\n this.config = config;\n }\n\n verify = createMiddleware(async (c: hono.Context, next: hono.Next) => {\n const user = c.get(\"user\");\n\n if (!user) {\n throw AccessDeniedAuthShieldError;\n }\n\n return next();\n });\n\n reverse = createMiddleware(async (c: hono.Context, next: hono.Next) => {\n const user = c.get(\"user\");\n\n if (user) {\n throw AccessDeniedAuthShieldError;\n }\n\n return next();\n });\n\n detach = createMiddleware(async (c: hono.Context, next: hono.Next) => {\n const cookie = c.req.header(\"cookie\");\n\n const sessionId = new SessionId(cookie, this.config.lucia).get();\n\n if (!sessionId) return next();\n\n await this.config.lucia.invalidateSession(sessionId);\n\n return next();\n });\n\n build = createMiddleware(async (c: hono.Context, next: hono.Next) => {\n const cookie = c.req.header(\"cookie\");\n\n const sessionId = new SessionId(cookie, this.config.lucia).get();\n\n if (!sessionId) {\n c.set(\"user\", null);\n c.set(\"session\", null);\n\n return next();\n }\n\n const { session, user } = await this.config.lucia.validateSession(\n sessionId\n );\n\n if (!session) {\n c.res.headers.set(\n \"Set-Cookie\",\n this.config.lucia.createBlankSessionCookie().serialize()\n );\n c.set(\"user\", null);\n c.set(\"session\", null);\n\n return next();\n }\n\n if (session.fresh) {\n c.res.headers.set(\n \"Set-Cookie\",\n this.config.lucia.createSessionCookie(session.id).serialize()\n );\n }\n c.set(\"user\", user);\n c.set(\"session\", session);\n\n return next();\n });\n\n attach = createMiddleware(async (c: hono.Context, next: hono.Next) => {\n try {\n const body = await c.req.raw.clone().formData();\n\n const username = new this.config.Username(body.get(\"username\") as string);\n const password = new this.config.Password(body.get(\"password\") as string);\n\n const user = await this.config.findUniqueUserOrThrow(username);\n\n const hashedPassword = await this.config.HashedPassword.fromHash(\n user.password\n );\n await hashedPassword.matchesOrThrow(password);\n\n const session = await this.config.lucia.createSession(user.id, {});\n const sessionCookie = this.config.lucia.createSessionCookie(session.id);\n\n c.res.headers.set(\"Set-Cookie\", sessionCookie.serialize());\n\n return next();\n } catch (error) {\n throw AccessDeniedAuthShieldError;\n }\n });\n}\n","import * as bg from \"@bgord/node\";\nimport { createMiddleware } from \"hono/factory\";\n\nimport { TimeZoneOffsetVariables } from \"./time-zone-offset\";\n\nexport type ContextVariables = {\n context: bg.ContextType;\n requestId: string;\n} & TimeZoneOffsetVariables;\n\nexport class Context {\n static attach = createMiddleware(async (c, next) => {\n c.set(\"context\", {\n requestId: c.get(\"requestId\") as bg.Schema.CorrelationIdType,\n timeZoneOffset: c.get(\"timeZoneOffset\"),\n });\n\n await next();\n });\n}\n","import * as bg from \"@bgord/node\";\nimport { createMiddleware } from \"hono/factory\";\n\nexport type EtagVariables = {\n ETag: bg.ETag | null;\n WeakETag: bg.WeakETag | null;\n};\n\nexport class ETagExtractor {\n static attach = createMiddleware<{ Variables: EtagVariables }>(\n async (c, next) => {\n try {\n const header = String(c.req.header(bg.ETag.IF_MATCH_HEADER_NAME));\n\n if (!header || header === \"undefined\") c.set(\"ETag\", null);\n else c.set(\"ETag\", bg.ETag.fromHeader(header));\n } catch (error) {\n c.set(\"ETag\", null);\n }\n\n await next();\n }\n );\n}\n\nexport class WeakETagExtractor {\n static attach = createMiddleware<{ Variables: EtagVariables }>(\n async (c, next) => {\n try {\n const header = String(c.req.header(bg.WeakETag.IF_MATCH_HEADER_NAME));\n\n if (!header || header === \"undefined\") c.set(\"WeakETag\", null);\n else c.set(\"WeakETag\", bg.WeakETag.fromHeader(header));\n } catch (error) {\n c.set(\"WeakETag\", null);\n }\n\n await next();\n }\n );\n}\n","import * as bg from \"@bgord/node\";\n\ntype ServerType = ReturnType<typeof Bun.serve>;\n\nexport class GracefulShutdown {\n private static async shutdown(\n server: ServerType,\n callback: () => any = bg.noop\n ) {\n server.stop();\n await callback();\n // biome-ignore lint: lint/suspicious/noConsoleLog\n console.log(\"HTTP server closed\");\n }\n\n static applyTo(server: ServerType, callback: () => any = bg.noop) {\n process.on(\"SIGTERM\", async () => {\n // biome-ignore lint: lint/suspicious/noConsoleLog\n console.log(\"SIGTERM signal received: closing HTTP server\");\n await GracefulShutdown.shutdown(server, callback);\n process.exit(0);\n });\n\n process.on(\"SIGINT\", async () => {\n // biome-ignore lint: lint/suspicious/noConsoleLog\n console.log(\"SIGINT signal received: closing HTTP server\");\n await GracefulShutdown.shutdown(server, callback);\n process.exit(0);\n });\n\n process.on(\"unhandledRejection\", async (event) => {\n // biome-ignore lint: lint/suspicious/noConsoleLog\n console.log(\n \"UnhandledPromiseRejectionWarning received: closing HTTP server\"\n );\n\n // biome-ignore lint: lint/suspicious/noConsoleLog\n console.log(JSON.stringify(event));\n\n await GracefulShutdown.shutdown(server, callback);\n process.exit(1);\n });\n }\n}\n","import * as bg from \"@bgord/node\";\nimport { createFactory } from \"hono/factory\";\n\nconst handler = createFactory();\n\ntype HealthcheckResultType = {\n ok: bg.PrerequisiteStatusEnum;\n version: bg.Schema.BuildVersionType;\n details: {\n label: bg.PrerequisiteLabelType;\n status: bg.PrerequisiteStatusEnum;\n }[];\n uptime: bg.UptimeResultType;\n memory: {\n bytes: bg.Size[\"bytes\"];\n formatted: ReturnType<bg.Size[\"format\"]>;\n };\n} & bg.StopwatchResultType;\n\nexport class Healthcheck {\n static build = (\n prerequisites: bg.AbstractPrerequisite<bg.BasePrerequisiteConfig>[]\n ) =>\n handler.createHandlers(async (c) => {\n const stopwatch = new bg.Stopwatch();\n\n const build = await bg.BuildInfoRepository.extract();\n\n const details: HealthcheckResultType[\"details\"][number][] = [];\n\n for (const prerequisite of prerequisites) {\n const status = await prerequisite.verify();\n details.push({ label: prerequisite.label, status });\n }\n\n const ok = details.every(\n (result) => result.status !== bg.PrerequisiteStatusEnum.failure\n )\n ? bg.PrerequisiteStatusEnum.success\n : bg.PrerequisiteStatusEnum.failure;\n\n const code = ok === bg.PrerequisiteStatusEnum.success ? 200 : 424;\n\n const result: HealthcheckResultType = {\n ok,\n details,\n version: build.BUILD_VERSION ?? bg.Schema.BuildVersion.parse(\"unknown\"),\n uptime: bg.Uptime.get(),\n memory: {\n bytes: bg.MemoryConsumption.get().toBytes(),\n formatted: bg.MemoryConsumption.get().format(bg.SizeUnit.MB),\n },\n ...stopwatch.stop(),\n };\n\n return c.json(result, code);\n });\n}\n","import * as bg from \"@bgord/node\";\nimport { createMiddleware } from \"hono/factory\";\nimport { getConnInfo } from \"hono/bun\";\nimport _ from \"lodash\";\n\nexport class HttpLogger {\n private static simplify(response: unknown) {\n const result = JSON.stringify(response, (_key, value) =>\n Array.isArray(value) ? { type: \"Array\", length: value.length } : value\n );\n\n return JSON.parse(result);\n }\n\n private static uninformativeHeaders = [\n \"accept\",\n \"accept-encoding\",\n \"cache-control\",\n \"connection\",\n \"content-length\",\n \"content-type\",\n \"cookie\",\n \"dnt\",\n \"host\",\n \"origin\",\n \"pragma\",\n \"sec-fetch-dest\",\n \"sec-fetch-mode\",\n \"sec-fetch-site\",\n \"sec-fetch-user\",\n \"sec-gpc\",\n \"upgrade-insecure-requests\",\n \"user-agent\",\n \"if-none-match\",\n ];\n\n static build = (logger: bg.Logger) =>\n createMiddleware(async (c, next) => {\n const correlationId = c.get(\"requestId\") as bg.Schema.CorrelationIdType;\n const info = getConnInfo(c);\n const url = c.req.url;\n const method = c.req.method;\n\n const client = {\n ip:\n c.req.header(\"x-real-ip\") ||\n c.req.header(\"x-forwarded-for\") ||\n info.remote.address,\n userAgent: c.req.header(\"user-agent\"),\n };\n\n let body: any;\n\n try {\n body = await c.req.raw.clone().json();\n } catch (error) {}\n\n const httpRequestBeforeMetadata = {\n params: c.req.param(),\n headers: _.omit(\n c.req.raw.clone().headers.toJSON(),\n HttpLogger.uninformativeHeaders\n ),\n body,\n query: c.req.queries(),\n };\n\n logger.http({\n operation: \"http_request_before\",\n correlationId,\n message: \"request\",\n method,\n url,\n client,\n metadata: _.pickBy(\n httpRequestBeforeMetadata,\n (value) => !_.isEmpty(value)\n ),\n });\n\n await next();\n\n const cacheHitHeader = c.res\n .clone()\n .headers.get(bg.CacheResponse.CACHE_HIT_HEADER);\n\n const cacheHit =\n cacheHitHeader === bg.CacheHitEnum.hit\n ? bg.CacheHitEnum.hit\n : undefined;\n\n let response: any;\n try {\n response = await c.res.clone().json();\n } catch (error) {}\n\n const httpRequestAfterMetadata = {\n response,\n cacheHit,\n };\n\n const serverTimingMs = c.res.clone().headers.get(\"Server-Timing\");\n\n const durationMsMatch =\n serverTimingMs?.match(/dur=([0-9]*\\.?[0-9]+)/) ?? undefined;\n\n const durationMs = durationMsMatch?.[1]\n ? Number(durationMsMatch[1])\n : undefined;\n\n logger.http({\n operation: \"http_request_after\",\n correlationId,\n message: \"response\",\n method,\n url,\n responseCode: c.res.status,\n durationMs,\n client,\n metadata: HttpLogger.simplify(httpRequestAfterMetadata),\n });\n });\n}\n","import * as bg from \"@bgord/node\";\nimport { HTTPException } from \"hono/http-exception\";\nimport { createMiddleware } from \"hono/factory\";\n\ntype RateLimitShieldOptionsType = { ms: bg.Schema.TimestampType };\n\nexport const TooManyRequestsError = new HTTPException(429, {\n message: \"app.too_many_requests\",\n});\n\nexport const rateLimitShield = (options: RateLimitShieldOptionsType) => {\n const rateLimiter = new bg.RateLimiter(options);\n\n return createMiddleware(async (_c, next) => {\n const currentTimestampMs = Date.now();\n const check = rateLimiter.verify(currentTimestampMs);\n\n if (!check.allowed) {\n throw TooManyRequestsError;\n }\n\n return next();\n });\n};\n","import * as bg from \"@bgord/node\";\nimport { createMiddleware } from \"hono/factory\";\n\nexport type TimeZoneOffsetVariables = {\n timeZoneOffset: {\n minutes: bg.Schema.TimeZoneOffsetValueType;\n seconds: bg.Schema.TimeZoneOffsetValueType;\n miliseconds: bg.Schema.TimeZoneOffsetValueType;\n };\n};\n\nexport class TimeZoneOffset {\n static TIME_ZONE_OFFSET_HEADER_NAME = \"time-zone-offset\";\n\n static attach = createMiddleware(async (c, next) => {\n const timeZoneOffsetMinutes = bg.Schema.TimeZoneOffsetHeaderValue.parse(\n c.req.header(TimeZoneOffset.TIME_ZONE_OFFSET_HEADER_NAME)\n );\n\n const timeZoneOffset = {\n minutes: timeZoneOffsetMinutes,\n seconds: bg.Time.Minutes(timeZoneOffsetMinutes).seconds,\n miliseconds: bg.Time.Minutes(timeZoneOffsetMinutes).ms,\n };\n\n c.set(\"timeZoneOffset\", timeZoneOffset);\n\n await next();\n });\n\n static adjustTimestamp(\n timestamp: bg.Schema.TimestampType,\n timeZoneOffsetMs: bg.Schema.TimeZoneOffsetValueType\n ): bg.Schema.TimestampType {\n return timestamp - timeZoneOffsetMs;\n }\n\n static adjustDate(\n timestamp: bg.Schema.TimestampType,\n timeZoneOffsetMs: bg.Schema.TimeZoneOffsetValueType\n ): Date {\n return new Date(timestamp - timeZoneOffsetMs);\n }\n}\n","import * as bg from \"@bgord/node\";\nimport { createMiddleware } from \"hono/factory\";\n\nexport enum CacheStaticFilesStrategy {\n never = \"never\",\n always = \"always\",\n five_minutes = \"five_minutes\",\n}\n\nexport class CacheStaticFiles {\n static handle(strategy: CacheStaticFilesStrategy) {\n return createMiddleware(async (c, next) => {\n if (strategy === CacheStaticFilesStrategy.never) {\n c.res.headers.set(\n \"cache-control\",\n \"private, no-cache, no-store, must-revalidate\"\n );\n }\n if (strategy === CacheStaticFilesStrategy.always) {\n c.res.headers.set(\n \"cache-control\",\n `public, max-age=${bg.Time.Days(365).seconds}, immutable`\n );\n }\n if (strategy === CacheStaticFilesStrategy.five_minutes) {\n c.res.headers.set(\n \"cache-control\",\n `public, max-age=${bg.Time.Minutes(5).seconds}`\n );\n }\n return next();\n });\n }\n}\n","import { createMiddleware } from \"hono/factory\";\nimport NodeCache from \"node-cache\";\nimport _ from \"lodash\";\n\nexport enum CacheHitEnum {\n hit = \"hit\",\n miss = \"miss\",\n}\n\nexport class CacheResponse {\n static readonly CACHE_HIT_HEADER = \"Cache-Hit\";\n\n constructor(private readonly cache: NodeCache) {}\n\n handle = createMiddleware(async (c, next) => {\n const url = _.escape(c.req.url);\n\n if (this.cache.has(url)) {\n c.res.headers.set(CacheResponse.CACHE_HIT_HEADER, CacheHitEnum.hit);\n\n // @ts-ignore\n return c.json(this.cache.get(url));\n }\n\n c.res.headers.set(CacheResponse.CACHE_HIT_HEADER, CacheHitEnum.miss);\n\n return next();\n });\n\n clear = createMiddleware(async (_c, next) => {\n this.cache.flushAll();\n\n return next();\n });\n}\n","import * as bgn from \"@bgord/node\";\nimport type { PathLike } from \"node:fs\";\n\nexport type DownloadFileConfigType = { filename: PathLike; mime: bgn.Mime };\n\nexport class DownloadFile {\n static attach(config: DownloadFileConfigType) {\n return {\n headers: new Headers({\n \"Content-Disposition\": `attachment; filename=\"${config.filename}\"`,\n \"Content-Type\": config.mime.raw,\n }),\n };\n }\n}\n","import * as bgn from \"@bgord/node\";\nimport path from \"node:path\";\nimport { createMiddleware } from \"hono/factory\";\nimport { getCookie } from \"hono/cookie\";\n\nexport type TranslationsKeyType = string;\nexport type TranslationsValueType = string;\nexport type TranslationsType = Record<\n TranslationsKeyType,\n TranslationsValueType\n>;\n\nexport type TranslationPlaceholderType = string;\nexport type TranslationPlaceholderValueType = string | number;\nexport type TranslationVariableType = Record<\n TranslationPlaceholderType,\n TranslationPlaceholderValueType\n>;\n\nexport type I18nConfigType = {\n translationsPath?: bgn.Schema.PathType;\n defaultLanguage?: bgn.Schema.LanguageType;\n supportedLanguages: Record<string, bgn.Schema.LanguageType>;\n};\n\nexport type I18nVariablesType = {\n language: bgn.Schema.LanguageType;\n supportedLanguages: bgn.Schema.LanguageType[];\n translationsPath: bgn.Schema.PathType;\n};\n\nexport class I18n {\n static LANGUAGE_COOKIE_NAME = \"accept-language\";\n\n static DEFAULT_TRANSLATIONS_PATH =\n bgn.Schema.Path.parse(\"infra/translations\");\n\n static FALLBACK_LANGUAGE = \"en\";\n\n static applyTo(config: I18nConfigType) {\n return createMiddleware(async (c, next) => {\n const translationsPath =\n config?.translationsPath ?? I18n.DEFAULT_TRANSLATIONS_PATH;\n\n const defaultLanguage = config?.defaultLanguage ?? I18n.FALLBACK_LANGUAGE;\n\n const chosenLanguage =\n getCookie(c, I18n.LANGUAGE_COOKIE_NAME) ?? defaultLanguage;\n\n const language = Object.keys(config.supportedLanguages).find(\n (language) => language === chosenLanguage\n )\n ? chosenLanguage\n : I18n.FALLBACK_LANGUAGE;\n\n c.set(\"supportedLanguages\", Object.keys(config.supportedLanguages));\n c.set(\"language\", language);\n c.set(\"translationsPath\", translationsPath);\n\n return next();\n });\n }\n\n static async getTranslations(\n language: bgn.Schema.LanguageType,\n translationsPath: bgn.Schema.PathType\n ): Promise<TranslationsType> {\n try {\n return Bun.file(\n I18n.getTranslationPathForLanguage(language, translationsPath)\n ).json();\n } catch (error) {\n // biome-ignore lint: lint/suspicious/noConsoleLog\n console.log(\"I18n#getTranslations\", error);\n\n return {};\n }\n }\n\n static useTranslations(translations: TranslationsType) {\n return function translate(\n key: TranslationsKeyType,\n variables?: TranslationVariableType\n ) {\n const translation = translations[key];\n\n if (!translation) {\n console.warn(`[@bgord/node] missing translation for key: ${key}`);\n return key;\n }\n\n if (!variables) return translation;\n\n return Object.entries(variables).reduce(\n (result, [placeholder, value]) =>\n result.replace(`{{${placeholder}}}`, String(value)),\n translation\n );\n };\n }\n\n static getTranslationPathForLanguage(\n language: bgn.Schema.LanguageType,\n translationsPath = I18n.DEFAULT_TRANSLATIONS_PATH\n ): bgn.Schema.PathType {\n return bgn.Schema.Path.parse(\n path.join(translationsPath, `${language}.json`)\n );\n }\n}\n","import * as bgn from \"@bgord/node\";\nimport { createMiddleware } from \"hono/factory\";\nimport { HTTPException } from \"hono/http-exception\";\nimport { bodyLimit } from \"hono/body-limit\";\n\nexport const InvalidFileMimeTypeError = new HTTPException(400, {\n message: \"invalid_file_mime_type_error\",\n});\n\nexport const FileTooBigError = new HTTPException(400, {\n message: \"file_too_big_error\",\n});\n\ntype FileUploaderConfigType = {\n mimeTypes: string[];\n maxFilesSize: bgn.SizeValueType;\n};\n\nexport class FileUploader {\n static validate(config: FileUploaderConfigType) {\n return [\n bodyLimit({\n maxSize: config.maxFilesSize,\n onError: () => {\n throw FileTooBigError;\n },\n }),\n\n createMiddleware(async (c, next) => {\n const body = await c.req.raw.clone().formData();\n\n const file = body.get(\"file\");\n\n if (!(file instanceof File)) {\n throw InvalidFileMimeTypeError;\n }\n\n const contentType = new bgn.Mime(file.type);\n const accepted = config.mimeTypes.some((acceptedMimeType) =>\n new bgn.Mime(acceptedMimeType).isSatisfiedBy(contentType)\n );\n\n if (!accepted) throw InvalidFileMimeTypeError;\n return next();\n }),\n ];\n }\n}\n","import sharp from \"sharp\";\n\nexport class ImageProcessor {\n static sharp = sharp;\n}\n","import * as bgn from \"@bgord/node\";\nimport { bodyLimit } from \"hono/body-limit\";\nimport { cors } from \"hono/cors\";\nimport { secureHeaders } from \"hono/secure-headers\";\nimport { requestId } from \"hono/request-id\";\nimport { timing } from \"hono/timing\";\n\nimport { ApiVersion } from \"./api-version\";\nimport { TimeZoneOffset } from \"./time-zone-offset\";\nimport { Context } from \"./context\";\nimport { WeakETagExtractor, ETagExtractor } from \"./etag-extractor\";\nimport { HttpLogger } from \"./http-logger\";\n\nexport const BODY_LIMIT_MAX_SIZE = new bgn.Size({\n value: 128,\n unit: bgn.SizeUnit.kB,\n}).toBytes();\n\nexport class Setup {\n static essentials(logger: bgn.Logger) {\n return [\n secureHeaders(),\n bodyLimit({ maxSize: BODY_LIMIT_MAX_SIZE }),\n ApiVersion.attach,\n cors({ origin: \"*\" }),\n requestId(),\n TimeZoneOffset.attach,\n Context.attach,\n WeakETagExtractor.attach,\n ETagExtractor.attach,\n HttpLogger.build(logger),\n timing(),\n ];\n }\n}\n"],"names":["AccessDeniedApiKeyError","HTTPException","message","ApiKeyShield","config","_this","this","verify","createMiddleware","c","next","req","header","HEADER_NAME","API_KEY","Promise","resolve","e","reject","ApiVersion","DEFAULT_API_VERSION","attach","bg","BuildInfoRepository","extract","then","build","_build$BUILD_VERSION","res","headers","set","BUILD_VERSION","SessionId","cookie","lucia","value","readSessionCookie","prototype","get","AccessDeniedAuthShieldError","Context","requestId","timeZoneOffset","ETagExtractor","String","ETag","IF_MATCH_HEADER_NAME","fromHeader","error","WeakETagExtractor","WeakETag","GracefulShutdown","shutdown","server","callback","undefined","noop","stop","console","log","applyTo","process","on","exit","event","JSON","stringify","_Pact","onFulfilled","onRejected","result","state","_settle","v","o","handler","createFactory","Healthcheck","prerequisites","createHandlers","stopwatch","Stopwatch","_temp2","ok","details","every","status","PrerequisiteStatusEnum","failure","success","code","_extends","version","Schema","BuildVersion","parse","uptime","Uptime","memory","bytes","MemoryConsumption","toBytes","formatted","format","SizeUnit","MB","json","_temp","_forOf","prerequisite","push","label","HttpLogger","simplify","response","_key","Array","isArray","type","length","uninformativeHeaders","logger","body","_temp4","httpRequestBeforeMetadata","params","param","_","omit","raw","clone","toJSON","query","queries","http","operation","correlationId","method","url","client","metadata","pickBy","isEmpty","_serverTimingMs$match","httpRequestAfterMetadata","cacheHit","serverTimingMs","durationMsMatch","match","durationMs","Number","responseCode","CacheResponse","CACHE_HIT_HEADER","CacheHitEnum","hit","_catch","_c$res$clone$json","info","getConnInfo","ip","remote","address","userAgent","_temp3","_c$req$raw$clone$json","_TimeZoneOffset","CacheStaticFilesStrategy","TooManyRequestsError","TimeZoneOffset","adjustTimestamp","timestamp","timeZoneOffsetMs","adjustDate","Date","TIME_ZONE_OFFSET_HEADER_NAME","timeZoneOffsetMinutes","TimeZoneOffsetHeaderValue","minutes","seconds","Time","Minutes","miliseconds","ms","CacheStaticFiles","handle","strategy","never","always","Days","five_minutes","cache","_this2","escape","has","miss","clear","_c","flushAll","DownloadFile","Headers","filename","mime","I18n","_config$translationsP","_config$defaultLangua","_getCookie","translationsPath","DEFAULT_TRANSLATIONS_PATH","defaultLanguage","FALLBACK_LANGUAGE","chosenLanguage","getCookie","LANGUAGE_COOKIE_NAME","language","Object","keys","supportedLanguages","find","getTranslations","Bun","file","getTranslationPathForLanguage","useTranslations","translations","key","variables","translation","entries","reduce","_ref","replace","placeholder","warn","bgn","Path","path","join","InvalidFileMimeTypeError","FileTooBigError","FileUploader","validate","bodyLimit","maxSize","maxFilesSize","onError","formData","File","contentType","Mime","mimeTypes","some","acceptedMimeType","isSatisfiedBy","ImageProcessor","sharp","BODY_LIMIT_MAX_SIZE","Size","unit","kB","Setup","essentials","secureHeaders","cors","origin","timing","overrides","_overrides$Username","_overrides$Password","_overrides$HashedPass","_this3","reverse","detach","sessionId","invalidateSession","validateSession","session","user","fresh","createSessionCookie","id","serialize","createBlankSessionCookie","username","Username","password","Password","findUniqueUserOrThrow","HashedPassword","fromHash","hashedPassword","matchesOrThrow","createSession","sessionCookie","options","rateLimiter","RateLimiter","currentTimestampMs","now","allowed"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bgord-bun.cjs","sources":["../src/api-key-shield.ts","../src/api-version.ts","../src/auth-shield.ts","../src/context.ts","../src/etag-extractor.ts","../src/graceful-shutdown.ts","../src/healthcheck.ts","../src/http-logger.ts","../src/rate-limit-shield.ts","../src/time-zone-offset.ts","../src/cache-static-files.ts","../src/cache-response.ts","../src/download-file.ts","../src/i18n.ts","../src/file-uploader.ts","../src/image-processor.ts","../src/setup.ts"],"sourcesContent":["import * as bg from \"@bgord/node\";\nimport { createMiddleware } from \"hono/factory\";\nimport { HTTPException } from \"hono/http-exception\";\n\ntype ApiKeyShieldConfigType = { API_KEY: bg.Schema.ApiKeyType };\n\nexport const AccessDeniedApiKeyError = new HTTPException(403, {\n message: \"access_denied_api_key\",\n});\n\nexport class ApiKeyShield {\n static readonly HEADER_NAME = \"bgord-api-key\";\n\n constructor(private readonly config: ApiKeyShieldConfigType) {}\n\n verify = createMiddleware(async (c, next) => {\n if (c.req.header(ApiKeyShield.HEADER_NAME) === this.config.API_KEY) {\n return next();\n }\n\n throw AccessDeniedApiKeyError;\n });\n}\n","import * as bg from \"@bgord/node\";\nimport { createMiddleware } from \"hono/factory\";\n\nexport class ApiVersion {\n static HEADER_NAME = \"api-version\";\n\n static DEFAULT_API_VERSION = \"unknown\";\n\n static attach = createMiddleware(async (c, next) => {\n const build = await bg.BuildInfoRepository.extract();\n\n c.res.headers.set(ApiVersion.HEADER_NAME, build.BUILD_VERSION ?? ApiVersion.DEFAULT_API_VERSION);\n\n await next();\n });\n}\n","import * as bgn from \"@bgord/node\";\nimport hono from \"hono\";\nimport { createMiddleware } from \"hono/factory\";\nimport { HTTPException } from \"hono/http-exception\";\nimport { Lucia } from \"lucia\";\n\nclass SessionId {\n private value: string | null;\n\n constructor(cookie: string | undefined, lucia: Lucia) {\n this.value = lucia.readSessionCookie(cookie ?? \"\");\n }\n\n get(): SessionId[\"value\"] {\n return this.value;\n }\n}\n\ntype AuthShieldConfigType<T> = {\n Username: typeof bgn.Username;\n Password: typeof bgn.Password;\n HashedPassword: typeof bgn.HashedPassword;\n lucia: Lucia;\n findUniqueUserOrThrow: (username: bgn.Username) => Promise<T>;\n};\n\nexport const AccessDeniedAuthShieldError = new HTTPException(403, {\n message: \"access_denied_auth_shield\",\n});\n\nexport class AuthShield<T extends { password: bgn.PasswordType; id: bgn.IdType }> {\n private readonly config: AuthShieldConfigType<T>;\n\n constructor(\n overrides: Omit<AuthShieldConfigType<T>, \"Username\" | \"Password\" | \"HashedPassword\"> & {\n Username?: typeof bgn.Username;\n Password?: typeof bgn.Password;\n HashedPassword?: typeof bgn.HashedPassword;\n },\n ) {\n const config = {\n Username: overrides.Username ?? bgn.Username,\n Password: overrides.Password ?? bgn.Password,\n HashedPassword: overrides.HashedPassword ?? bgn.HashedPassword,\n lucia: overrides.lucia,\n findUniqueUserOrThrow: overrides.findUniqueUserOrThrow,\n };\n\n this.config = config;\n }\n\n verify = createMiddleware(async (c: hono.Context, next: hono.Next) => {\n const user = c.get(\"user\");\n\n if (!user) {\n throw AccessDeniedAuthShieldError;\n }\n\n return next();\n });\n\n reverse = createMiddleware(async (c: hono.Context, next: hono.Next) => {\n const user = c.get(\"user\");\n\n if (user) {\n throw AccessDeniedAuthShieldError;\n }\n\n return next();\n });\n\n detach = createMiddleware(async (c: hono.Context, next: hono.Next) => {\n const cookie = c.req.header(\"cookie\");\n\n const sessionId = new SessionId(cookie, this.config.lucia).get();\n\n if (!sessionId) return next();\n\n await this.config.lucia.invalidateSession(sessionId);\n\n return next();\n });\n\n build = createMiddleware(async (c: hono.Context, next: hono.Next) => {\n const cookie = c.req.header(\"cookie\");\n\n const sessionId = new SessionId(cookie, this.config.lucia).get();\n\n if (!sessionId) {\n c.set(\"user\", null);\n c.set(\"session\", null);\n\n return next();\n }\n\n const { session, user } = await this.config.lucia.validateSession(sessionId);\n\n if (!session) {\n c.res.headers.set(\"Set-Cookie\", this.config.lucia.createBlankSessionCookie().serialize());\n c.set(\"user\", null);\n c.set(\"session\", null);\n\n return next();\n }\n\n if (session.fresh) {\n c.res.headers.set(\"Set-Cookie\", this.config.lucia.createSessionCookie(session.id).serialize());\n }\n c.set(\"user\", user);\n c.set(\"session\", session);\n\n return next();\n });\n\n attach = createMiddleware(async (c: hono.Context, next: hono.Next) => {\n try {\n const body = await c.req.raw.clone().formData();\n\n const username = new this.config.Username(body.get(\"username\") as string);\n const password = new this.config.Password(body.get(\"password\") as string);\n\n const user = await this.config.findUniqueUserOrThrow(username);\n\n const hashedPassword = await this.config.HashedPassword.fromHash(user.password);\n await hashedPassword.matchesOrThrow(password);\n\n const session = await this.config.lucia.createSession(user.id, {});\n const sessionCookie = this.config.lucia.createSessionCookie(session.id);\n\n c.res.headers.set(\"Set-Cookie\", sessionCookie.serialize());\n\n return next();\n } catch (error) {\n throw AccessDeniedAuthShieldError;\n }\n });\n}\n","import * as bg from \"@bgord/node\";\nimport { createMiddleware } from \"hono/factory\";\n\nimport { TimeZoneOffsetVariables } from \"./time-zone-offset\";\n\nexport type ContextVariables = {\n context: bg.ContextType;\n requestId: string;\n} & TimeZoneOffsetVariables;\n\nexport class Context {\n static attach = createMiddleware(async (c, next) => {\n c.set(\"context\", {\n requestId: c.get(\"requestId\") as bg.Schema.CorrelationIdType,\n timeZoneOffset: c.get(\"timeZoneOffset\"),\n });\n\n await next();\n });\n}\n","import * as bg from \"@bgord/node\";\nimport { createMiddleware } from \"hono/factory\";\n\nexport type EtagVariables = {\n ETag: bg.ETag | null;\n WeakETag: bg.WeakETag | null;\n};\n\nexport class ETagExtractor {\n static attach = createMiddleware<{ Variables: EtagVariables }>(async (c, next) => {\n try {\n const header = String(c.req.header(bg.ETag.IF_MATCH_HEADER_NAME));\n\n if (!header || header === \"undefined\") c.set(\"ETag\", null);\n else c.set(\"ETag\", bg.ETag.fromHeader(header));\n } catch (error) {\n c.set(\"ETag\", null);\n }\n\n await next();\n });\n}\n\nexport class WeakETagExtractor {\n static attach = createMiddleware<{ Variables: EtagVariables }>(async (c, next) => {\n try {\n const header = String(c.req.header(bg.WeakETag.IF_MATCH_HEADER_NAME));\n\n if (!header || header === \"undefined\") c.set(\"WeakETag\", null);\n else c.set(\"WeakETag\", bg.WeakETag.fromHeader(header));\n } catch (error) {\n c.set(\"WeakETag\", null);\n }\n\n await next();\n });\n}\n","import * as bg from \"@bgord/node\";\n\ntype ServerType = ReturnType<typeof Bun.serve>;\n\nexport class GracefulShutdown {\n private static async shutdown(server: ServerType, callback: () => any = bg.noop) {\n server.stop();\n await callback();\n // biome-ignore lint: lint/suspicious/noConsoleLog\n console.log(\"HTTP server closed\");\n }\n\n static applyTo(server: ServerType, callback: () => any = bg.noop) {\n process.on(\"SIGTERM\", async () => {\n // biome-ignore lint: lint/suspicious/noConsoleLog\n console.log(\"SIGTERM signal received: closing HTTP server\");\n await GracefulShutdown.shutdown(server, callback);\n process.exit(0);\n });\n\n process.on(\"SIGINT\", async () => {\n // biome-ignore lint: lint/suspicious/noConsoleLog\n console.log(\"SIGINT signal received: closing HTTP server\");\n await GracefulShutdown.shutdown(server, callback);\n process.exit(0);\n });\n\n process.on(\"unhandledRejection\", async (event) => {\n // biome-ignore lint: lint/suspicious/noConsoleLog\n console.log(\"UnhandledPromiseRejectionWarning received: closing HTTP server\");\n\n // biome-ignore lint: lint/suspicious/noConsoleLog\n console.log(JSON.stringify(event));\n\n await GracefulShutdown.shutdown(server, callback);\n process.exit(1);\n });\n }\n}\n","import * as bg from \"@bgord/node\";\nimport { createFactory } from \"hono/factory\";\n\nconst handler = createFactory();\n\ntype HealthcheckResultType = {\n ok: bg.PrerequisiteStatusEnum;\n version: bg.Schema.BuildVersionType;\n details: {\n label: bg.PrerequisiteLabelType;\n status: bg.PrerequisiteStatusEnum;\n }[];\n uptime: bg.UptimeResultType;\n memory: {\n bytes: bg.Size[\"bytes\"];\n formatted: ReturnType<bg.Size[\"format\"]>;\n };\n} & bg.StopwatchResultType;\n\nexport class Healthcheck {\n static build = (prerequisites: bg.AbstractPrerequisite<bg.BasePrerequisiteConfig>[]) =>\n handler.createHandlers(async (c) => {\n const stopwatch = new bg.Stopwatch();\n\n const build = await bg.BuildInfoRepository.extract();\n\n const details: HealthcheckResultType[\"details\"][number][] = [];\n\n for (const prerequisite of prerequisites) {\n const status = await prerequisite.verify();\n details.push({ label: prerequisite.label, status });\n }\n\n const ok = details.every((result) => result.status !== bg.PrerequisiteStatusEnum.failure)\n ? bg.PrerequisiteStatusEnum.success\n : bg.PrerequisiteStatusEnum.failure;\n\n const code = ok === bg.PrerequisiteStatusEnum.success ? 200 : 424;\n\n const result: HealthcheckResultType = {\n ok,\n details,\n version: build.BUILD_VERSION ?? bg.Schema.BuildVersion.parse(\"unknown\"),\n uptime: bg.Uptime.get(),\n memory: {\n bytes: bg.MemoryConsumption.get().toBytes(),\n formatted: bg.MemoryConsumption.get().format(bg.SizeUnit.MB),\n },\n ...stopwatch.stop(),\n };\n\n return c.json(result, code);\n });\n}\n","import * as bg from \"@bgord/node\";\nimport { getConnInfo } from \"hono/bun\";\nimport { createMiddleware } from \"hono/factory\";\nimport _ from \"lodash\";\n\nexport class HttpLogger {\n private static simplify(response: unknown) {\n const result = JSON.stringify(response, (_key, value) =>\n Array.isArray(value) ? { type: \"Array\", length: value.length } : value,\n );\n\n return JSON.parse(result);\n }\n\n private static uninformativeHeaders = [\n \"accept\",\n \"accept-encoding\",\n \"cache-control\",\n \"connection\",\n \"content-length\",\n \"content-type\",\n \"cookie\",\n \"dnt\",\n \"host\",\n \"origin\",\n \"pragma\",\n \"sec-fetch-dest\",\n \"sec-fetch-mode\",\n \"sec-fetch-site\",\n \"sec-fetch-user\",\n \"sec-gpc\",\n \"upgrade-insecure-requests\",\n \"user-agent\",\n \"if-none-match\",\n ];\n\n static build = (logger: bg.Logger) =>\n createMiddleware(async (c, next) => {\n const correlationId = c.get(\"requestId\") as bg.Schema.CorrelationIdType;\n const info = getConnInfo(c);\n const url = c.req.url;\n const method = c.req.method;\n\n const client = {\n ip: c.req.header(\"x-real-ip\") || c.req.header(\"x-forwarded-for\") || info.remote.address,\n userAgent: c.req.header(\"user-agent\"),\n };\n\n let body: any;\n\n try {\n body = await c.req.raw.clone().json();\n } catch (error) {}\n\n const httpRequestBeforeMetadata = {\n params: c.req.param(),\n headers: _.omit(c.req.raw.clone().headers.toJSON(), HttpLogger.uninformativeHeaders),\n body,\n query: c.req.queries(),\n };\n\n logger.http({\n operation: \"http_request_before\",\n correlationId,\n message: \"request\",\n method,\n url,\n client,\n metadata: _.pickBy(httpRequestBeforeMetadata, (value) => !_.isEmpty(value)),\n });\n\n await next();\n\n const cacheHitHeader = c.res.clone().headers.get(bg.CacheResponse.CACHE_HIT_HEADER);\n\n const cacheHit = cacheHitHeader === bg.CacheHitEnum.hit ? bg.CacheHitEnum.hit : undefined;\n\n let response: any;\n try {\n response = await c.res.clone().json();\n } catch (error) {}\n\n const httpRequestAfterMetadata = {\n response,\n cacheHit,\n };\n\n const serverTimingMs = c.res.clone().headers.get(\"Server-Timing\");\n\n const durationMsMatch = serverTimingMs?.match(/dur=([0-9]*\\.?[0-9]+)/) ?? undefined;\n\n const durationMs = durationMsMatch?.[1] ? Number(durationMsMatch[1]) : undefined;\n\n logger.http({\n operation: \"http_request_after\",\n correlationId,\n message: \"response\",\n method,\n url,\n responseCode: c.res.status,\n durationMs,\n client,\n metadata: HttpLogger.simplify(httpRequestAfterMetadata),\n });\n });\n}\n","import * as bg from \"@bgord/node\";\nimport { createMiddleware } from \"hono/factory\";\nimport { HTTPException } from \"hono/http-exception\";\n\ntype RateLimitShieldOptionsType = { ms: bg.Schema.TimestampType };\n\nexport const TooManyRequestsError = new HTTPException(429, {\n message: \"app.too_many_requests\",\n});\n\nexport const rateLimitShield = (options: RateLimitShieldOptionsType) => {\n const rateLimiter = new bg.RateLimiter(options);\n\n return createMiddleware(async (_c, next) => {\n const currentTimestampMs = Date.now();\n const check = rateLimiter.verify(currentTimestampMs);\n\n if (!check.allowed) {\n throw TooManyRequestsError;\n }\n\n return next();\n });\n};\n","import * as bg from \"@bgord/node\";\nimport { createMiddleware } from \"hono/factory\";\n\nexport type TimeZoneOffsetVariables = {\n timeZoneOffset: {\n minutes: bg.Schema.TimeZoneOffsetValueType;\n seconds: bg.Schema.TimeZoneOffsetValueType;\n miliseconds: bg.Schema.TimeZoneOffsetValueType;\n };\n};\n\nexport class TimeZoneOffset {\n static TIME_ZONE_OFFSET_HEADER_NAME = \"time-zone-offset\";\n\n static attach = createMiddleware(async (c, next) => {\n const timeZoneOffsetMinutes = bg.Schema.TimeZoneOffsetHeaderValue.parse(\n c.req.header(TimeZoneOffset.TIME_ZONE_OFFSET_HEADER_NAME),\n );\n\n const timeZoneOffset = {\n minutes: timeZoneOffsetMinutes,\n seconds: bg.Time.Minutes(timeZoneOffsetMinutes).seconds,\n miliseconds: bg.Time.Minutes(timeZoneOffsetMinutes).ms,\n };\n\n c.set(\"timeZoneOffset\", timeZoneOffset);\n\n await next();\n });\n\n static adjustTimestamp(\n timestamp: bg.Schema.TimestampType,\n timeZoneOffsetMs: bg.Schema.TimeZoneOffsetValueType,\n ): bg.Schema.TimestampType {\n return timestamp - timeZoneOffsetMs;\n }\n\n static adjustDate(\n timestamp: bg.Schema.TimestampType,\n timeZoneOffsetMs: bg.Schema.TimeZoneOffsetValueType,\n ): Date {\n return new Date(timestamp - timeZoneOffsetMs);\n }\n}\n","import * as bg from \"@bgord/node\";\nimport { createMiddleware } from \"hono/factory\";\n\nexport enum CacheStaticFilesStrategy {\n never = \"never\",\n always = \"always\",\n five_minutes = \"five_minutes\",\n}\n\nexport class CacheStaticFiles {\n static handle(strategy: CacheStaticFilesStrategy) {\n return createMiddleware(async (c, next) => {\n if (strategy === CacheStaticFilesStrategy.never) {\n c.res.headers.set(\"cache-control\", \"private, no-cache, no-store, must-revalidate\");\n }\n if (strategy === CacheStaticFilesStrategy.always) {\n c.res.headers.set(\"cache-control\", `public, max-age=${bg.Time.Days(365).seconds}, immutable`);\n }\n if (strategy === CacheStaticFilesStrategy.five_minutes) {\n c.res.headers.set(\"cache-control\", `public, max-age=${bg.Time.Minutes(5).seconds}`);\n }\n return next();\n });\n }\n}\n","import { createMiddleware } from \"hono/factory\";\nimport _ from \"lodash\";\nimport NodeCache from \"node-cache\";\n\nexport enum CacheHitEnum {\n hit = \"hit\",\n miss = \"miss\",\n}\n\nexport class CacheResponse {\n static readonly CACHE_HIT_HEADER = \"Cache-Hit\";\n\n constructor(private readonly cache: NodeCache) {}\n\n handle = createMiddleware(async (c, next) => {\n const url = _.escape(c.req.url);\n\n if (this.cache.has(url)) {\n c.res.headers.set(CacheResponse.CACHE_HIT_HEADER, CacheHitEnum.hit);\n\n // @ts-ignore\n return c.json(this.cache.get(url));\n }\n\n c.res.headers.set(CacheResponse.CACHE_HIT_HEADER, CacheHitEnum.miss);\n\n return next();\n });\n\n clear = createMiddleware(async (_c, next) => {\n this.cache.flushAll();\n\n return next();\n });\n}\n","import type { PathLike } from \"node:fs\";\nimport * as bgn from \"@bgord/node\";\n\nexport type DownloadFileConfigType = { filename: PathLike; mime: bgn.Mime };\n\nexport class DownloadFile {\n static attach(config: DownloadFileConfigType) {\n return {\n headers: new Headers({\n \"Content-Disposition\": `attachment; filename=\"${config.filename}\"`,\n \"Content-Type\": config.mime.raw,\n }),\n };\n }\n}\n","import path from \"node:path\";\nimport * as bgn from \"@bgord/node\";\nimport { getCookie } from \"hono/cookie\";\nimport { createMiddleware } from \"hono/factory\";\n\nexport type TranslationsKeyType = string;\nexport type TranslationsValueType = string;\nexport type TranslationsType = Record<TranslationsKeyType, TranslationsValueType>;\n\nexport type TranslationPlaceholderType = string;\nexport type TranslationPlaceholderValueType = string | number;\nexport type TranslationVariableType = Record<TranslationPlaceholderType, TranslationPlaceholderValueType>;\n\nexport type I18nConfigType = {\n translationsPath?: bgn.Schema.PathType;\n defaultLanguage?: bgn.Schema.LanguageType;\n supportedLanguages: Record<string, bgn.Schema.LanguageType>;\n};\n\nexport type I18nVariablesType = {\n language: bgn.Schema.LanguageType;\n supportedLanguages: bgn.Schema.LanguageType[];\n translationsPath: bgn.Schema.PathType;\n};\n\nexport class I18n {\n static LANGUAGE_COOKIE_NAME = \"accept-language\";\n\n static DEFAULT_TRANSLATIONS_PATH = bgn.Schema.Path.parse(\"infra/translations\");\n\n static FALLBACK_LANGUAGE = \"en\";\n\n static applyTo(config: I18nConfigType) {\n return createMiddleware(async (c, next) => {\n const translationsPath = config?.translationsPath ?? I18n.DEFAULT_TRANSLATIONS_PATH;\n\n const defaultLanguage = config?.defaultLanguage ?? I18n.FALLBACK_LANGUAGE;\n\n const chosenLanguage = getCookie(c, I18n.LANGUAGE_COOKIE_NAME) ?? defaultLanguage;\n\n const language = Object.keys(config.supportedLanguages).find((language) => language === chosenLanguage)\n ? chosenLanguage\n : I18n.FALLBACK_LANGUAGE;\n\n c.set(\"supportedLanguages\", Object.keys(config.supportedLanguages));\n c.set(\"language\", language);\n c.set(\"translationsPath\", translationsPath);\n\n return next();\n });\n }\n\n static async getTranslations(\n language: bgn.Schema.LanguageType,\n translationsPath: bgn.Schema.PathType,\n ): Promise<TranslationsType> {\n try {\n return Bun.file(I18n.getTranslationPathForLanguage(language, translationsPath)).json();\n } catch (error) {\n // biome-ignore lint: lint/suspicious/noConsoleLog\n console.log(\"I18n#getTranslations\", error);\n\n return {};\n }\n }\n\n static useTranslations(translations: TranslationsType) {\n return function translate(key: TranslationsKeyType, variables?: TranslationVariableType) {\n const translation = translations[key];\n\n if (!translation) {\n console.warn(`[@bgord/node] missing translation for key: ${key}`);\n return key;\n }\n\n if (!variables) return translation;\n\n return Object.entries(variables).reduce(\n (result, [placeholder, value]) => result.replace(`{{${placeholder}}}`, String(value)),\n translation,\n );\n };\n }\n\n static getTranslationPathForLanguage(\n language: bgn.Schema.LanguageType,\n translationsPath = I18n.DEFAULT_TRANSLATIONS_PATH,\n ): bgn.Schema.PathType {\n return bgn.Schema.Path.parse(path.join(translationsPath, `${language}.json`));\n }\n}\n","import * as bgn from \"@bgord/node\";\nimport { bodyLimit } from \"hono/body-limit\";\nimport { createMiddleware } from \"hono/factory\";\nimport { HTTPException } from \"hono/http-exception\";\n\nexport const InvalidFileMimeTypeError = new HTTPException(400, {\n message: \"invalid_file_mime_type_error\",\n});\n\nexport const FileTooBigError = new HTTPException(400, {\n message: \"file_too_big_error\",\n});\n\ntype FileUploaderConfigType = {\n mimeTypes: string[];\n maxFilesSize: bgn.SizeValueType;\n};\n\nexport class FileUploader {\n static validate(config: FileUploaderConfigType) {\n return [\n bodyLimit({\n maxSize: config.maxFilesSize,\n onError: () => {\n throw FileTooBigError;\n },\n }),\n\n createMiddleware(async (c, next) => {\n const body = await c.req.raw.clone().formData();\n\n const file = body.get(\"file\");\n\n if (!(file instanceof File)) {\n throw InvalidFileMimeTypeError;\n }\n\n const contentType = new bgn.Mime(file.type);\n const accepted = config.mimeTypes.some((acceptedMimeType) =>\n new bgn.Mime(acceptedMimeType).isSatisfiedBy(contentType),\n );\n\n if (!accepted) throw InvalidFileMimeTypeError;\n return next();\n }),\n ];\n }\n}\n","import sharp from \"sharp\";\n\nexport class ImageProcessor {\n static sharp = sharp;\n}\n","import * as bgn from \"@bgord/node\";\nimport { bodyLimit } from \"hono/body-limit\";\nimport { cors } from \"hono/cors\";\nimport { requestId } from \"hono/request-id\";\nimport { secureHeaders } from \"hono/secure-headers\";\nimport { timing } from \"hono/timing\";\n\nimport { ApiVersion } from \"./api-version\";\nimport { Context } from \"./context\";\nimport { ETagExtractor, WeakETagExtractor } from \"./etag-extractor\";\nimport { HttpLogger } from \"./http-logger\";\nimport { TimeZoneOffset } from \"./time-zone-offset\";\n\nexport const BODY_LIMIT_MAX_SIZE = new bgn.Size({\n value: 128,\n unit: bgn.SizeUnit.kB,\n}).toBytes();\n\nexport class Setup {\n static essentials(logger: bgn.Logger) {\n return [\n secureHeaders(),\n bodyLimit({ maxSize: BODY_LIMIT_MAX_SIZE }),\n ApiVersion.attach,\n cors({ origin: \"*\" }),\n requestId(),\n TimeZoneOffset.attach,\n Context.attach,\n WeakETagExtractor.attach,\n ETagExtractor.attach,\n HttpLogger.build(logger),\n timing(),\n ];\n }\n}\n"],"names":["AccessDeniedApiKeyError","HTTPException","message","ApiKeyShield","config","_this","this","verify","createMiddleware","c","next","req","header","HEADER_NAME","API_KEY","Promise","resolve","e","reject","ApiVersion","DEFAULT_API_VERSION","attach","bg","BuildInfoRepository","extract","then","build","_build$BUILD_VERSION","res","headers","set","BUILD_VERSION","SessionId","cookie","lucia","value","readSessionCookie","prototype","get","AccessDeniedAuthShieldError","Context","requestId","timeZoneOffset","ETagExtractor","String","ETag","IF_MATCH_HEADER_NAME","fromHeader","error","WeakETagExtractor","WeakETag","GracefulShutdown","shutdown","server","callback","undefined","noop","stop","console","log","applyTo","process","on","exit","event","JSON","stringify","_Pact","onFulfilled","onRejected","result","state","_settle","v","o","handler","createFactory","Healthcheck","prerequisites","createHandlers","stopwatch","Stopwatch","_temp2","ok","details","every","status","PrerequisiteStatusEnum","failure","success","code","_extends","version","Schema","BuildVersion","parse","uptime","Uptime","memory","bytes","MemoryConsumption","toBytes","formatted","format","SizeUnit","MB","json","_temp","_forOf","prerequisite","push","label","HttpLogger","simplify","response","_key","Array","isArray","type","length","uninformativeHeaders","logger","body","_temp4","httpRequestBeforeMetadata","params","param","_","omit","raw","clone","toJSON","query","queries","http","operation","correlationId","method","url","client","metadata","pickBy","isEmpty","_serverTimingMs$match","httpRequestAfterMetadata","cacheHit","serverTimingMs","durationMsMatch","match","durationMs","Number","responseCode","CacheResponse","CACHE_HIT_HEADER","CacheHitEnum","hit","_catch","_c$res$clone$json","info","getConnInfo","ip","remote","address","userAgent","_temp3","_c$req$raw$clone$json","_TimeZoneOffset","CacheStaticFilesStrategy","TooManyRequestsError","TimeZoneOffset","adjustTimestamp","timestamp","timeZoneOffsetMs","adjustDate","Date","TIME_ZONE_OFFSET_HEADER_NAME","timeZoneOffsetMinutes","TimeZoneOffsetHeaderValue","minutes","seconds","Time","Minutes","miliseconds","ms","CacheStaticFiles","handle","strategy","never","always","Days","five_minutes","cache","_this2","escape","has","miss","clear","_c","flushAll","DownloadFile","Headers","filename","mime","I18n","_config$translationsP","_config$defaultLangua","_getCookie","translationsPath","DEFAULT_TRANSLATIONS_PATH","defaultLanguage","FALLBACK_LANGUAGE","chosenLanguage","getCookie","LANGUAGE_COOKIE_NAME","language","Object","keys","supportedLanguages","find","getTranslations","Bun","file","getTranslationPathForLanguage","useTranslations","translations","key","variables","translation","entries","reduce","_ref","replace","placeholder","warn","bgn","Path","path","join","InvalidFileMimeTypeError","FileTooBigError","FileUploader","validate","bodyLimit","maxSize","maxFilesSize","onError","formData","File","contentType","Mime","mimeTypes","some","acceptedMimeType","isSatisfiedBy","ImageProcessor","sharp","BODY_LIMIT_MAX_SIZE","Size","unit","kB","Setup","essentials","secureHeaders","cors","origin","timing","overrides","_overrides$Username","_overrides$Password","_overrides$HashedPass","_this3","reverse","detach","sessionId","invalidateSession","validateSession","session","user","fresh","createSessionCookie","id","serialize","createBlankSessionCookie","username","Username","password","Password","findUniqueUserOrThrow","HashedPassword","fromHash","hashedPassword","matchesOrThrow","createSession","sessionCookie","options","rateLimiter","RateLimiter","currentTimestampMs","now","allowed"],"mappings":"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"}
|
package/dist/bgord-bun.modern.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{createMiddleware as e,createFactory as t}from"hono/factory";import{HTTPException as s}from"hono/http-exception";import*as a from"@bgord/node";import{getConnInfo as n}from"hono/bun";import r from"lodash";import o from"node:path";import{getCookie as i}from"hono/cookie";import{bodyLimit as c}from"hono/body-limit";import u from"sharp";import{cors as l}from"hono/cors";import{secureHeaders as h}from"hono/secure-headers";import{requestId as d}from"hono/request-id";import{timing as m}from"hono/timing";const f=new s(403,{message:"access_denied_api_key"});class g{constructor(t){var s=this;this.config=void 0,this.verify=e(async function(e,t){if(e.req.header(g.HEADER_NAME)===s.config.API_KEY)return t();throw f}),this.config=t}}var p;g.HEADER_NAME="bgord-api-key";class w{}p=w,w.HEADER_NAME="api-version",w.DEFAULT_API_VERSION="unknown",w.attach=e(async(e,t)=>{var s;const n=await a.BuildInfoRepository.extract();e.res.headers.set(p.HEADER_NAME,null!=(s=n.BUILD_VERSION)?s:p.DEFAULT_API_VERSION),await t()});class E{constructor(e,t){this.value=void 0,this.value=t.readSessionCookie(null!=e?e:"")}get(){return this.value}}const y=new s(403,{message:"access_denied_auth_shield"});class _{constructor(t){var s,n,r,o=this;this.config=void 0,this.verify=e(async function(e,t){if(!e.get("user"))throw y;return t()}),this.reverse=e(async function(e,t){if(e.get("user"))throw y;return t()}),this.detach=e(async function(e,t){const s=e.req.header("cookie"),a=new E(s,o.config.lucia).get();return a?(await o.config.lucia.invalidateSession(a),t()):t()}),this.build=e(async function(e,t){const s=e.req.header("cookie"),a=new E(s,o.config.lucia).get();if(!a)return e.set("user",null),e.set("session",null),t();const{session:n,user:r}=await o.config.lucia.validateSession(a);return n?(n.fresh&&e.res.headers.set("Set-Cookie",o.config.lucia.createSessionCookie(n.id).serialize()),e.set("user",r),e.set("session",n),t()):(e.res.headers.set("Set-Cookie",o.config.lucia.createBlankSessionCookie().serialize()),e.set("user",null),e.set("session",null),t())}),this.attach=e(async function(e,t){try{const s=await e.req.raw.clone().formData(),a=new o.config.Username(s.get("username")),n=new o.config.Password(s.get("password")),r=await o.config.findUniqueUserOrThrow(a),i=await o.config.HashedPassword.fromHash(r.password);await i.matchesOrThrow(n);const c=await o.config.lucia.createSession(r.id,{}),u=o.config.lucia.createSessionCookie(c.id);return e.res.headers.set("Set-Cookie",u.serialize()),t()}catch(e){throw y}});const i={Username:null!=(s=t.Username)?s:a.Username,Password:null!=(n=t.Password)?n:a.Password,HashedPassword:null!=(r=t.HashedPassword)?r:a.HashedPassword,lucia:t.lucia,findUniqueUserOrThrow:t.findUniqueUserOrThrow};this.config=i}}class A{}A.attach=e(async(e,t)=>{e.set("context",{requestId:e.get("requestId"),timeZoneOffset:e.get("timeZoneOffset")}),await t()});class T{}T.attach=e(async(e,t)=>{try{const t=String(e.req.header(a.ETag.IF_MATCH_HEADER_NAME));e.set("ETag",t&&"undefined"!==t?a.ETag.fromHeader(t):null)}catch(t){e.set("ETag",null)}await t()});class v{}v.attach=e(async(e,t)=>{try{const t=String(e.req.header(a.WeakETag.IF_MATCH_HEADER_NAME));e.set("WeakETag",t&&"undefined"!==t?a.WeakETag.fromHeader(t):null)}catch(t){e.set("WeakETag",null)}await t()});class S{static async shutdown(e,t=a.noop){e.stop(),await t(),console.log("HTTP server closed")}static applyTo(e,t=a.noop){process.on("SIGTERM",async function(){console.log("SIGTERM signal received: closing HTTP server"),await S.shutdown(e,t),process.exit(0)}),process.on("SIGINT",async function(){console.log("SIGINT signal received: closing HTTP server"),await S.shutdown(e,t),process.exit(0)}),process.on("unhandledRejection",async function(s){console.log("UnhandledPromiseRejectionWarning received: closing HTTP server"),console.log(JSON.stringify(s)),await S.shutdown(e,t),process.exit(1)})}}function H(){return H=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var a in s)({}).hasOwnProperty.call(s,a)&&(e[a]=s[a])}return e},H.apply(null,arguments)}const q=t();class I{}var N;I.build=e=>q.createHandlers(async t=>{var s;const n=new a.Stopwatch,r=await a.BuildInfoRepository.extract(),o=[];for(const t of e){const e=await t.verify();o.push({label:t.label,status:e})}const i=o.every(e=>e.status!==a.PrerequisiteStatusEnum.failure)?a.PrerequisiteStatusEnum.success:a.PrerequisiteStatusEnum.failure,c=i===a.PrerequisiteStatusEnum.success?200:424,u=H({ok:i,details:o,version:null!=(s=r.BUILD_VERSION)?s:a.Schema.BuildVersion.parse("unknown"),uptime:a.Uptime.get(),memory:{bytes:a.MemoryConsumption.get().toBytes(),formatted:a.MemoryConsumption.get().format(a.SizeUnit.MB)}},n.stop());return t.json(u,c)});class O{static simplify(e){const t=JSON.stringify(e,(e,t)=>Array.isArray(t)?{type:"Array",length:t.length}:t);return JSON.parse(t)}}N=O,O.uninformativeHeaders=["accept","accept-encoding","cache-control","connection","content-length","content-type","cookie","dnt","host","origin","pragma","sec-fetch-dest","sec-fetch-mode","sec-fetch-site","sec-fetch-user","sec-gpc","upgrade-insecure-requests","user-agent","if-none-match"],O.build=t=>e(async(e,s)=>{var o;const i=e.get("requestId"),c=n(e),u=e.req.url,l=e.req.method,h={ip:e.req.header("x-real-ip")||e.req.header("x-forwarded-for")||c.remote.address,userAgent:e.req.header("user-agent")};let d;try{d=await e.req.raw.clone().json()}catch(e){}const m={params:e.req.param(),headers:r.omit(e.req.raw.clone().headers.toJSON(),N.uninformativeHeaders),body:d,query:e.req.queries()};t.http({operation:"http_request_before",correlationId:i,message:"request",method:l,url:u,client:h,metadata:r.pickBy(m,e=>!r.isEmpty(e))}),await s();const f=e.res.clone().headers.get(a.CacheResponse.CACHE_HIT_HEADER)===a.CacheHitEnum.hit?a.CacheHitEnum.hit:void 0;let g;try{g=await e.res.clone().json()}catch(e){}const p={response:g,cacheHit:f},w=e.res.clone().headers.get("Server-Timing"),E=null!=(o=null==w?void 0:w.match(/dur=([0-9]*\.?[0-9]+)/))?o:void 0,y=null!=E&&E[1]?Number(E[1]):void 0;t.http({operation:"http_request_after",correlationId:i,message:"response",method:l,url:u,responseCode:e.res.status,durationMs:y,client:h,metadata:N.simplify(p)})});const C=new s(429,{message:"app.too_many_requests"}),P=t=>{const s=new a.RateLimiter(t);return e(async(e,t)=>{const a=Date.now();if(!s.verify(a).allowed)throw C;return t()})};var L,R,k;class D{static adjustTimestamp(e,t){return e-t}static adjustDate(e,t){return new Date(e-t)}}L=D,D.TIME_ZONE_OFFSET_HEADER_NAME="time-zone-offset",D.attach=e(async(e,t)=>{const s=a.Schema.TimeZoneOffsetHeaderValue.parse(e.req.header(L.TIME_ZONE_OFFSET_HEADER_NAME)),n={minutes:s,seconds:a.Time.Minutes(s).seconds,miliseconds:a.Time.Minutes(s).ms};e.set("timeZoneOffset",n),await t()}),function(e){e.never="never",e.always="always",e.five_minutes="five_minutes"}(R||(R={}));class U{static handle(t){return e(async function(e,s){return t===R.never&&e.res.headers.set("cache-control","private, no-cache, no-store, must-revalidate"),t===R.always&&e.res.headers.set("cache-control",`public, max-age=${a.Time.Days(365).seconds}, immutable`),t===R.five_minutes&&e.res.headers.set("cache-control",`public, max-age=${a.Time.Minutes(5).seconds}`),s()})}}!function(e){e.hit="hit",e.miss="miss"}(k||(k={}));class b{constructor(t){var s=this;this.cache=void 0,this.handle=e(async function(e,t){const a=r.escape(e.req.url);return s.cache.has(a)?(e.res.headers.set(b.CACHE_HIT_HEADER,k.hit),e.json(s.cache.get(a))):(e.res.headers.set(b.CACHE_HIT_HEADER,k.miss),t())}),this.clear=e(async function(e,t){return s.cache.flushAll(),t()}),this.cache=t}}b.CACHE_HIT_HEADER="Cache-Hit";class M{static attach(e){return{headers:new Headers({"Content-Disposition":`attachment; filename="${e.filename}"`,"Content-Type":e.mime.raw})}}}class F{static applyTo(t){return e(async function(e,s){var a,n,r;const o=null!=(a=null==t?void 0:t.translationsPath)?a:F.DEFAULT_TRANSLATIONS_PATH,c=null!=(n=null==t?void 0:t.defaultLanguage)?n:F.FALLBACK_LANGUAGE,u=null!=(r=i(e,F.LANGUAGE_COOKIE_NAME))?r:c,l=Object.keys(t.supportedLanguages).find(e=>e===u)?u:F.FALLBACK_LANGUAGE;return e.set("supportedLanguages",Object.keys(t.supportedLanguages)),e.set("language",l),e.set("translationsPath",o),s()})}static async getTranslations(e,t){try{return Bun.file(F.getTranslationPathForLanguage(e,t)).json()}catch(e){return console.log("I18n#getTranslations",e),{}}}static useTranslations(e){return function(t,s){const a=e[t];return a?s?Object.entries(s).reduce((e,[t,s])=>e.replace(`{{${t}}}`,String(s)),a):a:(console.warn(`[@bgord/node] missing translation for key: ${t}`),t)}}static getTranslationPathForLanguage(e,t=F.DEFAULT_TRANSLATIONS_PATH){return a.Schema.Path.parse(o.join(t,`${e}.json`))}}F.LANGUAGE_COOKIE_NAME="accept-language",F.DEFAULT_TRANSLATIONS_PATH=a.Schema.Path.parse("infra/translations"),F.FALLBACK_LANGUAGE="en";const j=new s(400,{message:"invalid_file_mime_type_error"}),B=new s(400,{message:"file_too_big_error"});class x{static validate(t){return[c({maxSize:t.maxFilesSize,onError:()=>{throw B}}),e(async function(e,s){const n=(await e.req.raw.clone().formData()).get("file");if(!(n instanceof File))throw j;const r=new a.Mime(n.type);if(!t.mimeTypes.some(e=>new a.Mime(e).isSatisfiedBy(r)))throw j;return s()})]}}class G{}G.sharp=u;const z=new a.Size({value:128,unit:a.SizeUnit.kB}).toBytes();class K{static essentials(e){return[h(),c({maxSize:z}),w.attach,l({origin:"*"}),d(),D.attach,A.attach,v.attach,T.attach,O.build(e),m()]}}export{f as AccessDeniedApiKeyError,y as AccessDeniedAuthShieldError,g as ApiKeyShield,w as ApiVersion,_ as AuthShield,z as BODY_LIMIT_MAX_SIZE,k as CacheHitEnum,b as CacheResponse,U as CacheStaticFiles,R as CacheStaticFilesStrategy,A as Context,M as DownloadFile,T as ETagExtractor,B as FileTooBigError,x as FileUploader,S as GracefulShutdown,I as Healthcheck,O as HttpLogger,F as I18n,G as ImageProcessor,j as InvalidFileMimeTypeError,K as Setup,D as TimeZoneOffset,C as TooManyRequestsError,v as WeakETagExtractor,P as rateLimitShield};
|
|
1
|
+
import{createMiddleware as e,createFactory as t}from"hono/factory";import{HTTPException as s}from"hono/http-exception";import*as a from"@bgord/node";import{getConnInfo as n}from"hono/bun";import r from"lodash";import o from"node:path";import{getCookie as i}from"hono/cookie";import{bodyLimit as c}from"hono/body-limit";import u from"sharp";import{cors as l}from"hono/cors";import{requestId as h}from"hono/request-id";import{secureHeaders as d}from"hono/secure-headers";import{timing as m}from"hono/timing";const f=new s(403,{message:"access_denied_api_key"});class g{constructor(t){var s=this;this.config=void 0,this.verify=e(async function(e,t){if(e.req.header(g.HEADER_NAME)===s.config.API_KEY)return t();throw f}),this.config=t}}var p;g.HEADER_NAME="bgord-api-key";class w{}p=w,w.HEADER_NAME="api-version",w.DEFAULT_API_VERSION="unknown",w.attach=e(async(e,t)=>{var s;const n=await a.BuildInfoRepository.extract();e.res.headers.set(p.HEADER_NAME,null!=(s=n.BUILD_VERSION)?s:p.DEFAULT_API_VERSION),await t()});class E{constructor(e,t){this.value=void 0,this.value=t.readSessionCookie(null!=e?e:"")}get(){return this.value}}const y=new s(403,{message:"access_denied_auth_shield"});class _{constructor(t){var s,n,r,o=this;this.config=void 0,this.verify=e(async function(e,t){if(!e.get("user"))throw y;return t()}),this.reverse=e(async function(e,t){if(e.get("user"))throw y;return t()}),this.detach=e(async function(e,t){const s=e.req.header("cookie"),a=new E(s,o.config.lucia).get();return a?(await o.config.lucia.invalidateSession(a),t()):t()}),this.build=e(async function(e,t){const s=e.req.header("cookie"),a=new E(s,o.config.lucia).get();if(!a)return e.set("user",null),e.set("session",null),t();const{session:n,user:r}=await o.config.lucia.validateSession(a);return n?(n.fresh&&e.res.headers.set("Set-Cookie",o.config.lucia.createSessionCookie(n.id).serialize()),e.set("user",r),e.set("session",n),t()):(e.res.headers.set("Set-Cookie",o.config.lucia.createBlankSessionCookie().serialize()),e.set("user",null),e.set("session",null),t())}),this.attach=e(async function(e,t){try{const s=await e.req.raw.clone().formData(),a=new o.config.Username(s.get("username")),n=new o.config.Password(s.get("password")),r=await o.config.findUniqueUserOrThrow(a),i=await o.config.HashedPassword.fromHash(r.password);await i.matchesOrThrow(n);const c=await o.config.lucia.createSession(r.id,{}),u=o.config.lucia.createSessionCookie(c.id);return e.res.headers.set("Set-Cookie",u.serialize()),t()}catch(e){throw y}});const i={Username:null!=(s=t.Username)?s:a.Username,Password:null!=(n=t.Password)?n:a.Password,HashedPassword:null!=(r=t.HashedPassword)?r:a.HashedPassword,lucia:t.lucia,findUniqueUserOrThrow:t.findUniqueUserOrThrow};this.config=i}}class A{}A.attach=e(async(e,t)=>{e.set("context",{requestId:e.get("requestId"),timeZoneOffset:e.get("timeZoneOffset")}),await t()});class T{}T.attach=e(async(e,t)=>{try{const t=String(e.req.header(a.ETag.IF_MATCH_HEADER_NAME));e.set("ETag",t&&"undefined"!==t?a.ETag.fromHeader(t):null)}catch(t){e.set("ETag",null)}await t()});class v{}v.attach=e(async(e,t)=>{try{const t=String(e.req.header(a.WeakETag.IF_MATCH_HEADER_NAME));e.set("WeakETag",t&&"undefined"!==t?a.WeakETag.fromHeader(t):null)}catch(t){e.set("WeakETag",null)}await t()});class S{static async shutdown(e,t=a.noop){e.stop(),await t(),console.log("HTTP server closed")}static applyTo(e,t=a.noop){process.on("SIGTERM",async function(){console.log("SIGTERM signal received: closing HTTP server"),await S.shutdown(e,t),process.exit(0)}),process.on("SIGINT",async function(){console.log("SIGINT signal received: closing HTTP server"),await S.shutdown(e,t),process.exit(0)}),process.on("unhandledRejection",async function(s){console.log("UnhandledPromiseRejectionWarning received: closing HTTP server"),console.log(JSON.stringify(s)),await S.shutdown(e,t),process.exit(1)})}}function H(){return H=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var a in s)({}).hasOwnProperty.call(s,a)&&(e[a]=s[a])}return e},H.apply(null,arguments)}const q=t();class I{}var N;I.build=e=>q.createHandlers(async t=>{var s;const n=new a.Stopwatch,r=await a.BuildInfoRepository.extract(),o=[];for(const t of e){const e=await t.verify();o.push({label:t.label,status:e})}const i=o.every(e=>e.status!==a.PrerequisiteStatusEnum.failure)?a.PrerequisiteStatusEnum.success:a.PrerequisiteStatusEnum.failure,c=i===a.PrerequisiteStatusEnum.success?200:424,u=H({ok:i,details:o,version:null!=(s=r.BUILD_VERSION)?s:a.Schema.BuildVersion.parse("unknown"),uptime:a.Uptime.get(),memory:{bytes:a.MemoryConsumption.get().toBytes(),formatted:a.MemoryConsumption.get().format(a.SizeUnit.MB)}},n.stop());return t.json(u,c)});class O{static simplify(e){const t=JSON.stringify(e,(e,t)=>Array.isArray(t)?{type:"Array",length:t.length}:t);return JSON.parse(t)}}N=O,O.uninformativeHeaders=["accept","accept-encoding","cache-control","connection","content-length","content-type","cookie","dnt","host","origin","pragma","sec-fetch-dest","sec-fetch-mode","sec-fetch-site","sec-fetch-user","sec-gpc","upgrade-insecure-requests","user-agent","if-none-match"],O.build=t=>e(async(e,s)=>{var o;const i=e.get("requestId"),c=n(e),u=e.req.url,l=e.req.method,h={ip:e.req.header("x-real-ip")||e.req.header("x-forwarded-for")||c.remote.address,userAgent:e.req.header("user-agent")};let d;try{d=await e.req.raw.clone().json()}catch(e){}const m={params:e.req.param(),headers:r.omit(e.req.raw.clone().headers.toJSON(),N.uninformativeHeaders),body:d,query:e.req.queries()};t.http({operation:"http_request_before",correlationId:i,message:"request",method:l,url:u,client:h,metadata:r.pickBy(m,e=>!r.isEmpty(e))}),await s();const f=e.res.clone().headers.get(a.CacheResponse.CACHE_HIT_HEADER)===a.CacheHitEnum.hit?a.CacheHitEnum.hit:void 0;let g;try{g=await e.res.clone().json()}catch(e){}const p={response:g,cacheHit:f},w=e.res.clone().headers.get("Server-Timing"),E=null!=(o=null==w?void 0:w.match(/dur=([0-9]*\.?[0-9]+)/))?o:void 0,y=null!=E&&E[1]?Number(E[1]):void 0;t.http({operation:"http_request_after",correlationId:i,message:"response",method:l,url:u,responseCode:e.res.status,durationMs:y,client:h,metadata:N.simplify(p)})});const C=new s(429,{message:"app.too_many_requests"}),P=t=>{const s=new a.RateLimiter(t);return e(async(e,t)=>{const a=Date.now();if(!s.verify(a).allowed)throw C;return t()})};var L,R,k;class D{static adjustTimestamp(e,t){return e-t}static adjustDate(e,t){return new Date(e-t)}}L=D,D.TIME_ZONE_OFFSET_HEADER_NAME="time-zone-offset",D.attach=e(async(e,t)=>{const s=a.Schema.TimeZoneOffsetHeaderValue.parse(e.req.header(L.TIME_ZONE_OFFSET_HEADER_NAME)),n={minutes:s,seconds:a.Time.Minutes(s).seconds,miliseconds:a.Time.Minutes(s).ms};e.set("timeZoneOffset",n),await t()}),function(e){e.never="never",e.always="always",e.five_minutes="five_minutes"}(R||(R={}));class U{static handle(t){return e(async function(e,s){return t===R.never&&e.res.headers.set("cache-control","private, no-cache, no-store, must-revalidate"),t===R.always&&e.res.headers.set("cache-control",`public, max-age=${a.Time.Days(365).seconds}, immutable`),t===R.five_minutes&&e.res.headers.set("cache-control",`public, max-age=${a.Time.Minutes(5).seconds}`),s()})}}!function(e){e.hit="hit",e.miss="miss"}(k||(k={}));class b{constructor(t){var s=this;this.cache=void 0,this.handle=e(async function(e,t){const a=r.escape(e.req.url);return s.cache.has(a)?(e.res.headers.set(b.CACHE_HIT_HEADER,k.hit),e.json(s.cache.get(a))):(e.res.headers.set(b.CACHE_HIT_HEADER,k.miss),t())}),this.clear=e(async function(e,t){return s.cache.flushAll(),t()}),this.cache=t}}b.CACHE_HIT_HEADER="Cache-Hit";class M{static attach(e){return{headers:new Headers({"Content-Disposition":`attachment; filename="${e.filename}"`,"Content-Type":e.mime.raw})}}}class F{static applyTo(t){return e(async function(e,s){var a,n,r;const o=null!=(a=null==t?void 0:t.translationsPath)?a:F.DEFAULT_TRANSLATIONS_PATH,c=null!=(n=null==t?void 0:t.defaultLanguage)?n:F.FALLBACK_LANGUAGE,u=null!=(r=i(e,F.LANGUAGE_COOKIE_NAME))?r:c,l=Object.keys(t.supportedLanguages).find(e=>e===u)?u:F.FALLBACK_LANGUAGE;return e.set("supportedLanguages",Object.keys(t.supportedLanguages)),e.set("language",l),e.set("translationsPath",o),s()})}static async getTranslations(e,t){try{return Bun.file(F.getTranslationPathForLanguage(e,t)).json()}catch(e){return console.log("I18n#getTranslations",e),{}}}static useTranslations(e){return function(t,s){const a=e[t];return a?s?Object.entries(s).reduce((e,[t,s])=>e.replace(`{{${t}}}`,String(s)),a):a:(console.warn(`[@bgord/node] missing translation for key: ${t}`),t)}}static getTranslationPathForLanguage(e,t=F.DEFAULT_TRANSLATIONS_PATH){return a.Schema.Path.parse(o.join(t,`${e}.json`))}}F.LANGUAGE_COOKIE_NAME="accept-language",F.DEFAULT_TRANSLATIONS_PATH=a.Schema.Path.parse("infra/translations"),F.FALLBACK_LANGUAGE="en";const j=new s(400,{message:"invalid_file_mime_type_error"}),B=new s(400,{message:"file_too_big_error"});class x{static validate(t){return[c({maxSize:t.maxFilesSize,onError:()=>{throw B}}),e(async function(e,s){const n=(await e.req.raw.clone().formData()).get("file");if(!(n instanceof File))throw j;const r=new a.Mime(n.type);if(!t.mimeTypes.some(e=>new a.Mime(e).isSatisfiedBy(r)))throw j;return s()})]}}class G{}G.sharp=u;const z=new a.Size({value:128,unit:a.SizeUnit.kB}).toBytes();class K{static essentials(e){return[d(),c({maxSize:z}),w.attach,l({origin:"*"}),h(),D.attach,A.attach,v.attach,T.attach,O.build(e),m()]}}export{f as AccessDeniedApiKeyError,y as AccessDeniedAuthShieldError,g as ApiKeyShield,w as ApiVersion,_ as AuthShield,z as BODY_LIMIT_MAX_SIZE,k as CacheHitEnum,b as CacheResponse,U as CacheStaticFiles,R as CacheStaticFilesStrategy,A as Context,M as DownloadFile,T as ETagExtractor,B as FileTooBigError,x as FileUploader,S as GracefulShutdown,I as Healthcheck,O as HttpLogger,F as I18n,G as ImageProcessor,j as InvalidFileMimeTypeError,K as Setup,D as TimeZoneOffset,C as TooManyRequestsError,v as WeakETagExtractor,P as rateLimitShield};
|
|
2
2
|
//# sourceMappingURL=bgord-bun.modern.js.map
|