@riddance/host 0.0.11 → 0.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/context.d.ts +86 -86
- package/context.js +52 -52
- package/host/context.d.ts +51 -50
- package/host/context.js +90 -90
- package/host/emitter.d.ts +13 -13
- package/host/emitter.js +68 -68
- package/host/http.d.ts +30 -30
- package/host/http.js +212 -211
- package/host/logging.d.ts +4 -4
- package/host/logging.js +191 -191
- package/host/reflect.d.ts +24 -24
- package/host/reflect.js +58 -58
- package/host/registry.d.ts +27 -26
- package/host/registry.js +73 -61
- package/http.d.ts +39 -39
- package/http.js +18 -18
- package/package.json +10 -7
package/host/reflect.js
CHANGED
|
@@ -1,58 +1,58 @@
|
|
|
1
|
-
import { readdir, readFile } from 'node:fs/promises';
|
|
2
|
-
import { basename, extname, join, resolve } from 'node:path';
|
|
3
|
-
import { pathToFileURL } from 'node:url';
|
|
4
|
-
export function resolveCpu(config, supported) {
|
|
5
|
-
const resolved = resolveSupported(config.cpus, supported);
|
|
6
|
-
if (!resolved) {
|
|
7
|
-
// resolve<T>(config, supported) actually asserts config is (T | `!${T}`)[], but that's not supported yet.
|
|
8
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
9
|
-
throw new Error('Unsupported CPUs: ' + config.cpus.join(', '));
|
|
10
|
-
}
|
|
11
|
-
return resolved;
|
|
12
|
-
}
|
|
13
|
-
export function resolveOS(config, supported) {
|
|
14
|
-
const resolved = resolveSupported(config.os, supported);
|
|
15
|
-
if (!resolved) {
|
|
16
|
-
// resolve<T>(config, supported) actually asserts config is (T | `!${T}`)[], but that's not supported yet.
|
|
17
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
18
|
-
throw new Error('Unsupported operating systems: ' + config.os.join(', '));
|
|
19
|
-
}
|
|
20
|
-
return resolved;
|
|
21
|
-
}
|
|
22
|
-
function resolveSupported(config, supported) {
|
|
23
|
-
if (!config) {
|
|
24
|
-
return supported[0];
|
|
25
|
-
}
|
|
26
|
-
return supported.find(s => config.includes(s) && !config.includes(`!${s}`));
|
|
27
|
-
}
|
|
28
|
-
export async function reflect(path) {
|
|
29
|
-
const packageJson = await readConfig();
|
|
30
|
-
const absolutePath = resolve(process.cwd(), path);
|
|
31
|
-
const files = (await readdir(absolutePath)).filter(file => extname(file) === '.ts' && !file.endsWith('.d.ts'));
|
|
32
|
-
const { getHandlers, setMeta } = (await import(pathToFileURL(join(absolutePath, 'node_modules/@riddance/host/host/registry.js')).toString()));
|
|
33
|
-
for (const file of files) {
|
|
34
|
-
const base = basename(file, '.ts');
|
|
35
|
-
setMeta(packageJson.name, base, undefined, packageJson.config);
|
|
36
|
-
await import(pathToFileURL(join(absolutePath, base + '.js')).toString());
|
|
37
|
-
}
|
|
38
|
-
return {
|
|
39
|
-
name: packageJson.name,
|
|
40
|
-
http: getHandlers('http').map(h => ({
|
|
41
|
-
config: {
|
|
42
|
-
...h.config,
|
|
43
|
-
cpus: packageJson.cpu,
|
|
44
|
-
os: packageJson.os,
|
|
45
|
-
nodeVersion: packageJson.engines?.node,
|
|
46
|
-
},
|
|
47
|
-
name: h.meta?.fileName ?? '',
|
|
48
|
-
method: h.method,
|
|
49
|
-
pathPattern: h.pathPattern,
|
|
50
|
-
pathRegExp: h.pathRegExp,
|
|
51
|
-
})),
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
async function readConfig() {
|
|
55
|
-
const packageJson = JSON.parse(await readFile('package.json', 'utf-8'));
|
|
56
|
-
return packageJson;
|
|
57
|
-
}
|
|
58
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
import { readdir, readFile } from 'node:fs/promises';
|
|
2
|
+
import { basename, extname, join, resolve } from 'node:path';
|
|
3
|
+
import { pathToFileURL } from 'node:url';
|
|
4
|
+
export function resolveCpu(config, supported) {
|
|
5
|
+
const resolved = resolveSupported(config.cpus, supported);
|
|
6
|
+
if (!resolved) {
|
|
7
|
+
// resolve<T>(config, supported) actually asserts config is (T | `!${T}`)[], but that's not supported yet.
|
|
8
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
9
|
+
throw new Error('Unsupported CPUs: ' + config.cpus.join(', '));
|
|
10
|
+
}
|
|
11
|
+
return resolved;
|
|
12
|
+
}
|
|
13
|
+
export function resolveOS(config, supported) {
|
|
14
|
+
const resolved = resolveSupported(config.os, supported);
|
|
15
|
+
if (!resolved) {
|
|
16
|
+
// resolve<T>(config, supported) actually asserts config is (T | `!${T}`)[], but that's not supported yet.
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
18
|
+
throw new Error('Unsupported operating systems: ' + config.os.join(', '));
|
|
19
|
+
}
|
|
20
|
+
return resolved;
|
|
21
|
+
}
|
|
22
|
+
function resolveSupported(config, supported) {
|
|
23
|
+
if (!config) {
|
|
24
|
+
return supported[0];
|
|
25
|
+
}
|
|
26
|
+
return supported.find(s => config.includes(s) && !config.includes(`!${s}`));
|
|
27
|
+
}
|
|
28
|
+
export async function reflect(path) {
|
|
29
|
+
const packageJson = await readConfig();
|
|
30
|
+
const absolutePath = resolve(process.cwd(), path);
|
|
31
|
+
const files = (await readdir(absolutePath)).filter(file => extname(file) === '.ts' && !file.endsWith('.d.ts'));
|
|
32
|
+
const { getHandlers, setMeta } = (await import(pathToFileURL(join(absolutePath, 'node_modules/@riddance/host/host/registry.js')).toString()));
|
|
33
|
+
for (const file of files) {
|
|
34
|
+
const base = basename(file, '.ts');
|
|
35
|
+
setMeta(packageJson.name, base, undefined, packageJson.config);
|
|
36
|
+
await import(pathToFileURL(join(absolutePath, base + '.js')).toString());
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
name: packageJson.name,
|
|
40
|
+
http: getHandlers('http').map(h => ({
|
|
41
|
+
config: {
|
|
42
|
+
...h.config,
|
|
43
|
+
cpus: packageJson.cpu,
|
|
44
|
+
os: packageJson.os,
|
|
45
|
+
nodeVersion: packageJson.engines?.node,
|
|
46
|
+
},
|
|
47
|
+
name: h.meta?.fileName ?? '',
|
|
48
|
+
method: h.method,
|
|
49
|
+
pathPattern: h.pathPattern,
|
|
50
|
+
pathRegExp: h.pathRegExp,
|
|
51
|
+
})),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
async function readConfig() {
|
|
55
|
+
const packageJson = JSON.parse(await readFile('package.json', 'utf-8'));
|
|
56
|
+
return packageJson;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmbGVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInJlZmxlY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQzVELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFvQ3hDLE1BQU0sVUFBVSxVQUFVLENBQUMsTUFBZ0MsRUFBRSxTQUFnQjtJQUN6RSxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBQ3pELElBQUksQ0FBQyxRQUFRLEVBQUU7UUFDWCwwR0FBMEc7UUFDMUcsb0VBQW9FO1FBQ3BFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLEdBQUcsTUFBTSxDQUFDLElBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtLQUNsRTtJQUNELE9BQU8sUUFBUSxDQUFBO0FBQ25CLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUyxDQUNyQixNQUFnQyxFQUNoQyxTQUE0QjtJQUU1QixNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBQ3ZELElBQUksQ0FBQyxRQUFRLEVBQUU7UUFDWCwwR0FBMEc7UUFDMUcsb0VBQW9FO1FBQ3BFLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLEdBQUcsTUFBTSxDQUFDLEVBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtLQUM3RTtJQUNELE9BQU8sUUFBUSxDQUFBO0FBQ25CLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUNyQixNQUFtQyxFQUNuQyxTQUFjO0lBRWQsSUFBSSxDQUFDLE1BQU0sRUFBRTtRQUNULE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ3RCO0lBQ0QsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7QUFDL0UsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsT0FBTyxDQUFDLElBQVk7SUFDdEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxVQUFVLEVBQUUsQ0FBQTtJQUN0QyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ2pELE1BQU0sS0FBSyxHQUFHLENBQUMsTUFBTSxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQzlDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQzdELENBQUE7SUFDRCxNQUFNLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsTUFBTSxNQUFNLENBQzFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLDhDQUE4QyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FDL0YsQ0FlQSxDQUFBO0lBRUQsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUU7UUFDdEIsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUNsQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUM5RCxNQUFNLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0tBQzNFO0lBRUQsT0FBTztRQUNILElBQUksRUFBRSxXQUFXLENBQUMsSUFBSTtRQUN0QixJQUFJLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEMsTUFBTSxFQUFFO2dCQUNKLEdBQUcsQ0FBQyxDQUFDLE1BQU07Z0JBQ1gsSUFBSSxFQUFFLFdBQVcsQ0FBQyxHQUFHO2dCQUNyQixFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7Z0JBQ2xCLFdBQVcsRUFBRSxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUk7YUFDekM7WUFDRCxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxRQUFRLElBQUksRUFBRTtZQUM1QixNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU07WUFDaEIsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXO1lBQzFCLFVBQVUsRUFBRSxDQUFDLENBQUMsVUFBVTtTQUMzQixDQUFDLENBQUM7S0FDTixDQUFBO0FBQ0wsQ0FBQztBQUVELEtBQUssVUFBVSxVQUFVO0lBQ3JCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQU1yRSxDQUFBO0lBQ0QsT0FBTyxXQUFXLENBQUE7QUFDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRkaXIsIHJlYWRGaWxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcydcbmltcG9ydCB7IGJhc2VuYW1lLCBleHRuYW1lLCBqb2luLCByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gJ25vZGU6dXJsJ1xuaW1wb3J0IHsgSHR0cEhhbmRsZXJDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vaHR0cC5qcydcbmltcG9ydCB7IFBhY2thZ2VDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9yZWdpc3RyeS5qcydcblxudHlwZSBDUFUgPVxuICAgIHwgJ2FybSdcbiAgICB8ICdhcm02NCdcbiAgICB8ICdpYTMyJ1xuICAgIHwgJ21pcHMnXG4gICAgfCAnbWlwc2VsJ1xuICAgIHwgJ3BwYydcbiAgICB8ICdwcGM2NCdcbiAgICB8ICdzMzkwJ1xuICAgIHwgJ3MzOTB4J1xuICAgIHwgJ3gzMidcbiAgICB8ICd4NjQnXG50eXBlIENwdUNvbmZpZyA9IENQVSB8IGAhJHtDUFV9YFxudHlwZSBPU0NvbmZpZyA9IE5vZGVKUy5QbGF0Zm9ybSB8IGAhJHtOb2RlSlMuUGxhdGZvcm19YFxuXG5leHBvcnQgdHlwZSBQYWNrYWdlSnNvbkNvbmZpZ3VyYXRpb24gPSB7XG4gICAgbm9kZVZlcnNpb24/OiBzdHJpbmdcbiAgICBjcHVzPzogQ3B1Q29uZmlnW11cbiAgICBvcz86IE9TQ29uZmlnW11cbn1cblxuZXhwb3J0IHR5cGUgUmVmbGVjdGlvbiA9IHtcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBodHRwOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICBtZXRob2Q6IHN0cmluZ1xuICAgICAgICBwYXRoUGF0dGVybjogc3RyaW5nXG4gICAgICAgIHBhdGhSZWdFeHA6IFJlZ0V4cFxuICAgICAgICBjb25maWc6IEh0dHBIYW5kbGVyQ29uZmlndXJhdGlvbiAmIFBhY2thZ2VKc29uQ29uZmlndXJhdGlvblxuICAgIH1bXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNwdShjb25maWc6IFBhY2thZ2VKc29uQ29uZmlndXJhdGlvbiwgc3VwcG9ydGVkOiBDUFVbXSk6IENQVSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlU3VwcG9ydGVkKGNvbmZpZy5jcHVzLCBzdXBwb3J0ZWQpXG4gICAgaWYgKCFyZXNvbHZlZCkge1xuICAgICAgICAvLyByZXNvbHZlPFQ+KGNvbmZpZywgc3VwcG9ydGVkKSBhY3R1YWxseSBhc3NlcnRzIGNvbmZpZyBpcyAoVCB8IGAhJHtUfWApW10sIGJ1dCB0aGF0J3Mgbm90IHN1cHBvcnRlZCB5ZXQuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgQ1BVczogJyArIGNvbmZpZy5jcHVzIS5qb2luKCcsICcpKVxuICAgIH1cbiAgICByZXR1cm4gcmVzb2x2ZWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVPUyhcbiAgICBjb25maWc6IFBhY2thZ2VKc29uQ29uZmlndXJhdGlvbixcbiAgICBzdXBwb3J0ZWQ6IE5vZGVKUy5QbGF0Zm9ybVtdLFxuKTogTm9kZUpTLlBsYXRmb3JtIHtcbiAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVTdXBwb3J0ZWQoY29uZmlnLm9zLCBzdXBwb3J0ZWQpXG4gICAgaWYgKCFyZXNvbHZlZCkge1xuICAgICAgICAvLyByZXNvbHZlPFQ+KGNvbmZpZywgc3VwcG9ydGVkKSBhY3R1YWxseSBhc3NlcnRzIGNvbmZpZyBpcyAoVCB8IGAhJHtUfWApW10sIGJ1dCB0aGF0J3Mgbm90IHN1cHBvcnRlZCB5ZXQuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgb3BlcmF0aW5nIHN5c3RlbXM6ICcgKyBjb25maWcub3MhLmpvaW4oJywgJykpXG4gICAgfVxuICAgIHJldHVybiByZXNvbHZlZFxufVxuXG5mdW5jdGlvbiByZXNvbHZlU3VwcG9ydGVkPFQgZXh0ZW5kcyBzdHJpbmc+KFxuICAgIGNvbmZpZzogKFQgfCBgISR7VH1gKVtdIHwgdW5kZWZpbmVkLFxuICAgIHN1cHBvcnRlZDogVFtdLFxuKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIHN1cHBvcnRlZFswXVxuICAgIH1cbiAgICByZXR1cm4gc3VwcG9ydGVkLmZpbmQocyA9PiBjb25maWcuaW5jbHVkZXMocykgJiYgIWNvbmZpZy5pbmNsdWRlcyhgISR7c31gKSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlZmxlY3QocGF0aDogc3RyaW5nKTogUHJvbWlzZTxSZWZsZWN0aW9uPiB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkQ29uZmlnKClcbiAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSByZXNvbHZlKHByb2Nlc3MuY3dkKCksIHBhdGgpXG4gICAgY29uc3QgZmlsZXMgPSAoYXdhaXQgcmVhZGRpcihhYnNvbHV0ZVBhdGgpKS5maWx0ZXIoXG4gICAgICAgIGZpbGUgPT4gZXh0bmFtZShmaWxlKSA9PT0gJy50cycgJiYgIWZpbGUuZW5kc1dpdGgoJy5kLnRzJyksXG4gICAgKVxuICAgIGNvbnN0IHsgZ2V0SGFuZGxlcnMsIHNldE1ldGEgfSA9IChhd2FpdCBpbXBvcnQoXG4gICAgICAgIHBhdGhUb0ZpbGVVUkwoam9pbihhYnNvbHV0ZVBhdGgsICdub2RlX21vZHVsZXMvQHJpZGRhbmNlL2hvc3QvaG9zdC9yZWdpc3RyeS5qcycpKS50b1N0cmluZygpXG4gICAgKSkgYXMge1xuICAgICAgICBnZXRIYW5kbGVyczogKHR5cGU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgICBtZXRhPzogeyBmaWxlTmFtZTogc3RyaW5nIH1cbiAgICAgICAgICAgIGNvbmZpZzogSHR0cEhhbmRsZXJDb25maWd1cmF0aW9uXG4gICAgICAgICAgICBtZXRob2Q6IHN0cmluZ1xuICAgICAgICAgICAgcGF0aFBhdHRlcm46IHN0cmluZ1xuICAgICAgICAgICAgcGF0aFJlZ0V4cDogUmVnRXhwXG4gICAgICAgIH1bXVxuICAgICAgICBzZXRNZXRhOiAoXG4gICAgICAgICAgICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgZmlsZU5hbWU6IHN0cmluZyxcbiAgICAgICAgICAgIHJldjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgY2ZnOiBQYWNrYWdlQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgKSA9PiB2b2lkXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGNvbnN0IGJhc2UgPSBiYXNlbmFtZShmaWxlLCAnLnRzJylcbiAgICAgICAgc2V0TWV0YShwYWNrYWdlSnNvbi5uYW1lLCBiYXNlLCB1bmRlZmluZWQsIHBhY2thZ2VKc29uLmNvbmZpZylcbiAgICAgICAgYXdhaXQgaW1wb3J0KHBhdGhUb0ZpbGVVUkwoam9pbihhYnNvbHV0ZVBhdGgsIGJhc2UgKyAnLmpzJykpLnRvU3RyaW5nKCkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogcGFja2FnZUpzb24ubmFtZSxcbiAgICAgICAgaHR0cDogZ2V0SGFuZGxlcnMoJ2h0dHAnKS5tYXAoaCA9PiAoe1xuICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgLi4uaC5jb25maWcsXG4gICAgICAgICAgICAgICAgY3B1czogcGFja2FnZUpzb24uY3B1LFxuICAgICAgICAgICAgICAgIG9zOiBwYWNrYWdlSnNvbi5vcyxcbiAgICAgICAgICAgICAgICBub2RlVmVyc2lvbjogcGFja2FnZUpzb24uZW5naW5lcz8ubm9kZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuYW1lOiBoLm1ldGE/LmZpbGVOYW1lID8/ICcnLFxuICAgICAgICAgICAgbWV0aG9kOiBoLm1ldGhvZCxcbiAgICAgICAgICAgIHBhdGhQYXR0ZXJuOiBoLnBhdGhQYXR0ZXJuLFxuICAgICAgICAgICAgcGF0aFJlZ0V4cDogaC5wYXRoUmVnRXhwLFxuICAgICAgICB9KSksXG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkQ29uZmlnKCkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZSgncGFja2FnZS5qc29uJywgJ3V0Zi04JykpIGFzIHtcbiAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgIGVuZ2luZXM/OiB7IFtlbmdpbmU6IHN0cmluZ106IHN0cmluZyB9XG4gICAgICAgIGNwdT86IENwdUNvbmZpZ1tdXG4gICAgICAgIG9zPzogT1NDb25maWdbXVxuICAgICAgICBjb25maWc/OiBvYmplY3RcbiAgICB9XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uXG59XG4iXX0=
|
package/host/registry.d.ts
CHANGED
|
@@ -1,26 +1,27 @@
|
|
|
1
|
-
import { HandlerConfiguration } from '../context.js';
|
|
2
|
-
import { Handler } from '../http.js';
|
|
3
|
-
export
|
|
4
|
-
meta: Metadata | undefined;
|
|
5
|
-
config:
|
|
6
|
-
method: Method;
|
|
7
|
-
pathPattern: string;
|
|
8
|
-
pathRegExp: RegExp;
|
|
9
|
-
entry: Handler;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
http: HttpHandler;
|
|
13
|
-
}
|
|
14
|
-
export declare function getHandlers(type: keyof HandlerTypes): HttpHandler[];
|
|
15
|
-
export declare function
|
|
16
|
-
export
|
|
17
|
-
}
|
|
18
|
-
export
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
export
|
|
26
|
-
export
|
|
1
|
+
import { HandlerConfiguration } from '../context.js';
|
|
2
|
+
import { Handler } from '../http.js';
|
|
3
|
+
export type HttpHandler = {
|
|
4
|
+
meta: Metadata | undefined;
|
|
5
|
+
config: FullConfiguration | undefined;
|
|
6
|
+
method: Method;
|
|
7
|
+
pathPattern: string;
|
|
8
|
+
pathRegExp: RegExp;
|
|
9
|
+
entry: Handler;
|
|
10
|
+
};
|
|
11
|
+
type HandlerTypes = {
|
|
12
|
+
http: HttpHandler;
|
|
13
|
+
};
|
|
14
|
+
export declare function getHandlers(type: keyof HandlerTypes): HttpHandler[];
|
|
15
|
+
export declare function getHandler(type: keyof HandlerTypes): HttpHandler;
|
|
16
|
+
export declare function setMeta(packageName: string, fileName: string, revision: string | undefined, config: PackageConfiguration | undefined): void;
|
|
17
|
+
export type PackageConfiguration = HandlerConfiguration & {};
|
|
18
|
+
export type FullConfiguration = PackageConfiguration & HandlerConfiguration;
|
|
19
|
+
export type Metadata = {
|
|
20
|
+
packageName: string;
|
|
21
|
+
fileName: string;
|
|
22
|
+
revision: string | undefined;
|
|
23
|
+
config?: PackageConfiguration;
|
|
24
|
+
};
|
|
25
|
+
export type Method = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
26
|
+
export declare function registerHttpHandler(method: Method, path: string, configOrHandler: HandlerConfiguration | Handler, fn?: Handler): void;
|
|
27
|
+
export {};
|
package/host/registry.js
CHANGED
|
@@ -1,61 +1,73 @@
|
|
|
1
|
-
const handlers = {};
|
|
2
|
-
function addHandler(type, handler) {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
function
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
function
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
1
|
+
const handlers = {};
|
|
2
|
+
function addHandler(type, handler) {
|
|
3
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
4
|
+
;
|
|
5
|
+
(handlers[type] ??= []).push(handler);
|
|
6
|
+
}
|
|
7
|
+
export function getHandlers(type) {
|
|
8
|
+
return (handlers[type] ?? []);
|
|
9
|
+
}
|
|
10
|
+
export function getHandler(type) {
|
|
11
|
+
const hs = getHandlers(type);
|
|
12
|
+
const [handler] = hs;
|
|
13
|
+
if (!handler) {
|
|
14
|
+
throw new Error(`No ${type} handler registered.`);
|
|
15
|
+
}
|
|
16
|
+
if (hs.length !== 1) {
|
|
17
|
+
throw new Error(`Multiple ${type} handlers registered.`);
|
|
18
|
+
}
|
|
19
|
+
return handler;
|
|
20
|
+
}
|
|
21
|
+
let httpHostRegistry;
|
|
22
|
+
function setHttpHost(host) {
|
|
23
|
+
httpHostRegistry = host;
|
|
24
|
+
}
|
|
25
|
+
let metadata;
|
|
26
|
+
export function setMeta(packageName, fileName, revision, config) {
|
|
27
|
+
metadata = {
|
|
28
|
+
packageName,
|
|
29
|
+
fileName,
|
|
30
|
+
revision,
|
|
31
|
+
config,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function getMetadata() {
|
|
35
|
+
return metadata;
|
|
36
|
+
}
|
|
37
|
+
function pathToRegExp(path) {
|
|
38
|
+
return new RegExp(('^' +
|
|
39
|
+
path.replace(/[/\\^$+?.()|[\]{}]/gu, '\\$&').replaceAll('*', '[^/\\?]+') +
|
|
40
|
+
'(\\?.*)?$').replace('[^/\\?]+[^/\\?]+(\\?.*)?$', ''), 'u');
|
|
41
|
+
}
|
|
42
|
+
function combineConfig(base, override) {
|
|
43
|
+
if (base === undefined) {
|
|
44
|
+
return override;
|
|
45
|
+
}
|
|
46
|
+
else if (override === undefined) {
|
|
47
|
+
return base;
|
|
48
|
+
}
|
|
49
|
+
return { ...base, ...override };
|
|
50
|
+
}
|
|
51
|
+
function httpHost(meta, cfg, method, path, entry) {
|
|
52
|
+
addHandler('http', {
|
|
53
|
+
meta,
|
|
54
|
+
config: combineConfig(meta?.config, cfg),
|
|
55
|
+
method,
|
|
56
|
+
pathPattern: path,
|
|
57
|
+
pathRegExp: pathToRegExp(path),
|
|
58
|
+
entry,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
setHttpHost(httpHost);
|
|
62
|
+
export function registerHttpHandler(method, path, configOrHandler, fn) {
|
|
63
|
+
if (typeof configOrHandler === 'function') {
|
|
64
|
+
httpHostRegistry(getMetadata(), undefined, method, path, configOrHandler);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
if (!fn) {
|
|
68
|
+
throw new Error('Please provide a handler function.');
|
|
69
|
+
}
|
|
70
|
+
httpHostRegistry(getMetadata(), configOrHandler, method, path, fn);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJyZWdpc3RyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsTUFBTSxRQUFRLEdBQWlDLEVBQUUsQ0FBQTtBQUVqRCxTQUFTLFVBQVUsQ0FBQyxJQUF3QixFQUFFLE9BQW9CO0lBQzlELHVFQUF1RTtJQUN2RSxDQUFDO0lBQUEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQzFDLENBQUM7QUFFRCxNQUFNLFVBQVUsV0FBVyxDQUFDLElBQXdCO0lBQ2hELE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFrQixDQUFBO0FBQ2xELENBQUM7QUFFRCxNQUFNLFVBQVUsVUFBVSxDQUFDLElBQXdCO0lBQy9DLE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUM1QixNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFBO0lBQ3BCLElBQUksQ0FBQyxPQUFPLEVBQUU7UUFDVixNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxzQkFBc0IsQ0FBQyxDQUFBO0tBQ3BEO0lBQ0QsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLFlBQVksSUFBSSx1QkFBdUIsQ0FBQyxDQUFBO0tBQzNEO0lBQ0QsT0FBTyxPQUFPLENBQUE7QUFDbEIsQ0FBQztBQVVELElBQUksZ0JBQTBCLENBQUE7QUFFOUIsU0FBUyxXQUFXLENBQUMsSUFBYztJQUMvQixnQkFBZ0IsR0FBRyxJQUFJLENBQUE7QUFDM0IsQ0FBQztBQUVELElBQUksUUFBOEIsQ0FBQTtBQUVsQyxNQUFNLFVBQVUsT0FBTyxDQUNuQixXQUFtQixFQUNuQixRQUFnQixFQUNoQixRQUE0QixFQUM1QixNQUF3QztJQUV4QyxRQUFRLEdBQUc7UUFDUCxXQUFXO1FBQ1gsUUFBUTtRQUNSLFFBQVE7UUFDUixNQUFNO0tBQ1QsQ0FBQTtBQUNMLENBQUM7QUFpQkQsU0FBUyxXQUFXO0lBQ2hCLE9BQU8sUUFBUSxDQUFBO0FBQ25CLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxJQUFZO0lBQzlCLE9BQU8sSUFBSSxNQUFNLENBQ2IsQ0FDSSxHQUFHO1FBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxNQUFNLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQztRQUN4RSxXQUFXLENBQ2QsQ0FBQyxPQUFPLENBQUMsMkJBQTJCLEVBQUUsRUFBRSxDQUFDLEVBQzFDLEdBQUcsQ0FDTixDQUFBO0FBQ0wsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUNsQixJQUFzQyxFQUN0QyxRQUEwQztJQUcxQyxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7UUFDcEIsT0FBTyxRQUFRLENBQUE7S0FDbEI7U0FBTSxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7UUFDL0IsT0FBTyxJQUFJLENBQUE7S0FDZDtJQUNELE9BQU8sRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLFFBQVEsRUFBRSxDQUFBO0FBQ25DLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FDYixJQUEwQixFQUMxQixHQUFxQyxFQUNyQyxNQUFjLEVBQ2QsSUFBWSxFQUNaLEtBQWM7SUFFZCxVQUFVLENBQUMsTUFBTSxFQUFFO1FBQ2YsSUFBSTtRQUNKLE1BQU0sRUFBRSxhQUFhLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUM7UUFDeEMsTUFBTTtRQUNOLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFVBQVUsRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDO1FBQzlCLEtBQUs7S0FDUixDQUFDLENBQUE7QUFDTixDQUFDO0FBRUQsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0FBSXJCLE1BQU0sVUFBVSxtQkFBbUIsQ0FDL0IsTUFBYyxFQUNkLElBQVksRUFDWixlQUErQyxFQUMvQyxFQUFZO0lBRVosSUFBSSxPQUFPLGVBQWUsS0FBSyxVQUFVLEVBQUU7UUFDdkMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUE7S0FDNUU7U0FBTTtRQUNILElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDTCxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUE7U0FDeEQ7UUFDRCxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQTtLQUNyRTtBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIYW5kbGVyQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uL2NvbnRleHQuanMnXG5pbXBvcnQgeyBIYW5kbGVyIH0gZnJvbSAnLi4vaHR0cC5qcydcblxuZXhwb3J0IHR5cGUgSHR0cEhhbmRsZXIgPSB7XG4gICAgbWV0YTogTWV0YWRhdGEgfCB1bmRlZmluZWRcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR1cGxpY2F0ZS10eXBlLWNvbnN0aXR1ZW50c1xuICAgIGNvbmZpZzogRnVsbENvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWRcbiAgICBtZXRob2Q6IE1ldGhvZFxuICAgIHBhdGhQYXR0ZXJuOiBzdHJpbmdcbiAgICBwYXRoUmVnRXhwOiBSZWdFeHBcbiAgICBlbnRyeTogSGFuZGxlclxufVxuXG50eXBlIEhhbmRsZXJUeXBlcyA9IHtcbiAgICBodHRwOiBIdHRwSGFuZGxlclxufVxuXG5jb25zdCBoYW5kbGVyczogeyBba2V5OiBzdHJpbmddOiB1bmtub3duW10gfSA9IHt9XG5cbmZ1bmN0aW9uIGFkZEhhbmRsZXIodHlwZToga2V5b2YgSGFuZGxlclR5cGVzLCBoYW5kbGVyOiBIdHRwSGFuZGxlcikge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgOyhoYW5kbGVyc1t0eXBlXSA/Pz0gW10pLnB1c2goaGFuZGxlcilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEhhbmRsZXJzKHR5cGU6IGtleW9mIEhhbmRsZXJUeXBlcykge1xuICAgIHJldHVybiAoaGFuZGxlcnNbdHlwZV0gPz8gW10pIGFzIEh0dHBIYW5kbGVyW11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEhhbmRsZXIodHlwZToga2V5b2YgSGFuZGxlclR5cGVzKSB7XG4gICAgY29uc3QgaHMgPSBnZXRIYW5kbGVycyh0eXBlKVxuICAgIGNvbnN0IFtoYW5kbGVyXSA9IGhzXG4gICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gJHt0eXBlfSBoYW5kbGVyIHJlZ2lzdGVyZWQuYClcbiAgICB9XG4gICAgaWYgKGhzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE11bHRpcGxlICR7dHlwZX0gaGFuZGxlcnMgcmVnaXN0ZXJlZC5gKVxuICAgIH1cbiAgICByZXR1cm4gaGFuZGxlclxufVxuXG50eXBlIEh0dHBIb3N0ID0gKFxuICAgIG1ldGE6IE1ldGFkYXRhIHwgdW5kZWZpbmVkLFxuICAgIGNvbmZpZzogSGFuZGxlckNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQsXG4gICAgbWV0aG9kOiBNZXRob2QsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGhhbmRsZXI6IEhhbmRsZXIsXG4pID0+IHZvaWRcblxubGV0IGh0dHBIb3N0UmVnaXN0cnk6IEh0dHBIb3N0XG5cbmZ1bmN0aW9uIHNldEh0dHBIb3N0KGhvc3Q6IEh0dHBIb3N0KSB7XG4gICAgaHR0cEhvc3RSZWdpc3RyeSA9IGhvc3Rcbn1cblxubGV0IG1ldGFkYXRhOiBNZXRhZGF0YSB8IHVuZGVmaW5lZFxuXG5leHBvcnQgZnVuY3Rpb24gc2V0TWV0YShcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICAgIGZpbGVOYW1lOiBzdHJpbmcsXG4gICAgcmV2aXNpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBjb25maWc6IFBhY2thZ2VDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkLFxuKSB7XG4gICAgbWV0YWRhdGEgPSB7XG4gICAgICAgIHBhY2thZ2VOYW1lLFxuICAgICAgICBmaWxlTmFtZSxcbiAgICAgICAgcmV2aXNpb24sXG4gICAgICAgIGNvbmZpZyxcbiAgICB9XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktaW50ZXJmYWNlXG5leHBvcnQgdHlwZSBQYWNrYWdlQ29uZmlndXJhdGlvbiA9IEhhbmRsZXJDb25maWd1cmF0aW9uICYge1xuICAgIC8vIFBsYWNlaG9sZGVyIGZvciBwYWNrYWdlLWxldmVsIGNvbmZpZ3VyYXRpb25zXG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHVwbGljYXRlLXR5cGUtY29uc3RpdHVlbnRzXG5leHBvcnQgdHlwZSBGdWxsQ29uZmlndXJhdGlvbiA9IFBhY2thZ2VDb25maWd1cmF0aW9uICYgSGFuZGxlckNvbmZpZ3VyYXRpb25cblxuZXhwb3J0IHR5cGUgTWV0YWRhdGEgPSB7XG4gICAgcGFja2FnZU5hbWU6IHN0cmluZ1xuICAgIGZpbGVOYW1lOiBzdHJpbmdcbiAgICByZXZpc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgY29uZmlnPzogUGFja2FnZUNvbmZpZ3VyYXRpb25cbn1cblxuZnVuY3Rpb24gZ2V0TWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIG1ldGFkYXRhXG59XG5cbmZ1bmN0aW9uIHBhdGhUb1JlZ0V4cChwYXRoOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChcbiAgICAgICAgKFxuICAgICAgICAgICAgJ14nICtcbiAgICAgICAgICAgIHBhdGgucmVwbGFjZSgvWy9cXFxcXiQrPy4oKXxbXFxde31dL2d1LCAnXFxcXCQmJykucmVwbGFjZUFsbCgnKicsICdbXi9cXFxcP10rJykgK1xuICAgICAgICAgICAgJyhcXFxcPy4qKT8kJ1xuICAgICAgICApLnJlcGxhY2UoJ1teL1xcXFw/XStbXi9cXFxcP10rKFxcXFw/LiopPyQnLCAnJyksXG4gICAgICAgICd1JyxcbiAgICApXG59XG5cbmZ1bmN0aW9uIGNvbWJpbmVDb25maWcoXG4gICAgYmFzZTogUGFja2FnZUNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQsXG4gICAgb3ZlcnJpZGU6IEhhbmRsZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHVwbGljYXRlLXR5cGUtY29uc3RpdHVlbnRzXG4pOiBGdWxsQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGJhc2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gb3ZlcnJpZGVcbiAgICB9IGVsc2UgaWYgKG92ZXJyaWRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VcbiAgICB9XG4gICAgcmV0dXJuIHsgLi4uYmFzZSwgLi4ub3ZlcnJpZGUgfVxufVxuXG5mdW5jdGlvbiBodHRwSG9zdChcbiAgICBtZXRhOiBNZXRhZGF0YSB8IHVuZGVmaW5lZCxcbiAgICBjZmc6IEhhbmRsZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkLFxuICAgIG1ldGhvZDogTWV0aG9kLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBlbnRyeTogSGFuZGxlcixcbikge1xuICAgIGFkZEhhbmRsZXIoJ2h0dHAnLCB7XG4gICAgICAgIG1ldGEsXG4gICAgICAgIGNvbmZpZzogY29tYmluZUNvbmZpZyhtZXRhPy5jb25maWcsIGNmZyksXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgcGF0aFBhdHRlcm46IHBhdGgsXG4gICAgICAgIHBhdGhSZWdFeHA6IHBhdGhUb1JlZ0V4cChwYXRoKSxcbiAgICAgICAgZW50cnksXG4gICAgfSlcbn1cblxuc2V0SHR0cEhvc3QoaHR0cEhvc3QpXG5cbmV4cG9ydCB0eXBlIE1ldGhvZCA9ICdHRVQnIHwgJ1BPU1QnIHwgJ1BVVCcgfCAnUEFUQ0gnIHwgJ0RFTEVURSdcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVySHR0cEhhbmRsZXIoXG4gICAgbWV0aG9kOiBNZXRob2QsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGNvbmZpZ09ySGFuZGxlcjogSGFuZGxlckNvbmZpZ3VyYXRpb24gfCBIYW5kbGVyLFxuICAgIGZuPzogSGFuZGxlcixcbik6IHZvaWQge1xuICAgIGlmICh0eXBlb2YgY29uZmlnT3JIYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGh0dHBIb3N0UmVnaXN0cnkoZ2V0TWV0YWRhdGEoKSwgdW5kZWZpbmVkLCBtZXRob2QsIHBhdGgsIGNvbmZpZ09ySGFuZGxlcilcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIWZuKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSBwcm92aWRlIGEgaGFuZGxlciBmdW5jdGlvbi4nKVxuICAgICAgICB9XG4gICAgICAgIGh0dHBIb3N0UmVnaXN0cnkoZ2V0TWV0YWRhdGEoKSwgY29uZmlnT3JIYW5kbGVyLCBtZXRob2QsIHBhdGgsIGZuKVxuICAgIH1cbn1cbiJdfQ==
|
package/http.d.ts
CHANGED
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
-
import type { UrlWithParsedQuery } from 'node:url';
|
|
3
|
-
import { Context, HandlerConfiguration, Json } from './context.js';
|
|
4
|
-
export * from './context.js';
|
|
5
|
-
export
|
|
6
|
-
[key: string]: string;
|
|
7
|
-
}
|
|
8
|
-
export
|
|
9
|
-
headers?: ResponseHeaders;
|
|
10
|
-
status?: number;
|
|
11
|
-
body?: unknown;
|
|
12
|
-
}
|
|
13
|
-
export type Result = void | string | FullResult;
|
|
14
|
-
export
|
|
15
|
-
readonly rawUrl: string;
|
|
16
|
-
readonly url: Readonly<UrlWithParsedQuery> & {
|
|
17
|
-
pathStepAt: (index: number) => string;
|
|
18
|
-
};
|
|
19
|
-
readonly headers: Readonly<ResponseHeaders>;
|
|
20
|
-
readonly body?: Json | string;
|
|
21
|
-
}
|
|
22
|
-
export
|
|
23
|
-
/**
|
|
24
|
-
* A string identifying which domains can access the endpoint cross-origin.
|
|
25
|
-
* @default undefined
|
|
26
|
-
*/
|
|
27
|
-
readonly cors?: string;
|
|
28
|
-
}
|
|
29
|
-
export type Handler = (context: Context, request: HttpRequest) => Promise<Result> | Result;
|
|
30
|
-
export declare function get(path: string, fn: Handler): void;
|
|
31
|
-
export declare function get(path: string, config: HttpHandlerConfiguration, fn: Handler): void;
|
|
32
|
-
export declare function post(path: string, fn: Handler): void;
|
|
33
|
-
export declare function post(path: string, config: HttpHandlerConfiguration, fn: Handler): void;
|
|
34
|
-
export declare function put(path: string, fn: Handler): void;
|
|
35
|
-
export declare function put(path: string, config: HttpHandlerConfiguration, fn: Handler): void;
|
|
36
|
-
export declare function patch(path: string, fn: Handler): void;
|
|
37
|
-
export declare function patch(path: string, config: HttpHandlerConfiguration, fn: Handler): void;
|
|
38
|
-
export declare function del(path: string, fn: Handler): void;
|
|
39
|
-
export declare function del(path: string, config: HttpHandlerConfiguration, fn: Handler): void;
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
import type { UrlWithParsedQuery } from 'node:url';
|
|
3
|
+
import { Context, HandlerConfiguration, Json } from './context.js';
|
|
4
|
+
export * from './context.js';
|
|
5
|
+
export type ResponseHeaders = {
|
|
6
|
+
[key: string]: string;
|
|
7
|
+
};
|
|
8
|
+
export type FullResult = {
|
|
9
|
+
headers?: ResponseHeaders;
|
|
10
|
+
status?: number;
|
|
11
|
+
body?: unknown;
|
|
12
|
+
};
|
|
13
|
+
export type Result = void | string | FullResult;
|
|
14
|
+
export type HttpRequest = {
|
|
15
|
+
readonly rawUrl: string;
|
|
16
|
+
readonly url: Readonly<UrlWithParsedQuery> & {
|
|
17
|
+
pathStepAt: (index: number) => string;
|
|
18
|
+
};
|
|
19
|
+
readonly headers: Readonly<ResponseHeaders>;
|
|
20
|
+
readonly body?: Json | string;
|
|
21
|
+
};
|
|
22
|
+
export type HttpHandlerConfiguration = HandlerConfiguration & {
|
|
23
|
+
/**
|
|
24
|
+
* A string identifying which domains can access the endpoint cross-origin.
|
|
25
|
+
* @default undefined
|
|
26
|
+
*/
|
|
27
|
+
readonly cors?: string;
|
|
28
|
+
};
|
|
29
|
+
export type Handler = (context: Context, request: HttpRequest) => Promise<Result> | Result;
|
|
30
|
+
export declare function get(path: string, fn: Handler): void;
|
|
31
|
+
export declare function get(path: string, config: HttpHandlerConfiguration, fn: Handler): void;
|
|
32
|
+
export declare function post(path: string, fn: Handler): void;
|
|
33
|
+
export declare function post(path: string, config: HttpHandlerConfiguration, fn: Handler): void;
|
|
34
|
+
export declare function put(path: string, fn: Handler): void;
|
|
35
|
+
export declare function put(path: string, config: HttpHandlerConfiguration, fn: Handler): void;
|
|
36
|
+
export declare function patch(path: string, fn: Handler): void;
|
|
37
|
+
export declare function patch(path: string, config: HttpHandlerConfiguration, fn: Handler): void;
|
|
38
|
+
export declare function del(path: string, fn: Handler): void;
|
|
39
|
+
export declare function del(path: string, config: HttpHandlerConfiguration, fn: Handler): void;
|
package/http.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { registerHttpHandler } from './host/registry.js';
|
|
2
|
-
export * from './context.js';
|
|
3
|
-
export function get(path, configOrHandler, fn) {
|
|
4
|
-
registerHttpHandler('GET', path, configOrHandler, fn);
|
|
5
|
-
}
|
|
6
|
-
export function post(path, configOrHandler, fn) {
|
|
7
|
-
registerHttpHandler('POST', path, configOrHandler, fn);
|
|
8
|
-
}
|
|
9
|
-
export function put(path, configOrHandler, fn) {
|
|
10
|
-
registerHttpHandler('PUT', path, configOrHandler, fn);
|
|
11
|
-
}
|
|
12
|
-
export function patch(path, configOrHandler, fn) {
|
|
13
|
-
registerHttpHandler('PATCH', path, configOrHandler, fn);
|
|
14
|
-
}
|
|
15
|
-
export function del(path, configOrHandler, fn) {
|
|
16
|
-
registerHttpHandler('DELETE', path, configOrHandler, fn);
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
import { registerHttpHandler } from './host/registry.js';
|
|
2
|
+
export * from './context.js';
|
|
3
|
+
export function get(path, configOrHandler, fn) {
|
|
4
|
+
registerHttpHandler('GET', path, configOrHandler, fn);
|
|
5
|
+
}
|
|
6
|
+
export function post(path, configOrHandler, fn) {
|
|
7
|
+
registerHttpHandler('POST', path, configOrHandler, fn);
|
|
8
|
+
}
|
|
9
|
+
export function put(path, configOrHandler, fn) {
|
|
10
|
+
registerHttpHandler('PUT', path, configOrHandler, fn);
|
|
11
|
+
}
|
|
12
|
+
export function patch(path, configOrHandler, fn) {
|
|
13
|
+
registerHttpHandler('PATCH', path, configOrHandler, fn);
|
|
14
|
+
}
|
|
15
|
+
export function del(path, configOrHandler, fn) {
|
|
16
|
+
registerHttpHandler('DELETE', path, configOrHandler, fn);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImh0dHAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFFeEQsY0FBYyxjQUFjLENBQUE7QUFpQzVCLE1BQU0sVUFBVSxHQUFHLENBQ2YsSUFBWSxFQUNaLGVBQW1ELEVBQ25ELEVBQVk7SUFFWixtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQTtBQUN6RCxDQUFDO0FBR0QsTUFBTSxVQUFVLElBQUksQ0FDaEIsSUFBWSxFQUNaLGVBQW1ELEVBQ25ELEVBQVk7SUFFWixtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQTtBQUMxRCxDQUFDO0FBR0QsTUFBTSxVQUFVLEdBQUcsQ0FDZixJQUFZLEVBQ1osZUFBbUQsRUFDbkQsRUFBWTtJQUVaLG1CQUFtQixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0FBQ3pELENBQUM7QUFHRCxNQUFNLFVBQVUsS0FBSyxDQUNqQixJQUFZLEVBQ1osZUFBbUQsRUFDbkQsRUFBWTtJQUVaLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0FBQzNELENBQUM7QUFHRCxNQUFNLFVBQVUsR0FBRyxDQUNmLElBQVksRUFDWixlQUFtRCxFQUNuRCxFQUFZO0lBRVosbUJBQW1CLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsRUFBRSxDQUFDLENBQUE7QUFDNUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgVXJsV2l0aFBhcnNlZFF1ZXJ5IH0gZnJvbSAnbm9kZTp1cmwnXG5pbXBvcnQgeyBDb250ZXh0LCBIYW5kbGVyQ29uZmlndXJhdGlvbiwgSnNvbiB9IGZyb20gJy4vY29udGV4dC5qcydcbmltcG9ydCB7IHJlZ2lzdGVySHR0cEhhbmRsZXIgfSBmcm9tICcuL2hvc3QvcmVnaXN0cnkuanMnXG5cbmV4cG9ydCAqIGZyb20gJy4vY29udGV4dC5qcydcblxuZXhwb3J0IHR5cGUgUmVzcG9uc2VIZWFkZXJzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBGdWxsUmVzdWx0ID0ge1xuICAgIGhlYWRlcnM/OiBSZXNwb25zZUhlYWRlcnNcbiAgICBzdGF0dXM/OiBudW1iZXJcbiAgICBib2R5PzogdW5rbm93blxufVxuXG5leHBvcnQgdHlwZSBSZXN1bHQgPSB2b2lkIHwgc3RyaW5nIHwgRnVsbFJlc3VsdFxuXG5leHBvcnQgdHlwZSBIdHRwUmVxdWVzdCA9IHtcbiAgICByZWFkb25seSByYXdVcmw6IHN0cmluZ1xuICAgIHJlYWRvbmx5IHVybDogUmVhZG9ubHk8VXJsV2l0aFBhcnNlZFF1ZXJ5PiAmIHsgcGF0aFN0ZXBBdDogKGluZGV4OiBudW1iZXIpID0+IHN0cmluZyB9XG4gICAgcmVhZG9ubHkgaGVhZGVyczogUmVhZG9ubHk8UmVzcG9uc2VIZWFkZXJzPlxuICAgIHJlYWRvbmx5IGJvZHk/OiBKc29uIHwgc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIEh0dHBIYW5kbGVyQ29uZmlndXJhdGlvbiA9IEhhbmRsZXJDb25maWd1cmF0aW9uICYge1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIGlkZW50aWZ5aW5nIHdoaWNoIGRvbWFpbnMgY2FuIGFjY2VzcyB0aGUgZW5kcG9pbnQgY3Jvc3Mtb3JpZ2luLlxuICAgICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgICAqL1xuICAgIHJlYWRvbmx5IGNvcnM/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgSGFuZGxlciA9IChjb250ZXh0OiBDb250ZXh0LCByZXF1ZXN0OiBIdHRwUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXN1bHQ+IHwgUmVzdWx0XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXQocGF0aDogc3RyaW5nLCBmbjogSGFuZGxlcik6IHZvaWRcbmV4cG9ydCBmdW5jdGlvbiBnZXQocGF0aDogc3RyaW5nLCBjb25maWc6IEh0dHBIYW5kbGVyQ29uZmlndXJhdGlvbiwgZm46IEhhbmRsZXIpOiB2b2lkXG5leHBvcnQgZnVuY3Rpb24gZ2V0KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBjb25maWdPckhhbmRsZXI6IEh0dHBIYW5kbGVyQ29uZmlndXJhdGlvbiB8IEhhbmRsZXIsXG4gICAgZm4/OiBIYW5kbGVyLFxuKTogdm9pZCB7XG4gICAgcmVnaXN0ZXJIdHRwSGFuZGxlcignR0VUJywgcGF0aCwgY29uZmlnT3JIYW5kbGVyLCBmbilcbn1cbmV4cG9ydCBmdW5jdGlvbiBwb3N0KHBhdGg6IHN0cmluZywgZm46IEhhbmRsZXIpOiB2b2lkXG5leHBvcnQgZnVuY3Rpb24gcG9zdChwYXRoOiBzdHJpbmcsIGNvbmZpZzogSHR0cEhhbmRsZXJDb25maWd1cmF0aW9uLCBmbjogSGFuZGxlcik6IHZvaWRcbmV4cG9ydCBmdW5jdGlvbiBwb3N0KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBjb25maWdPckhhbmRsZXI6IEh0dHBIYW5kbGVyQ29uZmlndXJhdGlvbiB8IEhhbmRsZXIsXG4gICAgZm4/OiBIYW5kbGVyLFxuKTogdm9pZCB7XG4gICAgcmVnaXN0ZXJIdHRwSGFuZGxlcignUE9TVCcsIHBhdGgsIGNvbmZpZ09ySGFuZGxlciwgZm4pXG59XG5leHBvcnQgZnVuY3Rpb24gcHV0KHBhdGg6IHN0cmluZywgZm46IEhhbmRsZXIpOiB2b2lkXG5leHBvcnQgZnVuY3Rpb24gcHV0KHBhdGg6IHN0cmluZywgY29uZmlnOiBIdHRwSGFuZGxlckNvbmZpZ3VyYXRpb24sIGZuOiBIYW5kbGVyKTogdm9pZFxuZXhwb3J0IGZ1bmN0aW9uIHB1dChcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgY29uZmlnT3JIYW5kbGVyOiBIdHRwSGFuZGxlckNvbmZpZ3VyYXRpb24gfCBIYW5kbGVyLFxuICAgIGZuPzogSGFuZGxlcixcbik6IHZvaWQge1xuICAgIHJlZ2lzdGVySHR0cEhhbmRsZXIoJ1BVVCcsIHBhdGgsIGNvbmZpZ09ySGFuZGxlciwgZm4pXG59XG5leHBvcnQgZnVuY3Rpb24gcGF0Y2gocGF0aDogc3RyaW5nLCBmbjogSGFuZGxlcik6IHZvaWRcbmV4cG9ydCBmdW5jdGlvbiBwYXRjaChwYXRoOiBzdHJpbmcsIGNvbmZpZzogSHR0cEhhbmRsZXJDb25maWd1cmF0aW9uLCBmbjogSGFuZGxlcik6IHZvaWRcbmV4cG9ydCBmdW5jdGlvbiBwYXRjaChcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgY29uZmlnT3JIYW5kbGVyOiBIdHRwSGFuZGxlckNvbmZpZ3VyYXRpb24gfCBIYW5kbGVyLFxuICAgIGZuPzogSGFuZGxlcixcbik6IHZvaWQge1xuICAgIHJlZ2lzdGVySHR0cEhhbmRsZXIoJ1BBVENIJywgcGF0aCwgY29uZmlnT3JIYW5kbGVyLCBmbilcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWwocGF0aDogc3RyaW5nLCBmbjogSGFuZGxlcik6IHZvaWRcbmV4cG9ydCBmdW5jdGlvbiBkZWwocGF0aDogc3RyaW5nLCBjb25maWc6IEh0dHBIYW5kbGVyQ29uZmlndXJhdGlvbiwgZm46IEhhbmRsZXIpOiB2b2lkXG5leHBvcnQgZnVuY3Rpb24gZGVsKFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBjb25maWdPckhhbmRsZXI6IEh0dHBIYW5kbGVyQ29uZmlndXJhdGlvbiB8IEhhbmRsZXIsXG4gICAgZm4/OiBIYW5kbGVyLFxuKTogdm9pZCB7XG4gICAgcmVnaXN0ZXJIdHRwSGFuZGxlcignREVMRVRFJywgcGF0aCwgY29uZmlnT3JIYW5kbGVyLCBmbilcbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@riddance/host",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.13",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"engines": {
|
|
7
|
-
"node": ">=
|
|
7
|
+
"node": ">=18"
|
|
8
8
|
},
|
|
9
9
|
"keywords": [
|
|
10
10
|
"riddance",
|
|
@@ -29,10 +29,13 @@
|
|
|
29
29
|
"./http": "./host/http.js"
|
|
30
30
|
},
|
|
31
31
|
"scripts": {
|
|
32
|
-
"
|
|
33
|
-
"
|
|
32
|
+
"start": "riddance-watch",
|
|
33
|
+
"prepack": "riddance-build",
|
|
34
|
+
"prepublishOnly": "riddance-prepublish",
|
|
35
|
+
"postpublish": "riddance-sync"
|
|
34
36
|
},
|
|
35
37
|
"devDependencies": {
|
|
36
|
-
"@riddance/env": "0.
|
|
37
|
-
}
|
|
38
|
-
|
|
38
|
+
"@riddance/env": "0.4.3"
|
|
39
|
+
},
|
|
40
|
+
"gitHead": "8f6355e2dd0a0881e596de90c2898c64107e1c7b"
|
|
41
|
+
}
|