edge.libx.js 0.0.1

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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +49 -0
  3. package/bin/cli.sh +7 -0
  4. package/bin/set-secrets.ts +70 -0
  5. package/bin/test.ts +18 -0
  6. package/build/Main.d.ts +1 -0
  7. package/build/Main.js +6 -0
  8. package/build/Main.js.map +1 -0
  9. package/build/helpers/EdgeNetwork.d.ts +13 -0
  10. package/build/helpers/EdgeNetwork.js +100 -0
  11. package/build/helpers/EdgeNetwork.js.map +1 -0
  12. package/build/helpers/Exceptions.d.ts +37 -0
  13. package/build/helpers/Exceptions.js +100 -0
  14. package/build/helpers/Exceptions.js.map +1 -0
  15. package/build/helpers/getExpress.d.ts +4 -0
  16. package/build/helpers/getExpress.js +25 -0
  17. package/build/helpers/getExpress.js.map +1 -0
  18. package/build/helpers/index.d.ts +12 -0
  19. package/build/helpers/index.js +70 -0
  20. package/build/helpers/index.js.map +1 -0
  21. package/build/helpers/jwt.d.ts +57 -0
  22. package/build/helpers/jwt.js +227 -0
  23. package/build/helpers/jwt.js.map +1 -0
  24. package/build/helpers/localServer.d.ts +1 -0
  25. package/build/helpers/localServer.js +54 -0
  26. package/build/helpers/localServer.js.map +1 -0
  27. package/build/helpers/require.d.ts +1 -0
  28. package/build/helpers/require.js +219 -0
  29. package/build/helpers/require.js.map +1 -0
  30. package/build/modules/@module.d.ts +6 -0
  31. package/build/modules/@module.js +16 -0
  32. package/build/modules/@module.js.map +1 -0
  33. package/build/modules/RouterWrapper.d.ts +21 -0
  34. package/build/modules/RouterWrapper.js +62 -0
  35. package/build/modules/RouterWrapper.js.map +1 -0
  36. package/build/modules/cors.d.ts +15 -0
  37. package/build/modules/cors.js +117 -0
  38. package/build/modules/cors.js.map +1 -0
  39. package/jest.config.js +26 -0
  40. package/package.json +65 -0
  41. package/src/Main.ts +1 -0
  42. package/src/helpers/EdgeNetwork.ts +113 -0
  43. package/src/helpers/Exceptions.ts +102 -0
  44. package/src/helpers/getExpress.ts +25 -0
  45. package/src/helpers/index.ts +61 -0
  46. package/src/helpers/jwt.ts +287 -0
  47. package/src/helpers/localServer.ts +75 -0
  48. package/src/helpers/require.ts +331 -0
  49. package/src/modules/@module.ts +13 -0
  50. package/src/modules/RouterWrapper.ts +68 -0
  51. package/src/modules/cors.ts +153 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2020 Elya Livshitz
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,49 @@
1
+ # 🗡️ edge.libx.js
2
+
3
+ Provider-agnostic, edge-compatible, [itty-router](https://itty.dev/itty-router/) microrouter wrapper.
4
+ Allowing you to crete multi-route endpoints that can work with Cloudflare, Vercel, Google Cloud Functions, Netlify Functions, and any other provider.
5
+
6
+ ## Get Started:
7
+
8
+ ```ts:
9
+ import { Route, Router, RouterType, error, json, cors, text } from 'itty-router';
10
+ import { RouterWrapper } from 'edge.libx.js';
11
+
12
+ const routerWrapper = RouterWrapper.getNew('/v1');
13
+
14
+ routerWrapper.router.all('/ping', async (req) => {
15
+ return json({ message: 'pong' });
16
+ });
17
+ ```
18
+
19
+ Useful package.json scripts:
20
+ ```json:
21
+ ...
22
+ "scripts": {
23
+ "build": "tsc",
24
+ "debug": "tsx --inspect -r dotenv/config node_modules/edge.libx.js/src/helpers/localServer.ts src/index.ts",
25
+ "debug:watch": "nodemon --watch 'src/**/*.ts' --exec tsx --inspect -r dotenv/config node_modules/edge.libx.js/src/helpers/localServer.ts src/index.ts",
26
+
27
+ "set-secrets": "set-secrets .env.preview preview \"vercel env add\" remove",
28
+
29
+ }
30
+ ...
31
+ ```
32
+
33
+ ## Contribute:
34
+
35
+ ### Build:
36
+
37
+ > `$ bun run build`
38
+
39
+ ### Watch & Build:
40
+
41
+ > `$ bun run watch`
42
+
43
+ ### Run tests:
44
+
45
+ > `$ bun run test <optional: path-to-test-file>`
46
+
47
+ ---
48
+
49
+ Scaffolded with [🏗 TS-scaffold](https://github.com/Livshitz/ts-scaffold.git)
package/bin/cli.sh ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+
3
+ # Get dir of executable
4
+ dir=$( dirname $(realpath "$0") )/../
5
+
6
+ # Execute the main script and pass the args
7
+ node $dir/build/Main.js $@
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { readFileSync } from 'fs';
4
+ import { execSync } from 'child_process';
5
+
6
+ const args = process.argv.slice(2);
7
+ const file = args[0] || '.dev.vars';
8
+ const env = args[1] || 'preview';
9
+ const setCommand = args[2] || 'vercel env add';
10
+ const removeExisting = args[3] === 'remove'; // Additional flag to remove existing keys
11
+
12
+ console.log(`DBG: ${file} | ${env} | ${setCommand} | Remove existing: ${removeExisting}`);
13
+
14
+ try {
15
+ const fileContents = readFileSync(file, 'utf8');
16
+ const lines = fileContents.split('\n');
17
+
18
+ for (const line of lines) {
19
+ if (!line.trim() || line.startsWith('#')) {
20
+ const glimpse = line.substring(0, 10);
21
+ console.log(`Skipping comment or empty line: ${glimpse}...`);
22
+ continue;
23
+ }
24
+
25
+ const firstEqualIndex = line.indexOf('=');
26
+ if (firstEqualIndex === -1) {
27
+ console.log(`Skipping invalid line: ${line}`);
28
+ continue;
29
+ }
30
+
31
+ const key = line.substring(0, firstEqualIndex).trim();
32
+ const rawValue = line.substring(firstEqualIndex + 1).trim();
33
+ // Escape double quotes in the value
34
+ let value = rawValue.replace(/"/g, '\\"');
35
+ value = rawValue.replace(/"/g, '\\"');
36
+
37
+ console.log(`Processing key: ${key}`);
38
+
39
+ if (removeExisting) {
40
+ try {
41
+ execSync(`vercel env rm "${key}" ${env} --yes`, { stdio: 'ignore' });
42
+ console.log(`Removed existing key: ${key}`);
43
+ } catch (error) {
44
+ console.log(`No existing key to remove or error removing key: ${key}`);
45
+ }
46
+ }
47
+
48
+ if (!value) {
49
+ console.log(`No value for "${key}", skipping...`);
50
+ continue;
51
+ }
52
+
53
+ const command = `printf "%s" "${value}" | ${setCommand} "${key}" ${env}`;
54
+ console.log('Running command...');
55
+ console.log(`DBG: ${command}`);
56
+
57
+ try {
58
+ const result = execSync(command, { stdio: 'pipe' });
59
+ console.log(`Command successfully executed for key: ${key}`);
60
+ } catch (error) {
61
+ console.error(`Error executing command for key: ${key}`);
62
+ console.error(`Error message: ${error.message}`);
63
+ }
64
+
65
+ console.log('---------------------');
66
+ }
67
+ } catch (error) {
68
+ console.error(`Error: `, error);
69
+ process.exit(1);
70
+ }
package/bin/test.ts ADDED
@@ -0,0 +1,18 @@
1
+
2
+ import { readFileSync } from 'fs';
3
+ import { execSync } from 'child_process';
4
+
5
+ const args = process.argv.slice(2);
6
+ const file = args[0] || '.dev.vars';
7
+ const env = args[1] || 'preview';
8
+ const setCommand = args[2] || 'vercel env add';
9
+ const removeExisting = args[3] === 'remove'; // Additional flag to remove existing keys
10
+
11
+ console.log(`DBG: ${file} | ${env} | ${setCommand} | Remove existing: ${removeExisting}`);
12
+
13
+ try {
14
+ console.log('---------------------');
15
+ } catch (error) {
16
+ console.error(`${file} does not exist.`);
17
+ process.exit(1);
18
+ }
@@ -0,0 +1 @@
1
+ export { RouterWrapper } from "./modules/RouterWrapper";
package/build/Main.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RouterWrapper = void 0;
4
+ var RouterWrapper_1 = require("./modules/RouterWrapper");
5
+ Object.defineProperty(exports, "RouterWrapper", { enumerable: true, get: function () { return RouterWrapper_1.RouterWrapper; } });
6
+ //# sourceMappingURL=Main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Main.js","sourceRoot":"","sources":["../src/Main.ts"],"names":[],"mappings":";;;AAAA,yDAAwD;AAA/C,8GAAA,aAAa,OAAA","sourcesContent":["export { RouterWrapper } from \"./modules/RouterWrapper\";"]}
@@ -0,0 +1,13 @@
1
+ declare class EdgeNetwork {
2
+ fetch(url: string, method: "GET" | "POST" | any, options?: RequestInit): Promise<any>;
3
+ httpGet(url: string, options?: RequestInit): Promise<any>;
4
+ httpGetText(url: string, options?: RequestInit): Promise<any>;
5
+ httpGetJson<T = any>(url: string, options?: RequestInit): Promise<T>;
6
+ httpPost(url: string, data: any, _options?: any): Promise<any>;
7
+ httpPostText(url: string, data: any, _options?: {}): Promise<any>;
8
+ httpPostJson(url: string, data: any, _options?: {}): Promise<any>;
9
+ fixUrl(url: string, prefixUrl?: string): string;
10
+ cleanUrl(url: string): string;
11
+ }
12
+ export declare const network: EdgeNetwork;
13
+ export {};
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.network = void 0;
13
+ const essentials_js_1 = require("libx.js/build/bundles/essentials.js");
14
+ class EdgeNetwork {
15
+ fetch(url, method, options) {
16
+ return __awaiter(this, void 0, void 0, function* () {
17
+ url = this.cleanUrl(url);
18
+ const p = essentials_js_1.libx.newPromise();
19
+ const _p = fetch(url, Object.assign({ method, redirect: "follow" }, options));
20
+ _p.catch(err => {
21
+ return p.reject(err);
22
+ });
23
+ _p.then((res) => __awaiter(this, void 0, void 0, function* () {
24
+ var _a, _b;
25
+ if (res.status < 200 || res.status > 299) {
26
+ let body = null;
27
+ try {
28
+ body = yield res.json();
29
+ }
30
+ catch (_c) { }
31
+ const msg = `Fetch error: "${res === null || res === void 0 ? void 0 : res.status} - ${(_b = (_a = body === null || body === void 0 ? void 0 : body.error) !== null && _a !== void 0 ? _a : body === null || body === void 0 ? void 0 : body.message) !== null && _b !== void 0 ? _b : res === null || res === void 0 ? void 0 : res.statusText}"`;
32
+ essentials_js_1.libx.log.w(msg, body);
33
+ return p.reject(msg);
34
+ }
35
+ else
36
+ p.resolve(res);
37
+ }));
38
+ return p;
39
+ });
40
+ }
41
+ httpGet(url, options) {
42
+ return __awaiter(this, void 0, void 0, function* () {
43
+ return yield this.fetch(url, 'GET', options);
44
+ });
45
+ }
46
+ httpGetText(url, options) {
47
+ return __awaiter(this, void 0, void 0, function* () {
48
+ const res = yield this.httpGet(url, options);
49
+ return yield res.text();
50
+ });
51
+ }
52
+ httpGetJson(url, options) {
53
+ return __awaiter(this, void 0, void 0, function* () {
54
+ const res = yield this.httpGet(url, options);
55
+ return yield res.json();
56
+ });
57
+ }
58
+ httpPost(url, data, _options) {
59
+ return __awaiter(this, void 0, void 0, function* () {
60
+ const res = yield this.fetch(url, "POST", Object.assign({ body: data, headers: Object.assign({}, _options === null || _options === void 0 ? void 0 : _options.headers) }, _options));
61
+ return res;
62
+ });
63
+ }
64
+ httpPostText(url, data, _options) {
65
+ return __awaiter(this, void 0, void 0, function* () {
66
+ const res = yield this.httpPost(url, data, _options);
67
+ return res.text();
68
+ });
69
+ }
70
+ httpPostJson(url, data, _options) {
71
+ return __awaiter(this, void 0, void 0, function* () {
72
+ const res = yield this.httpPost(url, JSON.stringify(data), Object.assign({ headers: {}, withCredentials: true }, _options));
73
+ return res.json();
74
+ });
75
+ }
76
+ fixUrl(url, prefixUrl) {
77
+ var sep = '://';
78
+ var pos = url.indexOf(sep);
79
+ if (pos > -1) {
80
+ var startOfUrl = url.slice(0, pos);
81
+ var restOfUrl = url.slice(pos + 3);
82
+ restOfUrl = restOfUrl.replace(/([^:]\/)\/+/g, '$1');
83
+ url = startOfUrl + sep + restOfUrl;
84
+ }
85
+ else {
86
+ url = url.replace(/([^:]\/)\/+/g, '$1');
87
+ }
88
+ prefixUrl = prefixUrl || '';
89
+ var isAbsoluteUrl = pos > -1;
90
+ url = this.cleanUrl((!isAbsoluteUrl ? prefixUrl : '') + url);
91
+ return url;
92
+ }
93
+ cleanUrl(url) {
94
+ if (url == null)
95
+ return null;
96
+ return url.replace(new RegExp('([^:]/)/+', 'g'), '$1');
97
+ }
98
+ }
99
+ exports.network = new EdgeNetwork();
100
+ //# sourceMappingURL=EdgeNetwork.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EdgeNetwork.js","sourceRoot":"","sources":["../../src/helpers/EdgeNetwork.ts"],"names":[],"mappings":"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","sourcesContent":["import { libx } from \"libx.js/build/bundles/essentials.js\";\n\nclass EdgeNetwork {\n\tpublic async fetch(url: string, method: \"GET\" | \"POST\" | any, options?: RequestInit) {\n\t\turl = this.cleanUrl(url);\n\t\tconst p = libx.newPromise();\n\t\tconst _p = fetch(url, {\n\t\t\tmethod,\n\t\t\t// credentials: \"include\",\n\t\t\t//@ts-ignore\n\t\t\t// withCredentials: true,\n\t\t\tredirect: \"follow\",\n\t\t\t...options,\n\t\t});\n\n\t\t_p.catch(err=>{\n\t\t\treturn p.reject(err);\n\t\t});\n\t\t_p.then(async res=>{\n\t\t\tif (res.status < 200 || res.status > 299) {\n\t\t\t\tlet body = null;\n\t\t\t\ttry {\n\t\t\t\t\tbody = await res.json(); \n\t\t\t\t} catch {}\n\t\t\t\tconst msg = `Fetch error: \"${res?.status} - ${body?.error ?? body?.message ?? res?.statusText}\"`;\n\t\t\t\tlibx.log.w(msg, body);\n\t\t\t\treturn p.reject(msg); \n\t\t\t}\n\t\t\telse p.resolve(res);\n\t\t});\n\n\t\treturn p;\n\t}\n\tpublic async httpGet(url: string, options?: RequestInit) {\n\t\treturn await this.fetch(url, 'GET', options);\n\t}\n\n\tpublic async httpGetText(url: string, options?: RequestInit) {\n\t\tconst res = await this.httpGet(url, options);\n\t\treturn await res.text();\n\t}\n\n\tpublic async httpGetJson<T=any>(url: string, options?: RequestInit): Promise<T> {\n\t\tconst res = await this.httpGet(url, options);\n\t\treturn await res.json();\n\t}\n\n public async httpPost(url: string, data: any, _options?: any) {\n\t\tconst res = await this.fetch(url, \"POST\", {\n\t\t\tbody: data,\n\t\t\theaders: {\n\t\t\t\t..._options?.headers,\n\t\t\t\t// 'content-type': 'application/json',\n\t\t\t},\n\t\t\t..._options,\n\t\t});\n\t\treturn res;\n\t}\n\n public async httpPostText(url: string, data: any, _options?: {}) {\n\t\tconst res = await this.httpPost(url, data, _options);\n\t\treturn res.text();\n\t}\n\n public async httpPostJson(url: string, data: any, _options?: {}) {\n\t\tconst res = await this.httpPost(url, JSON.stringify(data), {\n\t\t\theaders: {\n\t\t\t\t// 'content-type': 'application/json',\n\t\t\t\t// 'content-length': '0',\n\t\t\t},\n\t\t\twithCredentials: true,\n\t\t\t..._options \n\t\t});\n\t\t// const res = await this.fetch(url, \"POST\", {\n\t\t// \tbody: JSON.stringify(data),\n\t\t// \theaders: {\n\t\t// \t\t'content-type': 'application/json',\n\t\t// \t},\n\t\t// \t..._options,\n\t\t// });\n\n\t\treturn res.json();\n\t}\n\n\tpublic fixUrl(url: string, prefixUrl?: string) {\n var sep = '://';\n var pos = url.indexOf(sep);\n if (pos > -1) {\n var startOfUrl = url.slice(0, pos);\n var restOfUrl = url.slice(pos + 3);\n restOfUrl = restOfUrl.replace(/([^:]\\/)\\/+/g, '$1');\n url = startOfUrl + sep + restOfUrl;\n } else {\n url = url.replace(/([^:]\\/)\\/+/g, '$1');\n }\n\n prefixUrl = prefixUrl || '';\n\n var isAbsoluteUrl = pos > -1; // url.contains(\"//\");\n url = this.cleanUrl((!isAbsoluteUrl ? prefixUrl : '') + url);\n\n return url;\n }\n\n\tpublic cleanUrl(url: string) {\n if (url == null) return null;\n //return url.replace('/(?<!http:)\\/\\//g', '/');\n return url.replace(new RegExp('([^:]/)/+', 'g'), '$1');\n }\n\t\n}\n\nexport const network = new EdgeNetwork();"]}
@@ -0,0 +1,37 @@
1
+ export declare class Exception extends Error {
2
+ message: string;
3
+ metadata: string;
4
+ stack: string;
5
+ constructor(message: any, metadata?: any, stack?: any);
6
+ metadataPretty(): string;
7
+ static fromError(err: Error): Exception;
8
+ static assert(condition: any | any[], message?: string, metadata?: any, exceptionType?: typeof Exception): void;
9
+ toString(): string;
10
+ }
11
+ export declare class ErrorNotFound extends Exception {
12
+ constructor(message: any, metadata?: any, stack?: any);
13
+ }
14
+ export declare class ErrorDuplicate extends Exception {
15
+ constructor(message: any, metadata?: any, stack?: any);
16
+ }
17
+ export declare class HttpError extends Exception {
18
+ statusCode: number;
19
+ constructor(statusCode: number, message: any, metadata?: any, stack?: any);
20
+ static tryGetErrorCode(error: any, defaultCode: number): number;
21
+ }
22
+ export declare class HttpErrorBadRequest extends HttpError {
23
+ statusCode: number;
24
+ constructor(message: any, metadata?: any, stack?: any);
25
+ }
26
+ export declare class HttpErrorNotFound extends HttpError {
27
+ statusCode: number;
28
+ constructor(message: any, metadata?: any, stack?: any);
29
+ }
30
+ export declare class HttpErrorDuplicate extends HttpError {
31
+ statusCode: number;
32
+ constructor(message: any, metadata?: any, stack?: any);
33
+ }
34
+ export declare class NotImplemented extends Exception {
35
+ constructor();
36
+ }
37
+ export default Exception;
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NotImplemented = exports.HttpErrorDuplicate = exports.HttpErrorNotFound = exports.HttpErrorBadRequest = exports.HttpError = exports.ErrorDuplicate = exports.ErrorNotFound = exports.Exception = void 0;
4
+ class Exception extends Error {
5
+ constructor(message, metadata, stack) {
6
+ let json = '';
7
+ try {
8
+ json = JSON.stringify(metadata);
9
+ }
10
+ catch (_a) { }
11
+ let msg = message;
12
+ if (json != '')
13
+ msg += '\nMetadata: ' + json;
14
+ super(msg);
15
+ this.name = 'Exception';
16
+ this.message = message;
17
+ this.metadata = metadata !== null && metadata !== void 0 ? metadata : json;
18
+ this.stack = stack;
19
+ }
20
+ metadataPretty() {
21
+ return JSON.stringify(this.metadata, null, 2);
22
+ }
23
+ static fromError(err) {
24
+ return new Exception(err.message, err, err.stack);
25
+ }
26
+ static assert(condition, message, metadata, exceptionType = Exception) {
27
+ let conditions = condition;
28
+ if (!Array.isArray(condition))
29
+ conditions = [condition];
30
+ for (let cond of conditions) {
31
+ let isNull = cond === null;
32
+ let isFalse = typeof cond == 'boolean' && cond !== true;
33
+ if (isNull || isFalse)
34
+ throw new exceptionType(message, metadata);
35
+ }
36
+ }
37
+ toString() {
38
+ return (this.message += '\n\tMetadata: ' + this.metadata);
39
+ }
40
+ }
41
+ exports.Exception = Exception;
42
+ class ErrorNotFound extends Exception {
43
+ constructor(message, metadata, stack) {
44
+ super('Requested item not found', metadata, stack);
45
+ }
46
+ }
47
+ exports.ErrorNotFound = ErrorNotFound;
48
+ class ErrorDuplicate extends Exception {
49
+ constructor(message, metadata, stack) {
50
+ super(message || 'Requested item conflicts with exists', { metadata }, stack);
51
+ }
52
+ }
53
+ exports.ErrorDuplicate = ErrorDuplicate;
54
+ class HttpError extends Exception {
55
+ constructor(statusCode, message, metadata, stack) {
56
+ super(message, metadata, stack);
57
+ this.statusCode = statusCode;
58
+ }
59
+ static tryGetErrorCode(error, defaultCode) {
60
+ if (error == null)
61
+ return defaultCode;
62
+ if (error instanceof HttpError)
63
+ return error.statusCode;
64
+ if (error instanceof ErrorNotFound)
65
+ return new HttpErrorNotFound(error.message, error.metadata, error.stack).statusCode;
66
+ if (error instanceof ErrorDuplicate)
67
+ return new HttpErrorDuplicate(error.message, error.metadata, error.stack).statusCode;
68
+ return defaultCode;
69
+ }
70
+ }
71
+ exports.HttpError = HttpError;
72
+ class HttpErrorBadRequest extends HttpError {
73
+ constructor(message, metadata, stack) {
74
+ super(400, message, metadata, stack);
75
+ this.statusCode = 400;
76
+ }
77
+ }
78
+ exports.HttpErrorBadRequest = HttpErrorBadRequest;
79
+ class HttpErrorNotFound extends HttpError {
80
+ constructor(message, metadata, stack) {
81
+ super(404, message, metadata, stack);
82
+ this.statusCode = 404;
83
+ }
84
+ }
85
+ exports.HttpErrorNotFound = HttpErrorNotFound;
86
+ class HttpErrorDuplicate extends HttpError {
87
+ constructor(message, metadata, stack) {
88
+ super(409, message, metadata, stack);
89
+ this.statusCode = 409;
90
+ }
91
+ }
92
+ exports.HttpErrorDuplicate = HttpErrorDuplicate;
93
+ class NotImplemented extends Exception {
94
+ constructor() {
95
+ super('Not Implemented!');
96
+ }
97
+ }
98
+ exports.NotImplemented = NotImplemented;
99
+ exports.default = Exception;
100
+ //# sourceMappingURL=Exceptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Exceptions.js","sourceRoot":"","sources":["../../src/helpers/Exceptions.ts"],"names":[],"mappings":"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","sourcesContent":["export class Exception extends Error {\n public message: string;\n public metadata: string;\n public stack: string;\n // public metadataObj: string;\n\n constructor(message, metadata?, stack?) {\n let json = '';\n try {\n json = JSON.stringify(metadata); //, null, 2);\n } catch {}\n let msg = message;\n if (json != '') msg += '\\nMetadata: ' + json;\n super(msg);\n this.name = 'Exception';\n this.message = message;\n // this.metadataObj = metadata;\n this.metadata = metadata ?? json; //json;\n this.stack = stack;\n }\n\n public metadataPretty() {\n return JSON.stringify(this.metadata, null, 2);\n }\n\n public static fromError(err: Error) {\n return new Exception(err.message, err, err.stack);\n }\n\n public static assert(condition: any | any[], message?: string, metadata?, exceptionType: typeof Exception = Exception) {\n let conditions = condition;\n if (!Array.isArray(condition)) conditions = [condition];\n\n for (let cond of conditions) {\n let isNull = cond === null;\n let isFalse = typeof cond == 'boolean' && cond !== true;\n\n if (isNull || isFalse) throw new exceptionType(message, metadata);\n }\n }\n\n public toString() {\n return (this.message += '\\n\\tMetadata: ' + this.metadata);\n }\n}\n\nexport class ErrorNotFound extends Exception {\n constructor(message, metadata?, stack?) {\n super('Requested item not found', metadata, stack);\n }\n}\n\nexport class ErrorDuplicate extends Exception {\n constructor(message, metadata?, stack?) {\n super(message || 'Requested item conflicts with exists', { metadata }, stack);\n }\n}\n\nexport class HttpError extends Exception {\n constructor(public statusCode: number, message, metadata?, stack?) {\n super(message, metadata, stack);\n }\n\n public static tryGetErrorCode(error: any, defaultCode: number): number {\n if (error == null) return defaultCode;\n\n if (error instanceof HttpError) return (<HttpError>error).statusCode;\n if (error instanceof ErrorNotFound) return new HttpErrorNotFound(error.message, error.metadata, error.stack).statusCode;\n if (error instanceof ErrorDuplicate) return new HttpErrorDuplicate(error.message, error.metadata, error.stack).statusCode;\n\n return defaultCode;\n }\n}\n\nexport class HttpErrorBadRequest extends HttpError {\n public statusCode: number = 400;\n constructor(message, metadata?, stack?) {\n super(400, message, metadata, stack);\n }\n}\n\nexport class HttpErrorNotFound extends HttpError {\n public statusCode: number = 404;\n constructor(message, metadata?, stack?) {\n super(404, message, metadata, stack);\n }\n}\n\nexport class HttpErrorDuplicate extends HttpError {\n public statusCode: number = 409;\n constructor(message, metadata?, stack?) {\n super(409, message, metadata, stack);\n }\n}\n\nexport class NotImplemented extends Exception {\n constructor() {\n super('Not Implemented!');\n }\n}\n\nexport default Exception;\n"]}
@@ -0,0 +1,4 @@
1
+ export declare function getExpress(): {
2
+ app: any;
3
+ router: any;
4
+ };
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getExpress = getExpress;
7
+ const body_parser_1 = __importDefault(require("body-parser"));
8
+ const express_1 = __importDefault(require("express"));
9
+ const cors_1 = __importDefault(require("cors"));
10
+ function getExpress() {
11
+ const app = (0, express_1.default)();
12
+ app.set('json spaces', 4);
13
+ var rawBodySaver = function (req, res, buf, encoding) {
14
+ if (buf && buf.length) {
15
+ req.rawBody = buf.toString(encoding || 'utf8');
16
+ }
17
+ };
18
+ app.use(body_parser_1.default.json({ verify: rawBodySaver }));
19
+ app.use(body_parser_1.default.urlencoded({ verify: rawBodySaver, extended: true }));
20
+ app.use(body_parser_1.default.raw({ verify: rawBodySaver, type: '*/*' }));
21
+ app.use((0, cors_1.default)());
22
+ const router = express_1.default.Router();
23
+ return { app, router };
24
+ }
25
+ //# sourceMappingURL=getExpress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getExpress.js","sourceRoot":"","sources":["../../src/helpers/getExpress.ts"],"names":[],"mappings":";;;;;AAIA,gCAoBC;AAxBD,8DAAqC;AACrC,sDAA8B;AAC9B,gDAAwB;AAExB,SAAgB,UAAU;IACzB,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;IAEtB,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IAE1B,IAAI,YAAY,GAAG,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ;QACnD,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACvB,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC;QAChD,CAAC;IACF,CAAC,CAAC;IAEF,GAAG,CAAC,GAAG,CAAC,qBAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;IACnD,GAAG,CAAC,GAAG,CAAC,qBAAU,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACzE,GAAG,CAAC,GAAG,CAAC,qBAAU,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAE/D,GAAG,CAAC,GAAG,CAAC,IAAA,cAAI,GAAE,CAAC,CAAC;IAEhB,MAAM,MAAM,GAAG,iBAAO,CAAC,MAAM,EAAE,CAAC;IAEhC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;AACxB,CAAC","sourcesContent":["import bodyParser from 'body-parser';\nimport express from 'express';\nimport cors from 'cors';\n\nexport function getExpress() {\n\tconst app = express();\n\n\tapp.set('json spaces', 4);\n\n\tvar rawBodySaver = function (req, res, buf, encoding) {\n\t\tif (buf && buf.length) {\n\t\t\treq.rawBody = buf.toString(encoding || 'utf8');\n\t\t}\n\t};\n\n\tapp.use(bodyParser.json({ verify: rawBodySaver }));\n\tapp.use(bodyParser.urlencoded({ verify: rawBodySaver, extended: true }));\n\tapp.use(bodyParser.raw({ verify: rawBodySaver, type: '*/*' }));\n\n\tapp.use(cors());\n\n\tconst router = express.Router();\n\n\treturn { app, router };\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import { IRequest } from 'itty-router';
2
+ import { IFirebaseTokenPayload } from './jwt.js';
3
+ export declare class Helpers {
4
+ options?: Partial<ModuleOptions>;
5
+ constructor(options?: Partial<ModuleOptions>);
6
+ verifyRequestToken(request: IRequest, expectedAud: string): Promise<IFirebaseTokenPayload>;
7
+ gatherResponse(response: Response): Promise<string | Uint8Array>;
8
+ readStream(stream: ReadableStream<Uint8Array>): Promise<Uint8Array>;
9
+ }
10
+ export declare class ModuleOptions {
11
+ }
12
+ export declare const helpers: Helpers;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.helpers = exports.ModuleOptions = exports.Helpers = void 0;
13
+ const essentials_js_1 = require("libx.js/build/bundles/essentials.js");
14
+ const jwt_js_1 = require("./jwt.js");
15
+ class Helpers {
16
+ constructor(options) {
17
+ this.options = options;
18
+ this.options = Object.assign(Object.assign({}, new ModuleOptions()), options);
19
+ essentials_js_1.libx.log.v('Helpers:ctor');
20
+ }
21
+ verifyRequestToken(request, expectedAud) {
22
+ return __awaiter(this, void 0, void 0, function* () {
23
+ var _a;
24
+ const token = (_a = request.headers.get('authorization')) === null || _a === void 0 ? void 0 : _a.replace('Bearer ', '');
25
+ if (token == null)
26
+ throw 'verifyRequestToken: token is empty';
27
+ const tokenPayload = yield jwt_js_1.JwtHelper.verifyFirebaseToken(token, expectedAud);
28
+ return tokenPayload;
29
+ });
30
+ }
31
+ gatherResponse(response) {
32
+ return __awaiter(this, void 0, void 0, function* () {
33
+ const { headers } = response;
34
+ const contentType = headers.get("content-type") || "";
35
+ if (contentType.includes("application/json")) {
36
+ return JSON.stringify(yield response.json());
37
+ }
38
+ else if (contentType.includes("image")) {
39
+ return yield this.readStream(response.body);
40
+ }
41
+ return yield response.text();
42
+ });
43
+ }
44
+ readStream(stream) {
45
+ return __awaiter(this, void 0, void 0, function* () {
46
+ const reader = stream.getReader();
47
+ const chunks = [];
48
+ while (true) {
49
+ const { done, value } = yield reader.read();
50
+ if (done) {
51
+ break;
52
+ }
53
+ chunks.push(value);
54
+ }
55
+ const concatenatedChunks = new Uint8Array(chunks.reduce((acc, chunk) => acc + chunk.length, 0));
56
+ let offset = 0;
57
+ for (const chunk of chunks) {
58
+ concatenatedChunks.set(chunk, offset);
59
+ offset += chunk.length;
60
+ }
61
+ return concatenatedChunks;
62
+ });
63
+ }
64
+ }
65
+ exports.Helpers = Helpers;
66
+ class ModuleOptions {
67
+ }
68
+ exports.ModuleOptions = ModuleOptions;
69
+ exports.helpers = new Helpers();
70
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,uEAA2D;AAC3D,qCAA4D;AAE5D,MAAa,OAAO;IACnB,YAA0B,OAAgC;QAAhC,YAAO,GAAP,OAAO,CAAyB;QACzD,IAAI,CAAC,OAAO,mCAAQ,IAAI,aAAa,EAAE,GAAK,OAAO,CAAE,CAAC;QACtD,oBAAI,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IAC5B,CAAC;IAEY,kBAAkB,CAAC,OAAiB,EAAE,WAAmB;;;YACrE,MAAM,KAAK,GAAG,MAAA,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,0CAAE,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAC3E,IAAI,KAAK,IAAI,IAAI;gBAAE,MAAM,oCAAoC,CAAC;YAC9D,MAAM,YAAY,GAAG,MAAM,kBAAS,CAAC,mBAAmB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;YAC7E,OAAO,YAAY,CAAC;QACrB,CAAC;KAAA;IAEY,cAAc,CAAC,QAAkB;;YAC7C,MAAM,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC;YAC7B,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YACtD,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAC9C,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9C,CAAC;iBACI,IAAI,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxC,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC7C,CAAC;YACD,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC9B,CAAC;KAAA;IAEY,UAAU,CAAC,MAAkC;;YACzD,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;YAClC,MAAM,MAAM,GAAiB,EAAE,CAAC;YAEhC,OAAO,IAAI,EAAE,CAAC;gBACb,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAE5C,IAAI,IAAI,EAAE,CAAC;oBACV,MAAM;gBACP,CAAC;gBAED,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;YAGD,MAAM,kBAAkB,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;YAChG,IAAI,MAAM,GAAG,CAAC,CAAC;YAEf,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC5B,kBAAkB,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACtC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;YACxB,CAAC;YAED,OAAO,kBAAkB,CAAC;QAC3B,CAAC;KAAA;CACD;AAlDD,0BAkDC;AAED,MAAa,aAAa;CAEzB;AAFD,sCAEC;AAEY,QAAA,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC","sourcesContent":["import { IRequest } from 'itty-router';\nimport { libx } from 'libx.js/build/bundles/essentials.js';\nimport { IFirebaseTokenPayload, JwtHelper } from './jwt.js';\n\nexport class Helpers {\n\tpublic constructor(public options?: Partial<ModuleOptions>) {\n\t\tthis.options = { ...new ModuleOptions(), ...options };\n\t\tlibx.log.v('Helpers:ctor');\n\t}\n\n\tpublic async verifyRequestToken(request: IRequest, expectedAud: string) {\n\t\tconst token = request.headers.get('authorization')?.replace('Bearer ', '');\n\t\tif (token == null) throw 'verifyRequestToken: token is empty';\n\t\tconst tokenPayload = await JwtHelper.verifyFirebaseToken(token, expectedAud);\n\t\treturn tokenPayload;\n\t}\n\n\tpublic async gatherResponse(response: Response) {\n\t\tconst { headers } = response;\n\t\tconst contentType = headers.get(\"content-type\") || \"\";\n\t\tif (contentType.includes(\"application/json\")) {\n\t\t\treturn JSON.stringify(await response.json());\n\t\t}\n\t\telse if (contentType.includes(\"image\")) {\n\t\t\treturn await this.readStream(response.body);\n\t\t}\n\t\treturn await response.text();\n\t}\n\n\tpublic async readStream(stream: ReadableStream<Uint8Array>): Promise<Uint8Array> {\n\t\tconst reader = stream.getReader();\n\t\tconst chunks: Uint8Array[] = [];\n\n\t\twhile (true) {\n\t\t\tconst { done, value } = await reader.read();\n\n\t\t\tif (done) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tchunks.push(value);\n\t\t}\n\n\t\t// Concatenate the chunks and decode them into a string using TextDecoder\n\t\tconst concatenatedChunks = new Uint8Array(chunks.reduce((acc, chunk) => acc + chunk.length, 0));\n\t\tlet offset = 0;\n\n\t\tfor (const chunk of chunks) {\n\t\t\tconcatenatedChunks.set(chunk, offset);\n\t\t\toffset += chunk.length;\n\t\t}\n\n\t\treturn concatenatedChunks;\n\t}\n}\n\nexport class ModuleOptions {\n\n}\n\nexport const helpers = new Helpers();"]}
@@ -0,0 +1,57 @@
1
+ declare class JwtHelper {
2
+ private static cachedFirebasePublicKeys;
3
+ private static base64urlEncode;
4
+ private static objectToBase64url;
5
+ private static arrayBufferToBase64Url;
6
+ private static hexToBuffer;
7
+ private static base64UrlDecode;
8
+ private static getGooglePublicKey;
9
+ static generateSignedJWT(serviceAccount: any, scope: string, options?: Partial<Options>): Promise<{
10
+ header: string;
11
+ payload: string;
12
+ signature: string;
13
+ }>;
14
+ static generateToken(serviceAccount: any, scope: string, options?: Partial<Options>): Promise<string>;
15
+ static generateOAuth(serviceAccount: any, scope: string, options?: Partial<Options>): Promise<any>;
16
+ private static jwtToOAuth;
17
+ static makeRequest(url: string, serviceAccountObj: Object, scope: string, payload: any, options?: {
18
+ method: string;
19
+ exHeaders: {};
20
+ }): Promise<Response>;
21
+ static verifyFirebaseToken(token: any, expectAud: any): Promise<IFirebaseTokenPayload>;
22
+ static verifyToken(publicKey: any, token: any, expectAud: any, expectIss: any, checkExpiry?: boolean): Promise<IJwtTokenPayload>;
23
+ static decodeToken(idToken: any): {
24
+ rawHeader: any;
25
+ header: any;
26
+ payload: any;
27
+ rawPayload: any;
28
+ signature: any;
29
+ };
30
+ private static parseBase64Url;
31
+ private static utf8ToUint8Array;
32
+ private static decodeToken_2;
33
+ }
34
+ declare class Options {
35
+ aud: string;
36
+ exp: number;
37
+ }
38
+ interface IJwtTokenPayload {
39
+ name: string;
40
+ picture: string;
41
+ iss: string;
42
+ aud: string;
43
+ auth_time: number;
44
+ user_id: string;
45
+ sub: string;
46
+ iat: number;
47
+ exp: number;
48
+ email: string;
49
+ email_verified: true;
50
+ }
51
+ export interface IFirebaseTokenPayload extends IJwtTokenPayload {
52
+ firebase: {
53
+ identities: any;
54
+ sign_in_provider: string;
55
+ };
56
+ }
57
+ export { JwtHelper };