@xyo-network/bridge-http 2.108.0 → 2.109.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/dist/browser/HttpBridgeFull.d.cts +11 -4
- package/dist/browser/HttpBridgeFull.d.cts.map +1 -1
- package/dist/browser/HttpBridgeFull.d.mts +11 -4
- package/dist/browser/HttpBridgeFull.d.mts.map +1 -1
- package/dist/browser/HttpBridgeFull.d.ts +11 -4
- package/dist/browser/HttpBridgeFull.d.ts.map +1 -1
- package/dist/browser/index-browser.cjs +1 -1
- package/dist/browser/index-browser.cjs.map +1 -1
- package/dist/browser/index-browser.js +1 -1
- package/dist/browser/index-browser.js.map +1 -1
- package/dist/neutral/HttpBridgeFull.d.cts +11 -4
- package/dist/neutral/HttpBridgeFull.d.cts.map +1 -1
- package/dist/neutral/HttpBridgeFull.d.mts +11 -4
- package/dist/neutral/HttpBridgeFull.d.mts.map +1 -1
- package/dist/neutral/HttpBridgeFull.d.ts +11 -4
- package/dist/neutral/HttpBridgeFull.d.ts.map +1 -1
- package/dist/neutral/index-browser.cjs +1 -1
- package/dist/neutral/index-browser.cjs.map +1 -1
- package/dist/neutral/index-browser.js +1 -1
- package/dist/neutral/index-browser.js.map +1 -1
- package/dist/node/HttpBridgeFull.d.cts +11 -4
- package/dist/node/HttpBridgeFull.d.cts.map +1 -1
- package/dist/node/HttpBridgeFull.d.mts +11 -4
- package/dist/node/HttpBridgeFull.d.mts.map +1 -1
- package/dist/node/HttpBridgeFull.d.ts +11 -4
- package/dist/node/HttpBridgeFull.d.ts.map +1 -1
- package/dist/node/index.cjs +90 -39
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +90 -39
- package/dist/node/index.js.map +1 -1
- package/package.json +30 -26
- package/src/HttpBridgeFull.ts +125 -44
- package/src/HttpBridgeModuleResolver.ts +1 -1
package/dist/node/index.cjs
CHANGED
|
@@ -47,9 +47,12 @@ var HttpBridgeConfigSchema = "network.xyo.bridge.http.config";
|
|
|
47
47
|
var import_assert4 = require("@xylabs/assert");
|
|
48
48
|
var import_exists3 = require("@xylabs/exists");
|
|
49
49
|
var import_object2 = require("@xylabs/object");
|
|
50
|
+
var import_sdk_api_express_ecs = require("@xylabs/sdk-api-express-ecs");
|
|
50
51
|
var import_boundwitness_model = require("@xyo-network/boundwitness-model");
|
|
52
|
+
var import_express_node_middleware = require("@xyo-network/express-node-middleware");
|
|
51
53
|
var import_module_model4 = require("@xyo-network/module-model");
|
|
52
54
|
var import_express = __toESM(require("express"), 1);
|
|
55
|
+
var import_http_status_codes = require("http-status-codes");
|
|
53
56
|
|
|
54
57
|
// src/HttpBridgeBase.ts
|
|
55
58
|
var import_assert3 = require("@xylabs/assert");
|
|
@@ -184,7 +187,7 @@ var _HttpBridgeModuleResolver = class _HttpBridgeModuleResolver extends import_b
|
|
|
184
187
|
return;
|
|
185
188
|
}
|
|
186
189
|
}
|
|
187
|
-
const account = import_account.Account.
|
|
190
|
+
const account = await import_account.Account.random();
|
|
188
191
|
const finalParams = {
|
|
189
192
|
account,
|
|
190
193
|
archiving: this.params.archiving,
|
|
@@ -436,20 +439,12 @@ var _HttpBridge = class _HttpBridge extends HttpBridgeBase {
|
|
|
436
439
|
_exposedModules = [];
|
|
437
440
|
_server;
|
|
438
441
|
get app() {
|
|
439
|
-
this._app
|
|
440
|
-
|
|
441
|
-
app.use(import_express.default.json());
|
|
442
|
-
app.post("/", (req, res) => {
|
|
443
|
-
this.handlePost(req, res);
|
|
444
|
-
});
|
|
445
|
-
return app;
|
|
446
|
-
})();
|
|
447
|
-
return this._app;
|
|
442
|
+
if (!this._app) this._app = this.initializeApp();
|
|
443
|
+
return (0, import_assert4.assertEx)(this._app, () => "App not initialized");
|
|
448
444
|
}
|
|
449
445
|
async exposeChild(mod, options) {
|
|
450
446
|
var _a, _b;
|
|
451
447
|
const { maxDepth = 5 } = options ?? {};
|
|
452
|
-
console.log(`exposeChild: ${mod.address} ${mod == null ? void 0 : mod.id} ${maxDepth}`);
|
|
453
448
|
(0, import_assert4.assertEx)(this.config.host, () => "Not configured as a host");
|
|
454
449
|
this._exposedModules.push(new WeakRef(mod));
|
|
455
450
|
const children = maxDepth > 0 ? await ((_a = mod.publicChildren) == null ? void 0 : _a.call(mod)) ?? [] : [];
|
|
@@ -468,7 +463,6 @@ var _HttpBridge = class _HttpBridge extends HttpBridgeBase {
|
|
|
468
463
|
async exposeHandler(address, options) {
|
|
469
464
|
const { required = true } = options ?? {};
|
|
470
465
|
const mod = await (0, import_module_model4.resolveAddressToInstanceUp)(this, address);
|
|
471
|
-
console.log(`exposeHandler: ${address} ${mod == null ? void 0 : mod.id}`);
|
|
472
466
|
if (required && !mod) {
|
|
473
467
|
throw new Error(`Unable to find required module: ${address}`);
|
|
474
468
|
}
|
|
@@ -484,10 +478,10 @@ var _HttpBridge = class _HttpBridge extends HttpBridgeBase {
|
|
|
484
478
|
}).filter(import_exists3.exists);
|
|
485
479
|
}
|
|
486
480
|
async startHandler() {
|
|
487
|
-
return await super.startHandler() && this.startHttpServer();
|
|
481
|
+
return await super.startHandler() && await this.startHttpServer();
|
|
488
482
|
}
|
|
489
483
|
async stopHandler(_timeout) {
|
|
490
|
-
return await super.stopHandler() && this.stopHttpServer();
|
|
484
|
+
return await super.stopHandler() && await this.stopHttpServer();
|
|
491
485
|
}
|
|
492
486
|
async unexposeHandler(address, options) {
|
|
493
487
|
var _a, _b;
|
|
@@ -521,31 +515,77 @@ var _HttpBridge = class _HttpBridge extends HttpBridgeBase {
|
|
|
521
515
|
var _a2;
|
|
522
516
|
return ((_a2 = ref.deref()) == null ? void 0 : _a2.address) === address;
|
|
523
517
|
})) == null ? void 0 : _a.deref();
|
|
524
|
-
|
|
525
|
-
|
|
518
|
+
return mod ? await mod.query(query, payloads) : null;
|
|
519
|
+
}
|
|
520
|
+
async handleGet(req, res) {
|
|
521
|
+
var _a;
|
|
522
|
+
const { address } = req.params;
|
|
523
|
+
try {
|
|
524
|
+
if (address == this.address) {
|
|
525
|
+
res.json(await this.stateQuery(this.account));
|
|
526
|
+
} else {
|
|
527
|
+
const mod = (_a = this._exposedModules.find((ref) => {
|
|
528
|
+
var _a2;
|
|
529
|
+
return ((_a2 = ref.deref()) == null ? void 0 : _a2.address) === address;
|
|
530
|
+
})) == null ? void 0 : _a.deref();
|
|
531
|
+
if (mod) {
|
|
532
|
+
res.json(await mod.stateQuery(this.account));
|
|
533
|
+
} else {
|
|
534
|
+
res.status(import_http_status_codes.StatusCodes.NOT_FOUND).json({
|
|
535
|
+
error: "Module not found"
|
|
536
|
+
});
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
} catch (ex) {
|
|
540
|
+
res.status(import_http_status_codes.StatusCodes.INTERNAL_SERVER_ERROR).json({
|
|
541
|
+
error: ex.message
|
|
542
|
+
});
|
|
526
543
|
}
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
const
|
|
531
|
-
const query =
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
544
|
+
}
|
|
545
|
+
async handlePost(req, res) {
|
|
546
|
+
const { address } = req.params;
|
|
547
|
+
const [bw, payloads = []] = Array.isArray(req.body) ? req.body : [];
|
|
548
|
+
const query = (0, import_boundwitness_model.isQueryBoundWitness)(bw) ? bw : void 0;
|
|
549
|
+
if (!query) {
|
|
550
|
+
res.status(import_http_status_codes.StatusCodes.BAD_REQUEST).json({
|
|
551
|
+
error: "No query provided"
|
|
552
|
+
});
|
|
553
|
+
return;
|
|
554
|
+
}
|
|
555
|
+
try {
|
|
556
|
+
if (address == this.address) {
|
|
557
|
+
const result = await this.query(query, payloads);
|
|
558
|
+
return res.json(result);
|
|
538
559
|
} else {
|
|
539
|
-
const
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
560
|
+
const result = await this.callLocalModule(address, query, payloads);
|
|
561
|
+
if (result === null) {
|
|
562
|
+
res.status(import_http_status_codes.StatusCodes.NOT_FOUND).json({
|
|
563
|
+
error: "Module not found"
|
|
564
|
+
});
|
|
565
|
+
} else {
|
|
566
|
+
res.json(result);
|
|
567
|
+
}
|
|
543
568
|
}
|
|
544
|
-
}
|
|
545
|
-
res.status(
|
|
569
|
+
} catch (ex) {
|
|
570
|
+
res.status(import_http_status_codes.StatusCodes.INTERNAL_SERVER_ERROR).json({
|
|
546
571
|
error: ex.message
|
|
547
572
|
});
|
|
548
|
-
}
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
initializeApp() {
|
|
576
|
+
const app = (0, import_express.default)();
|
|
577
|
+
app.use(import_sdk_api_express_ecs.responseProfiler);
|
|
578
|
+
app.use(import_sdk_api_express_ecs.jsonBodyParser);
|
|
579
|
+
app.use(import_express_node_middleware.standardResponses);
|
|
580
|
+
(0, import_sdk_api_express_ecs.disableExpressDefaultPoweredByHeader)(app);
|
|
581
|
+
app.use(import_sdk_api_express_ecs.customPoweredByHeader);
|
|
582
|
+
(0, import_sdk_api_express_ecs.disableCaseSensitiveRouting)(app);
|
|
583
|
+
(0, import_sdk_api_express_ecs.useRequestCounters)(app);
|
|
584
|
+
app.get("/", (_req, res) => res.redirect(import_http_status_codes.StatusCodes.MOVED_TEMPORARILY, `/${this.address}`));
|
|
585
|
+
app.post("/", (_req, res) => res.redirect(import_http_status_codes.StatusCodes.TEMPORARY_REDIRECT, `/${this.address}`));
|
|
586
|
+
app.get("/:address", (0, import_sdk_api_express_ecs.asyncHandler)(async (req, res) => await this.handleGet(req, res)));
|
|
587
|
+
app.post("/:address", (0, import_sdk_api_express_ecs.asyncHandler)(async (req, res) => await this.handlePost(req, res)));
|
|
588
|
+
return app;
|
|
549
589
|
}
|
|
550
590
|
startHttpServer() {
|
|
551
591
|
var _a;
|
|
@@ -553,13 +593,24 @@ var _HttpBridge = class _HttpBridge extends HttpBridgeBase {
|
|
|
553
593
|
(0, import_assert4.assertEx)(!this._server, () => "Server already started");
|
|
554
594
|
this._server = this.app.listen(((_a = this.config.host) == null ? void 0 : _a.port) ?? 3030);
|
|
555
595
|
}
|
|
556
|
-
return true;
|
|
596
|
+
return Promise.resolve(true);
|
|
557
597
|
}
|
|
558
598
|
stopHttpServer() {
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
599
|
+
if (this.config.host) {
|
|
600
|
+
return new Promise((resolve, reject) => {
|
|
601
|
+
if (this._server) {
|
|
602
|
+
this._server.close((err) => {
|
|
603
|
+
if (err) {
|
|
604
|
+
reject(err);
|
|
605
|
+
} else {
|
|
606
|
+
this._server = void 0;
|
|
607
|
+
resolve(true);
|
|
608
|
+
}
|
|
609
|
+
});
|
|
610
|
+
}
|
|
611
|
+
});
|
|
612
|
+
}
|
|
613
|
+
return Promise.resolve(true);
|
|
563
614
|
}
|
|
564
615
|
};
|
|
565
616
|
__name(_HttpBridge, "HttpBridge");
|
package/dist/node/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/HttpBridgeConfig.ts","../../src/HttpBridgeFull.ts","../../src/HttpBridgeBase.ts","../../src/HttpBridgeModuleResolver.ts","../../src/ModuleProxy/ModuleProxy.ts"],"sourcesContent":["export * from './HttpBridgeConfig'\nexport * from './HttpBridgeFull'\n","import { EmptyObject } from '@xylabs/object'\nimport { BridgeConfig } from '@xyo-network/bridge-model'\n\nexport type HttpBridgeConfigSchema = 'network.xyo.bridge.http.config'\nexport const HttpBridgeConfigSchema: HttpBridgeConfigSchema = 'network.xyo.bridge.http.config'\n\nexport type HttpBridgeConfig<TConfig extends EmptyObject = EmptyObject, TSchema extends string | void = void> = BridgeConfig<\n {\n client?: BridgeConfig['client'] & {\n url: string\n }\n failureRetryTime?: number\n failureTimeCacheMax?: number\n host?: {\n port: number\n }\n maxConnections?: number\n maxPayloadSizeWarning?: number\n /** @deprecated use client.url instead */\n nodeUrl?: string\n schema: HttpBridgeConfigSchema\n } & TConfig,\n TSchema extends string ? TSchema : HttpBridgeConfigSchema\n>\n","import { Server } from 'node:http'\n\nimport { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { toJsonString } from '@xylabs/object'\nimport { ApiEnvelopeSuccess } from '@xyo-network/api-models'\nimport { isQueryBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BridgeExposeOptions, BridgeParams, BridgeUnexposeOptions } from '@xyo-network/bridge-model'\nimport { AnyConfigSchema, creatableModule, ModuleInstance, ModuleQueryResult, resolveAddressToInstanceUp } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport express, { Application, Request, Response } from 'express'\n\nimport { HttpBridgeBase } from './HttpBridgeBase'\nimport { HttpBridgeConfig } from './HttpBridgeConfig'\n\nexport interface HttpBridgeParams extends BridgeParams<AnyConfigSchema<HttpBridgeConfig>> {}\n\n@creatableModule()\nexport class HttpBridge<TParams extends HttpBridgeParams> extends HttpBridgeBase<TParams> {\n protected _app?: Application\n protected _exposedModules: WeakRef<ModuleInstance>[] = []\n protected _server?: Server\n\n get app() {\n this._app =\n this._app ??\n (() => {\n const app = express()\n app.use(express.json())\n\n app.post<Payload[]>('/', (req, res) => {\n this.handlePost(req, res)\n })\n\n return app\n })()\n return this._app\n }\n\n async exposeChild(mod: ModuleInstance, options?: BridgeExposeOptions | undefined): Promise<ModuleInstance[]> {\n const { maxDepth = 5 } = options ?? {}\n console.log(`exposeChild: ${mod.address} ${mod?.id} ${maxDepth}`)\n assertEx(this.config.host, () => 'Not configured as a host')\n this._exposedModules.push(new WeakRef(mod))\n const children = maxDepth > 0 ? (await mod.publicChildren?.()) ?? [] : []\n this.logger.log(`childrenToExpose [${mod.id}][${mod.address}]: ${toJsonString(children.map((child) => child.id))}`)\n const exposedChildren = (await Promise.all(children.map((child) => this.exposeChild(child, { maxDepth: maxDepth - 1, required: false }))))\n .flat()\n .filter(exists)\n const allExposed = [mod, ...exposedChildren]\n\n for (const exposedMod of allExposed) this.logger?.log(`exposed: ${exposedMod.address} [${mod.id}]`)\n\n return allExposed\n }\n\n override async exposeHandler(address: Address, options?: BridgeExposeOptions | undefined): Promise<ModuleInstance[]> {\n const { required = true } = options ?? {}\n const mod = await resolveAddressToInstanceUp(this, address)\n console.log(`exposeHandler: ${address} ${mod?.id}`)\n if (required && !mod) {\n throw new Error(`Unable to find required module: ${address}`)\n }\n if (mod) {\n return this.exposeChild(mod, options)\n }\n return []\n }\n\n override exposedHandler(): Address[] {\n return this._exposedModules.map((ref) => ref.deref()?.address).filter(exists)\n }\n\n override async startHandler(): Promise<boolean> {\n return (await super.startHandler()) && this.startHttpServer()\n }\n\n override async stopHandler(_timeout?: number | undefined): Promise<boolean> {\n return (await super.stopHandler()) && this.stopHttpServer()\n }\n\n override async unexposeHandler(address: Address, options?: BridgeUnexposeOptions | undefined): Promise<ModuleInstance[]> {\n const { maxDepth = 2, required = true } = options ?? {}\n assertEx(this.config.host, () => 'Not configured as a host')\n const mod = this._exposedModules.find((ref) => ref.deref()?.address === address)?.deref()\n assertEx(!required || mod, () => `Module not exposed: ${address}`)\n this._exposedModules = this._exposedModules.filter((ref) => ref.deref()?.address !== address)\n if (mod) {\n const children = maxDepth > 0 ? (await mod.publicChildren?.()) ?? [] : []\n const exposedChildren = (\n await Promise.all(children.map((child) => this.unexposeHandler(child.address, { maxDepth: maxDepth - 1, required: false })))\n )\n .flat()\n .filter(exists)\n return [mod, ...exposedChildren]\n }\n return []\n }\n\n protected async callLocalModule(address: Address, query: QueryBoundWitness, payloads: Payload[]): Promise<ModuleQueryResult | null> {\n const mod = this._exposedModules.find((ref) => ref.deref()?.address === address)?.deref()\n if (mod) {\n return await mod.query(query, payloads)\n }\n return null\n }\n\n protected handlePost(req: Request<Payload[]>, res: Response) {\n const allPayloads = req.body as Payload[]\n const query = allPayloads.find(isQueryBoundWitness) as QueryBoundWitness\n const payloads = allPayloads.filter((payload) => !isQueryBoundWitness(payload))\n this.callLocalModule(req.route, query, payloads)\n .then((result) => {\n if (result === null) {\n res.status(404).json({ error: 'Module not found' })\n } else {\n const envelope = {\n data: result,\n } as ApiEnvelopeSuccess<ModuleQueryResult>\n res.json(envelope)\n }\n })\n .catch((ex) => {\n res.status(500).json({ error: (ex as Error).message })\n })\n }\n\n protected startHttpServer() {\n if (this.config.host) {\n assertEx(!this._server, () => 'Server already started')\n this._server = this.app.listen(this.config.host?.port ?? 3030)\n }\n return true\n }\n\n protected stopHttpServer() {\n const server = assertEx(this._server, () => 'Server not started')\n server.close()\n this._server = undefined\n return true\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { AxiosError, AxiosJson } from '@xylabs/axios'\nimport { exists } from '@xylabs/exists'\nimport { forget } from '@xylabs/forget'\nimport { Address } from '@xylabs/hex'\nimport { toJsonString } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport { ApiEnvelope } from '@xyo-network/api-models'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractBridge } from '@xyo-network/bridge-abstract'\nimport {\n BridgeExposeOptions,\n BridgeModule,\n BridgeParams,\n BridgeUnexposeOptions,\n QuerySendFinishedEventArgs,\n QuerySendStartedEventArgs,\n} from '@xyo-network/bridge-model'\nimport { ModuleManifestPayload, NodeManifestPayload, NodeManifestPayloadSchema } from '@xyo-network/manifest-model'\nimport {\n AnyConfigSchema,\n creatableModule,\n ModuleInstance,\n ModuleQueryResult,\n ModuleResolverInstance,\n ModuleStateQuery,\n ModuleStateQuerySchema,\n} from '@xyo-network/module-model'\nimport { asAttachableNodeInstance } from '@xyo-network/node-model'\nimport { isPayloadOfSchemaType, Payload, Schema, WithMeta } from '@xyo-network/payload-model'\nimport { Mutex, Semaphore } from 'async-mutex'\nimport { LRUCache } from 'lru-cache'\n\nimport { HttpBridgeConfig, HttpBridgeConfigSchema } from './HttpBridgeConfig'\nimport { HttpBridgeModuleResolver } from './HttpBridgeModuleResolver'\nimport { BridgeQuerySender } from './ModuleProxy'\n\nexport interface HttpBridgeParams extends BridgeParams<AnyConfigSchema<HttpBridgeConfig>> {\n axios?: AxiosJson\n}\n\n@creatableModule()\nexport class HttpBridgeBase<TParams extends HttpBridgeParams> extends AbstractBridge<TParams> implements BridgeModule<TParams>, BridgeQuerySender {\n static axios = new AxiosJson()\n static override readonly configSchemas: Schema[] = [...super.configSchemas, HttpBridgeConfigSchema]\n static override readonly defaultConfigSchema: Schema = HttpBridgeConfigSchema\n static defaultFailureRetryTime = 1000 * 60\n static defaultMaxConnections = 4\n static defaultMaxPayloadSizeWarning = 256 * 256\n static maxFailureCacheSize = 1000\n\n private _axios?: AxiosJson\n private _discoverRootsMutex = new Mutex()\n private _failureTimeCache = new LRUCache<Address, number>({ max: HttpBridgeBase.maxFailureCacheSize })\n private _querySemaphore?: Semaphore\n private _resolver?: HttpBridgeModuleResolver\n\n get axios() {\n this._axios = this._axios ?? this.params.axios ?? HttpBridgeBase.axios\n return this._axios\n }\n\n get clientUrl() {\n // eslint-disable-next-line deprecation/deprecation\n return assertEx(this.config.client?.url ?? this.config.nodeUrl, () => 'No Url Set')\n }\n\n get failureRetryTime() {\n return this.config.failureRetryTime ?? HttpBridgeBase.defaultFailureRetryTime\n }\n\n get maxConnections() {\n return this.config.maxConnections ?? HttpBridgeBase.defaultMaxConnections\n }\n\n get maxPayloadSizeWarning() {\n return this.config.maxPayloadSizeWarning ?? HttpBridgeBase.defaultMaxPayloadSizeWarning\n }\n\n get querySemaphore() {\n this._querySemaphore = this._querySemaphore ?? new Semaphore(this.maxConnections)\n return this._querySemaphore\n }\n\n override get resolver() {\n this._resolver =\n this._resolver ??\n new HttpBridgeModuleResolver({\n additionalSigners: this.additionalSigners,\n archiving: { ...this.archiving, resolveArchivists: this.resolveArchivingArchivists.bind(this) },\n bridge: this,\n onQuerySendFinished: (args: Omit<QuerySendFinishedEventArgs, 'mod'>) => {\n forget(this.emit('querySendFinished', { mod: this, ...args }))\n },\n onQuerySendStarted: (args: Omit<QuerySendStartedEventArgs, 'mod'>) => {\n forget(this.emit('querySendStarted', { mod: this, ...args }))\n },\n querySender: this,\n root: this,\n rootUrl: this.clientUrl,\n wrapperAccount: this.account,\n })\n return this._resolver\n }\n\n override exposeHandler(_id: string, _options?: BridgeExposeOptions | undefined): Promisable<ModuleInstance[]> {\n throw new Error('Unsupported')\n }\n\n override exposedHandler(): Promisable<Address[]> {\n throw new Error('Unsupported')\n }\n\n async getRoots(force?: boolean): Promise<ModuleInstance[]> {\n return await this._discoverRootsMutex.runExclusive(async () => {\n if (this._roots === undefined || force) {\n const state = await this.getRootState()\n this.logger?.debug(`HttpBridge:discoverRoots.state [${state?.length}]`)\n const nodeManifest = state?.find(isPayloadOfSchemaType<WithMeta<NodeManifestPayload>>(NodeManifestPayloadSchema))\n if (nodeManifest) {\n const mods = (await this.resolveRootNode(nodeManifest)).filter(exists)\n this.logger?.debug(`HttpBridge:discoverRoots [${mods.length}]`)\n this._roots = mods\n } else {\n this._roots = []\n }\n }\n return this._roots\n })\n }\n\n moduleUrl(address: Address) {\n return new URL(address, this.clientUrl)\n }\n\n async sendBridgeQuery<TOut extends Payload = Payload, TQuery extends QueryBoundWitness = QueryBoundWitness, TIn extends Payload = Payload>(\n targetAddress: Address,\n query: TQuery,\n payloads?: TIn[],\n ): Promise<ModuleQueryResult<TOut>> {\n const lastFailureTime = this._failureTimeCache.get(targetAddress)\n if (lastFailureTime !== undefined) {\n const now = Date.now()\n const timeSincePreviousFailure = now - lastFailureTime\n if (timeSincePreviousFailure > this.failureRetryTime) {\n throw new Error(`target module failed recently [${targetAddress}] [${timeSincePreviousFailure}ms ago]`)\n }\n this._failureTimeCache.delete(targetAddress)\n }\n try {\n await this.querySemaphore.acquire()\n const payloadSize = JSON.stringify([query, payloads]).length\n if (payloadSize > this.maxPayloadSizeWarning) {\n this.logger?.warn(\n `Large targetQuery being sent: ${payloadSize} bytes [${this.address}][${this.moduleAddress}] [${query.schema}] [${payloads?.length}]`,\n )\n }\n const moduleUrl = this.moduleUrl(targetAddress).href\n const result = await this.axios.post<ApiEnvelope<ModuleQueryResult<TOut>>>(moduleUrl, [query, payloads])\n if (result.status === 404) {\n throw `target module not found [${moduleUrl}] [${result.status}]`\n }\n if (result.status >= 400) {\n this.logger?.error(`targetQuery failed [${moduleUrl}]`)\n throw `targetQuery failed [${moduleUrl}] [${result.status}]`\n }\n return result.data?.data\n } catch (ex) {\n const error = ex as AxiosError\n this.logger?.error(`Error: ${toJsonString(error)}`)\n throw error\n } finally {\n this.querySemaphore.release()\n }\n }\n\n override unexposeHandler(_id: string, _options?: BridgeUnexposeOptions | undefined): Promisable<ModuleInstance[]> {\n throw new Error('Unsupported')\n }\n\n private async getRootState() {\n const queryPayload: ModuleStateQuery = { schema: ModuleStateQuerySchema }\n const boundQuery = await this.bindQuery(queryPayload)\n try {\n const response = await this.axios.post<ApiEnvelope<ModuleQueryResult>>(this.clientUrl.toString(), boundQuery)\n if (response.status === 404) {\n return []\n }\n const [, payloads, errors] = response.data.data\n if (errors.length > 0) {\n throw new Error(`getRootState failed: ${JSON.stringify(errors, null, 2)}`)\n }\n return payloads\n } catch (ex) {\n const error = ex as Error\n this.logger?.warn(`Unable to connect to remote node: ${error.message} [${this.clientUrl}]`)\n }\n }\n\n private async resolveRootNode(nodeManifest: ModuleManifestPayload): Promise<ModuleInstance[]> {\n const rootModule = assertEx(\n (\n await this.resolver.resolveHandler(\n assertEx(nodeManifest.status?.address, () => 'Root has no address'),\n undefined,\n { manifest: nodeManifest },\n )\n ).at(0),\n () => `Root not found [${nodeManifest.status?.address}]`,\n )\n assertEx(rootModule.constructor.name !== 'HttpModuleProxy', () => 'rootModule is not a Wrapper')\n const rootNode = asAttachableNodeInstance(rootModule, 'Root modules is not a node')\n if (rootNode) {\n this.logger.debug(`rootNode: ${rootNode.id}`)\n this.downResolver.addResolver(rootNode as unknown as ModuleResolverInstance)\n return [rootNode]\n }\n return []\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { Account } from '@xyo-network/account'\nimport { AbstractBridgeModuleResolver, BridgeModuleResolverParams, wrapModuleWithType } from '@xyo-network/bridge-abstract'\nimport { ConfigPayload, ConfigSchema } from '@xyo-network/config-payload-plugin'\nimport {\n asModuleInstance,\n isModuleInstance,\n ModuleConfig,\n ModuleConfigSchema,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ResolveHelper,\n} from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\nimport { LRUCache } from 'lru-cache'\n\nimport { BridgeQuerySender, HttpModuleProxy, HttpModuleProxyParams } from './ModuleProxy'\n\nconst NotFoundModule = { notFound: true }\n\nexport interface HttpBridgeModuleResolverParams extends BridgeModuleResolverParams {\n querySender: BridgeQuerySender\n rootUrl: string\n}\n\nexport class HttpBridgeModuleResolver<\n T extends HttpBridgeModuleResolverParams = HttpBridgeModuleResolverParams,\n> extends AbstractBridgeModuleResolver<T> {\n protected _resolvedCache = new LRUCache<Address, ModuleInstance | typeof NotFoundModule>({ max: 1000 })\n protected _resolvedCacheMutex = new Mutex()\n\n get querySender() {\n return this.params.querySender\n }\n\n moduleUrl(address: Address) {\n return new URL(address, this.params.rootUrl)\n }\n\n override async resolveHandler<T extends ModuleInstance = ModuleInstance>(\n id: ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n params?: Partial<HttpModuleProxyParams>,\n ): Promise<T[]> {\n const parentResult = await super.resolveHandler(id, options)\n if (parentResult.length > 0) {\n return parentResult\n }\n const idParts = id.split(':')\n const untransformedFirstPart = assertEx(idParts.shift(), () => 'Missing module identifier')\n const firstPart = await ResolveHelper.transformModuleIdentifier(untransformedFirstPart)\n assertEx(isAddress(firstPart), () => `Invalid module address: ${firstPart}`)\n const remainderParts = idParts.join(':')\n const instance: T | undefined = await this._resolvedCacheMutex.runExclusive(async () => {\n const cachedMod = this._resolvedCache.get(firstPart as Address)\n if (cachedMod) {\n if (isModuleInstance(cachedMod)) {\n const result = idParts.length <= 0 ? cachedMod : cachedMod.resolve(remainderParts, { ...options, maxDepth: (options?.maxDepth ?? 5) - 1 })\n return result as T\n } else {\n //return cached 404\n return\n }\n }\n const account = Account.randomSync()\n const finalParams: HttpModuleProxyParams = {\n account,\n archiving: this.params.archiving,\n config: { schema: ModuleConfigSchema },\n host: this,\n moduleAddress: firstPart as Address,\n onQuerySendFinished: this.params.onQuerySendFinished,\n onQuerySendStarted: this.params.onQuerySendStarted,\n querySender: this.params.querySender,\n ...params,\n }\n\n this.logger?.debug(`creating HttpProxy [${firstPart}] ${id}`)\n console.log(`creating HttpProxy [${firstPart}] ${id}`)\n\n const proxy = new HttpModuleProxy<T, HttpModuleProxyParams>(finalParams)\n\n let state: Payload[] | undefined\n\n try {\n state = await proxy.state()\n } catch (ex) {\n const error = ex as Error\n this.logger?.log(error.message)\n }\n\n if (!state) {\n //cache the fact that it was not found\n this._resolvedCache.set(firstPart as Address, NotFoundModule)\n return\n }\n\n const configSchema = (state.find((payload) => payload.schema === ConfigSchema) as ConfigPayload | undefined)?.config\n const config = assertEx(\n state.find((payload) => payload.schema === configSchema),\n () => 'Unable to locate config',\n ) as ModuleConfig\n proxy.setConfig(config)\n\n console.log(`created HttpProxy [${firstPart}] ${proxy.id}`)\n\n await proxy.start?.()\n const wrapped = wrapModuleWithType(proxy, account) as unknown as T\n assertEx(asModuleInstance<T>(wrapped, {}), () => `Failed to asModuleInstance [${id}]`)\n this._resolvedCache.set(wrapped.address, wrapped)\n return wrapped as ModuleInstance as T\n })\n const result = remainderParts.length > 0 ? await instance?.resolve(remainderParts, options) : instance\n return result ? [result] : []\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { forget } from '@xylabs/forget'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractModuleProxy, ModuleProxyParams } from '@xyo-network/bridge-abstract'\nimport {\n AttachableModuleInstance,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleQueryResult,\n ResolveHelper,\n ResolveHelperConfig,\n} from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\n\nexport interface BridgeQuerySender {\n sendBridgeQuery: <TOut extends Payload = Payload, TQuery extends QueryBoundWitness = QueryBoundWitness, TIn extends Payload = Payload>(\n targetAddress: Address,\n query: TQuery,\n payloads?: TIn[],\n ) => Promise<ModuleQueryResult<TOut>>\n}\n\nexport type HttpModuleProxyParams = ModuleProxyParams & {\n querySender: BridgeQuerySender\n}\n\nexport class HttpModuleProxy<\n TWrappedModule extends ModuleInstance = ModuleInstance,\n TParams extends Omit<HttpModuleProxyParams, 'config'> & { config: TWrappedModule['config'] } = Omit<HttpModuleProxyParams, 'config'> & {\n config: TWrappedModule['config']\n },\n >\n extends AbstractModuleProxy<TWrappedModule, TParams>\n implements AttachableModuleInstance<TParams, TWrappedModule['eventData']>\n{\n static createCount = 0\n\n constructor(params: TParams) {\n HttpModuleProxy.createCount = HttpModuleProxy.createCount + 1\n if (Math.floor(HttpModuleProxy.createCount / 10) === HttpModuleProxy.createCount / 10) {\n console.log(`HttpModuleProxy.createCount: ${HttpModuleProxy.createCount}`)\n }\n super(params)\n }\n\n async proxyQueryHandler<T extends QueryBoundWitness = QueryBoundWitness>(query: T, payloads: Payload[] = []): Promise<ModuleQueryResult> {\n if (this.archiving && this.isAllowedArchivingQuery(query.schema)) {\n forget(this.storeToArchivists([query, ...(payloads ?? [])]))\n }\n const result = await this.params.querySender.sendBridgeQuery(this.params.moduleAddress, query, payloads)\n if (this.archiving && this.isAllowedArchivingQuery(query.schema)) {\n forget(this.storeToArchivists(result.flat()))\n }\n return result\n }\n\n override async publicChildren(): Promise<ModuleInstance[]> {\n return (\n await Promise.all(\n Object.values(await this.childAddressMap())\n .filter(exists)\n .map((address) => this.resolve(address)),\n )\n ).filter(exists)\n }\n\n /** @deprecated do not pass undefined. If trying to get all, pass '*' */\n override async resolve(): Promise<ModuleInstance[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter, options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n /** @deprecated use '*' if trying to resolve all */\n override async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter, options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T | T[] | undefined> {\n const config: ResolveHelperConfig = {\n address: this.address,\n dead: this.dead,\n downResolver: this.downResolver,\n logger: this.logger,\n mod: this,\n transformers: this.moduleIdentifierTransformers,\n upResolver: this.upResolver,\n }\n if (idOrFilter === '*') {\n return [...(await this.publicChildren()), await this.params.host.resolve(this.address)] as T[]\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const parts = idOrFilter.split(':')\n const first = assertEx(parts.shift(), () => 'Missing first')\n const remainingPath = parts.join(':')\n const address =\n isAddress(first) ? first\n : this.id === first ? this.address\n : this.childAddressByName(first)\n if (!address) return undefined\n const firstInstance = (await this.params.host.resolve(address)) as ModuleInstance | undefined\n return (remainingPath ? await firstInstance?.resolve(remainingPath) : firstInstance) as T | undefined\n }\n case 'object': {\n return (await ResolveHelper.resolve(config, idOrFilter, options)).filter((mod) => mod.address !== this.address)\n }\n default: {\n return (await ResolveHelper.resolve(config, idOrFilter, options)).filter((mod) => mod.address !== this.address)\n }\n }\n }\n}\n"],"mappings":"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","names":["HttpBridgeConfigSchema","import_assert","import_exists","import_object","import_module_model","import_assert","import_exists","import_forget","import_bridge_abstract","import_module_model","import_async_mutex","import_lru_cache","import_assert","import_hex","import_bridge_abstract","import_module_model","HttpModuleProxy","AbstractModuleProxy","constructor","params","createCount","Math","floor","console","log","proxyQueryHandler","query","payloads","archiving","isAllowedArchivingQuery","schema","forget","storeToArchivists","result","querySender","sendBridgeQuery","moduleAddress","flat","publicChildren","Promise","all","Object","values","childAddressMap","filter","exists","map","address","resolve","idOrFilter","options","config","dead","downResolver","logger","mod","transformers","moduleIdentifierTransformers","upResolver","host","parts","split","first","assertEx","shift","remainingPath","join","isAddress","id","childAddressByName","undefined","firstInstance","ResolveHelper","NotFoundModule","notFound","HttpBridgeModuleResolver","AbstractBridgeModuleResolver","_resolvedCache","LRUCache","max","_resolvedCacheMutex","Mutex","querySender","params","moduleUrl","address","URL","rootUrl","resolveHandler","id","options","parentResult","length","idParts","split","untransformedFirstPart","assertEx","shift","firstPart","ResolveHelper","transformModuleIdentifier","isAddress","remainderParts","join","instance","runExclusive","cachedMod","get","isModuleInstance","result","resolve","maxDepth","account","Account","randomSync","finalParams","archiving","config","schema","ModuleConfigSchema","host","moduleAddress","onQuerySendFinished","onQuerySendStarted","logger","debug","console","log","proxy","HttpModuleProxy","state","ex","error","message","set","configSchema","find","payload","ConfigSchema","setConfig","start","wrapped","wrapModuleWithType","asModuleInstance","HttpBridgeBase","AbstractBridge","_axios","_discoverRootsMutex","Mutex","_failureTimeCache","LRUCache","max","maxFailureCacheSize","_querySemaphore","_resolver","axios","params","clientUrl","assertEx","config","client","url","nodeUrl","failureRetryTime","defaultFailureRetryTime","maxConnections","defaultMaxConnections","maxPayloadSizeWarning","defaultMaxPayloadSizeWarning","querySemaphore","Semaphore","resolver","HttpBridgeModuleResolver","additionalSigners","archiving","resolveArchivists","resolveArchivingArchivists","bind","bridge","onQuerySendFinished","args","forget","emit","mod","onQuerySendStarted","querySender","root","rootUrl","wrapperAccount","account","exposeHandler","_id","_options","Error","exposedHandler","getRoots","force","runExclusive","_roots","undefined","state","getRootState","logger","debug","length","nodeManifest","find","isPayloadOfSchemaType","NodeManifestPayloadSchema","mods","resolveRootNode","filter","exists","moduleUrl","address","URL","sendBridgeQuery","targetAddress","query","payloads","lastFailureTime","get","now","Date","timeSincePreviousFailure","delete","acquire","payloadSize","JSON","stringify","warn","moduleAddress","schema","href","result","post","status","error","data","ex","toJsonString","release","unexposeHandler","queryPayload","ModuleStateQuerySchema","boundQuery","bindQuery","response","toString","errors","message","rootModule","resolveHandler","manifest","at","constructor","name","rootNode","asAttachableNodeInstance","id","downResolver","addResolver","AxiosJson","configSchemas","HttpBridgeConfigSchema","defaultConfigSchema","HttpBridge","HttpBridgeBase","_app","_exposedModules","_server","app","express","use","json","post","req","res","handlePost","exposeChild","mod","options","maxDepth","console","log","address","id","assertEx","config","host","push","WeakRef","children","publicChildren","logger","toJsonString","map","child","exposedChildren","Promise","all","required","flat","filter","exists","allExposed","exposedMod","exposeHandler","resolveAddressToInstanceUp","Error","exposedHandler","ref","deref","startHandler","startHttpServer","stopHandler","_timeout","stopHttpServer","unexposeHandler","find","callLocalModule","query","payloads","allPayloads","body","isQueryBoundWitness","payload","route","then","result","status","error","envelope","data","catch","ex","message","listen","port","server","close","undefined"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/HttpBridgeConfig.ts","../../src/HttpBridgeFull.ts","../../src/HttpBridgeBase.ts","../../src/HttpBridgeModuleResolver.ts","../../src/ModuleProxy/ModuleProxy.ts"],"sourcesContent":["export * from './HttpBridgeConfig'\nexport * from './HttpBridgeFull'\n","import { EmptyObject } from '@xylabs/object'\nimport { BridgeConfig } from '@xyo-network/bridge-model'\n\nexport type HttpBridgeConfigSchema = 'network.xyo.bridge.http.config'\nexport const HttpBridgeConfigSchema: HttpBridgeConfigSchema = 'network.xyo.bridge.http.config'\n\nexport type HttpBridgeConfig<TConfig extends EmptyObject = EmptyObject, TSchema extends string | void = void> = BridgeConfig<\n {\n client?: BridgeConfig['client'] & {\n url: string\n }\n failureRetryTime?: number\n failureTimeCacheMax?: number\n host?: {\n port: number\n }\n maxConnections?: number\n maxPayloadSizeWarning?: number\n /** @deprecated use client.url instead */\n nodeUrl?: string\n schema: HttpBridgeConfigSchema\n } & TConfig,\n TSchema extends string ? TSchema : HttpBridgeConfigSchema\n>\n","import { Server } from 'node:http'\n\nimport { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { toJsonString } from '@xylabs/object'\nimport {\n asyncHandler,\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n jsonBodyParser,\n responseProfiler,\n useRequestCounters,\n} from '@xylabs/sdk-api-express-ecs'\nimport { isQueryBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BridgeExposeOptions, BridgeParams, BridgeUnexposeOptions } from '@xyo-network/bridge-model'\nimport { standardResponses } from '@xyo-network/express-node-middleware'\nimport { AnyConfigSchema, creatableModule, ModuleInstance, ModuleQueryResult, resolveAddressToInstanceUp } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport express, { Application, Request, Response } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport { HttpBridgeBase } from './HttpBridgeBase'\nimport { HttpBridgeConfig } from './HttpBridgeConfig'\n\n/**\n * The type of the path parameters for the address path.\n */\ntype AddressPathParams = {\n address: Address\n}\n\n/**\n * The type of the request body for the address path.\n */\ntype PostAddressRequestBody = [QueryBoundWitness, undefined | Payload[]]\n\n// TODO: This does not match the error response shape of the legacy bridge BUT it its the\n// shape this bridge is currently returning. Massage this into the standard\n// error shape constructed via middleware.\ntype ErrorResponseBody = {\n error: string\n}\n\nexport interface HttpBridgeParams extends BridgeParams<AnyConfigSchema<HttpBridgeConfig>> {}\n\n@creatableModule()\nexport class HttpBridge<TParams extends HttpBridgeParams> extends HttpBridgeBase<TParams> {\n protected _app?: Application\n protected _exposedModules: WeakRef<ModuleInstance>[] = []\n protected _server?: Server\n\n protected get app() {\n if (!this._app) this._app = this.initializeApp()\n return assertEx(this._app, () => 'App not initialized')\n }\n\n async exposeChild(mod: ModuleInstance, options?: BridgeExposeOptions | undefined): Promise<ModuleInstance[]> {\n const { maxDepth = 5 } = options ?? {}\n assertEx(this.config.host, () => 'Not configured as a host')\n this._exposedModules.push(new WeakRef(mod))\n const children = maxDepth > 0 ? (await mod.publicChildren?.()) ?? [] : []\n this.logger.log(`childrenToExpose [${mod.id}][${mod.address}]: ${toJsonString(children.map((child) => child.id))}`)\n const exposedChildren = (await Promise.all(children.map((child) => this.exposeChild(child, { maxDepth: maxDepth - 1, required: false }))))\n .flat()\n .filter(exists)\n const allExposed = [mod, ...exposedChildren]\n\n for (const exposedMod of allExposed) this.logger?.log(`exposed: ${exposedMod.address} [${mod.id}]`)\n\n return allExposed\n }\n\n override async exposeHandler(address: Address, options?: BridgeExposeOptions | undefined): Promise<ModuleInstance[]> {\n const { required = true } = options ?? {}\n const mod = await resolveAddressToInstanceUp(this, address)\n if (required && !mod) {\n throw new Error(`Unable to find required module: ${address}`)\n }\n if (mod) {\n return this.exposeChild(mod, options)\n }\n return []\n }\n\n override exposedHandler(): Address[] {\n return this._exposedModules.map((ref) => ref.deref()?.address).filter(exists)\n }\n\n override async startHandler(): Promise<boolean> {\n return (await super.startHandler()) && (await this.startHttpServer())\n }\n\n override async stopHandler(_timeout?: number | undefined): Promise<boolean> {\n return (await super.stopHandler()) && (await this.stopHttpServer())\n }\n\n override async unexposeHandler(address: Address, options?: BridgeUnexposeOptions | undefined): Promise<ModuleInstance[]> {\n const { maxDepth = 2, required = true } = options ?? {}\n assertEx(this.config.host, () => 'Not configured as a host')\n const mod = this._exposedModules.find((ref) => ref.deref()?.address === address)?.deref()\n assertEx(!required || mod, () => `Module not exposed: ${address}`)\n this._exposedModules = this._exposedModules.filter((ref) => ref.deref()?.address !== address)\n if (mod) {\n const children = maxDepth > 0 ? (await mod.publicChildren?.()) ?? [] : []\n const exposedChildren = (\n await Promise.all(children.map((child) => this.unexposeHandler(child.address, { maxDepth: maxDepth - 1, required: false })))\n )\n .flat()\n .filter(exists)\n return [mod, ...exposedChildren]\n }\n return []\n }\n\n protected async callLocalModule(address: Address, query: QueryBoundWitness, payloads: Payload[]): Promise<ModuleQueryResult | null> {\n const mod = this._exposedModules.find((ref) => ref.deref()?.address === address)?.deref()\n return mod ? await mod.query(query, payloads) : null\n }\n\n protected async handleGet(req: Request<AddressPathParams, ModuleQueryResult, PostAddressRequestBody>, res: Response) {\n const { address } = req.params\n try {\n if (address == this.address) {\n res.json(await this.stateQuery(this.account))\n } else {\n const mod = this._exposedModules.find((ref) => ref.deref()?.address === address)?.deref()\n // TODO: Use standard errors middleware\n if (mod) {\n res.json(await mod.stateQuery(this.account))\n } else {\n res.status(StatusCodes.NOT_FOUND).json({ error: 'Module not found' })\n }\n }\n } catch (ex) {\n // TODO: Sanitize message\n res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({ error: (ex as Error).message })\n }\n }\n\n protected async handlePost(req: Request<AddressPathParams, ModuleQueryResult, PostAddressRequestBody>, res: Response) {\n const { address } = req.params\n const [bw, payloads = []] = Array.isArray(req.body) ? req.body : []\n const query = isQueryBoundWitness(bw) ? bw : undefined\n if (!query) {\n // TODO: Use standard errors middleware\n res.status(StatusCodes.BAD_REQUEST).json({ error: 'No query provided' })\n return\n }\n try {\n if (address == this.address) {\n const result = await this.query(query, payloads)\n return res.json(result)\n } else {\n const result = await this.callLocalModule(address, query, payloads)\n // TODO: Use standard errors middleware\n if (result === null) {\n res.status(StatusCodes.NOT_FOUND).json({ error: 'Module not found' })\n } else {\n res.json(result)\n }\n }\n } catch (ex) {\n // TODO: Sanitize message\n res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({ error: (ex as Error).message })\n }\n }\n\n protected initializeApp() {\n // Create the express app\n const app = express()\n\n // Add middleware\n app.use(responseProfiler)\n app.use(jsonBodyParser)\n app.use(standardResponses)\n disableExpressDefaultPoweredByHeader(app)\n app.use(customPoweredByHeader)\n disableCaseSensitiveRouting(app)\n useRequestCounters(app)\n\n // Add routes\n // Redirect all requests to the root to this module's address\n app.get('/', (_req, res) => res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${this.address}`))\n app.post('/', (_req, res) => res.redirect(StatusCodes.TEMPORARY_REDIRECT, `/${this.address}`))\n\n app.get<AddressPathParams, ModuleQueryResult>(\n '/:address',\n asyncHandler(async (req, res) => await this.handleGet(req, res)),\n )\n app.post<AddressPathParams, ModuleQueryResult, PostAddressRequestBody>(\n '/:address',\n asyncHandler(async (req, res) => await this.handlePost(req, res)),\n )\n return app\n }\n\n protected startHttpServer(): Promise<boolean> {\n if (this.config.host) {\n assertEx(!this._server, () => 'Server already started')\n this._server = this.app.listen(this.config.host?.port ?? 3030)\n }\n return Promise.resolve(true)\n }\n\n protected stopHttpServer(): Promise<boolean> {\n if (this.config.host) {\n return new Promise((resolve, reject) => {\n if (this._server) {\n this._server.close((err) => {\n if (err) {\n reject(err)\n } else {\n this._server = undefined\n resolve(true)\n }\n })\n }\n })\n }\n return Promise.resolve(true)\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { AxiosError, AxiosJson } from '@xylabs/axios'\nimport { exists } from '@xylabs/exists'\nimport { forget } from '@xylabs/forget'\nimport { Address } from '@xylabs/hex'\nimport { toJsonString } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport { ApiEnvelope } from '@xyo-network/api-models'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractBridge } from '@xyo-network/bridge-abstract'\nimport {\n BridgeExposeOptions,\n BridgeModule,\n BridgeParams,\n BridgeUnexposeOptions,\n QuerySendFinishedEventArgs,\n QuerySendStartedEventArgs,\n} from '@xyo-network/bridge-model'\nimport { ModuleManifestPayload, NodeManifestPayload, NodeManifestPayloadSchema } from '@xyo-network/manifest-model'\nimport {\n AnyConfigSchema,\n creatableModule,\n ModuleInstance,\n ModuleQueryResult,\n ModuleResolverInstance,\n ModuleStateQuery,\n ModuleStateQuerySchema,\n} from '@xyo-network/module-model'\nimport { asAttachableNodeInstance } from '@xyo-network/node-model'\nimport { isPayloadOfSchemaType, Payload, Schema, WithMeta } from '@xyo-network/payload-model'\nimport { Mutex, Semaphore } from 'async-mutex'\nimport { LRUCache } from 'lru-cache'\n\nimport { HttpBridgeConfig, HttpBridgeConfigSchema } from './HttpBridgeConfig'\nimport { HttpBridgeModuleResolver } from './HttpBridgeModuleResolver'\nimport { BridgeQuerySender } from './ModuleProxy'\n\nexport interface HttpBridgeParams extends BridgeParams<AnyConfigSchema<HttpBridgeConfig>> {\n axios?: AxiosJson\n}\n\n@creatableModule()\nexport class HttpBridgeBase<TParams extends HttpBridgeParams> extends AbstractBridge<TParams> implements BridgeModule<TParams>, BridgeQuerySender {\n static axios = new AxiosJson()\n static override readonly configSchemas: Schema[] = [...super.configSchemas, HttpBridgeConfigSchema]\n static override readonly defaultConfigSchema: Schema = HttpBridgeConfigSchema\n static defaultFailureRetryTime = 1000 * 60\n static defaultMaxConnections = 4\n static defaultMaxPayloadSizeWarning = 256 * 256\n static maxFailureCacheSize = 1000\n\n private _axios?: AxiosJson\n private _discoverRootsMutex = new Mutex()\n private _failureTimeCache = new LRUCache<Address, number>({ max: HttpBridgeBase.maxFailureCacheSize })\n private _querySemaphore?: Semaphore\n private _resolver?: HttpBridgeModuleResolver\n\n get axios() {\n this._axios = this._axios ?? this.params.axios ?? HttpBridgeBase.axios\n return this._axios\n }\n\n get clientUrl() {\n // eslint-disable-next-line deprecation/deprecation\n return assertEx(this.config.client?.url ?? this.config.nodeUrl, () => 'No Url Set')\n }\n\n get failureRetryTime() {\n return this.config.failureRetryTime ?? HttpBridgeBase.defaultFailureRetryTime\n }\n\n get maxConnections() {\n return this.config.maxConnections ?? HttpBridgeBase.defaultMaxConnections\n }\n\n get maxPayloadSizeWarning() {\n return this.config.maxPayloadSizeWarning ?? HttpBridgeBase.defaultMaxPayloadSizeWarning\n }\n\n get querySemaphore() {\n this._querySemaphore = this._querySemaphore ?? new Semaphore(this.maxConnections)\n return this._querySemaphore\n }\n\n override get resolver() {\n this._resolver =\n this._resolver ??\n new HttpBridgeModuleResolver({\n additionalSigners: this.additionalSigners,\n archiving: { ...this.archiving, resolveArchivists: this.resolveArchivingArchivists.bind(this) },\n bridge: this,\n onQuerySendFinished: (args: Omit<QuerySendFinishedEventArgs, 'mod'>) => {\n forget(this.emit('querySendFinished', { mod: this, ...args }))\n },\n onQuerySendStarted: (args: Omit<QuerySendStartedEventArgs, 'mod'>) => {\n forget(this.emit('querySendStarted', { mod: this, ...args }))\n },\n querySender: this,\n root: this,\n rootUrl: this.clientUrl,\n wrapperAccount: this.account,\n })\n return this._resolver\n }\n\n override exposeHandler(_id: string, _options?: BridgeExposeOptions | undefined): Promisable<ModuleInstance[]> {\n throw new Error('Unsupported')\n }\n\n override exposedHandler(): Promisable<Address[]> {\n throw new Error('Unsupported')\n }\n\n async getRoots(force?: boolean): Promise<ModuleInstance[]> {\n return await this._discoverRootsMutex.runExclusive(async () => {\n if (this._roots === undefined || force) {\n const state = await this.getRootState()\n this.logger?.debug(`HttpBridge:discoverRoots.state [${state?.length}]`)\n const nodeManifest = state?.find(isPayloadOfSchemaType<WithMeta<NodeManifestPayload>>(NodeManifestPayloadSchema))\n if (nodeManifest) {\n const mods = (await this.resolveRootNode(nodeManifest)).filter(exists)\n this.logger?.debug(`HttpBridge:discoverRoots [${mods.length}]`)\n this._roots = mods\n } else {\n this._roots = []\n }\n }\n return this._roots\n })\n }\n\n moduleUrl(address: Address) {\n return new URL(address, this.clientUrl)\n }\n\n async sendBridgeQuery<TOut extends Payload = Payload, TQuery extends QueryBoundWitness = QueryBoundWitness, TIn extends Payload = Payload>(\n targetAddress: Address,\n query: TQuery,\n payloads?: TIn[],\n ): Promise<ModuleQueryResult<TOut>> {\n const lastFailureTime = this._failureTimeCache.get(targetAddress)\n if (lastFailureTime !== undefined) {\n const now = Date.now()\n const timeSincePreviousFailure = now - lastFailureTime\n if (timeSincePreviousFailure > this.failureRetryTime) {\n throw new Error(`target module failed recently [${targetAddress}] [${timeSincePreviousFailure}ms ago]`)\n }\n this._failureTimeCache.delete(targetAddress)\n }\n try {\n await this.querySemaphore.acquire()\n const payloadSize = JSON.stringify([query, payloads]).length\n if (payloadSize > this.maxPayloadSizeWarning) {\n this.logger?.warn(\n `Large targetQuery being sent: ${payloadSize} bytes [${this.address}][${this.moduleAddress}] [${query.schema}] [${payloads?.length}]`,\n )\n }\n const moduleUrl = this.moduleUrl(targetAddress).href\n const result = await this.axios.post<ApiEnvelope<ModuleQueryResult<TOut>>>(moduleUrl, [query, payloads])\n if (result.status === 404) {\n throw `target module not found [${moduleUrl}] [${result.status}]`\n }\n if (result.status >= 400) {\n this.logger?.error(`targetQuery failed [${moduleUrl}]`)\n throw `targetQuery failed [${moduleUrl}] [${result.status}]`\n }\n return result.data?.data\n } catch (ex) {\n const error = ex as AxiosError\n this.logger?.error(`Error: ${toJsonString(error)}`)\n throw error\n } finally {\n this.querySemaphore.release()\n }\n }\n\n override unexposeHandler(_id: string, _options?: BridgeUnexposeOptions | undefined): Promisable<ModuleInstance[]> {\n throw new Error('Unsupported')\n }\n\n private async getRootState() {\n const queryPayload: ModuleStateQuery = { schema: ModuleStateQuerySchema }\n const boundQuery = await this.bindQuery(queryPayload)\n try {\n const response = await this.axios.post<ApiEnvelope<ModuleQueryResult>>(this.clientUrl.toString(), boundQuery)\n if (response.status === 404) {\n return []\n }\n const [, payloads, errors] = response.data.data\n if (errors.length > 0) {\n throw new Error(`getRootState failed: ${JSON.stringify(errors, null, 2)}`)\n }\n return payloads\n } catch (ex) {\n const error = ex as Error\n this.logger?.warn(`Unable to connect to remote node: ${error.message} [${this.clientUrl}]`)\n }\n }\n\n private async resolveRootNode(nodeManifest: ModuleManifestPayload): Promise<ModuleInstance[]> {\n const rootModule = assertEx(\n (\n await this.resolver.resolveHandler(\n assertEx(nodeManifest.status?.address, () => 'Root has no address'),\n undefined,\n { manifest: nodeManifest },\n )\n ).at(0),\n () => `Root not found [${nodeManifest.status?.address}]`,\n )\n assertEx(rootModule.constructor.name !== 'HttpModuleProxy', () => 'rootModule is not a Wrapper')\n const rootNode = asAttachableNodeInstance(rootModule, 'Root modules is not a node')\n if (rootNode) {\n this.logger.debug(`rootNode: ${rootNode.id}`)\n this.downResolver.addResolver(rootNode as unknown as ModuleResolverInstance)\n return [rootNode]\n }\n return []\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { Account } from '@xyo-network/account'\nimport { AbstractBridgeModuleResolver, BridgeModuleResolverParams, wrapModuleWithType } from '@xyo-network/bridge-abstract'\nimport { ConfigPayload, ConfigSchema } from '@xyo-network/config-payload-plugin'\nimport {\n asModuleInstance,\n isModuleInstance,\n ModuleConfig,\n ModuleConfigSchema,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ResolveHelper,\n} from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\nimport { LRUCache } from 'lru-cache'\n\nimport { BridgeQuerySender, HttpModuleProxy, HttpModuleProxyParams } from './ModuleProxy'\n\nconst NotFoundModule = { notFound: true }\n\nexport interface HttpBridgeModuleResolverParams extends BridgeModuleResolverParams {\n querySender: BridgeQuerySender\n rootUrl: string\n}\n\nexport class HttpBridgeModuleResolver<\n T extends HttpBridgeModuleResolverParams = HttpBridgeModuleResolverParams,\n> extends AbstractBridgeModuleResolver<T> {\n protected _resolvedCache = new LRUCache<Address, ModuleInstance | typeof NotFoundModule>({ max: 1000 })\n protected _resolvedCacheMutex = new Mutex()\n\n get querySender() {\n return this.params.querySender\n }\n\n moduleUrl(address: Address) {\n return new URL(address, this.params.rootUrl)\n }\n\n override async resolveHandler<T extends ModuleInstance = ModuleInstance>(\n id: ModuleIdentifier,\n options?: ModuleFilterOptions<T>,\n params?: Partial<HttpModuleProxyParams>,\n ): Promise<T[]> {\n const parentResult = await super.resolveHandler(id, options)\n if (parentResult.length > 0) {\n return parentResult\n }\n const idParts = id.split(':')\n const untransformedFirstPart = assertEx(idParts.shift(), () => 'Missing module identifier')\n const firstPart = await ResolveHelper.transformModuleIdentifier(untransformedFirstPart)\n assertEx(isAddress(firstPart), () => `Invalid module address: ${firstPart}`)\n const remainderParts = idParts.join(':')\n const instance: T | undefined = await this._resolvedCacheMutex.runExclusive(async () => {\n const cachedMod = this._resolvedCache.get(firstPart as Address)\n if (cachedMod) {\n if (isModuleInstance(cachedMod)) {\n const result = idParts.length <= 0 ? cachedMod : cachedMod.resolve(remainderParts, { ...options, maxDepth: (options?.maxDepth ?? 5) - 1 })\n return result as T\n } else {\n //return cached 404\n return\n }\n }\n const account = await Account.random()\n const finalParams: HttpModuleProxyParams = {\n account,\n archiving: this.params.archiving,\n config: { schema: ModuleConfigSchema },\n host: this,\n moduleAddress: firstPart as Address,\n onQuerySendFinished: this.params.onQuerySendFinished,\n onQuerySendStarted: this.params.onQuerySendStarted,\n querySender: this.params.querySender,\n ...params,\n }\n\n this.logger?.debug(`creating HttpProxy [${firstPart}] ${id}`)\n console.log(`creating HttpProxy [${firstPart}] ${id}`)\n\n const proxy = new HttpModuleProxy<T, HttpModuleProxyParams>(finalParams)\n\n let state: Payload[] | undefined\n\n try {\n state = await proxy.state()\n } catch (ex) {\n const error = ex as Error\n this.logger?.log(error.message)\n }\n\n if (!state) {\n //cache the fact that it was not found\n this._resolvedCache.set(firstPart as Address, NotFoundModule)\n return\n }\n\n const configSchema = (state.find((payload) => payload.schema === ConfigSchema) as ConfigPayload | undefined)?.config\n const config = assertEx(\n state.find((payload) => payload.schema === configSchema),\n () => 'Unable to locate config',\n ) as ModuleConfig\n proxy.setConfig(config)\n\n console.log(`created HttpProxy [${firstPart}] ${proxy.id}`)\n\n await proxy.start?.()\n const wrapped = wrapModuleWithType(proxy, account) as unknown as T\n assertEx(asModuleInstance<T>(wrapped, {}), () => `Failed to asModuleInstance [${id}]`)\n this._resolvedCache.set(wrapped.address, wrapped)\n return wrapped as ModuleInstance as T\n })\n const result = remainderParts.length > 0 ? await instance?.resolve(remainderParts, options) : instance\n return result ? [result] : []\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { forget } from '@xylabs/forget'\nimport { Address, isAddress } from '@xylabs/hex'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractModuleProxy, ModuleProxyParams } from '@xyo-network/bridge-abstract'\nimport {\n AttachableModuleInstance,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleQueryResult,\n ResolveHelper,\n ResolveHelperConfig,\n} from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\n\nexport interface BridgeQuerySender {\n sendBridgeQuery: <TOut extends Payload = Payload, TQuery extends QueryBoundWitness = QueryBoundWitness, TIn extends Payload = Payload>(\n targetAddress: Address,\n query: TQuery,\n payloads?: TIn[],\n ) => Promise<ModuleQueryResult<TOut>>\n}\n\nexport type HttpModuleProxyParams = ModuleProxyParams & {\n querySender: BridgeQuerySender\n}\n\nexport class HttpModuleProxy<\n TWrappedModule extends ModuleInstance = ModuleInstance,\n TParams extends Omit<HttpModuleProxyParams, 'config'> & { config: TWrappedModule['config'] } = Omit<HttpModuleProxyParams, 'config'> & {\n config: TWrappedModule['config']\n },\n >\n extends AbstractModuleProxy<TWrappedModule, TParams>\n implements AttachableModuleInstance<TParams, TWrappedModule['eventData']>\n{\n static createCount = 0\n\n constructor(params: TParams) {\n HttpModuleProxy.createCount = HttpModuleProxy.createCount + 1\n if (Math.floor(HttpModuleProxy.createCount / 10) === HttpModuleProxy.createCount / 10) {\n console.log(`HttpModuleProxy.createCount: ${HttpModuleProxy.createCount}`)\n }\n super(params)\n }\n\n async proxyQueryHandler<T extends QueryBoundWitness = QueryBoundWitness>(query: T, payloads: Payload[] = []): Promise<ModuleQueryResult> {\n if (this.archiving && this.isAllowedArchivingQuery(query.schema)) {\n forget(this.storeToArchivists([query, ...(payloads ?? [])]))\n }\n const result = await this.params.querySender.sendBridgeQuery(this.params.moduleAddress, query, payloads)\n if (this.archiving && this.isAllowedArchivingQuery(query.schema)) {\n forget(this.storeToArchivists(result.flat()))\n }\n return result\n }\n\n override async publicChildren(): Promise<ModuleInstance[]> {\n return (\n await Promise.all(\n Object.values(await this.childAddressMap())\n .filter(exists)\n .map((address) => this.resolve(address)),\n )\n ).filter(exists)\n }\n\n /** @deprecated do not pass undefined. If trying to get all, pass '*' */\n override async resolve(): Promise<ModuleInstance[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter, options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n /** @deprecated use '*' if trying to resolve all */\n override async resolve<T extends ModuleInstance = ModuleInstance>(filter?: ModuleFilter, options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T | T[] | undefined> {\n const config: ResolveHelperConfig = {\n address: this.address,\n dead: this.dead,\n downResolver: this.downResolver,\n logger: this.logger,\n mod: this,\n transformers: this.moduleIdentifierTransformers,\n upResolver: this.upResolver,\n }\n if (idOrFilter === '*') {\n return [...(await this.publicChildren()), await this.params.host.resolve(this.address)] as T[]\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const parts = idOrFilter.split(':')\n const first = assertEx(parts.shift(), () => 'Missing first')\n const remainingPath = parts.join(':')\n const address =\n isAddress(first) ? first\n : this.id === first ? this.address\n : this.childAddressByName(first)\n if (!address) return undefined\n const firstInstance = (await this.params.host.resolve(address)) as ModuleInstance | undefined\n return (remainingPath ? await firstInstance?.resolve(remainingPath) : firstInstance) as T | undefined\n }\n case 'object': {\n return (await ResolveHelper.resolve(config, idOrFilter, options)).filter((mod) => mod.address !== this.address)\n }\n default: {\n return (await ResolveHelper.resolve(config, idOrFilter, options)).filter((mod) => mod.address !== this.address)\n }\n }\n }\n}\n"],"mappings":"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","names":["HttpBridgeConfigSchema","import_assert","import_exists","import_object","import_module_model","import_assert","import_exists","import_forget","import_bridge_abstract","import_module_model","import_async_mutex","import_lru_cache","import_assert","import_hex","import_bridge_abstract","import_module_model","HttpModuleProxy","AbstractModuleProxy","constructor","params","createCount","Math","floor","console","log","proxyQueryHandler","query","payloads","archiving","isAllowedArchivingQuery","schema","forget","storeToArchivists","result","querySender","sendBridgeQuery","moduleAddress","flat","publicChildren","Promise","all","Object","values","childAddressMap","filter","exists","map","address","resolve","idOrFilter","options","config","dead","downResolver","logger","mod","transformers","moduleIdentifierTransformers","upResolver","host","parts","split","first","assertEx","shift","remainingPath","join","isAddress","id","childAddressByName","undefined","firstInstance","ResolveHelper","NotFoundModule","notFound","HttpBridgeModuleResolver","AbstractBridgeModuleResolver","_resolvedCache","LRUCache","max","_resolvedCacheMutex","Mutex","querySender","params","moduleUrl","address","URL","rootUrl","resolveHandler","id","options","parentResult","length","idParts","split","untransformedFirstPart","assertEx","shift","firstPart","ResolveHelper","transformModuleIdentifier","isAddress","remainderParts","join","instance","runExclusive","cachedMod","get","isModuleInstance","result","resolve","maxDepth","account","Account","random","finalParams","archiving","config","schema","ModuleConfigSchema","host","moduleAddress","onQuerySendFinished","onQuerySendStarted","logger","debug","console","log","proxy","HttpModuleProxy","state","ex","error","message","set","configSchema","find","payload","ConfigSchema","setConfig","start","wrapped","wrapModuleWithType","asModuleInstance","HttpBridgeBase","AbstractBridge","_axios","_discoverRootsMutex","Mutex","_failureTimeCache","LRUCache","max","maxFailureCacheSize","_querySemaphore","_resolver","axios","params","clientUrl","assertEx","config","client","url","nodeUrl","failureRetryTime","defaultFailureRetryTime","maxConnections","defaultMaxConnections","maxPayloadSizeWarning","defaultMaxPayloadSizeWarning","querySemaphore","Semaphore","resolver","HttpBridgeModuleResolver","additionalSigners","archiving","resolveArchivists","resolveArchivingArchivists","bind","bridge","onQuerySendFinished","args","forget","emit","mod","onQuerySendStarted","querySender","root","rootUrl","wrapperAccount","account","exposeHandler","_id","_options","Error","exposedHandler","getRoots","force","runExclusive","_roots","undefined","state","getRootState","logger","debug","length","nodeManifest","find","isPayloadOfSchemaType","NodeManifestPayloadSchema","mods","resolveRootNode","filter","exists","moduleUrl","address","URL","sendBridgeQuery","targetAddress","query","payloads","lastFailureTime","get","now","Date","timeSincePreviousFailure","delete","acquire","payloadSize","JSON","stringify","warn","moduleAddress","schema","href","result","post","status","error","data","ex","toJsonString","release","unexposeHandler","queryPayload","ModuleStateQuerySchema","boundQuery","bindQuery","response","toString","errors","message","rootModule","resolveHandler","manifest","at","constructor","name","rootNode","asAttachableNodeInstance","id","downResolver","addResolver","AxiosJson","configSchemas","HttpBridgeConfigSchema","defaultConfigSchema","HttpBridge","HttpBridgeBase","_app","_exposedModules","_server","app","initializeApp","assertEx","exposeChild","mod","options","maxDepth","config","host","push","WeakRef","children","publicChildren","logger","log","id","address","toJsonString","map","child","exposedChildren","Promise","all","required","flat","filter","exists","allExposed","exposedMod","exposeHandler","resolveAddressToInstanceUp","Error","exposedHandler","ref","deref","startHandler","startHttpServer","stopHandler","_timeout","stopHttpServer","unexposeHandler","find","callLocalModule","query","payloads","handleGet","req","res","params","json","stateQuery","account","status","StatusCodes","NOT_FOUND","error","ex","INTERNAL_SERVER_ERROR","message","handlePost","bw","Array","isArray","body","isQueryBoundWitness","undefined","BAD_REQUEST","result","express","use","responseProfiler","jsonBodyParser","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","useRequestCounters","get","_req","redirect","MOVED_TEMPORARILY","post","TEMPORARY_REDIRECT","asyncHandler","listen","port","resolve","reject","close","err"]}
|
package/dist/node/index.js
CHANGED
|
@@ -13,9 +13,12 @@ var HttpBridgeConfigSchema = "network.xyo.bridge.http.config";
|
|
|
13
13
|
import { assertEx as assertEx4 } from "@xylabs/assert";
|
|
14
14
|
import { exists as exists3 } from "@xylabs/exists";
|
|
15
15
|
import { toJsonString as toJsonString2 } from "@xylabs/object";
|
|
16
|
+
import { asyncHandler, customPoweredByHeader, disableCaseSensitiveRouting, disableExpressDefaultPoweredByHeader, jsonBodyParser, responseProfiler, useRequestCounters } from "@xylabs/sdk-api-express-ecs";
|
|
16
17
|
import { isQueryBoundWitness } from "@xyo-network/boundwitness-model";
|
|
18
|
+
import { standardResponses } from "@xyo-network/express-node-middleware";
|
|
17
19
|
import { creatableModule as creatableModule2, resolveAddressToInstanceUp } from "@xyo-network/module-model";
|
|
18
20
|
import express from "express";
|
|
21
|
+
import { StatusCodes } from "http-status-codes";
|
|
19
22
|
|
|
20
23
|
// src/HttpBridgeBase.ts
|
|
21
24
|
import { assertEx as assertEx3 } from "@xylabs/assert";
|
|
@@ -150,7 +153,7 @@ var _HttpBridgeModuleResolver = class _HttpBridgeModuleResolver extends Abstract
|
|
|
150
153
|
return;
|
|
151
154
|
}
|
|
152
155
|
}
|
|
153
|
-
const account = Account.
|
|
156
|
+
const account = await Account.random();
|
|
154
157
|
const finalParams = {
|
|
155
158
|
account,
|
|
156
159
|
archiving: this.params.archiving,
|
|
@@ -402,20 +405,12 @@ var _HttpBridge = class _HttpBridge extends HttpBridgeBase {
|
|
|
402
405
|
_exposedModules = [];
|
|
403
406
|
_server;
|
|
404
407
|
get app() {
|
|
405
|
-
this._app
|
|
406
|
-
|
|
407
|
-
app.use(express.json());
|
|
408
|
-
app.post("/", (req, res) => {
|
|
409
|
-
this.handlePost(req, res);
|
|
410
|
-
});
|
|
411
|
-
return app;
|
|
412
|
-
})();
|
|
413
|
-
return this._app;
|
|
408
|
+
if (!this._app) this._app = this.initializeApp();
|
|
409
|
+
return assertEx4(this._app, () => "App not initialized");
|
|
414
410
|
}
|
|
415
411
|
async exposeChild(mod, options) {
|
|
416
412
|
var _a, _b;
|
|
417
413
|
const { maxDepth = 5 } = options ?? {};
|
|
418
|
-
console.log(`exposeChild: ${mod.address} ${mod == null ? void 0 : mod.id} ${maxDepth}`);
|
|
419
414
|
assertEx4(this.config.host, () => "Not configured as a host");
|
|
420
415
|
this._exposedModules.push(new WeakRef(mod));
|
|
421
416
|
const children = maxDepth > 0 ? await ((_a = mod.publicChildren) == null ? void 0 : _a.call(mod)) ?? [] : [];
|
|
@@ -434,7 +429,6 @@ var _HttpBridge = class _HttpBridge extends HttpBridgeBase {
|
|
|
434
429
|
async exposeHandler(address, options) {
|
|
435
430
|
const { required = true } = options ?? {};
|
|
436
431
|
const mod = await resolveAddressToInstanceUp(this, address);
|
|
437
|
-
console.log(`exposeHandler: ${address} ${mod == null ? void 0 : mod.id}`);
|
|
438
432
|
if (required && !mod) {
|
|
439
433
|
throw new Error(`Unable to find required module: ${address}`);
|
|
440
434
|
}
|
|
@@ -450,10 +444,10 @@ var _HttpBridge = class _HttpBridge extends HttpBridgeBase {
|
|
|
450
444
|
}).filter(exists3);
|
|
451
445
|
}
|
|
452
446
|
async startHandler() {
|
|
453
|
-
return await super.startHandler() && this.startHttpServer();
|
|
447
|
+
return await super.startHandler() && await this.startHttpServer();
|
|
454
448
|
}
|
|
455
449
|
async stopHandler(_timeout) {
|
|
456
|
-
return await super.stopHandler() && this.stopHttpServer();
|
|
450
|
+
return await super.stopHandler() && await this.stopHttpServer();
|
|
457
451
|
}
|
|
458
452
|
async unexposeHandler(address, options) {
|
|
459
453
|
var _a, _b;
|
|
@@ -487,31 +481,77 @@ var _HttpBridge = class _HttpBridge extends HttpBridgeBase {
|
|
|
487
481
|
var _a2;
|
|
488
482
|
return ((_a2 = ref.deref()) == null ? void 0 : _a2.address) === address;
|
|
489
483
|
})) == null ? void 0 : _a.deref();
|
|
490
|
-
|
|
491
|
-
|
|
484
|
+
return mod ? await mod.query(query, payloads) : null;
|
|
485
|
+
}
|
|
486
|
+
async handleGet(req, res) {
|
|
487
|
+
var _a;
|
|
488
|
+
const { address } = req.params;
|
|
489
|
+
try {
|
|
490
|
+
if (address == this.address) {
|
|
491
|
+
res.json(await this.stateQuery(this.account));
|
|
492
|
+
} else {
|
|
493
|
+
const mod = (_a = this._exposedModules.find((ref) => {
|
|
494
|
+
var _a2;
|
|
495
|
+
return ((_a2 = ref.deref()) == null ? void 0 : _a2.address) === address;
|
|
496
|
+
})) == null ? void 0 : _a.deref();
|
|
497
|
+
if (mod) {
|
|
498
|
+
res.json(await mod.stateQuery(this.account));
|
|
499
|
+
} else {
|
|
500
|
+
res.status(StatusCodes.NOT_FOUND).json({
|
|
501
|
+
error: "Module not found"
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
} catch (ex) {
|
|
506
|
+
res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({
|
|
507
|
+
error: ex.message
|
|
508
|
+
});
|
|
492
509
|
}
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
const
|
|
497
|
-
const query =
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
510
|
+
}
|
|
511
|
+
async handlePost(req, res) {
|
|
512
|
+
const { address } = req.params;
|
|
513
|
+
const [bw, payloads = []] = Array.isArray(req.body) ? req.body : [];
|
|
514
|
+
const query = isQueryBoundWitness(bw) ? bw : void 0;
|
|
515
|
+
if (!query) {
|
|
516
|
+
res.status(StatusCodes.BAD_REQUEST).json({
|
|
517
|
+
error: "No query provided"
|
|
518
|
+
});
|
|
519
|
+
return;
|
|
520
|
+
}
|
|
521
|
+
try {
|
|
522
|
+
if (address == this.address) {
|
|
523
|
+
const result = await this.query(query, payloads);
|
|
524
|
+
return res.json(result);
|
|
504
525
|
} else {
|
|
505
|
-
const
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
526
|
+
const result = await this.callLocalModule(address, query, payloads);
|
|
527
|
+
if (result === null) {
|
|
528
|
+
res.status(StatusCodes.NOT_FOUND).json({
|
|
529
|
+
error: "Module not found"
|
|
530
|
+
});
|
|
531
|
+
} else {
|
|
532
|
+
res.json(result);
|
|
533
|
+
}
|
|
509
534
|
}
|
|
510
|
-
}
|
|
511
|
-
res.status(
|
|
535
|
+
} catch (ex) {
|
|
536
|
+
res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({
|
|
512
537
|
error: ex.message
|
|
513
538
|
});
|
|
514
|
-
}
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
initializeApp() {
|
|
542
|
+
const app = express();
|
|
543
|
+
app.use(responseProfiler);
|
|
544
|
+
app.use(jsonBodyParser);
|
|
545
|
+
app.use(standardResponses);
|
|
546
|
+
disableExpressDefaultPoweredByHeader(app);
|
|
547
|
+
app.use(customPoweredByHeader);
|
|
548
|
+
disableCaseSensitiveRouting(app);
|
|
549
|
+
useRequestCounters(app);
|
|
550
|
+
app.get("/", (_req, res) => res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${this.address}`));
|
|
551
|
+
app.post("/", (_req, res) => res.redirect(StatusCodes.TEMPORARY_REDIRECT, `/${this.address}`));
|
|
552
|
+
app.get("/:address", asyncHandler(async (req, res) => await this.handleGet(req, res)));
|
|
553
|
+
app.post("/:address", asyncHandler(async (req, res) => await this.handlePost(req, res)));
|
|
554
|
+
return app;
|
|
515
555
|
}
|
|
516
556
|
startHttpServer() {
|
|
517
557
|
var _a;
|
|
@@ -519,13 +559,24 @@ var _HttpBridge = class _HttpBridge extends HttpBridgeBase {
|
|
|
519
559
|
assertEx4(!this._server, () => "Server already started");
|
|
520
560
|
this._server = this.app.listen(((_a = this.config.host) == null ? void 0 : _a.port) ?? 3030);
|
|
521
561
|
}
|
|
522
|
-
return true;
|
|
562
|
+
return Promise.resolve(true);
|
|
523
563
|
}
|
|
524
564
|
stopHttpServer() {
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
565
|
+
if (this.config.host) {
|
|
566
|
+
return new Promise((resolve, reject) => {
|
|
567
|
+
if (this._server) {
|
|
568
|
+
this._server.close((err) => {
|
|
569
|
+
if (err) {
|
|
570
|
+
reject(err);
|
|
571
|
+
} else {
|
|
572
|
+
this._server = void 0;
|
|
573
|
+
resolve(true);
|
|
574
|
+
}
|
|
575
|
+
});
|
|
576
|
+
}
|
|
577
|
+
});
|
|
578
|
+
}
|
|
579
|
+
return Promise.resolve(true);
|
|
529
580
|
}
|
|
530
581
|
};
|
|
531
582
|
__name(_HttpBridge, "HttpBridge");
|