@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
package/dist/router.js ADDED
@@ -0,0 +1,113 @@
1
+ import { Context } from "./context.js";
2
+ export class Router {
3
+ staticRoutes = [];
4
+ parametricRoutes = [];
5
+ wildcardRoutes = [];
6
+ add(path, handlers) {
7
+ const { pattern, keys } = Router.pathToRegex(path);
8
+ const route = {
9
+ pathname: path,
10
+ pattern: pattern,
11
+ keys: keys,
12
+ staticParts: 0,
13
+ parametricParts: 0,
14
+ handlers: handlers
15
+ };
16
+ let isWildCard = false;
17
+ const sp = path.split('/');
18
+ for (const hop of sp) {
19
+ if (hop === "*") {
20
+ if (sp.indexOf(hop) !== sp.length - 1) {
21
+ console.warn(`Wildcard '*' should be last hop: ${path}`);
22
+ }
23
+ isWildCard = true;
24
+ }
25
+ else if (hop.charAt(0) === ':') {
26
+ route.parametricParts++;
27
+ }
28
+ else {
29
+ route.staticParts++;
30
+ }
31
+ }
32
+ if (isWildCard) {
33
+ this.injectRoute(route, this.wildcardRoutes);
34
+ }
35
+ else if (route.parametricParts > 0) {
36
+ this.injectRoute(route, this.parametricRoutes);
37
+ }
38
+ else {
39
+ this.injectRoute(route, this.staticRoutes);
40
+ }
41
+ }
42
+ injectRoute(route, collection) {
43
+ let index = 0;
44
+ while (index < collection.length) {
45
+ const r = collection[index];
46
+ if ((r.parametricParts < route.parametricParts) ||
47
+ (r.parametricParts === route.parametricParts && r.staticParts < route.staticParts)) {
48
+ collection.splice(index, 0, route);
49
+ return;
50
+ }
51
+ index++;
52
+ }
53
+ collection.push(route);
54
+ }
55
+ static pathToRegex(path) {
56
+ const keys = [];
57
+ const regex = path
58
+ .split("/")
59
+ .map(seg => {
60
+ if (seg.startsWith(":")) {
61
+ keys.push(seg.slice(1));
62
+ return "([^/]+)";
63
+ }
64
+ if (seg === "*") {
65
+ return "(.*)?";
66
+ }
67
+ return seg.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // escape
68
+ })
69
+ .join("/");
70
+ return {
71
+ pattern: new RegExp("^" + regex + "$"),
72
+ keys
73
+ };
74
+ }
75
+ match(pathname) {
76
+ for (const route of this.staticRoutes) {
77
+ if (pathname === route.pathname) {
78
+ return {
79
+ handlers: route.handlers,
80
+ params: {}
81
+ };
82
+ }
83
+ }
84
+ for (const route of this.parametricRoutes) {
85
+ const match = pathname.match(route.pattern);
86
+ if (match !== null) {
87
+ const routeParams = {};
88
+ for (let i = 0; i < route.keys.length; i++) {
89
+ routeParams[route.keys[i]] = match[i + 1];
90
+ }
91
+ return {
92
+ handlers: route.handlers,
93
+ params: routeParams
94
+ };
95
+ }
96
+ }
97
+ for (const route of this.wildcardRoutes) {
98
+ const match = pathname.match(route.pattern);
99
+ if (match !== null) {
100
+ const routeParams = {};
101
+ for (let i = 0; i < route.keys.length; i++) {
102
+ routeParams[route.keys[i]] = match[i + 1];
103
+ }
104
+ return {
105
+ handlers: route.handlers,
106
+ params: routeParams
107
+ };
108
+ }
109
+ }
110
+ return null;
111
+ }
112
+ }
113
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { Context } from "./context.js";
2
+ export interface SecurityHeadersOptions {
3
+ contentTypeOptions?: boolean;
4
+ xFrameOptions?: 'DENY' | 'SAMEORIGIN';
5
+ referrerPolicy?: "no-referrer" | "no-referrer-when-downgrade" | "origin" | "origin-when-cross-origin" | "same-origin" | "strict-origin" | "strict-origin-when-cross-origin" | "unsafe-url";
6
+ transportSecurity?: {
7
+ maxAge: number;
8
+ includeSubDomains?: boolean;
9
+ preload?: boolean;
10
+ };
11
+ contentSecurityPolicy?: string;
12
+ crossOriginResourcePolicy?: 'same-origin' | 'same-site' | 'cross-origin';
13
+ permissionsPolicy?: string;
14
+ }
15
+ export declare function SecurityHeaders(options: SecurityHeadersOptions): (ctx: Context) => Promise<void>;
16
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,WAAW,sBAAsB;IACtC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC;IACtC,cAAc,CAAC,EAAE,aAAa,GAAG,4BAA4B,GAAG,QAAQ,GAAG,0BAA0B,GAAG,aAAa,GAAG,eAAe,GAAG,iCAAiC,GAAG,YAAY,CAAC;IAC3L,iBAAiB,CAAC,EAAE;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC;IACF,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,yBAAyB,CAAC,EAAE,aAAa,GAAG,WAAW,GAAG,cAAc,CAAC;IACzE,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,eAAe,CAAE,OAAO,EAAE,sBAAsB,IACjD,KAAK,OAAO,mBAoC1B"}
@@ -0,0 +1,34 @@
1
+ import { Context } from "./context.js";
2
+ export function SecurityHeaders(options) {
3
+ return async (ctx) => {
4
+ if (options.contentTypeOptions) {
5
+ ctx.responseHeader("X-Content-Type-Options", "nosniff");
6
+ }
7
+ if (options.xFrameOptions) {
8
+ ctx.responseHeader("X-Frame-Options", options.xFrameOptions);
9
+ }
10
+ if (options.referrerPolicy) {
11
+ ctx.responseHeader("Referrer-Policy", options.referrerPolicy);
12
+ }
13
+ if (options.transportSecurity) {
14
+ let value = `max-age=${options.transportSecurity.maxAge}`;
15
+ if (options.transportSecurity.includeSubDomains) {
16
+ value += "; includeSubDomains";
17
+ }
18
+ if (options.transportSecurity.preload) {
19
+ value += "; preload";
20
+ }
21
+ ctx.responseHeader("Strict-Transport-Security", value);
22
+ }
23
+ if (options.contentSecurityPolicy) {
24
+ ctx.responseHeader("Content-Security-Policy", options.contentSecurityPolicy);
25
+ }
26
+ if (options.crossOriginResourcePolicy) {
27
+ ctx.responseHeader("Cross-Origin-Resource-Policy", options.crossOriginResourcePolicy);
28
+ }
29
+ if (options.permissionsPolicy) {
30
+ ctx.responseHeader("Permissions-Policy", options.permissionsPolicy);
31
+ }
32
+ };
33
+ }
34
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAgBtC,MAAM,UAAU,eAAe,CAAE,OAA+B;IAC/D,OAAO,KAAK,EAAE,GAAY,EAAE,EAAE;QAC7B,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;YAChC,GAAG,CAAC,cAAc,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC3B,GAAG,CAAC,cAAc,CAAC,iBAAiB,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC5B,GAAG,CAAC,cAAc,CAAC,iBAAiB,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAC/B,IAAI,KAAK,GAAG,WAAW,OAAO,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC;YAC1D,IAAI,OAAO,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,CAAC;gBACjD,KAAK,IAAI,qBAAqB,CAAC;YAChC,CAAC;YACD,IAAI,OAAO,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;gBACvC,KAAK,IAAI,WAAW,CAAC;YACtB,CAAC;YACD,GAAG,CAAC,cAAc,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;QACxD,CAAC;QAED,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;YACnC,GAAG,CAAC,cAAc,CAAC,yBAAyB,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;QAC9E,CAAC;QAED,IAAI,OAAO,CAAC,yBAAyB,EAAE,CAAC;YACvC,GAAG,CAAC,cAAc,CAAC,8BAA8B,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAC;QACvF,CAAC;QAED,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAC/B,GAAG,CAAC,cAAc,CAAC,oBAAoB,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACrE,CAAC;IACF,CAAC,CAAA;AACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { Context } from "./context.js";
2
+ export interface ServeStaticOptions {
3
+ basePath: string;
4
+ rootDir: string;
5
+ cacheControl?: string[];
6
+ fallback?: string;
7
+ }
8
+ export declare function ServeStatic(options: ServeStaticOptions): (ctx: Context) => Promise<void>;
9
+ //# sourceMappingURL=static.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static.d.ts","sourceRoot":"","sources":["../src/static.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,WAAW,kBAAkB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,WAAW,CAAE,OAAO,EAAE,kBAAkB,IAOzC,KAAK,OAAO,mBAmD1B"}
package/dist/static.js ADDED
@@ -0,0 +1,71 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import mime from "mime-types";
4
+ import { Context } from "./context.js";
5
+ export function ServeStatic(options) {
6
+ let fallbackFull;
7
+ if (options.fallback !== undefined) {
8
+ fallbackFull = path.resolve(options.rootDir, options.fallback);
9
+ }
10
+ return async (ctx) => {
11
+ const tail = ctx.path.slice(options.basePath.length);
12
+ let fullPath = path.resolve(options.rootDir, tail);
13
+ // serve files only from root directory
14
+ if (!fullPath.startsWith(options.rootDir)) {
15
+ ctx.status(403).text(`${ctx.path}: Access forbidden`);
16
+ return;
17
+ }
18
+ const toServe = await checkFile(fullPath, fallbackFull);
19
+ if (toServe === null) {
20
+ ctx.callNotFound();
21
+ return;
22
+ }
23
+ const stats = toServe.stats;
24
+ fullPath = toServe.candidate;
25
+ const range = ctx.headers["range"];
26
+ if (range === undefined) {
27
+ ctx
28
+ .status(200)
29
+ .responseHeader("Content-Type", mime.lookup(fullPath) || "application/octet-stream")
30
+ .send(fs.createReadStream(fullPath), stats.size);
31
+ }
32
+ else {
33
+ const [startStr, endStr] = range.replace(/bytes=/, "").split("-");
34
+ const start = parseInt(startStr, 10);
35
+ let end = endStr ? parseInt(endStr, 10) : stats.size - 1;
36
+ if (isNaN(end) || end >= stats.size) {
37
+ end = stats.size - 1;
38
+ }
39
+ if (isNaN(start) || start < 0 || end < start || start >= stats.size) {
40
+ ctx
41
+ .status(416)
42
+ .responseHeader("Content-Range", `bytes */${stats.size}`)
43
+ .end();
44
+ return;
45
+ }
46
+ ctx
47
+ .status(206)
48
+ .responseHeader("Content-Range", `bytes ${start}-${end}/${stats.size}`)
49
+ .responseHeader("Accept-Ranges", "bytes")
50
+ .responseHeader("Content-Type", mime.lookup(fullPath) || "application/octet-stream")
51
+ .send(fs.createReadStream(fullPath, { start, end }), end - start + 1);
52
+ }
53
+ };
54
+ }
55
+ async function checkFile(filePath, fallback) {
56
+ for (const candidate of [filePath, fallback]) {
57
+ if (!candidate)
58
+ continue;
59
+ try {
60
+ const stats = await fs.promises.stat(candidate);
61
+ if (stats.isFile()) {
62
+ return { candidate, stats };
63
+ }
64
+ }
65
+ catch (err) {
66
+ // ignore
67
+ }
68
+ }
69
+ return null;
70
+ }
71
+ //# sourceMappingURL=static.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static.js","sourceRoot":"","sources":["../src/static.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Context } from "./context.js";
2
+ export default function TextBody(ctx: Context): Promise<void>;
3
+ //# sourceMappingURL=textBody.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textBody.d.ts","sourceRoot":"","sources":["../src/textBody.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,wBAA8B,QAAQ,CAAE,GAAG,EAAE,OAAO,iBAEnD"}
@@ -0,0 +1,4 @@
1
+ import { Context } from "./context.js";
2
+ export default async function TextBody(ctx) {
3
+ }
4
+ //# sourceMappingURL=textBody.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textBody.js","sourceRoot":"","sources":["../src/textBody.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,QAAQ,CAAE,GAAY;AAEpD,CAAC"}
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@tripod311/currents",
3
+ "version": "0.0.0",
4
+ "description": "Lightweight pipeline API constructor",
5
+ "keywords": [
6
+ "js",
7
+ "ts",
8
+ "api",
9
+ "routing"
10
+ ],
11
+ "license": "MIT",
12
+ "author": "Tripod ind.tripod@gmail.com",
13
+ "type": "module",
14
+ "main": "dist/index.js",
15
+ "types": "dist/index.d.ts",
16
+ "scripts": {
17
+ "test": "echo \"Error: no test specified\" && exit 1"
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "README.md"
22
+ ],
23
+ "devDependencies": {
24
+ "@types/node": "^24.3.1",
25
+ "typescript": "^5.9.2"
26
+ },
27
+ "dependencies": {
28
+ "@types/mime-types": "^3.0.1",
29
+ "mime-types": "^3.0.1"
30
+ }
31
+ }