@tripod311/currents 0.0.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.
Files changed (74) hide show
  1. package/README.md +257 -0
  2. package/dist/binaryBody.d.ts +3 -0
  3. package/dist/binaryBody.d.ts.map +1 -0
  4. package/dist/binaryBody.js +14 -0
  5. package/dist/binaryBody.js.map +1 -0
  6. package/dist/body/binaryBody.d.ts +3 -0
  7. package/dist/body/binaryBody.d.ts.map +1 -0
  8. package/dist/body/binaryBody.js +14 -0
  9. package/dist/body/binaryBody.js.map +1 -0
  10. package/dist/body/formBody.d.ts +3 -0
  11. package/dist/body/formBody.d.ts.map +1 -0
  12. package/dist/body/formBody.js +15 -0
  13. package/dist/body/formBody.js.map +1 -0
  14. package/dist/body/jsonBody.d.ts +3 -0
  15. package/dist/body/jsonBody.d.ts.map +1 -0
  16. package/dist/body/jsonBody.js +7 -0
  17. package/dist/body/jsonBody.js.map +1 -0
  18. package/dist/body/multipartBody.d.ts +3 -0
  19. package/dist/body/multipartBody.d.ts.map +1 -0
  20. package/dist/body/multipartBody.js +115 -0
  21. package/dist/body/multipartBody.js.map +1 -0
  22. package/dist/body/textBody.d.ts +3 -0
  23. package/dist/body/textBody.d.ts.map +1 -0
  24. package/dist/body/textBody.js +7 -0
  25. package/dist/body/textBody.js.map +1 -0
  26. package/dist/context.d.ts +43 -0
  27. package/dist/context.d.ts.map +1 -0
  28. package/dist/context.js +129 -0
  29. package/dist/context.js.map +1 -0
  30. package/dist/cookie.d.ts +13 -0
  31. package/dist/cookie.d.ts.map +1 -0
  32. package/dist/cookie.js +61 -0
  33. package/dist/cookie.js.map +1 -0
  34. package/dist/cors.d.ts +9 -0
  35. package/dist/cors.d.ts.map +1 -0
  36. package/dist/cors.js +34 -0
  37. package/dist/cors.js.map +1 -0
  38. package/dist/currents.d.ts +41 -0
  39. package/dist/currents.d.ts.map +1 -0
  40. package/dist/currents.js +172 -0
  41. package/dist/currents.js.map +1 -0
  42. package/dist/formBody.d.ts +2 -0
  43. package/dist/formBody.d.ts.map +1 -0
  44. package/dist/formBody.js +2 -0
  45. package/dist/formBody.js.map +1 -0
  46. package/dist/index.d.ts +20 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +14 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/jsonBody.d.ts +2 -0
  51. package/dist/jsonBody.d.ts.map +1 -0
  52. package/dist/jsonBody.js +2 -0
  53. package/dist/jsonBody.js.map +1 -0
  54. package/dist/multipartBody.d.ts +2 -0
  55. package/dist/multipartBody.d.ts.map +1 -0
  56. package/dist/multipartBody.js +2 -0
  57. package/dist/multipartBody.js.map +1 -0
  58. package/dist/router.d.ts +24 -0
  59. package/dist/router.d.ts.map +1 -0
  60. package/dist/router.js +113 -0
  61. package/dist/router.js.map +1 -0
  62. package/dist/security.d.ts +16 -0
  63. package/dist/security.d.ts.map +1 -0
  64. package/dist/security.js +34 -0
  65. package/dist/security.js.map +1 -0
  66. package/dist/static.d.ts +9 -0
  67. package/dist/static.d.ts.map +1 -0
  68. package/dist/static.js +71 -0
  69. package/dist/static.js.map +1 -0
  70. package/dist/textBody.d.ts +3 -0
  71. package/dist/textBody.d.ts.map +1 -0
  72. package/dist/textBody.js +4 -0
  73. package/dist/textBody.js.map +1 -0
  74. package/package.json +31 -0
