@bgord/bun 0.1.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/LICENSE +21 -0
- package/README.md +3 -0
- package/dist/api-key-shield.d.ts +16 -0
- package/dist/api-version.d.ts +8 -0
- package/dist/auth-shield.d.ts +32 -0
- package/dist/basic-auth-shield.d.ts +14 -0
- package/dist/bgord-bun.cjs +2 -0
- package/dist/bgord-bun.cjs.map +1 -0
- package/dist/bgord-bun.modern.js +2 -0
- package/dist/bgord-bun.modern.js.map +1 -0
- package/dist/bgord-bun.module.js +2 -0
- package/dist/bgord-bun.module.js.map +1 -0
- package/dist/bgord-bun.umd.js +2 -0
- package/dist/bgord-bun.umd.js.map +1 -0
- package/dist/build-info-repository.d.ts +8 -0
- package/dist/bun/api-key-shield.d.ts +16 -0
- package/dist/bun/api-version.d.ts +8 -0
- package/dist/bun/context.d.ts +12 -0
- package/dist/bun/etag-extractor.d.ts +17 -0
- package/dist/bun/graceful-shutdown.d.ts +6 -0
- package/dist/bun/healthcheck.d.ts +22 -0
- package/dist/bun/http-logger.d.ts +9 -0
- package/dist/bun/index.d.ts +9 -0
- package/dist/bun/rate-limit-shield.d.ts +11 -0
- package/dist/bun/time-zone-offset.d.ts +16 -0
- package/dist/cache-response.d.ts +15 -0
- package/dist/cache-static-files.d.ts +9 -0
- package/dist/cache.d.ts +1 -0
- package/dist/clock.d.ts +49 -0
- package/dist/context.d.ts +12 -0
- package/dist/credentials.d.ts +28 -0
- package/dist/dates.d.ts +37 -0
- package/dist/decorators.d.ts +8 -0
- package/dist/deep-merge.d.ts +7 -0
- package/dist/dll.d.ts +29 -0
- package/dist/download-file.d.ts +10 -0
- package/dist/email-censor.d.ts +4 -0
- package/dist/encryption.d.ts +20 -0
- package/dist/environment-validator.d.ts +23 -0
- package/dist/errors.d.ts +49 -0
- package/dist/etag-extractor.d.ts +17 -0
- package/dist/etag.d.ts +19 -0
- package/dist/event.d.ts +59 -0
- package/dist/express-essentials.d.ts +35 -0
- package/dist/feature-flag.d.ts +5 -0
- package/dist/file-location.d.ts +31 -0
- package/dist/file-uploader.d.ts +12 -0
- package/dist/file.d.ts +4 -0
- package/dist/filter.d.ts +17 -0
- package/dist/graceful-shutdown.d.ts +6 -0
- package/dist/gzip.d.ts +12 -0
- package/dist/handlebars.d.ts +10 -0
- package/dist/hcaptcha-shield.d.ts +24 -0
- package/dist/healthcheck.d.ts +20 -0
- package/dist/http-logger.d.ts +10 -0
- package/dist/i18n.d.ts +31 -0
- package/dist/image-compressor.d.ts +10 -0
- package/dist/image-converter.d.ts +11 -0
- package/dist/image-exif.d.ts +18 -0
- package/dist/image-resizer.d.ts +16 -0
- package/dist/index.d.ts +9 -0
- package/dist/jobs.d.ts +32 -0
- package/dist/leap-year-checker.d.ts +4 -0
- package/dist/logger.d.ts +53 -0
- package/dist/mailer.d.ts +16 -0
- package/dist/mean.d.ts +4 -0
- package/dist/memory-consumption.d.ts +4 -0
- package/dist/method-override.d.ts +4 -0
- package/dist/mime-types.d.ts +2 -0
- package/dist/mime.d.ts +10 -0
- package/dist/min-max-scaler.d.ts +36 -0
- package/dist/money.d.ts +24 -0
- package/dist/noop.d.ts +2 -0
- package/dist/open-graph.d.ts +91 -0
- package/dist/outlier-detector.d.ts +6 -0
- package/dist/package-version.d.ts +20 -0
- package/dist/pagination.d.ts +58 -0
- package/dist/percentage.d.ts +4 -0
- package/dist/policy.d.ts +11 -0
- package/dist/polyfills.d.ts +0 -0
- package/dist/population-standard-deviation.d.ts +4 -0
- package/dist/prerequisites/binary.d.ts +16 -0
- package/dist/prerequisites/bun.d.ts +13 -0
- package/dist/prerequisites/jobs.d.ts +13 -0
- package/dist/prerequisites/mailer.d.ts +13 -0
- package/dist/prerequisites/memory.d.ts +13 -0
- package/dist/prerequisites/node.d.ts +13 -0
- package/dist/prerequisites/outside-connectivity.d.ts +11 -0
- package/dist/prerequisites/path.d.ts +16 -0
- package/dist/prerequisites/port.d.ts +13 -0
- package/dist/prerequisites/ram.d.ts +13 -0
- package/dist/prerequisites/self.d.ts +11 -0
- package/dist/prerequisites/space.d.ts +13 -0
- package/dist/prerequisites/ssl-certificate-expiry.d.ts +13 -0
- package/dist/prerequisites/timezone-utc.d.ts +13 -0
- package/dist/prerequisites/translations.d.ts +14 -0
- package/dist/prerequisites.d.ts +44 -0
- package/dist/random.d.ts +8 -0
- package/dist/rate-limit-shield.d.ts +11 -0
- package/dist/rate-limiter.d.ts +18 -0
- package/dist/recaptcha-shield.d.ts +12 -0
- package/dist/redirector.d.ts +4 -0
- package/dist/reordering.d.ts +49 -0
- package/dist/request-id.d.ts +13 -0
- package/dist/response-body-in-locals.d.ts +4 -0
- package/dist/revision.d.ts +12 -0
- package/dist/rounding.d.ts +17 -0
- package/dist/schema.d.ts +189 -0
- package/dist/server-timing.d.ts +7 -0
- package/dist/simple-linear-regression.d.ts +18 -0
- package/dist/simulated-error.d.ts +4 -0
- package/dist/sitemap.d.ts +37 -0
- package/dist/size.d.ts +31 -0
- package/dist/sleep.d.ts +3 -0
- package/dist/slower.d.ts +8 -0
- package/dist/static-files.d.ts +14 -0
- package/dist/stepper.d.ts +23 -0
- package/dist/stopwatch.d.ts +14 -0
- package/dist/streak-calculator.d.ts +14 -0
- package/dist/sum.d.ts +3 -0
- package/dist/thousands-separator.d.ts +4 -0
- package/dist/time-zone-offset.d.ts +17 -0
- package/dist/time.d.ts +21 -0
- package/dist/timeout.d.ts +9 -0
- package/dist/ts-utils.d.ts +3 -0
- package/dist/uploaded-file-location.d.ts +10 -0
- package/dist/uptime.d.ts +9 -0
- package/dist/uuid.d.ts +3 -0
- package/dist/visually-unambiguous-characters-generator.d.ts +4 -0
- package/dist/z-score.d.ts +8 -0
- package/package.json +48 -0
- package/src/api-key-shield.ts +23 -0
- package/src/api-version.ts +19 -0
- package/src/context.ts +20 -0
- package/src/etag-extractor.ts +41 -0
- package/src/graceful-shutdown.ts +44 -0
- package/src/healthcheck.ts +58 -0
- package/src/http-logger.ts +123 -0
- package/src/index.ts +9 -0
- package/src/rate-limit-shield.ts +24 -0
- package/src/time-zone-offset.ts +44 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2021 Bartosz Gordon
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as bg from "@bgord/node";
|
|
2
|
+
import { HTTPException } from "hono/http-exception";
|
|
3
|
+
declare 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/types").MiddlewareHandler<{
|
|
12
|
+
Bindings: any;
|
|
13
|
+
Variables: any;
|
|
14
|
+
}, string, {}>;
|
|
15
|
+
}
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import express from "express";
|
|
2
|
+
import { Lucia } from "lucia";
|
|
3
|
+
import { Password, HashedPassword, Username, PasswordType, IdType } from "./credentials";
|
|
4
|
+
type AuthShieldConfigType<T> = {
|
|
5
|
+
Username: typeof Username;
|
|
6
|
+
Password: typeof Password;
|
|
7
|
+
HashedPassword: typeof HashedPassword;
|
|
8
|
+
lucia: Lucia;
|
|
9
|
+
findUniqueUserOrThrow: (username: Username) => Promise<T>;
|
|
10
|
+
};
|
|
11
|
+
export declare class AuthShield<T extends {
|
|
12
|
+
password: PasswordType;
|
|
13
|
+
id: IdType;
|
|
14
|
+
}> {
|
|
15
|
+
private readonly config;
|
|
16
|
+
constructor(overrides: Omit<AuthShieldConfigType<T>, "Username" | "Password" | "HashedPassword"> & {
|
|
17
|
+
Username?: typeof Username;
|
|
18
|
+
Password?: typeof Password;
|
|
19
|
+
HashedPassword?: typeof HashedPassword;
|
|
20
|
+
});
|
|
21
|
+
private _verify;
|
|
22
|
+
private _reverse;
|
|
23
|
+
private _detach;
|
|
24
|
+
applyTo(app: express.Application): void;
|
|
25
|
+
private _applyTo;
|
|
26
|
+
private _attach;
|
|
27
|
+
verify: (_request: express.Request, response: express.Response, next: express.NextFunction) => Promise<void>;
|
|
28
|
+
reverse: (_request: express.Request, response: express.Response, next: express.NextFunction) => Promise<void>;
|
|
29
|
+
detach: (request: express.Request, _response: express.Response, next: express.NextFunction) => Promise<void>;
|
|
30
|
+
attach: (request: express.Request, response: express.Response, next: express.NextFunction) => Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import express from "express";
|
|
2
|
+
import { BasicAuthUsernameType, BasicAuthPasswordType } from "./schema";
|
|
3
|
+
type BasicAuthShieldConfigType = {
|
|
4
|
+
username: BasicAuthUsernameType;
|
|
5
|
+
password: BasicAuthPasswordType;
|
|
6
|
+
};
|
|
7
|
+
export declare class BasicAuthShield {
|
|
8
|
+
private readonly config;
|
|
9
|
+
constructor(config: BasicAuthShieldConfigType);
|
|
10
|
+
private _verify;
|
|
11
|
+
verify: (request: express.Request, response: express.Response, next: express.NextFunction) => void;
|
|
12
|
+
private reject;
|
|
13
|
+
}
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e=require("@bgord/node"),t=require("hono/factory"),r=require("hono/bun"),n=require("lodash"),o=require("hono/http-exception");function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function s(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach(function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}}),t.default=e,t}var u,c,a=/*#__PURE__*/s(e),f=/*#__PURE__*/i(n),l=/*#__PURE__*/function(){function e(){}return e.shutdown=function(e,t){try{return void 0===t&&(t=a.noop),e.stop(),Promise.resolve(t()).then(function(){console.log("HTTP server closed")})}catch(e){return Promise.reject(e)}},e.applyTo=function(t,r){void 0===r&&(r=a.noop),process.on("SIGTERM",function(){try{return console.log("SIGTERM signal received: closing HTTP server"),Promise.resolve(e.shutdown(t,r)).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(t,r)).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(t,r)).then(function(){process.exit(1)})}catch(e){return Promise.reject(e)}})},e}(),h=function(){};u=h,h.HEADER_NAME="api-version",h.DEFAULT_API_VERSION="unknown",h.attach=t.createMiddleware(function(e,t){try{return Promise.resolve(a.BuildInfoRepository.extract()).then(function(r){var n;return e.res.headers.set(u.HEADER_NAME,null!=(n=r.BUILD_VERSION)?n:u.DEFAULT_API_VERSION),Promise.resolve(t()).then(function(){})})}catch(e){return Promise.reject(e)}});var d=/*#__PURE__*/function(){function e(){}return e.adjustTimestamp=function(e,t){return e-t},e.adjustDate=function(e,t){return new Date(e-t)},e}();c=d,d.TIME_ZONE_OFFSET_HEADER_NAME="time-zone-offset",d.attach=t.createMiddleware(function(e,t){try{var r=a.Schema.TimeZoneOffsetHeaderValue.parse(e.req.header(c.TIME_ZONE_OFFSET_HEADER_NAME)),n={minutes:r,seconds:a.Time.Minutes(r).seconds,miliseconds:a.Time.Minutes(r).ms};return e.set("timeZoneOffset",n),Promise.resolve(t()).then(function(){})}catch(e){return Promise.reject(e)}});var m=function(){};m.attach=t.createMiddleware(function(e,t){try{return e.set("context",{requestId:e.get("requestId"),timeZoneOffset:e.get("timeZoneOffset")}),Promise.resolve(t()).then(function(){})}catch(e){return Promise.reject(e)}});var v=function(){};v.attach=t.createMiddleware(function(e,t){try{try{var r=String(e.req.header(a.ETag.IF_MATCH_HEADER_NAME));e.set("ETag",r&&"undefined"!==r?a.ETag.fromHeader(r):null)}catch(t){e.set("ETag",null)}return Promise.resolve(t()).then(function(){})}catch(e){return Promise.reject(e)}});var p,y=function(){};function E(e,t){try{var r=e()}catch(e){return t(e)}return r&&r.then?r.then(void 0,t):r}y.attach=t.createMiddleware(function(e,t){try{try{var r=String(e.req.header(a.WeakETag.IF_MATCH_HEADER_NAME));e.set("WeakETag",r&&"undefined"!==r?a.ETag.fromHeader(r):null)}catch(t){e.set("WeakETag",null)}return Promise.resolve(t()).then(function(){})}catch(e){return Promise.reject(e)}});var g=/*#__PURE__*/function(){function e(){}return e.simplify=function(e){var t=JSON.stringify(e,function(e,t){return Array.isArray(t)?{type:"Array",length:t.length}:t});return JSON.parse(t)},e}();p=g,g.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"],g.build=function(e){return t.createMiddleware(function(t,n){try{var o,i=function(){var r={params:t.req.param(),headers:f.default.omit(t.req.raw.headers.toJSON(),p.uninformativeHeaders),body:o,query:t.req.queries()};return e.http({operation:"http_request_before",correlationId:s,message:"request",method:l,url:c,client:h,metadata:f.default.pickBy(r,function(e){return!f.default.isEmpty(e)})}),Promise.resolve(n()).then(function(){function r(){var r,i={response:n,cacheHit:o},u=t.res.headers.get("Server-Timing"),a=null!=(r=null==u?void 0:u.match(/dur=([0-9]*\.?[0-9]+)/))?r:void 0,f=null!=a&&a[1]?Number(a[1]):void 0;e.http({operation:"http_request_after",correlationId:s,message:"response",method:l,url:c,responseCode:t.res.status,durationMs:f,client:h,metadata:p.simplify(i)})}var n,o=t.res.headers.get(a.CacheResponse.CACHE_HIT_HEADER)===a.CacheHitEnum.hit?a.CacheHitEnum.hit:void 0,i=E(function(){return Promise.resolve(t.res.clone().json()).then(function(e){n=e})},function(){});return i&&i.then?i.then(r):r()})},s=t.get("requestId"),u=r.getConnInfo(t),c=t.req.url,l=t.req.method,h={ip:t.req.header("x-real-ip")||t.req.header("x-forwarded-for")||u.remote.address,userAgent:t.req.header("user-agent")},d=E(function(){return Promise.resolve(t.req.json()).then(function(e){o=e})},function(){});return Promise.resolve(d&&d.then?d.then(i):i())}catch(e){return Promise.reject(e)}})};var P=new o.HTTPException(403,{message:"access_denied_api_key"}),T=function e(r){var n=this;this.config=void 0,this.verify=t.createMiddleware(function(t,r){try{if(t.req.header(e.HEADER_NAME)===n.config.API_KEY)return Promise.resolve(r());throw P}catch(e){return Promise.reject(e)}}),this.config=r};T.HEADER_NAME="bgord-api-key";var _=new o.HTTPException(429,{message:"app.too_many_requests"});function w(){return w=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},w.apply(null,arguments)}var q="undefined"!=typeof Symbol?Symbol.iterator||(Symbol.iterator=Symbol("Symbol.iterator")):"@@iterator";function A(e,t,r){if(!e.s){if(r instanceof S){if(!r.s)return void(r.o=A.bind(null,e,t));1&t&&(t=r.s),r=r.v}if(r&&r.then)return void r.then(A.bind(null,e,t),A.bind(null,e,2));e.s=t,e.v=r;var n=e.o;n&&n(e)}}var S=/*#__PURE__*/function(){function e(){}return e.prototype.then=function(t,r){var n=new e,o=this.s;if(o){var i=1&o?t:r;if(i){try{A(n,1,i(this.v))}catch(e){A(n,2,e)}return n}return this}return this.o=function(e){try{var o=e.v;1&e.s?A(n,1,t?t(o):o):r?A(n,1,r(o)):A(n,2,o)}catch(e){A(n,2,e)}},n},e}();function b(e){return e instanceof S&&1&e.s}var H=t.createFactory(),M=function(){};M.build=function(e){return H.createHandlers(function(t){try{var r=new a.Stopwatch;return Promise.resolve(a.BuildInfoRepository.extract()).then(function(n){function o(){var e,o=i.every(function(e){return e.status!==a.PrerequisiteStatusEnum.failure})?a.PrerequisiteStatusEnum.success:a.PrerequisiteStatusEnum.failure,s=o===a.PrerequisiteStatusEnum.success?200:424,u=w({ok:o,details:i,version:null!=(e=n.BUILD_VERSION)?e:a.Schema.BuildVersion.parse("unknown"),uptime:a.Uptime.get(),memory:{bytes:a.MemoryConsumption.get().toBytes(),formatted:a.MemoryConsumption.get().format(a.SizeUnit.MB)}},r.stop());return t.json(u,s)}var i=[],s=function(e,t){if("function"==typeof e[q]){var r,n,o,i=e[q]();if(function e(s){try{for(;!(r=i.next()).done;)if((s=t(r.value))&&s.then){if(!b(s))return void s.then(e,o||(o=A.bind(null,n=new S,2)));s=s.v}n?A(n,1,s):n=s}catch(e){A(n||(n=new S),2,e)}}(),i.return){var s=function(e){try{r.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 u=[],c=0;c<e.length;c++)u.push(e[c]);return function(e,t){var r,n,o=-1;return function i(s){try{for(;++o<e.length;)if((s=t(o))&&s.then){if(!b(s))return void s.then(i,n||(n=A.bind(null,r=new S,2)));s=s.v}r?A(r,1,s):r=s}catch(e){A(r||(r=new S),2,e)}}(),r}(u,function(e){return t(u[e])})}(e,function(e){return Promise.resolve(e.verify()).then(function(t){i.push({label:e.label,status:t})})});return s&&s.then?s.then(o):o()})}catch(e){return Promise.reject(e)}})},exports.AccessDeniedApiKeyError=P,exports.ApiKeyShield=T,exports.ApiVersion=h,exports.Context=m,exports.ETagExtractor=v,exports.GracefulShutdown=l,exports.Healthcheck=M,exports.HttpLogger=g,exports.TimeZoneOffset=d,exports.TooManyRequestsError=_,exports.WeakETagExtractor=y,exports.rateLimitShield=function(e){var r=new a.RateLimiter(e);return t.createMiddleware(function(e,t){try{var n=Date.now();if(!r.verify(n).allowed)throw _;return Promise.resolve(t())}catch(e){return Promise.reject(e)}})};
|
|
2
|
+
//# sourceMappingURL=bgord-bun.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bgord-bun.cjs","sources":["../src/time-zone-offset.ts","../src/graceful-shutdown.ts","../src/api-version.ts","../src/context.ts","../src/etag-extractor.ts","../src/http-logger.ts","../src/api-key-shield.ts","../src/rate-limit-shield.ts","../src/healthcheck.ts"],"sourcesContent":["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\";\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 { 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 * 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.ETag.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\";\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.json();\n } catch (error) {}\n\n const httpRequestBeforeMetadata = {\n params: c.req.param(),\n headers: _.omit(\n c.req.raw.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.headers.get(\n bg.CacheResponse.CACHE_HIT_HEADER\n );\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.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 { 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 { 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 { 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"],"names":["_TimeZoneOffset","GracefulShutdown","shutdown","server","callback","undefined","bg","noop","stop","Promise","resolve","then","console","log","e","reject","applyTo","process","on","exit","event","JSON","stringify","ApiVersion","HEADER_NAME","DEFAULT_API_VERSION","attach","createMiddleware","c","next","BuildInfoRepository","extract","build","_build$BUILD_VERSION","res","headers","set","BUILD_VERSION","TimeZoneOffset","adjustTimestamp","timestamp","timeZoneOffsetMs","adjustDate","Date","TIME_ZONE_OFFSET_HEADER_NAME","timeZoneOffsetMinutes","Schema","TimeZoneOffsetHeaderValue","parse","req","header","timeZoneOffset","minutes","seconds","Time","Minutes","miliseconds","ms","Context","requestId","get","ETagExtractor","String","ETag","IF_MATCH_HEADER_NAME","fromHeader","error","WeakETagExtractor","WeakETag","HttpLogger","simplify","response","result","_key","value","Array","isArray","type","length","uninformativeHeaders","logger","body","_temp4","httpRequestBeforeMetadata","params","param","_","omit","raw","toJSON","query","queries","http","operation","correlationId","message","method","url","client","metadata","pickBy","isEmpty","_temp2","_serverTimingMs$match","httpRequestAfterMetadata","cacheHit","serverTimingMs","durationMsMatch","match","durationMs","Number","responseCode","status","CacheResponse","CACHE_HIT_HEADER","CacheHitEnum","hit","_temp","_catch","clone","json","_c$res$clone$json","info","getConnInfo","ip","remote","address","userAgent","_temp3","_c$req$json","AccessDeniedApiKeyError","HTTPException","ApiKeyShield","config","_this","this","verify","API_KEY","TooManyRequestsError","_Pact","onFulfilled","onRejected","state","_settle","v","o","handler","createFactory","Healthcheck","prerequisites","createHandlers","stopwatch","Stopwatch","ok","details","every","PrerequisiteStatusEnum","failure","success","code","_extends","version","BuildVersion","uptime","Uptime","memory","bytes","MemoryConsumption","toBytes","formatted","format","SizeUnit","MB","_forOf","prerequisite","push","label","options","rateLimiter","RateLimiter","_c","currentTimestampMs","now","allowed"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import*as e from"@bgord/node";import{createMiddleware as t,createFactory as s}from"hono/factory";import{getConnInfo as a}from"hono/bun";import r from"lodash";import{HTTPException as n}from"hono/http-exception";class o{static async shutdown(t,s=e.noop){t.stop(),await s(),console.log("HTTP server closed")}static applyTo(t,s=e.noop){process.on("SIGTERM",async function(){console.log("SIGTERM signal received: closing HTTP server"),await o.shutdown(t,s),process.exit(0)}),process.on("SIGINT",async function(){console.log("SIGINT signal received: closing HTTP server"),await o.shutdown(t,s),process.exit(0)}),process.on("unhandledRejection",async function(e){console.log("UnhandledPromiseRejectionWarning received: closing HTTP server"),console.log(JSON.stringify(e)),await o.shutdown(t,s),process.exit(1)})}}var i,c,u;class l{}i=l,l.HEADER_NAME="api-version",l.DEFAULT_API_VERSION="unknown",l.attach=t(async(t,s)=>{var a;const r=await e.BuildInfoRepository.extract();t.res.headers.set(i.HEADER_NAME,null!=(a=r.BUILD_VERSION)?a:i.DEFAULT_API_VERSION),await s()});class d{static adjustTimestamp(e,t){return e-t}static adjustDate(e,t){return new Date(e-t)}}c=d,d.TIME_ZONE_OFFSET_HEADER_NAME="time-zone-offset",d.attach=t(async(t,s)=>{const a=e.Schema.TimeZoneOffsetHeaderValue.parse(t.req.header(c.TIME_ZONE_OFFSET_HEADER_NAME)),r={minutes:a,seconds:e.Time.Minutes(a).seconds,miliseconds:e.Time.Minutes(a).ms};t.set("timeZoneOffset",r),await s()});class m{}m.attach=t(async(e,t)=>{e.set("context",{requestId:e.get("requestId"),timeZoneOffset:e.get("timeZoneOffset")}),await t()});class h{}h.attach=t(async(t,s)=>{try{const s=String(t.req.header(e.ETag.IF_MATCH_HEADER_NAME));t.set("ETag",s&&"undefined"!==s?e.ETag.fromHeader(s):null)}catch(e){t.set("ETag",null)}await s()});class p{}p.attach=t(async(t,s)=>{try{const s=String(t.req.header(e.WeakETag.IF_MATCH_HEADER_NAME));t.set("WeakETag",s&&"undefined"!==s?e.ETag.fromHeader(s):null)}catch(e){t.set("WeakETag",null)}await s()});class f{static simplify(e){const t=JSON.stringify(e,(e,t)=>Array.isArray(t)?{type:"Array",length:t.length}:t);return JSON.parse(t)}}u=f,f.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"],f.build=s=>t(async(t,n)=>{var o;const i=t.get("requestId"),c=a(t),l=t.req.url,d=t.req.method,m={ip:t.req.header("x-real-ip")||t.req.header("x-forwarded-for")||c.remote.address,userAgent:t.req.header("user-agent")};let h;try{h=await t.req.json()}catch(e){}const p={params:t.req.param(),headers:r.omit(t.req.raw.headers.toJSON(),u.uninformativeHeaders),body:h,query:t.req.queries()};s.http({operation:"http_request_before",correlationId:i,message:"request",method:d,url:l,client:m,metadata:r.pickBy(p,e=>!r.isEmpty(e))}),await n();const f=t.res.headers.get(e.CacheResponse.CACHE_HIT_HEADER)===e.CacheHitEnum.hit?e.CacheHitEnum.hit:void 0;let E;try{E=await t.res.clone().json()}catch(e){}const g={response:E,cacheHit:f},y=t.res.headers.get("Server-Timing"),_=null!=(o=null==y?void 0:y.match(/dur=([0-9]*\.?[0-9]+)/))?o:void 0,T=null!=_&&_[1]?Number(_[1]):void 0;s.http({operation:"http_request_after",correlationId:i,message:"response",method:d,url:l,responseCode:t.res.status,durationMs:T,client:m,metadata:u.simplify(g)})});const E=new n(403,{message:"access_denied_api_key"});class g{constructor(e){var s=this;this.config=void 0,this.verify=t(async function(e,t){if(e.req.header(g.HEADER_NAME)===s.config.API_KEY)return t();throw E}),this.config=e}}g.HEADER_NAME="bgord-api-key";const y=new n(429,{message:"app.too_many_requests"}),_=s=>{const a=new e.RateLimiter(s);return t(async(e,t)=>{const s=Date.now();if(!a.verify(s).allowed)throw y;return t()})};function T(){return T=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},T.apply(null,arguments)}const w=s();class v{}v.build=t=>w.createHandlers(async s=>{var a;const r=new e.Stopwatch,n=await e.BuildInfoRepository.extract(),o=[];for(const e of t){const t=await e.verify();o.push({label:e.label,status:t})}const i=o.every(t=>t.status!==e.PrerequisiteStatusEnum.failure)?e.PrerequisiteStatusEnum.success:e.PrerequisiteStatusEnum.failure,c=i===e.PrerequisiteStatusEnum.success?200:424,u=T({ok:i,details:o,version:null!=(a=n.BUILD_VERSION)?a:e.Schema.BuildVersion.parse("unknown"),uptime:e.Uptime.get(),memory:{bytes:e.MemoryConsumption.get().toBytes(),formatted:e.MemoryConsumption.get().format(e.SizeUnit.MB)}},r.stop());return s.json(u,c)});export{E as AccessDeniedApiKeyError,g as ApiKeyShield,l as ApiVersion,m as Context,h as ETagExtractor,o as GracefulShutdown,v as Healthcheck,f as HttpLogger,d as TimeZoneOffset,y as TooManyRequestsError,p as WeakETagExtractor,_ as rateLimitShield};
|
|
2
|
+
//# sourceMappingURL=bgord-bun.modern.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bgord-bun.modern.js","sources":["../src/graceful-shutdown.ts","../src/api-version.ts","../src/time-zone-offset.ts","../src/http-logger.ts","../src/context.ts","../src/etag-extractor.ts","../src/api-key-shield.ts","../src/rate-limit-shield.ts","../src/healthcheck.ts"],"sourcesContent":["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 { 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 * 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\";\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.json();\n } catch (error) {}\n\n const httpRequestBeforeMetadata = {\n params: c.req.param(),\n headers: _.omit(\n c.req.raw.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.headers.get(\n bg.CacheResponse.CACHE_HIT_HEADER\n );\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.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 { 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.ETag.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\";\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 { 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 { 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"],"names":["GracefulShutdown","shutdown","server","callback","bg","noop","stop","console","log","applyTo","process","on","async","exit","event","JSON","stringify","_ApiVersion","_TimeZoneOffset","_HttpLogger","ApiVersion","HEADER_NAME","DEFAULT_API_VERSION","attach","createMiddleware","c","next","_build$BUILD_VERSION","build","BuildInfoRepository","extract","res","headers","set","BUILD_VERSION","TimeZoneOffset","adjustTimestamp","timestamp","timeZoneOffsetMs","adjustDate","Date","TIME_ZONE_OFFSET_HEADER_NAME","timeZoneOffsetMinutes","Schema","TimeZoneOffsetHeaderValue","parse","req","header","timeZoneOffset","minutes","seconds","Time","Minutes","miliseconds","ms","Context","requestId","get","ETagExtractor","String","ETag","IF_MATCH_HEADER_NAME","fromHeader","error","WeakETagExtractor","WeakETag","HttpLogger","simplify","response","result","_key","value","Array","isArray","type","length","uninformativeHeaders","logger","_serverTimingMs$match","correlationId","info","getConnInfo","url","method","client","ip","remote","address","userAgent","body","json","httpRequestBeforeMetadata","params","param","_","omit","raw","toJSON","query","queries","http","operation","message","metadata","pickBy","isEmpty","cacheHit","CacheResponse","CACHE_HIT_HEADER","CacheHitEnum","hit","undefined","clone","httpRequestAfterMetadata","serverTimingMs","durationMsMatch","match","durationMs","Number","responseCode","status","AccessDeniedApiKeyError","HTTPException","ApiKeyShield","constructor","config","_this","verify","API_KEY","this","TooManyRequestsError","rateLimitShield","options","rateLimiter","RateLimiter","_c","currentTimestampMs","now","allowed","handler","createFactory","Healthcheck","prerequisites","createHandlers","stopwatch","Stopwatch","details","prerequisite","push","label","ok","every","PrerequisiteStatusEnum","failure","success","code","_extends","version","BuildVersion","uptime","Uptime","memory","bytes","MemoryConsumption","toBytes","formatted","format","SizeUnit","MB"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import*as e from"@bgord/node";import{createMiddleware as t,createFactory as r}from"hono/factory";import{getConnInfo as n}from"hono/bun";import o from"lodash";import{HTTPException as i}from"hono/http-exception";var s,u,c=/*#__PURE__*/function(){function t(){}return t.shutdown=function(t,r){try{return void 0===r&&(r=e.noop),t.stop(),Promise.resolve(r()).then(function(){console.log("HTTP server closed")})}catch(e){return Promise.reject(e)}},t.applyTo=function(r,n){void 0===n&&(n=e.noop),process.on("SIGTERM",function(){try{return console.log("SIGTERM signal received: closing HTTP server"),Promise.resolve(t.shutdown(r,n)).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(t.shutdown(r,n)).then(function(){process.exit(0)})}catch(e){return Promise.reject(e)}}),process.on("unhandledRejection",function(e){try{return console.log("UnhandledPromiseRejectionWarning received: closing HTTP server"),console.log(JSON.stringify(e)),Promise.resolve(t.shutdown(r,n)).then(function(){process.exit(1)})}catch(e){return Promise.reject(e)}})},t}(),a=function(){};s=a,a.HEADER_NAME="api-version",a.DEFAULT_API_VERSION="unknown",a.attach=t(function(t,r){try{return Promise.resolve(e.BuildInfoRepository.extract()).then(function(e){var n;return t.res.headers.set(s.HEADER_NAME,null!=(n=e.BUILD_VERSION)?n:s.DEFAULT_API_VERSION),Promise.resolve(r()).then(function(){})})}catch(e){return Promise.reject(e)}});var f=/*#__PURE__*/function(){function e(){}return e.adjustTimestamp=function(e,t){return e-t},e.adjustDate=function(e,t){return new Date(e-t)},e}();u=f,f.TIME_ZONE_OFFSET_HEADER_NAME="time-zone-offset",f.attach=t(function(t,r){try{var n=e.Schema.TimeZoneOffsetHeaderValue.parse(t.req.header(u.TIME_ZONE_OFFSET_HEADER_NAME)),o={minutes:n,seconds:e.Time.Minutes(n).seconds,miliseconds:e.Time.Minutes(n).ms};return t.set("timeZoneOffset",o),Promise.resolve(r()).then(function(){})}catch(e){return Promise.reject(e)}});var h=function(){};h.attach=t(function(e,t){try{return e.set("context",{requestId:e.get("requestId"),timeZoneOffset:e.get("timeZoneOffset")}),Promise.resolve(t()).then(function(){})}catch(e){return Promise.reject(e)}});var l=function(){};l.attach=t(function(t,r){try{try{var n=String(t.req.header(e.ETag.IF_MATCH_HEADER_NAME));t.set("ETag",n&&"undefined"!==n?e.ETag.fromHeader(n):null)}catch(e){t.set("ETag",null)}return Promise.resolve(r()).then(function(){})}catch(e){return Promise.reject(e)}});var m,d=function(){};function v(e,t){try{var r=e()}catch(e){return t(e)}return r&&r.then?r.then(void 0,t):r}d.attach=t(function(t,r){try{try{var n=String(t.req.header(e.WeakETag.IF_MATCH_HEADER_NAME));t.set("WeakETag",n&&"undefined"!==n?e.ETag.fromHeader(n):null)}catch(e){t.set("WeakETag",null)}return Promise.resolve(r()).then(function(){})}catch(e){return Promise.reject(e)}});var p=/*#__PURE__*/function(){function e(){}return e.simplify=function(e){var t=JSON.stringify(e,function(e,t){return Array.isArray(t)?{type:"Array",length:t.length}:t});return JSON.parse(t)},e}();m=p,p.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"],p.build=function(r){return t(function(t,i){try{var s,u=function(){var n={params:t.req.param(),headers:o.omit(t.req.raw.headers.toJSON(),m.uninformativeHeaders),body:s,query:t.req.queries()};return r.http({operation:"http_request_before",correlationId:c,message:"request",method:h,url:f,client:l,metadata:o.pickBy(n,function(e){return!o.isEmpty(e)})}),Promise.resolve(i()).then(function(){function n(){var e,n={response:o,cacheHit:i},s=t.res.headers.get("Server-Timing"),u=null!=(e=null==s?void 0:s.match(/dur=([0-9]*\.?[0-9]+)/))?e:void 0,a=null!=u&&u[1]?Number(u[1]):void 0;r.http({operation:"http_request_after",correlationId:c,message:"response",method:h,url:f,responseCode:t.res.status,durationMs:a,client:l,metadata:m.simplify(n)})}var o,i=t.res.headers.get(e.CacheResponse.CACHE_HIT_HEADER)===e.CacheHitEnum.hit?e.CacheHitEnum.hit:void 0,s=v(function(){return Promise.resolve(t.res.clone().json()).then(function(e){o=e})},function(){});return s&&s.then?s.then(n):n()})},c=t.get("requestId"),a=n(t),f=t.req.url,h=t.req.method,l={ip:t.req.header("x-real-ip")||t.req.header("x-forwarded-for")||a.remote.address,userAgent:t.req.header("user-agent")},d=v(function(){return Promise.resolve(t.req.json()).then(function(e){s=e})},function(){});return Promise.resolve(d&&d.then?d.then(u):u())}catch(e){return Promise.reject(e)}})};var y=new i(403,{message:"access_denied_api_key"}),g=function e(r){var n=this;this.config=void 0,this.verify=t(function(t,r){try{if(t.req.header(e.HEADER_NAME)===n.config.API_KEY)return Promise.resolve(r());throw y}catch(e){return Promise.reject(e)}}),this.config=r};g.HEADER_NAME="bgord-api-key";var E=new i(429,{message:"app.too_many_requests"}),P=function(r){var n=new e.RateLimiter(r);return t(function(e,t){try{var r=Date.now();if(!n.verify(r).allowed)throw E;return Promise.resolve(t())}catch(e){return Promise.reject(e)}})};function T(){return T=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},T.apply(null,arguments)}var _="undefined"!=typeof Symbol?Symbol.iterator||(Symbol.iterator=Symbol("Symbol.iterator")):"@@iterator";function S(e,t,r){if(!e.s){if(r instanceof A){if(!r.s)return void(r.o=S.bind(null,e,t));1&t&&(t=r.s),r=r.v}if(r&&r.then)return void r.then(S.bind(null,e,t),S.bind(null,e,2));e.s=t,e.v=r;var n=e.o;n&&n(e)}}var A=/*#__PURE__*/function(){function e(){}return e.prototype.then=function(t,r){var n=new e,o=this.s;if(o){var i=1&o?t:r;if(i){try{S(n,1,i(this.v))}catch(e){S(n,2,e)}return n}return this}return this.o=function(e){try{var o=e.v;1&e.s?S(n,1,t?t(o):o):r?S(n,1,r(o)):S(n,2,o)}catch(e){S(n,2,e)}},n},e}();function q(e){return e instanceof A&&1&e.s}var w=r(),I=function(){};I.build=function(t){return w.createHandlers(function(r){try{var n=new e.Stopwatch;return Promise.resolve(e.BuildInfoRepository.extract()).then(function(o){function i(){var t,i=s.every(function(t){return t.status!==e.PrerequisiteStatusEnum.failure})?e.PrerequisiteStatusEnum.success:e.PrerequisiteStatusEnum.failure,u=i===e.PrerequisiteStatusEnum.success?200:424,c=T({ok:i,details:s,version:null!=(t=o.BUILD_VERSION)?t:e.Schema.BuildVersion.parse("unknown"),uptime:e.Uptime.get(),memory:{bytes:e.MemoryConsumption.get().toBytes(),formatted:e.MemoryConsumption.get().format(e.SizeUnit.MB)}},n.stop());return r.json(c,u)}var s=[],u=function(e,t){if("function"==typeof e[_]){var r,n,o,i=e[_]();if(function e(s){try{for(;!(r=i.next()).done;)if((s=t(r.value))&&s.then){if(!q(s))return void s.then(e,o||(o=S.bind(null,n=new A,2)));s=s.v}n?S(n,1,s):n=s}catch(e){S(n||(n=new A),2,e)}}(),i.return){var s=function(e){try{r.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 u=[],c=0;c<e.length;c++)u.push(e[c]);return function(e,t){var r,n,o=-1;return function i(s){try{for(;++o<e.length;)if((s=t(o))&&s.then){if(!q(s))return void s.then(i,n||(n=S.bind(null,r=new A,2)));s=s.v}r?S(r,1,s):r=s}catch(e){S(r||(r=new A),2,e)}}(),r}(u,function(e){return t(u[e])})}(t,function(e){return Promise.resolve(e.verify()).then(function(t){s.push({label:e.label,status:t})})});return u&&u.then?u.then(i):i()})}catch(e){return Promise.reject(e)}})};export{y as AccessDeniedApiKeyError,g as ApiKeyShield,a as ApiVersion,h as Context,l as ETagExtractor,c as GracefulShutdown,I as Healthcheck,p as HttpLogger,f as TimeZoneOffset,E as TooManyRequestsError,d as WeakETagExtractor,P as rateLimitShield};
|
|
2
|
+
//# sourceMappingURL=bgord-bun.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bgord-bun.module.js","sources":["../src/graceful-shutdown.ts","../src/time-zone-offset.ts","../src/api-version.ts","../src/context.ts","../src/etag-extractor.ts","../src/http-logger.ts","../src/api-key-shield.ts","../src/rate-limit-shield.ts","../src/healthcheck.ts"],"sourcesContent":["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 { 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 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 * 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.ETag.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\";\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.json();\n } catch (error) {}\n\n const httpRequestBeforeMetadata = {\n params: c.req.param(),\n headers: _.omit(\n c.req.raw.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.headers.get(\n bg.CacheResponse.CACHE_HIT_HEADER\n );\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.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 { 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 { 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 { 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"],"names":["_TimeZoneOffset","GracefulShutdown","shutdown","server","callback","undefined","bg","noop","stop","Promise","resolve","then","console","log","e","reject","applyTo","process","on","exit","event","JSON","stringify","ApiVersion","HEADER_NAME","DEFAULT_API_VERSION","attach","createMiddleware","c","next","BuildInfoRepository","extract","build","_build$BUILD_VERSION","res","headers","set","BUILD_VERSION","TimeZoneOffset","adjustTimestamp","timestamp","timeZoneOffsetMs","adjustDate","Date","TIME_ZONE_OFFSET_HEADER_NAME","timeZoneOffsetMinutes","Schema","TimeZoneOffsetHeaderValue","parse","req","header","timeZoneOffset","minutes","seconds","Time","Minutes","miliseconds","ms","Context","requestId","get","ETagExtractor","String","ETag","IF_MATCH_HEADER_NAME","fromHeader","error","WeakETagExtractor","WeakETag","HttpLogger","simplify","response","result","_key","value","Array","isArray","type","length","uninformativeHeaders","logger","body","_temp4","httpRequestBeforeMetadata","params","param","_","omit","raw","toJSON","query","queries","http","operation","correlationId","message","method","url","client","metadata","pickBy","isEmpty","_temp2","_serverTimingMs$match","httpRequestAfterMetadata","cacheHit","serverTimingMs","durationMsMatch","match","durationMs","Number","responseCode","status","CacheResponse","CACHE_HIT_HEADER","CacheHitEnum","hit","_temp","_catch","clone","json","_c$res$clone$json","info","getConnInfo","ip","remote","address","userAgent","_temp3","_c$req$json","AccessDeniedApiKeyError","HTTPException","ApiKeyShield","config","_this","this","verify","API_KEY","TooManyRequestsError","rateLimitShield","options","rateLimiter","RateLimiter","_c","currentTimestampMs","now","allowed","_Pact","onFulfilled","onRejected","state","_settle","v","o","handler","createFactory","Healthcheck","prerequisites","createHandlers","stopwatch","Stopwatch","ok","details","every","PrerequisiteStatusEnum","failure","success","code","_extends","version","BuildVersion","uptime","Uptime","memory","bytes","MemoryConsumption","toBytes","formatted","format","SizeUnit","MB","_forOf","prerequisite","push","label"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@bgord/node"),require("hono/factory"),require("hono/bun"),require("lodash"),require("hono/http-exception")):"function"==typeof define&&define.amd?define(["exports","@bgord/node","hono/factory","hono/bun","lodash","hono/http-exception"],t):t((e||self).bun={},e.bg,e.factory,e.bun,e.lodash,e.httpException)}(this,function(e,t,r,n,o,i){function u(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function c(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach(function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}}),t.default=e,t}var s,a,f=/*#__PURE__*/c(t),l=/*#__PURE__*/u(o),h=/*#__PURE__*/function(){function e(){}return e.shutdown=function(e,t){try{return void 0===t&&(t=f.noop),e.stop(),Promise.resolve(t()).then(function(){console.log("HTTP server closed")})}catch(e){return Promise.reject(e)}},e.applyTo=function(t,r){void 0===r&&(r=f.noop),process.on("SIGTERM",function(){try{return console.log("SIGTERM signal received: closing HTTP server"),Promise.resolve(e.shutdown(t,r)).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(t,r)).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(t,r)).then(function(){process.exit(1)})}catch(e){return Promise.reject(e)}})},e}(),d=function(){};s=d,d.HEADER_NAME="api-version",d.DEFAULT_API_VERSION="unknown",d.attach=r.createMiddleware(function(e,t){try{return Promise.resolve(f.BuildInfoRepository.extract()).then(function(r){var n;return e.res.headers.set(s.HEADER_NAME,null!=(n=r.BUILD_VERSION)?n:s.DEFAULT_API_VERSION),Promise.resolve(t()).then(function(){})})}catch(e){return Promise.reject(e)}});var m=/*#__PURE__*/function(){function e(){}return e.adjustTimestamp=function(e,t){return e-t},e.adjustDate=function(e,t){return new Date(e-t)},e}();a=m,m.TIME_ZONE_OFFSET_HEADER_NAME="time-zone-offset",m.attach=r.createMiddleware(function(e,t){try{var r=f.Schema.TimeZoneOffsetHeaderValue.parse(e.req.header(a.TIME_ZONE_OFFSET_HEADER_NAME)),n={minutes:r,seconds:f.Time.Minutes(r).seconds,miliseconds:f.Time.Minutes(r).ms};return e.set("timeZoneOffset",n),Promise.resolve(t()).then(function(){})}catch(e){return Promise.reject(e)}});var v=function(){};v.attach=r.createMiddleware(function(e,t){try{return e.set("context",{requestId:e.get("requestId"),timeZoneOffset:e.get("timeZoneOffset")}),Promise.resolve(t()).then(function(){})}catch(e){return Promise.reject(e)}});var p=function(){};p.attach=r.createMiddleware(function(e,t){try{try{var r=String(e.req.header(f.ETag.IF_MATCH_HEADER_NAME));e.set("ETag",r&&"undefined"!==r?f.ETag.fromHeader(r):null)}catch(t){e.set("ETag",null)}return Promise.resolve(t()).then(function(){})}catch(e){return Promise.reject(e)}});var y,g=function(){};function E(e,t){try{var r=e()}catch(e){return t(e)}return r&&r.then?r.then(void 0,t):r}g.attach=r.createMiddleware(function(e,t){try{try{var r=String(e.req.header(f.WeakETag.IF_MATCH_HEADER_NAME));e.set("WeakETag",r&&"undefined"!==r?f.ETag.fromHeader(r):null)}catch(t){e.set("WeakETag",null)}return Promise.resolve(t()).then(function(){})}catch(e){return Promise.reject(e)}});var P=/*#__PURE__*/function(){function e(){}return e.simplify=function(e){var t=JSON.stringify(e,function(e,t){return Array.isArray(t)?{type:"Array",length:t.length}:t});return JSON.parse(t)},e}();y=P,P.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"],P.build=function(e){return r.createMiddleware(function(t,r){try{var o,i=function(){var n={params:t.req.param(),headers:l.default.omit(t.req.raw.headers.toJSON(),y.uninformativeHeaders),body:o,query:t.req.queries()};return e.http({operation:"http_request_before",correlationId:u,message:"request",method:a,url:s,client:h,metadata:l.default.pickBy(n,function(e){return!l.default.isEmpty(e)})}),Promise.resolve(r()).then(function(){function r(){var r,i={response:n,cacheHit:o},c=t.res.headers.get("Server-Timing"),f=null!=(r=null==c?void 0:c.match(/dur=([0-9]*\.?[0-9]+)/))?r:void 0,l=null!=f&&f[1]?Number(f[1]):void 0;e.http({operation:"http_request_after",correlationId:u,message:"response",method:a,url:s,responseCode:t.res.status,durationMs:l,client:h,metadata:y.simplify(i)})}var n,o=t.res.headers.get(f.CacheResponse.CACHE_HIT_HEADER)===f.CacheHitEnum.hit?f.CacheHitEnum.hit:void 0,i=E(function(){return Promise.resolve(t.res.clone().json()).then(function(e){n=e})},function(){});return i&&i.then?i.then(r):r()})},u=t.get("requestId"),c=n.getConnInfo(t),s=t.req.url,a=t.req.method,h={ip:t.req.header("x-real-ip")||t.req.header("x-forwarded-for")||c.remote.address,userAgent:t.req.header("user-agent")},d=E(function(){return Promise.resolve(t.req.json()).then(function(e){o=e})},function(){});return Promise.resolve(d&&d.then?d.then(i):i())}catch(e){return Promise.reject(e)}})};var T=new i.HTTPException(403,{message:"access_denied_api_key"}),b=function e(t){var n=this;this.config=void 0,this.verify=r.createMiddleware(function(t,r){try{if(t.req.header(e.HEADER_NAME)===n.config.API_KEY)return Promise.resolve(r());throw T}catch(e){return Promise.reject(e)}}),this.config=t};b.HEADER_NAME="bgord-api-key";var _=new i.HTTPException(429,{message:"app.too_many_requests"});function w(){return w=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},w.apply(null,arguments)}var q="undefined"!=typeof Symbol?Symbol.iterator||(Symbol.iterator=Symbol("Symbol.iterator")):"@@iterator";function A(e,t,r){if(!e.s){if(r instanceof S){if(!r.s)return void(r.o=A.bind(null,e,t));1&t&&(t=r.s),r=r.v}if(r&&r.then)return void r.then(A.bind(null,e,t),A.bind(null,e,2));e.s=t,e.v=r;var n=e.o;n&&n(e)}}var S=/*#__PURE__*/function(){function e(){}return e.prototype.then=function(t,r){var n=new e,o=this.s;if(o){var i=1&o?t:r;if(i){try{A(n,1,i(this.v))}catch(e){A(n,2,e)}return n}return this}return this.o=function(e){try{var o=e.v;1&e.s?A(n,1,t?t(o):o):r?A(n,1,r(o)):A(n,2,o)}catch(e){A(n,2,e)}},n},e}();function H(e){return e instanceof S&&1&e.s}var M=r.createFactory(),j=function(){};j.build=function(e){return M.createHandlers(function(t){try{var r=new f.Stopwatch;return Promise.resolve(f.BuildInfoRepository.extract()).then(function(n){function o(){var e,o=i.every(function(e){return e.status!==f.PrerequisiteStatusEnum.failure})?f.PrerequisiteStatusEnum.success:f.PrerequisiteStatusEnum.failure,u=o===f.PrerequisiteStatusEnum.success?200:424,c=w({ok:o,details:i,version:null!=(e=n.BUILD_VERSION)?e:f.Schema.BuildVersion.parse("unknown"),uptime:f.Uptime.get(),memory:{bytes:f.MemoryConsumption.get().toBytes(),formatted:f.MemoryConsumption.get().format(f.SizeUnit.MB)}},r.stop());return t.json(c,u)}var i=[],u=function(e,t){if("function"==typeof e[q]){var r,n,o,i=e[q]();if(function e(u){try{for(;!(r=i.next()).done;)if((u=t(r.value))&&u.then){if(!H(u))return void u.then(e,o||(o=A.bind(null,n=new S,2)));u=u.v}n?A(n,1,u):n=u}catch(e){A(n||(n=new S),2,e)}}(),i.return){var u=function(e){try{r.done||i.return()}catch(e){}return e};if(n&&n.then)return n.then(u,function(e){throw u(e)});u()}return n}if(!("length"in e))throw new TypeError("Object is not iterable");for(var c=[],s=0;s<e.length;s++)c.push(e[s]);return function(e,t){var r,n,o=-1;return function i(u){try{for(;++o<e.length;)if((u=t(o))&&u.then){if(!H(u))return void u.then(i,n||(n=A.bind(null,r=new S,2)));u=u.v}r?A(r,1,u):r=u}catch(e){A(r||(r=new S),2,e)}}(),r}(c,function(e){return t(c[e])})}(e,function(e){return Promise.resolve(e.verify()).then(function(t){i.push({label:e.label,status:t})})});return u&&u.then?u.then(o):o()})}catch(e){return Promise.reject(e)}})},e.AccessDeniedApiKeyError=T,e.ApiKeyShield=b,e.ApiVersion=d,e.Context=v,e.ETagExtractor=p,e.GracefulShutdown=h,e.Healthcheck=j,e.HttpLogger=P,e.TimeZoneOffset=m,e.TooManyRequestsError=_,e.WeakETagExtractor=g,e.rateLimitShield=function(e){var t=new f.RateLimiter(e);return r.createMiddleware(function(e,r){try{var n=Date.now();if(!t.verify(n).allowed)throw _;return Promise.resolve(r())}catch(e){return Promise.reject(e)}})}});
|
|
2
|
+
//# sourceMappingURL=bgord-bun.umd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bgord-bun.umd.js","sources":["../src/time-zone-offset.ts","../src/graceful-shutdown.ts","../src/api-version.ts","../src/context.ts","../src/etag-extractor.ts","../src/http-logger.ts","../src/api-key-shield.ts","../src/rate-limit-shield.ts","../src/healthcheck.ts"],"sourcesContent":["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\";\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 { 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 * 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.ETag.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\";\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.json();\n } catch (error) {}\n\n const httpRequestBeforeMetadata = {\n params: c.req.param(),\n headers: _.omit(\n c.req.raw.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.headers.get(\n bg.CacheResponse.CACHE_HIT_HEADER\n );\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.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 { 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 { 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 { 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"],"names":["_TimeZoneOffset","GracefulShutdown","shutdown","server","callback","undefined","bg","noop","stop","Promise","resolve","then","console","log","e","reject","applyTo","process","on","exit","event","JSON","stringify","ApiVersion","HEADER_NAME","DEFAULT_API_VERSION","attach","createMiddleware","c","next","BuildInfoRepository","extract","build","_build$BUILD_VERSION","res","headers","set","BUILD_VERSION","TimeZoneOffset","adjustTimestamp","timestamp","timeZoneOffsetMs","adjustDate","Date","TIME_ZONE_OFFSET_HEADER_NAME","timeZoneOffsetMinutes","Schema","TimeZoneOffsetHeaderValue","parse","req","header","timeZoneOffset","minutes","seconds","Time","Minutes","miliseconds","ms","Context","requestId","get","ETagExtractor","String","ETag","IF_MATCH_HEADER_NAME","fromHeader","error","WeakETagExtractor","WeakETag","HttpLogger","simplify","response","result","_key","value","Array","isArray","type","length","uninformativeHeaders","logger","body","_temp4","httpRequestBeforeMetadata","params","param","_","omit","raw","toJSON","query","queries","http","operation","correlationId","message","method","url","client","metadata","pickBy","isEmpty","_temp2","_serverTimingMs$match","httpRequestAfterMetadata","cacheHit","serverTimingMs","durationMsMatch","match","durationMs","Number","responseCode","status","CacheResponse","CACHE_HIT_HEADER","CacheHitEnum","hit","_temp","_catch","clone","json","_c$res$clone$json","info","getConnInfo","ip","remote","address","userAgent","_temp3","_c$req$json","AccessDeniedApiKeyError","HTTPException","ApiKeyShield","config","_this","this","verify","API_KEY","TooManyRequestsError","_Pact","onFulfilled","onRejected","state","_settle","v","o","handler","createFactory","Healthcheck","prerequisites","createHandlers","stopwatch","Stopwatch","ok","details","every","PrerequisiteStatusEnum","failure","success","code","_extends","version","BuildVersion","uptime","Uptime","memory","bytes","MemoryConsumption","toBytes","formatted","format","SizeUnit","MB","_forOf","prerequisite","push","label","options","rateLimiter","RateLimiter","_c","currentTimestampMs","now","allowed"],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as Schema from "../schema";
|
|
2
|
+
import { HTTPException } from "hono/http-exception";
|
|
3
|
+
type ApiKeyShieldConfigType = {
|
|
4
|
+
API_KEY: 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/types").MiddlewareHandler<{
|
|
12
|
+
Bindings: any;
|
|
13
|
+
Variables: any;
|
|
14
|
+
}, string, {}>;
|
|
15
|
+
}
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ContextType } from "../context";
|
|
2
|
+
import { TimeZoneOffsetVariables } from "./time-zone-offset";
|
|
3
|
+
export type ContextVariables = {
|
|
4
|
+
context: ContextType;
|
|
5
|
+
requestId: string;
|
|
6
|
+
} & TimeZoneOffsetVariables;
|
|
7
|
+
export declare class Context {
|
|
8
|
+
static attach: import("hono/types").MiddlewareHandler<{
|
|
9
|
+
Bindings: any;
|
|
10
|
+
Variables: any;
|
|
11
|
+
}, string, {}>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ETag, WeakETag } from "../etag";
|
|
2
|
+
export type EtagVariables = {
|
|
3
|
+
ETag: ETag | null;
|
|
4
|
+
WeakETag: WeakETag | null;
|
|
5
|
+
};
|
|
6
|
+
export declare class ETagExtractor {
|
|
7
|
+
static attach: import("hono/types").MiddlewareHandler<{
|
|
8
|
+
Bindings: any;
|
|
9
|
+
Variables: EtagVariables;
|
|
10
|
+
}, string, {}>;
|
|
11
|
+
}
|
|
12
|
+
export declare class WeakETagExtractor {
|
|
13
|
+
static attach: import("hono/types").MiddlewareHandler<{
|
|
14
|
+
Bindings: any;
|
|
15
|
+
Variables: EtagVariables;
|
|
16
|
+
}, string, {}>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as Schema from "../schema";
|
|
2
|
+
import { AbstractPrerequisite, BasePrerequisiteConfig, PrerequisiteStatusEnum, PrerequisiteLabelType } from "../prerequisites";
|
|
3
|
+
import { Size } from "../size";
|
|
4
|
+
export declare class Healthcheck {
|
|
5
|
+
static build: (prerequisites: AbstractPrerequisite<BasePrerequisiteConfig>[]) => [import("hono/types").H<any, any, {}, Promise<Response & import("hono/types").TypedResponse<{
|
|
6
|
+
ok: PrerequisiteStatusEnum;
|
|
7
|
+
version: Schema.BuildVersionType;
|
|
8
|
+
details: {
|
|
9
|
+
label: PrerequisiteLabelType;
|
|
10
|
+
status: PrerequisiteStatusEnum;
|
|
11
|
+
}[];
|
|
12
|
+
uptime: {
|
|
13
|
+
seconds: Schema.TimestampType;
|
|
14
|
+
formatted: ReturnType<typeof import("..").DateFormatters["relative"]>;
|
|
15
|
+
};
|
|
16
|
+
memory: {
|
|
17
|
+
bytes: Size["bytes"];
|
|
18
|
+
formatted: ReturnType<Size["format"]>;
|
|
19
|
+
};
|
|
20
|
+
durationMs: Schema.TimestampType;
|
|
21
|
+
}, 200 | 424, "json">>>];
|
|
22
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Logger } from "../logger";
|
|
2
|
+
export declare class HttpLogger {
|
|
3
|
+
private static simplify;
|
|
4
|
+
private static uninformativeHeaders;
|
|
5
|
+
static build: (logger: Logger) => import("hono/types").MiddlewareHandler<{
|
|
6
|
+
Bindings: any;
|
|
7
|
+
Variables: any;
|
|
8
|
+
}, string, {}>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from "./graceful-shutdown";
|
|
2
|
+
export * from "./api-version";
|
|
3
|
+
export * from "./time-zone-offset";
|
|
4
|
+
export * from "./context";
|
|
5
|
+
export * from "./etag-extractor";
|
|
6
|
+
export * from "./http-logger";
|
|
7
|
+
export * from "./api-key-shield";
|
|
8
|
+
export * from "./rate-limit-shield";
|
|
9
|
+
export * from "./healthcheck";
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { HTTPException } from "hono/http-exception";
|
|
2
|
+
import * as Schema from "../schema";
|
|
3
|
+
type RateLimitShieldOptionsType = {
|
|
4
|
+
ms: Schema.TimestampType;
|
|
5
|
+
};
|
|
6
|
+
export declare const TooManyRequestsError: HTTPException;
|
|
7
|
+
export declare const rateLimitShield: (options: RateLimitShieldOptionsType) => import("hono/types").MiddlewareHandler<{
|
|
8
|
+
Bindings: any;
|
|
9
|
+
Variables: any;
|
|
10
|
+
}, string, {}>;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as Schema from "../schema";
|
|
2
|
+
export type TimeZoneOffsetVariables = {
|
|
3
|
+
timeZoneOffset: {
|
|
4
|
+
minutes: Schema.TimeZoneOffsetValueType;
|
|
5
|
+
seconds: Schema.TimeZoneOffsetValueType;
|
|
6
|
+
miliseconds: Schema.TimeZoneOffsetValueType;
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
export declare class TimeZoneOffset {
|
|
10
|
+
static attach: import("hono/types").MiddlewareHandler<{
|
|
11
|
+
Bindings: any;
|
|
12
|
+
Variables: any;
|
|
13
|
+
}, string, {}>;
|
|
14
|
+
static adjustTimestamp(timestamp: Schema.TimestampType, timeZoneOffsetMs: Schema.TimeZoneOffsetValueType): Schema.TimestampType;
|
|
15
|
+
static adjustDate(timestamp: Schema.TimestampType, timeZoneOffsetMs: Schema.TimeZoneOffsetValueType): Date;
|
|
16
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Request, Response, NextFunction } from "express";
|
|
2
|
+
import NodeCache from "node-cache";
|
|
3
|
+
export declare enum CacheHitEnum {
|
|
4
|
+
hit = "hit",
|
|
5
|
+
miss = "miss"
|
|
6
|
+
}
|
|
7
|
+
export declare class CacheResponse {
|
|
8
|
+
private readonly cache;
|
|
9
|
+
static readonly CACHE_HIT_HEADER = "Cache-Hit";
|
|
10
|
+
constructor(cache: NodeCache);
|
|
11
|
+
private _handle;
|
|
12
|
+
handle: (request: Request, response: Response, next: NextFunction) => void;
|
|
13
|
+
private _clear;
|
|
14
|
+
clear: (_request: Request, _response: Response, next: NextFunction) => void;
|
|
15
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as express from "express";
|
|
2
|
+
export declare enum CacheStaticFilesStrategy {
|
|
3
|
+
never = "never",
|
|
4
|
+
always = "always",
|
|
5
|
+
five_minutes = "five_minutes"
|
|
6
|
+
}
|
|
7
|
+
export declare class CacheStaticFiles {
|
|
8
|
+
static handle(strategy: CacheStaticFilesStrategy): (_request: express.Request, response: express.Response, next: express.NextFunction) => void;
|
|
9
|
+
}
|
package/dist/cache.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const Cache: typeof import("node-cache");
|