edge.libx.js 0.0.7 → 0.1.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.
- package/build/helpers/EdgeNetwork.js +3 -3
- package/build/helpers/EdgeNetwork.js.map +1 -1
- package/build/helpers/RequestInfo.d.ts +30 -0
- package/build/helpers/RequestInfo.js +67 -0
- package/build/helpers/RequestInfo.js.map +1 -0
- package/build/helpers/localServer.js +1 -1
- package/build/helpers/localServer.js.map +1 -1
- package/package.json +1 -1
- package/src/helpers/EdgeNetwork.ts +1 -1
- package/src/helpers/RequestInfo.ts +81 -0
- package/src/helpers/localServer.ts +1 -1
|
@@ -21,14 +21,14 @@ class EdgeNetwork {
|
|
|
21
21
|
return p.reject(err);
|
|
22
22
|
});
|
|
23
23
|
_p.then((res) => __awaiter(this, void 0, void 0, function* () {
|
|
24
|
-
var _a, _b;
|
|
24
|
+
var _a, _b, _c;
|
|
25
25
|
if (res.status < 200 || res.status > 299) {
|
|
26
26
|
let body = null;
|
|
27
27
|
try {
|
|
28
28
|
body = yield res.json();
|
|
29
29
|
}
|
|
30
|
-
catch (
|
|
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 &&
|
|
30
|
+
catch (_d) { }
|
|
31
|
+
const msg = `Fetch error: "${res === null || res === void 0 ? void 0 : res.status} - ${(_c = (_b = (_a = body === null || body === void 0 ? void 0 : body.error) === null || _a === void 0 ? void 0 : _a.message) !== null && _b !== void 0 ? _b : body === null || body === void 0 ? void 0 : body.message) !== null && _c !== void 0 ? _c : res === null || res === void 0 ? void 0 : res.statusText}"`;
|
|
32
32
|
essentials_js_1.libx.log.w(msg, body);
|
|
33
33
|
return p.reject(msg);
|
|
34
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EdgeNetwork.js","sourceRoot":"","sources":["../../src/helpers/EdgeNetwork.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,uEAA2D;AAE3D,MAAM,WAAW;IACH,KAAK,CAAC,GAAW,EAAE,MAA4B,EAAE,OAAqB;;YAClF,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACzB,MAAM,CAAC,GAAG,oBAAI,CAAC,UAAU,EAAE,CAAC;YAC5B,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,kBACnB,MAAM,EAIN,QAAQ,EAAE,QAAQ,IACf,OAAO,EACT,CAAC;YAEH,EAAE,CAAC,KAAK,CAAC,GAAG,CAAA,EAAE;gBACb,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC,CAAC,CAAC;YACH,EAAE,CAAC,IAAI,CAAC,CAAM,GAAG,EAAA,EAAE;;gBAClB,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;oBAC1C,IAAI,IAAI,GAAG,IAAI,CAAC;oBAChB,IAAI,CAAC;wBACJ,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;oBACzB,CAAC;oBAAC,WAAM,CAAC,CAAA,CAAC;oBACV,MAAM,GAAG,GAAG,iBAAiB,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,MAAM,MAAM,MAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,mCAAI,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,mCAAI,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,UAAU,GAAG,CAAC;
|
|
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?.message ?? 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,30 @@
|
|
|
1
|
+
import { IRequest } from 'itty-router';
|
|
2
|
+
export interface IRequestInfo {
|
|
3
|
+
deviceType: any;
|
|
4
|
+
clientIP: any;
|
|
5
|
+
ip: any;
|
|
6
|
+
country: any;
|
|
7
|
+
region: any;
|
|
8
|
+
city: any;
|
|
9
|
+
'cf.tlsClientAuth': any;
|
|
10
|
+
'cf.tlsExportedAuthenticator': any;
|
|
11
|
+
'device.vendor': any;
|
|
12
|
+
'device.model': any;
|
|
13
|
+
'device.type': any;
|
|
14
|
+
'browser.name': any;
|
|
15
|
+
'browser.version': any;
|
|
16
|
+
'browser.major': any;
|
|
17
|
+
'engine.name': any;
|
|
18
|
+
'engine.version': any;
|
|
19
|
+
'os.name': any;
|
|
20
|
+
'os.version': any;
|
|
21
|
+
'cpu.architecture': any;
|
|
22
|
+
}
|
|
23
|
+
export declare class RequestInfo {
|
|
24
|
+
options?: Partial<ModuleOptions>;
|
|
25
|
+
constructor(options?: Partial<ModuleOptions>);
|
|
26
|
+
static process(request: IRequest): Promise<IRequestInfo>;
|
|
27
|
+
private static getDeviceType;
|
|
28
|
+
}
|
|
29
|
+
export declare class ModuleOptions {
|
|
30
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.ModuleOptions = exports.RequestInfo = void 0;
|
|
16
|
+
const edge_1 = require("@vercel/edge");
|
|
17
|
+
const essentials_js_1 = require("libx.js/build/bundles/essentials.js");
|
|
18
|
+
const ua_parser_js_1 = __importDefault(require("ua-parser-js"));
|
|
19
|
+
class RequestInfo {
|
|
20
|
+
constructor(options) {
|
|
21
|
+
this.options = options;
|
|
22
|
+
essentials_js_1.libx.log.v('RequestInfo:ctor: ');
|
|
23
|
+
this.options = Object.assign(Object.assign({}, new ModuleOptions()), options);
|
|
24
|
+
}
|
|
25
|
+
static process(request) {
|
|
26
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
27
|
+
const reqCf = Object.assign({}, request.cf);
|
|
28
|
+
const clientIP = request.headers.get('CF-Connecting-IP');
|
|
29
|
+
const device = request.headers.get('CF-Device-Type');
|
|
30
|
+
const ip = request.headers.get('x-real-ip');
|
|
31
|
+
const country = request.headers.get('X-Vercel-IP-Country');
|
|
32
|
+
const region = request.headers.get('X-Vercel-IP-Country-Region');
|
|
33
|
+
let city = request.headers.get('X-Vercel-IP-City');
|
|
34
|
+
const userAgent = request.headers.get('User-Agent') || '';
|
|
35
|
+
let parser = new ua_parser_js_1.default(userAgent);
|
|
36
|
+
if (city == null)
|
|
37
|
+
city = (0, edge_1.geolocation)(request).city;
|
|
38
|
+
reqCf.tlsClientAuth = JSON.stringify(reqCf.tlsClientAuth);
|
|
39
|
+
reqCf.tlsExportedAuthenticator = JSON.stringify(reqCf.tlsExportedAuthenticator);
|
|
40
|
+
let parsed = parser.getResult();
|
|
41
|
+
delete parsed.ua;
|
|
42
|
+
let ret = Object.assign(Object.assign({ clientIP, cf: reqCf, device,
|
|
43
|
+
ip,
|
|
44
|
+
country,
|
|
45
|
+
region,
|
|
46
|
+
city }, parsed), { deviceType: this.getDeviceType(userAgent) });
|
|
47
|
+
ret = essentials_js_1.libx.flatterObjectToDotNotation(ret);
|
|
48
|
+
return ret;
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
static getDeviceType(ua) {
|
|
52
|
+
if (/mobile/i.test(ua)) {
|
|
53
|
+
return 'Mobile';
|
|
54
|
+
}
|
|
55
|
+
else if (/tablet/i.test(ua)) {
|
|
56
|
+
return 'Tablet';
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
return 'Desktop';
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.RequestInfo = RequestInfo;
|
|
64
|
+
class ModuleOptions {
|
|
65
|
+
}
|
|
66
|
+
exports.ModuleOptions = ModuleOptions;
|
|
67
|
+
//# sourceMappingURL=RequestInfo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequestInfo.js","sourceRoot":"","sources":["../../src/helpers/RequestInfo.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,uCAA2C;AAE3C,uEAA2D;AAC3D,gEAAoC;AAwBpC,MAAa,WAAW;IACpB,YAA0B,OAAgC;QAAhC,YAAO,GAAP,OAAO,CAAyB;QACtD,oBAAI,CAAC,GAAG,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;QACjC,IAAI,CAAC,OAAO,mCAAQ,IAAI,aAAa,EAAE,GAAK,OAAO,CAAE,CAAC;IAC1D,CAAC;IAEM,MAAM,CAAO,OAAO,CAAC,OAAiB;;YACzC,MAAM,KAAK,qBAAQ,OAAO,CAAC,EAAE,CAAE,CAAC;YAEhC,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YACrD,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;YACjE,IAAI,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YACnD,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;YAC1D,IAAI,MAAM,GAAG,IAAI,sBAAQ,CAAC,SAAS,CAAC,CAAC;YAErC,IAAI,IAAI,IAAI,IAAI;gBAAE,IAAI,GAAG,IAAA,kBAAW,EAAC,OAAO,CAAC,CAAC,IAAI,CAAC;YAEnD,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAC1D,KAAK,CAAC,wBAAwB,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAEhF,IAAI,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;YAChC,OAAO,MAAM,CAAC,EAAE,CAAC;YACjB,IAAI,GAAG,iCACH,QAAQ,EACR,EAAE,EAAE,KAAK,EACT,MAAM;gBACN,EAAE;gBACF,OAAO;gBACP,MAAM;gBACN,IAAI,IACD,MAAM,KACT,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,GAC5C,CAAC;YAEF,GAAG,GAAG,oBAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC;YAE3C,OAAO,GAAG,CAAC;QACf,CAAC;KAAA;IAEO,MAAM,CAAC,aAAa,CAAC,EAAU;QACnC,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACrB,OAAO,QAAQ,CAAC;QACpB,CAAC;aAAM,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAC5B,OAAO,QAAQ,CAAC;QACpB,CAAC;aAAM,CAAC;YACJ,OAAO,SAAS,CAAC;QACrB,CAAC;IACL,CAAC;CACJ;AAnDD,kCAmDC;AAED,MAAa,aAAa;CAAG;AAA7B,sCAA6B","sourcesContent":["import { geolocation } from '@vercel/edge';\nimport { IRequest } from 'itty-router';\nimport { libx } from 'libx.js/build/bundles/essentials.js';\nimport UAParser from 'ua-parser-js';\n\nexport interface IRequestInfo {\n deviceType;\n clientIP;\n ip;\n country;\n region;\n city;\n 'cf.tlsClientAuth';\n 'cf.tlsExportedAuthenticator';\n 'device.vendor';\n 'device.model';\n 'device.type';\n 'browser.name';\n 'browser.version';\n 'browser.major';\n 'engine.name';\n 'engine.version';\n 'os.name';\n 'os.version';\n 'cpu.architecture';\n}\n\nexport class RequestInfo {\n public constructor(public options?: Partial<ModuleOptions>) {\n libx.log.v('RequestInfo:ctor: ');\n this.options = { ...new ModuleOptions(), ...options };\n }\n\n public static async process(request: IRequest): Promise<IRequestInfo> {\n const reqCf = { ...request.cf };\n\n const clientIP = request.headers.get('CF-Connecting-IP');\n const device = request.headers.get('CF-Device-Type');\n const ip = request.headers.get('x-real-ip');\n const country = request.headers.get('X-Vercel-IP-Country');\n const region = request.headers.get('X-Vercel-IP-Country-Region');\n let city = request.headers.get('X-Vercel-IP-City');\n const userAgent = request.headers.get('User-Agent') || '';\n let parser = new UAParser(userAgent);\n\n if (city == null) city = geolocation(request).city;\n\n reqCf.tlsClientAuth = JSON.stringify(reqCf.tlsClientAuth);\n reqCf.tlsExportedAuthenticator = JSON.stringify(reqCf.tlsExportedAuthenticator);\n\n let parsed = parser.getResult();\n delete parsed.ua;\n let ret = {\n clientIP,\n cf: reqCf,\n device,\n ip,\n country,\n region,\n city,\n ...parsed,\n deviceType: this.getDeviceType(userAgent),\n };\n\n ret = libx.flatterObjectToDotNotation(ret);\n\n return ret;\n }\n\n private static getDeviceType(ua: string) {\n if (/mobile/i.test(ua)) {\n return 'Mobile';\n } else if (/tablet/i.test(ua)) {\n return 'Tablet';\n } else {\n return 'Desktop';\n }\n }\n}\n\nexport class ModuleOptions {}\n"]}
|
|
@@ -35,7 +35,7 @@ function getEnvVars() {
|
|
|
35
35
|
node_essentials_1.libx.node.catchErrors((err) => {
|
|
36
36
|
console.error('!!!!!! ERROR: ', err);
|
|
37
37
|
}, false);
|
|
38
|
-
if (['debug', 'debug:watch'].indexOf(process.env.npm_lifecycle_event) !== -1) {
|
|
38
|
+
if (['debug', 'debug:watch', 'api:debug'].indexOf(process.env.npm_lifecycle_event) !== -1) {
|
|
39
39
|
const env = (_a = getEnvVars()) !== null && _a !== void 0 ? _a : { a: 1 };
|
|
40
40
|
for (let entryPoint of entryPoints) {
|
|
41
41
|
const dir = process.cwd();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localServer.js","sourceRoot":"","sources":["../../src/helpers/localServer.ts"],"names":[],"mappings":";;;;;;AAAA,gDAA0D;AAC1D,4BAA0B;AAG1B,6CAA0C;AAE1C,4CAAoB;AACpB,mDAA0D;AAC1D,2EAA6D;AAC7D,gDAAwB;AAExB,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAEnE,SAAG,CAAC,OAAO,GAAG,IAAI,CAAC;AACnB,SAAG,CAAC,WAAW,GAAG,cAAQ,CAAC,GAAG,CAAC;AAE/B,MAAM,OAAO,GAAG,MAAM,CAAC;AAEvB,MAAM,WAAW,GAAG,sBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAErC,MAAM,EAAE,GAAG,EAAE,GAAG,IAAA,uBAAU,GAAE,CAAC;AAM7B,SAAS,UAAU;;IAClB,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;IACtD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,OAAO,GAAG,MAAA,YAAE,CAAC,YAAY,CAAC,WAAW,CAAC,0CAAE,QAAQ,EAAE,CAAC;IACzD,MAAM,GAAG,GAAG,EAAE,CAAC;IACf,KAAK,IAAI,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI;YAAE,SAAS;QAClE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,0BAA0B,EAAE,IAAI,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,sBAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7B,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;AACtC,CAAC,EAAE,KAAK,CAAC,CAAC;AAKV,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"localServer.js","sourceRoot":"","sources":["../../src/helpers/localServer.ts"],"names":[],"mappings":"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","sourcesContent":["import { createServerAdapter } from '@whatwg-node/server';\nimport 'isomorphic-fetch';\nimport { IRequest, Router, error, json } from 'itty-router';\nimport express from 'express';\nimport { getExpress } from './getExpress';\n// import { router, server } from '../v5';\nimport fs from 'fs';\nimport { log, LogLevel } from 'libx.js/build/modules/log';\nimport { libx } from 'libx.js/build/bundles/node.essentials';\nimport path from 'path';\n\nrequire('dotenv').config({ path: `.env.${process.env.NODE_ENV}` });\n\nlog.isDebug = true;\nlog.filterLevel = LogLevel.All;\n\nconst envFile = '.env'; //'.dev.vars'\n\nconst entryPoints = libx.node.args._;\n\nconst { app } = getExpress();\n\n// node-wrangler bridge:\n// global.crypto = require('crypto');\n// global.TransformStream = require('web-streams-polyfill').TransformStream;\n\nfunction getEnvVars() {\n\tconst envFilePath = path.join(process.cwd(), envFile);\n\tif (!fs.existsSync(envFilePath)) return null;\n\tconst content = fs.readFileSync(envFilePath)?.toString();\n\tconst ret = {};\n\tfor (let line of content.split('\\n')) {\n\t\tconst parts = line.split('=');\n\t\tif (parts[0].trim().startsWith('#') || parts[1] == null) continue;\n\t\tret[parts[0].trim()] = parts[1].replace(/\\s*[\\\"\\'](.+)[\\\"\\']\\s*/gi, '$1');\n\t}\n\treturn ret;\n}\n\nlibx.node.catchErrors((err) => {\n\tconsole.error('!!!!!! ERROR: ', err);\n}, false);\n\n\n\n// only lunch manual local server if using 'dev' command\nif (['debug', 'debug:watch', 'api:debug'].indexOf(process.env.npm_lifecycle_event) !== -1) {\n\tconst env = getEnvVars() ?? { a: 1 };\n\n\tfor (let entryPoint of entryPoints) {\n\t\tconst dir = process.cwd(); // process.argv[1]\n\t\tconst { handler, prefix } = require(`${dir}/${entryPoint}`);\n\t\tapp.use(\n\t\t\tprefix ?? '/api',\n\t\t\tcreateServerAdapter((request, env) =>\n\t\t\t\thandler(<IRequest>request, env))\n\t\t);\n\t}\n\n\t// app.use(\n\t// \t'/v5-n',\n\t// \tcreateServerAdapter((request, env) =>\n\t// \t\thandler_node(<IRequest>request, env))\n\t// \t\t// handlerRedirect(<IRequest>request, env))\n\t// );\n\n\tconst port = 8080;\n\ttry {\n\t\tapp.listen(port, () => {\n\t\t\tconsole.log(`Server listening on http://0.0.0.0:${port}`);\n\t\t});\n\t} catch (err) {\n\t\tconsole.warn(`LOCAL: Failed to start local server on port: ${port}`);\n\t}\n}\n\n// export default server; //routes.fetch;"]}
|
package/package.json
CHANGED
|
@@ -22,7 +22,7 @@ class EdgeNetwork {
|
|
|
22
22
|
try {
|
|
23
23
|
body = await res.json();
|
|
24
24
|
} catch {}
|
|
25
|
-
const msg = `Fetch error: "${res?.status} - ${body?.error ?? body?.message ?? res?.statusText}"`;
|
|
25
|
+
const msg = `Fetch error: "${res?.status} - ${body?.error?.message ?? body?.message ?? res?.statusText}"`;
|
|
26
26
|
libx.log.w(msg, body);
|
|
27
27
|
return p.reject(msg);
|
|
28
28
|
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { geolocation } from '@vercel/edge';
|
|
2
|
+
import { IRequest } from 'itty-router';
|
|
3
|
+
import { libx } from 'libx.js/build/bundles/essentials.js';
|
|
4
|
+
import UAParser from 'ua-parser-js';
|
|
5
|
+
|
|
6
|
+
export interface IRequestInfo {
|
|
7
|
+
deviceType;
|
|
8
|
+
clientIP;
|
|
9
|
+
ip;
|
|
10
|
+
country;
|
|
11
|
+
region;
|
|
12
|
+
city;
|
|
13
|
+
'cf.tlsClientAuth';
|
|
14
|
+
'cf.tlsExportedAuthenticator';
|
|
15
|
+
'device.vendor';
|
|
16
|
+
'device.model';
|
|
17
|
+
'device.type';
|
|
18
|
+
'browser.name';
|
|
19
|
+
'browser.version';
|
|
20
|
+
'browser.major';
|
|
21
|
+
'engine.name';
|
|
22
|
+
'engine.version';
|
|
23
|
+
'os.name';
|
|
24
|
+
'os.version';
|
|
25
|
+
'cpu.architecture';
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export class RequestInfo {
|
|
29
|
+
public constructor(public options?: Partial<ModuleOptions>) {
|
|
30
|
+
libx.log.v('RequestInfo:ctor: ');
|
|
31
|
+
this.options = { ...new ModuleOptions(), ...options };
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public static async process(request: IRequest): Promise<IRequestInfo> {
|
|
35
|
+
const reqCf = { ...request.cf };
|
|
36
|
+
|
|
37
|
+
const clientIP = request.headers.get('CF-Connecting-IP');
|
|
38
|
+
const device = request.headers.get('CF-Device-Type');
|
|
39
|
+
const ip = request.headers.get('x-real-ip');
|
|
40
|
+
const country = request.headers.get('X-Vercel-IP-Country');
|
|
41
|
+
const region = request.headers.get('X-Vercel-IP-Country-Region');
|
|
42
|
+
let city = request.headers.get('X-Vercel-IP-City');
|
|
43
|
+
const userAgent = request.headers.get('User-Agent') || '';
|
|
44
|
+
let parser = new UAParser(userAgent);
|
|
45
|
+
|
|
46
|
+
if (city == null) city = geolocation(request).city;
|
|
47
|
+
|
|
48
|
+
reqCf.tlsClientAuth = JSON.stringify(reqCf.tlsClientAuth);
|
|
49
|
+
reqCf.tlsExportedAuthenticator = JSON.stringify(reqCf.tlsExportedAuthenticator);
|
|
50
|
+
|
|
51
|
+
let parsed = parser.getResult();
|
|
52
|
+
delete parsed.ua;
|
|
53
|
+
let ret = {
|
|
54
|
+
clientIP,
|
|
55
|
+
cf: reqCf,
|
|
56
|
+
device,
|
|
57
|
+
ip,
|
|
58
|
+
country,
|
|
59
|
+
region,
|
|
60
|
+
city,
|
|
61
|
+
...parsed,
|
|
62
|
+
deviceType: this.getDeviceType(userAgent),
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
ret = libx.flatterObjectToDotNotation(ret);
|
|
66
|
+
|
|
67
|
+
return ret;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
private static getDeviceType(ua: string) {
|
|
71
|
+
if (/mobile/i.test(ua)) {
|
|
72
|
+
return 'Mobile';
|
|
73
|
+
} else if (/tablet/i.test(ua)) {
|
|
74
|
+
return 'Tablet';
|
|
75
|
+
} else {
|
|
76
|
+
return 'Desktop';
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export class ModuleOptions {}
|
|
@@ -44,7 +44,7 @@ libx.node.catchErrors((err) => {
|
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
// only lunch manual local server if using 'dev' command
|
|
47
|
-
if (['debug', 'debug:watch'].indexOf(process.env.npm_lifecycle_event) !== -1) {
|
|
47
|
+
if (['debug', 'debug:watch', 'api:debug'].indexOf(process.env.npm_lifecycle_event) !== -1) {
|
|
48
48
|
const env = getEnvVars() ?? { a: 1 };
|
|
49
49
|
|
|
50
50
|
for (let entryPoint of entryPoints) {
|