@@ -0,0 +1,129 @@
1
+ import { Readable } from "stream";
2
+ import { IncomingMessage, ServerResponse } from "http";
3
+ export class Context {
4
+ raw;
5
+ _finished = false;
6
+ _notFound = false;
7
+ /* request part */
8
+ method;
9
+ path;
10
+ headers;
11
+ cookies = {};
12
+ params = {};
13
+ query;
14
+ body;
15
+ /* for custom data */
16
+ locals = {};
17
+ /* response part */
18
+ _status = 200;
19
+ _responseHeaders = {};
20
+ constructor(raw) {
21
+ this.raw = raw;
22
+ if (raw.httpVersion === 1) {
23
+ this.headers = raw.req.headers;
24
+ this.method = raw.req.method;
25
+ this.path = raw.req.url;
26
+ }
27
+ else {
28
+ this.headers = raw.headers;
29
+ this.method = this.headers[":method"];
30
+ this.path = this.headers[":path"];
31
+ }
32
+ }
33
+ parsePath() {
34
+ const [pathEnc, search = ""] = this.path.split("?");
35
+ this.query = new URLSearchParams(search);
36
+ this.path = decodeURIComponent(pathEnc);
37
+ }
38
+ responseHeader(header, value) {
39
+ const key = header.toLowerCase();
40
+ if (this._responseHeaders[key] !== undefined) {
41
+ if (Array.isArray(this._responseHeaders[key])) {
42
+ this._responseHeaders[key].push(value);
43
+ }
44
+ else {
45
+ this._responseHeaders[key] = [this._responseHeaders[key], value];
46
+ }
47
+ }
48
+ else {
49
+ this._responseHeaders[key] = value;
50
+ }
51
+ return this;
52
+ }
53
+ status(code) {
54
+ this._status = code;
55
+ return this;
56
+ }
57
+ json(data) {
58
+ this.responseHeader("Content-Type", "application/json");
59
+ this.send(Buffer.from(JSON.stringify(data), "utf-8"));
60
+ }
61
+ text(data) {
62
+ this.responseHeader("Content-Type", "text/plain");
63
+ this.send(Buffer.from(data, "utf-8"));
64
+ }
65
+ binary(data) {
66
+ this.responseHeader("Content-Type", "application/octet-stream");
67
+ this.send(data);
68
+ }
69
+ send(data, contentLength) {
70
+ if (Buffer.isBuffer(data)) {
71
+ this._responseHeaders["Content-Length"] = data.length.toString();
72
+ }
73
+ else {
74
+ if (contentLength === undefined) {
75
+ throw new Error("Context.send must be provided with contentLength when sending Readable");
76
+ }
77
+ this._responseHeaders["Content-Length"] = contentLength.toString();
78
+ }
79
+ if (this.raw.httpVersion === 1) {
80
+ this.raw.res.writeHead(this._status, this._responseHeaders);
81
+ if (data instanceof Readable) {
82
+ data.pipe(this.raw.res);
83
+ }
84
+ else {
85
+ this.raw.res.end(data);
86
+ }
87
+ }
88
+ else {
89
+ this.raw.stream.respond({
90
+ ":status": this._status,
91
+ ...this._responseHeaders
92
+ });
93
+ if (data instanceof Readable) {
94
+ data.pipe(this.raw.stream);
95
+ }
96
+ else {
97
+ this.raw.stream.end(data);
98
+ }
99
+ }
100
+ this._finished = true;
101
+ }
102
+ end() {
103
+ if (this.raw.httpVersion === 1) {
104
+ this.raw.res.writeHead(this._status, this._responseHeaders);
105
+ this.raw.res.end();
106
+ }
107
+ else {
108
+ this.raw.stream.respond({
109
+ ":status": this._status,
110
+ ...this._responseHeaders
111
+ });
112
+ this.raw.stream.end();
113
+ }
114
+ this._finished = true;
115
+ }
116
+ redirect(to) {
117
+ this.responseHeader("Location", to).status(307).end();
118
+ }
119
+ callNotFound() {
120
+ this._notFound = true;
121
+ }
122
+ get finished() {
123
+ return this._finished;
124
+ }
125
+ get notFound() {
126
+ return this._notFound;
127
+ }
128
+ }
129
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { Context } from "./context.js";
2
+ export interface CookieOptions {
3
+ maxAge?: number;
4
+ expires?: Date;
5
+ httpOnly?: boolean;
6
+ secure?: boolean;
7
+ sameSite?: "Strict" | "Lax" | "None";
8
+ path?: string;
9
+ domain?: string;
10
+ }
11
+ export declare function ParseCookies(secret?: string): (ctx: Context) => Promise<void>;
12
+ export declare function SetCookie(ctx: Context, name: string, value: string, options: CookieOptions): void;
13
+ //# sourceMappingURL=cookie.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookie.d.ts","sourceRoot":"","sources":["../src/cookie.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,WAAW,aAAa;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAaD,wBAAgB,YAAY,CAAE,MAAM,CAAC,EAAE,MAAM,IAG9B,KAAK,OAAO,mBA4B1B;AAED,wBAAgB,SAAS,CAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,QAmB3F"}
package/dist/cookie.js ADDED
@@ -0,0 +1,61 @@
1
+ import crypto from "crypto";
2
+ import { Context } from "./context.js";
3
+ let CookieSecret = undefined;
4
+ function sign(value) {
5
+ return crypto.createHmac("sha256", CookieSecret).update(value).digest("base64url");
6
+ }
7
+ function verify(value, signature) {
8
+ const expected = sign(value);
9
+ return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
10
+ }
11
+ export function ParseCookies(secret) {
12
+ CookieSecret = secret;
13
+ return async (ctx) => {
14
+ const header = ctx.headers["cookie"];
15
+ if (!header)
16
+ return;
17
+ const parts = header.split(";");
18
+ for (const part of parts) {
19
+ const [rawKey, rawVal = ""] = part.trim().split("=");
20
+ const key = decodeURIComponent(rawKey);
21
+ const val = decodeURIComponent(rawVal);
22
+ if (CookieSecret) {
23
+ const sigIndex = val.lastIndexOf(".sig-");
24
+ if (sigIndex !== -1) {
25
+ const rawValue = val.slice(0, sigIndex);
26
+ const sig = val.slice(sigIndex + 5);
27
+ if (verify(rawValue, sig)) {
28
+ ctx.cookies[key] = rawValue;
29
+ }
30
+ }
31
+ }
32
+ else {
33
+ ctx.cookies[key] = val;
34
+ }
35
+ }
36
+ };
37
+ }
38
+ export function SetCookie(ctx, name, value, options) {
39
+ let cookieValue = encodeURIComponent(value);
40
+ if (CookieSecret !== undefined) {
41
+ const sig = sign(value);
42
+ cookieValue = encodeURIComponent(`${value}.sig-${sig}`);
43
+ }
44
+ const parts = [`${name}=${cookieValue}`];
45
+ if (options.maxAge !== undefined)
46
+ parts.push(`Max-Age=${options.maxAge}`);
47
+ if (options.expires)
48
+ parts.push(`Expires=${options.expires.toUTCString()}`);
49
+ if (options.path)
50
+ parts.push(`Path=${options.path}`);
51
+ if (options.domain)
52
+ parts.push(`Domain=${options.domain}`);
53
+ if (options.httpOnly)
54
+ parts.push("HttpOnly");
55
+ if (options.secure)
56
+ parts.push("Secure");
57
+ if (options.sameSite)
58
+ parts.push(`SameSite=${options.sameSite}`);
59
+ ctx.responseHeader("Set-Cookie", parts.join('; '));
60
+ }
61
+ //# sourceMappingURL=cookie.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookie.js","sourceRoot":"","sources":["../src/cookie.ts"],"names":[],"mappings":"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"}
package/dist/cors.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ import { Context } from "./context.js";
2
+ export interface CorsOptions {
3
+ allowedOrigin: string | string[];
4
+ allowedMethods?: string[];
5
+ allowedHeaders?: string[];
6
+ credentials?: boolean;
7
+ }
8
+ export declare function Cors(options: CorsOptions): (ctx: Context) => Promise<void>;
9
+ //# sourceMappingURL=cors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.d.ts","sourceRoot":"","sources":["../src/cors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,WAAW,WAAW;IAC3B,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,IAAI,CAAE,OAAO,EAAE,WAAW,IAC3B,KAAK,OAAO,mBAgC1B"}
package/dist/cors.js ADDED
@@ -0,0 +1,34 @@
1
+ import { Context } from "./context.js";
2
+ export function Cors(options) {
3
+ return async (ctx) => {
4
+ const origin = ctx.headers["origin"];
5
+ if (!origin)
6
+ return;
7
+ let allowed = false;
8
+ if (options.allowedOrigin === "*") {
9
+ allowed = true;
10
+ }
11
+ else if (typeof options.allowedOrigin === "string") {
12
+ allowed = options.allowedOrigin === origin;
13
+ }
14
+ else if (Array.isArray(options.allowedOrigin)) {
15
+ allowed = options.allowedOrigin.includes(origin);
16
+ }
17
+ if (!allowed)
18
+ return;
19
+ ctx.responseHeader("Access-Control-Allow-Origin", origin);
20
+ if (options.credentials) {
21
+ ctx.responseHeader("Access-Control-Allow-Credentials", "true");
22
+ }
23
+ if (ctx.method === "OPTIONS") {
24
+ if (options.allowedMethods) {
25
+ ctx.responseHeader("Access-Control-Allow-Methods", options.allowedMethods.join(", "));
26
+ }
27
+ if (options.allowedHeaders) {
28
+ ctx.responseHeader("Access-Control-Allow-Headers", options.allowedHeaders.join(", "));
29
+ }
30
+ ctx.status(204).end();
31
+ }
32
+ };
33
+ }
34
+ //# sourceMappingURL=cors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.js","sourceRoot":"","sources":["../src/cors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAStC,MAAM,UAAU,IAAI,CAAE,OAAoB;IACzC,OAAO,KAAK,EAAE,GAAY,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,IAAI,OAAO,CAAC,aAAa,KAAK,GAAG,EAAE,CAAC;YACnC,OAAO,GAAG,IAAI,CAAC;QAChB,CAAC;aAAM,IAAI,OAAO,OAAO,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;YACtD,OAAO,GAAG,OAAO,CAAC,aAAa,KAAK,MAAM,CAAC;QAC5C,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;YACjD,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,GAAG,CAAC,cAAc,CAAC,6BAA6B,EAAE,MAAM,CAAC,CAAC;QAE1D,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACzB,GAAG,CAAC,cAAc,CAAC,kCAAkC,EAAE,MAAM,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;gBAC5B,GAAG,CAAC,cAAc,CAAC,8BAA8B,EAAE,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACvF,CAAC;YACD,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;gBAC5B,GAAG,CAAC,cAAc,CAAC,8BAA8B,EAAE,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACvF,CAAC;YACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACvB,CAAC;IACF,CAAC,CAAA;AACF,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { Server as HttpServer, IncomingMessage, ServerResponse } from "http";
2
+ import { Server as HttpsServer } from "https";
3
+ import type { Http2Server, Http2SecureServer, ServerHttp2Stream, IncomingHttpHeaders } from "http2";
4
+ import type { RouteHandler } from "./router.js";
5
+ import { Context } from "./context.js";
6
+ export interface CurrentsOptions {
7
+ forceHTTPVersion?: 1 | 2;
8
+ certificates?: {
9
+ cert: string;
10
+ key: string;
11
+ ca?: string;
12
+ };
13
+ }
14
+ type Server = HttpServer | HttpsServer | Http2Server | Http2SecureServer;
15
+ export type ErrorHandler = (err: any, ctx: Context) => Promise<void>;
16
+ export declare class Currents {
17
+ httpVersion: number;
18
+ server: Server;
19
+ private routesTable;
20
+ private _notFoundHandler;
21
+ private _errorHandler;
22
+ constructor(version: number, server: Server);
23
+ handleRequestV1(req: IncomingMessage, res: ServerResponse): void;
24
+ handleRequestV2(stream: ServerHttp2Stream, headers: IncomingHttpHeaders): void;
25
+ private processRequest;
26
+ private runHandlers;
27
+ any(path: string, handlers: RouteHandler[]): void;
28
+ get(path: string, handlers: RouteHandler[]): void;
29
+ post(path: string, handlers: RouteHandler[]): void;
30
+ put(path: string, handlers: RouteHandler[]): void;
31
+ delete(path: string, handlers: RouteHandler[]): void;
32
+ set notFoundHandler(val: RouteHandler[]);
33
+ set errorHandler(val: ErrorHandler);
34
+ static fromOptions(options: CurrentsOptions): Currents;
35
+ static fromServer(server: Server): Currents;
36
+ static isHttp2Server(server: HttpServer | HttpsServer | Http2Server | Http2SecureServer): server is Http2Server | Http2SecureServer;
37
+ static defaultErrorHandler(err: any, ctx: Context): Promise<void>;
38
+ static defaultNotFoundHandler(ctx: Context): Promise<void>;
39
+ }
40
+ export {};
41
+ //# sourceMappingURL=currents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"currents.d.ts","sourceRoot":"","sources":["../src/currents.ts"],"names":[],"mappings":"AACA,OAAa,EAAE,MAAM,IAAI,UAAU,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAA;AAClF,OAAc,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,OAAO,CAAA;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAA;AAGnG,OAAO,KAAK,EAAc,YAAY,EAAE,MAAM,aAAa,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,WAAW,eAAe;IAC/B,gBAAgB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACzB,YAAY,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1D;AAED,KAAK,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,WAAW,GAAG,iBAAiB,CAAC;AAEzE,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAErE,qBAAa,QAAQ;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IAEtB,OAAO,CAAC,WAAW,CAMjB;IACF,OAAO,CAAC,gBAAgB,CAAiB;IACzC,OAAO,CAAC,aAAa,CAAe;gBAEvB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAc5C,eAAe,CAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc;IAiB1D,eAAe,CAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,mBAAmB;IAiBxE,OAAO,CAAC,cAAc;YAgCR,WAAW;IAkBzB,GAAG,CAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE;IAI3C,GAAG,CAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE;IAI3C,IAAI,CAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE;IAI5C,GAAG,CAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE;IAI3C,MAAM,CAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE;IAI9C,IAAI,eAAe,CAAE,GAAG,EAAE,YAAY,EAAE,EAEvC;IAED,IAAI,YAAY,CAAE,GAAG,EAAE,YAAY,EAElC;IAED,MAAM,CAAC,WAAW,CAAE,OAAO,EAAE,eAAe,GAAG,QAAQ;IA+BvD,MAAM,CAAC,UAAU,CAAE,MAAM,EAAE,MAAM,GAAG,QAAQ;IAI5C,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,WAAW,GAAG,iBAAiB,GAAG,MAAM,IAAI,WAAW,GAAG,iBAAiB;WAItH,mBAAmB,CAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO;WAO3C,sBAAsB,CAAE,GAAG,EAAE,OAAO;CAGjD"}
@@ -0,0 +1,172 @@
1
+ import fs from "fs";
2
+ import http, { Server as HttpServer, IncomingMessage, ServerResponse } from "http";
3
+ import https, { Server as HttpsServer } from "https";
4
+ import http2 from "http2";
5
+ import { Router } from "./router.js";
6
+ import { Context } from "./context.js";
7
+ export class Currents {
8
+ httpVersion;
9
+ server;
10
+ routesTable = {
11
+ "ANY": new Router(),
12
+ "GET": new Router(),
13
+ "POST": new Router(),
14
+ "PUT": new Router(),
15
+ "DELETE": new Router()
16
+ };
17
+ _notFoundHandler;
18
+ _errorHandler;
19
+ constructor(version, server) {
20
+ this.httpVersion = version;
21
+ this.server = server;
22
+ if (Currents.isHttp2Server(this.server)) {
23
+ this.server.on("stream", this.handleRequestV2.bind(this));
24
+ }
25
+ else {
26
+ this.server.on("request", this.handleRequestV1.bind(this));
27
+ }
28
+ this._errorHandler = Currents.defaultErrorHandler;
29
+ this._notFoundHandler = [Currents.defaultNotFoundHandler];
30
+ }
31
+ handleRequestV1(req, res) {
32
+ const ctx = new Context({
33
+ httpVersion: 1,
34
+ req: req,
35
+ res: res
36
+ });
37
+ try {
38
+ ctx.parsePath();
39
+ this.processRequest(ctx);
40
+ }
41
+ catch (err) {
42
+ // only if path is incorrect
43
+ this._errorHandler(`Bad request: ${err.toString()}`, ctx);
44
+ }
45
+ }
46
+ handleRequestV2(stream, headers) {
47
+ const ctx = new Context({
48
+ httpVersion: 2,
49
+ stream: stream,
50
+ headers: headers
51
+ });
52
+ try {
53
+ ctx.parsePath();
54
+ this.processRequest(ctx);
55
+ }
56
+ catch (err) {
57
+ // only if path is incorrect
58
+ this._errorHandler(`Bad request: ${err.toString()}`, ctx);
59
+ }
60
+ }
61
+ processRequest(ctx) {
62
+ let router;
63
+ switch (ctx.method) {
64
+ case "GET":
65
+ router = this.routesTable["GET"];
66
+ break;
67
+ case "POST":
68
+ router = this.routesTable["POST"];
69
+ break;
70
+ case "PUT":
71
+ router = this.routesTable["PUT"];
72
+ break;
73
+ case "DELETE":
74
+ router = this.routesTable["DELETE"];
75
+ break;
76
+ default:
77
+ router = this.routesTable["ANY"];
78
+ break;
79
+ }
80
+ const match = router.match(ctx.path);
81
+ if (match !== null) {
82
+ ctx.params = match.params;
83
+ this.runHandlers(ctx, match.handlers);
84
+ }
85
+ else {
86
+ this.runHandlers(ctx, this._notFoundHandler, true);
87
+ }
88
+ }
89
+ async runHandlers(ctx, handlers, ignoreNotFound = false) {
90
+ try {
91
+ let index = 0;
92
+ while (index < handlers.length && !ctx.finished) {
93
+ await handlers[index](ctx);
94
+ index++;
95
+ if (ctx.finished)
96
+ return;
97
+ if (ctx.notFound && !ignoreNotFound)
98
+ this.runHandlers(ctx, this._notFoundHandler, true);
99
+ }
100
+ if (!ctx.finished)
101
+ console.warn(`[Currents] Request to ${ctx.path} received no response`);
102
+ }
103
+ catch (err) {
104
+ await this._errorHandler(err, ctx);
105
+ }
106
+ }
107
+ any(path, handlers) {
108
+ this.routesTable["ANY"].add(path, handlers);
109
+ }
110
+ get(path, handlers) {
111
+ this.routesTable["GET"].add(path, handlers);
112
+ }
113
+ post(path, handlers) {
114
+ this.routesTable["POST"].add(path, handlers);
115
+ }
116
+ put(path, handlers) {
117
+ this.routesTable["PUT"].add(path, handlers);
118
+ }
119
+ delete(path, handlers) {
120
+ this.routesTable["DELETE"].add(path, handlers);
121
+ }
122
+ set notFoundHandler(val) {
123
+ this._notFoundHandler = val;
124
+ }
125
+ set errorHandler(val) {
126
+ this._errorHandler = val;
127
+ }
128
+ static fromOptions(options) {
129
+ let result;
130
+ if (options.certificates !== undefined) {
131
+ const loadedCerts = {
132
+ cert: fs.readFileSync(options.certificates.cert),
133
+ key: fs.readFileSync(options.certificates.key)
134
+ };
135
+ if (options.certificates.ca !== undefined)
136
+ loadedCerts.ca = fs.readFileSync(options.certificates.ca);
137
+ if (options.forceHTTPVersion === 1) {
138
+ result = new Currents(1, https.createServer(loadedCerts));
139
+ }
140
+ else {
141
+ result = new Currents(2, http2.createSecureServer(loadedCerts));
142
+ }
143
+ }
144
+ else {
145
+ if (options.forceHTTPVersion === 2) {
146
+ console.warn("[Currents] HTTP/2 started without TLS-certificate. " +
147
+ "Watch out: browsers won't connect in this mode. " +
148
+ "Use this variant only for local tests or cli/curl APIs.");
149
+ result = new Currents(2, http2.createServer());
150
+ }
151
+ else {
152
+ result = new Currents(1, http.createServer());
153
+ }
154
+ }
155
+ return result;
156
+ }
157
+ static fromServer(server) {
158
+ return new Currents(Currents.isHttp2Server(server) ? 2 : 1, server);
159
+ }
160
+ static isHttp2Server(server) {
161
+ return typeof server.on === "function" && "sessionTimeout" in server;
162
+ }
163
+ static async defaultErrorHandler(err, ctx) {
164
+ const message = err instanceof Error ? err.message : String(err);
165
+ const stack = err instanceof Error ? err.stack : undefined;
166
+ ctx.status(500).text(`An error occurred: ${message}\n${stack}`);
167
+ }
168
+ static async defaultNotFoundHandler(ctx) {
169
+ ctx.status(404).text(`Cannot find ${ctx.path}`);
170
+ }
171
+ }
172
+ //# sourceMappingURL=currents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"currents.js","sourceRoot":"","sources":["../src/currents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=formBody.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formBody.d.ts","sourceRoot":"","sources":["../src/formBody.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=formBody.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formBody.js","sourceRoot":"","sources":["../src/formBody.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import { Currents } from "./currents.js";
2
+ import { Context } from "./context.js";
3
+ import { Router } from "./router.js";
4
+ import { ServeStatic } from "./static.js";
5
+ import { ParseCookies, SetCookie } from "./cookie.js";
6
+ import { Cors } from "./cors.js";
7
+ import { SecurityHeaders } from "./security.js";
8
+ import BinaryBody from "./body/binaryBody.js";
9
+ import TextBody from "./body/textBody.js";
10
+ import JsonBody from "./body/jsonBody.js";
11
+ import FormBody from "./body/formBody.js";
12
+ import MultipartBody from "./body/multipartBody.js";
13
+ import type { CurrentsOptions, ErrorHandler } from "./currents.js";
14
+ import type { RawHttp1, RawHttp2, RawHttp } from "./context.js";
15
+ import type { RouteHandler, RouteMatch, Route } from "./router.js";
16
+ import type { CorsOptions } from "./cors.js";
17
+ import type { SecurityHeadersOptions } from "./security.js";
18
+ export type { CurrentsOptions, ErrorHandler, RawHttp1, RawHttp2, RawHttp, RouteHandler, RouteMatch, Route, CorsOptions, SecurityHeadersOptions };
19
+ export { Currents, Context, Router, ServeStatic, ParseCookies, SetCookie, Cors, SecurityHeaders, BinaryBody, TextBody, JsonBody, FormBody, MultipartBody };
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,UAAU,MAAM,sBAAsB,CAAA;AAC7C,OAAO,QAAQ,MAAM,oBAAoB,CAAA;AACzC,OAAO,QAAQ,MAAM,oBAAoB,CAAA;AACzC,OAAO,QAAQ,MAAM,oBAAoB,CAAA;AACzC,OAAO,aAAa,MAAM,yBAAyB,CAAA;AAEnD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAClE,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAGlE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAE3D,YAAY,EACX,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,UAAU,EACV,KAAK,EACL,WAAW,EACX,sBAAsB,EACtB,CAAA;AAED,OAAO,EACN,QAAQ,EACR,OAAO,EACP,MAAM,EACN,WAAW,EACX,YAAY,EACZ,SAAS,EACT,IAAI,EACJ,eAAe,EACf,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ import { Currents } from "./currents.js";
2
+ import { Context } from "./context.js";
3
+ import { Router } from "./router.js";
4
+ import { ServeStatic } from "./static.js";
5
+ import { ParseCookies, SetCookie } from "./cookie.js";
6
+ import { Cors } from "./cors.js";
7
+ import { SecurityHeaders } from "./security.js";
8
+ import BinaryBody from "./body/binaryBody.js";
9
+ import TextBody from "./body/textBody.js";
10
+ import JsonBody from "./body/jsonBody.js";
11
+ import FormBody from "./body/formBody.js";
12
+ import MultipartBody from "./body/multipartBody.js";
13
+ export { Currents, Context, Router, ServeStatic, ParseCookies, SetCookie, Cors, SecurityHeaders, BinaryBody, TextBody, JsonBody, FormBody, MultipartBody };
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,UAAU,MAAM,sBAAsB,CAAA;AAC7C,OAAO,QAAQ,MAAM,oBAAoB,CAAA;AACzC,OAAO,QAAQ,MAAM,oBAAoB,CAAA;AACzC,OAAO,QAAQ,MAAM,oBAAoB,CAAA;AACzC,OAAO,aAAa,MAAM,yBAAyB,CAAA;AAuBnD,OAAO,EACN,QAAQ,EACR,OAAO,EACP,MAAM,EACN,WAAW,EACX,YAAY,EACZ,SAAS,EACT,IAAI,EACJ,eAAe,EACf,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=jsonBody.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonBody.d.ts","sourceRoot":"","sources":["../src/jsonBody.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=jsonBody.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonBody.js","sourceRoot":"","sources":["../src/jsonBody.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=multipartBody.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multipartBody.d.ts","sourceRoot":"","sources":["../src/multipartBody.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=multipartBody.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multipartBody.js","sourceRoot":"","sources":["../src/multipartBody.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ import { Context } from "./context.js";
2
+ export type RouteHandler = (ctx: Context) => Promise<void>;
3
+ export interface Route {
4
+ pathname: string;
5
+ pattern: RegExp;
6
+ keys: string[];
7
+ staticParts: number;
8
+ parametricParts: number;
9
+ handlers: RouteHandler[];
10
+ }
11
+ export interface RouteMatch {
12
+ handlers: RouteHandler[];
13
+ params: Record<string, string>;
14
+ }
15
+ export declare class Router {
16
+ private staticRoutes;
17
+ private parametricRoutes;
18
+ private wildcardRoutes;
19
+ add(path: string, handlers: RouteHandler[]): void;
20
+ private injectRoute;
21
+ private static pathToRegex;
22
+ match(pathname: string): RouteMatch | null;
23
+ }
24
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3D,MAAM,WAAW,KAAK;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IAC1B,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,qBAAa,MAAM;IAClB,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,gBAAgB,CAAe;IACvC,OAAO,CAAC,cAAc,CAAe;IAErC,GAAG,CAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE;IAoC3C,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,MAAM,CAAC,WAAW;IAuB1B,KAAK,CAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;CA8C3C"}