@xyo-network/chain-api 1.19.7 → 1.19.9
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/node/ApiActor.d.ts +4 -25
- package/dist/node/ApiActor.d.ts.map +1 -1
- package/dist/node/index.mjs +21 -323
- package/dist/node/index.mjs.map +1 -1
- package/dist/node/runApi.d.ts +2 -6
- package/dist/node/runApi.d.ts.map +1 -1
- package/dist/node/server/app.d.ts +2 -2
- package/dist/node/server/app.d.ts.map +1 -1
- package/dist/node/server/index.d.ts +0 -1
- package/dist/node/server/index.d.ts.map +1 -1
- package/dist/node/server/routes/addRoutes.d.ts.map +1 -1
- package/dist/node/server/routes/index.d.ts +0 -1
- package/dist/node/server/routes/index.d.ts.map +1 -1
- package/dist/node/server/server.d.ts +2 -2
- package/dist/node/server/server.d.ts.map +1 -1
- package/package.json +11 -17
- package/src/ApiActor.ts +5 -40
- package/src/runApi.ts +15 -20
- package/src/server/app.ts +2 -2
- package/src/server/index.ts +0 -1
- package/src/server/routes/addRoutes.ts +0 -2
- package/src/server/routes/index.ts +0 -2
- package/src/server/server.ts +5 -4
- package/dist/node/ApiContext.d.ts +0 -6
- package/dist/node/ApiContext.d.ts.map +0 -1
- package/dist/node/server/initApiParams.d.ts +0 -12
- package/dist/node/server/initApiParams.d.ts.map +0 -1
- package/dist/node/server/routes/address/AddressPathParams.d.ts +0 -4
- package/dist/node/server/routes/address/AddressPathParams.d.ts.map +0 -1
- package/dist/node/server/routes/address/addNodeRoutes.d.ts +0 -3
- package/dist/node/server/routes/address/addNodeRoutes.d.ts.map +0 -1
- package/dist/node/server/routes/address/get/get.d.ts +0 -4
- package/dist/node/server/routes/address/get/get.d.ts.map +0 -1
- package/dist/node/server/routes/address/get/index.d.ts +0 -2
- package/dist/node/server/routes/address/get/index.d.ts.map +0 -1
- package/dist/node/server/routes/address/index.d.ts +0 -2
- package/dist/node/server/routes/address/index.d.ts.map +0 -1
- package/dist/node/server/routes/address/post/getQueryConfig.d.ts +0 -6
- package/dist/node/server/routes/address/post/getQueryConfig.d.ts.map +0 -1
- package/dist/node/server/routes/address/post/index.d.ts +0 -2
- package/dist/node/server/routes/address/post/index.d.ts.map +0 -1
- package/dist/node/server/routes/address/post/post.d.ts +0 -8
- package/dist/node/server/routes/address/post/post.d.ts.map +0 -1
- package/src/ApiContext.ts +0 -6
- package/src/server/initApiParams.ts +0 -194
- package/src/server/routes/address/AddressPathParams.ts +0 -3
- package/src/server/routes/address/addNodeRoutes.ts +0 -21
- package/src/server/routes/address/get/get.ts +0 -30
- package/src/server/routes/address/get/index.ts +0 -1
- package/src/server/routes/address/index.ts +0 -1
- package/src/server/routes/address/post/getQueryConfig.ts +0 -23
- package/src/server/routes/address/post/index.ts +0 -1
- package/src/server/routes/address/post/post.ts +0 -77
package/dist/node/ApiActor.d.ts
CHANGED
|
@@ -1,30 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export type ApiActorParams = ActorParams<{
|
|
5
|
-
balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>;
|
|
6
|
-
context: ApiContext;
|
|
7
|
-
transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>;
|
|
1
|
+
import { ActorParamsV3, ActorV3, Config } from '@xyo-network/xl1-sdk';
|
|
2
|
+
export type ApiActorParams = ActorParamsV3<{
|
|
3
|
+
config: Config;
|
|
8
4
|
}>;
|
|
9
|
-
export declare class ApiActor extends
|
|
5
|
+
export declare class ApiActor extends ActorV3<ApiActorParams> {
|
|
10
6
|
private server?;
|
|
11
|
-
protected get context(): import("@xyo-network/xl1-sdk").ActorContext & ApiContext;
|
|
12
|
-
static defaultFactories(): CreatableProviderFactory[];
|
|
13
|
-
static paramsHandler<T extends ApiActor>(params: T['params']): Promise<{
|
|
14
|
-
context: import("@xyo-network/xl1-sdk").ActorContext & ApiContext;
|
|
15
|
-
account: import("@xyo-network/account-model").AccountInstance;
|
|
16
|
-
name?: import("@xylabs/sdk-js").CreatableName;
|
|
17
|
-
statusReporter?: import("@xylabs/sdk-js").CreatableStatusReporter<void> | undefined;
|
|
18
|
-
logger: import("@xylabs/sdk-js").Logger;
|
|
19
|
-
meterProvider?: import("@opentelemetry/api").MeterProvider;
|
|
20
|
-
traceProvider?: import("@opentelemetry/api").TracerProvider;
|
|
21
|
-
displayName: string | (string & {
|
|
22
|
-
__baseClassName: true;
|
|
23
|
-
}) | undefined;
|
|
24
|
-
id: string | (string & {
|
|
25
|
-
__baseClassName: true;
|
|
26
|
-
});
|
|
27
|
-
}>;
|
|
28
7
|
createHandler(): Promise<void>;
|
|
29
8
|
startHandler(): Promise<void>;
|
|
30
9
|
stopHandler(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiActor.d.ts","sourceRoot":"","sources":["../../src/ApiActor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ApiActor.d.ts","sourceRoot":"","sources":["../../src/ApiActor.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,aAAa,EAAE,OAAO,EAAE,MAAM,EAC/B,MAAM,sBAAsB,CAAA;AAI7B,MAAM,MAAM,cAAc,GAAG,aAAa,CAAC;IACzC,MAAM,EAAE,MAAM,CAAA;CACf,CAAC,CAAA;AAEF,qBACa,QAAS,SAAQ,OAAO,CAAC,cAAc,CAAC;IACnD,OAAO,CAAC,MAAM,CAAC,CAAQ;IAER,aAAa;IAIb,YAAY;IAMZ,WAAW;YAKZ,WAAW;IAIzB,OAAO,CAAC,UAAU;CAInB"}
|
package/dist/node/index.mjs
CHANGED
|
@@ -2,9 +2,8 @@ var __defProp = Object.defineProperty;
|
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
3
|
|
|
4
4
|
// src/ApiActor.ts
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { Actor } from "@xyo-network/xl1-sdk";
|
|
5
|
+
import { creatable } from "@xylabs/sdk-js";
|
|
6
|
+
import { ActorV3 } from "@xyo-network/xl1-sdk";
|
|
8
7
|
|
|
9
8
|
// src/server/app.ts
|
|
10
9
|
import { customPoweredByHeader, disableCaseSensitiveRouting, disableExpressDefaultPoweredByHeader, getJsonBodyParser, getJsonBodyParserOptions, responseProfiler, standardErrors, standardResponses } from "@xylabs/express";
|
|
@@ -26,157 +25,9 @@ var addInstrumentation = /* @__PURE__ */ __name(() => {
|
|
|
26
25
|
});
|
|
27
26
|
}, "addInstrumentation");
|
|
28
27
|
|
|
29
|
-
// src/server/routes/address/addNodeRoutes.ts
|
|
30
|
-
import { StatusCodes as StatusCodes3 } from "http-status-codes";
|
|
31
|
-
|
|
32
|
-
// src/server/routes/address/get/get.ts
|
|
33
|
-
import { asyncHandler } from "@xylabs/express";
|
|
34
|
-
import { asAddress, isDefined } from "@xylabs/sdk-js";
|
|
35
|
-
import { isModuleName } from "@xyo-network/module-model";
|
|
36
|
-
import { StatusCodes } from "http-status-codes";
|
|
37
|
-
var handler = /* @__PURE__ */ __name(async (req, res, next) => {
|
|
38
|
-
const { address: moduleIdentifier } = req.params;
|
|
39
|
-
const { node } = req.app.context;
|
|
40
|
-
const address = asAddress(moduleIdentifier);
|
|
41
|
-
if (isDefined(address)) {
|
|
42
|
-
let mod = node.address === address ? node : await node.resolve(address, {
|
|
43
|
-
direction: "down"
|
|
44
|
-
});
|
|
45
|
-
if (mod) {
|
|
46
|
-
res.json(await mod.state());
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
if (isModuleName(moduleIdentifier)) {
|
|
51
|
-
const mod = await node.resolve(moduleIdentifier, {
|
|
52
|
-
direction: "down"
|
|
53
|
-
});
|
|
54
|
-
if (mod) {
|
|
55
|
-
res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${mod.address}`);
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
next("route");
|
|
60
|
-
}, "handler");
|
|
61
|
-
var getAddress = asyncHandler(handler);
|
|
62
|
-
|
|
63
|
-
// src/server/routes/address/post/post.ts
|
|
64
|
-
import { asyncHandler as asyncHandler2 } from "@xylabs/express";
|
|
65
|
-
import { asAddress as asAddress2, assertEx, isAddress, toAddress } from "@xylabs/sdk-js";
|
|
66
|
-
import { isQueryBoundWitness } from "@xyo-network/boundwitness-model";
|
|
67
|
-
import { ModuleErrorBuilder } from "@xyo-network/module-abstract";
|
|
68
|
-
import { StatusCodes as StatusCodes2 } from "http-status-codes";
|
|
69
|
-
|
|
70
|
-
// src/server/routes/address/post/getQueryConfig.ts
|
|
71
|
-
import { BoundWitnessSchema } from "@xyo-network/boundwitness-model";
|
|
72
|
-
import { ModuleConfigSchema } from "@xyo-network/module-model";
|
|
73
|
-
var DEFAULT_DEPTH = 5;
|
|
74
|
-
var getQueryConfig = /* @__PURE__ */ __name((mod, req, bw, payloads) => {
|
|
75
|
-
const nestedBwAddresses = payloads?.flat(DEFAULT_DEPTH).filter((payload) => payload?.schema === BoundWitnessSchema).map((bw2) => bw2.addresses) ?? [];
|
|
76
|
-
const addresses = [
|
|
77
|
-
bw.addresses,
|
|
78
|
-
...nestedBwAddresses
|
|
79
|
-
].filter((address) => address.length > 0);
|
|
80
|
-
const allowed = addresses.length > 0 ? Object.fromEntries(mod.queries.map((schema) => [
|
|
81
|
-
schema,
|
|
82
|
-
addresses
|
|
83
|
-
])) : {};
|
|
84
|
-
const security = {
|
|
85
|
-
allowed
|
|
86
|
-
};
|
|
87
|
-
return {
|
|
88
|
-
schema: ModuleConfigSchema,
|
|
89
|
-
security
|
|
90
|
-
};
|
|
91
|
-
}, "getQueryConfig");
|
|
92
|
-
|
|
93
|
-
// src/server/routes/address/post/post.ts
|
|
94
|
-
var handler2 = /* @__PURE__ */ __name(async (req, res, next) => {
|
|
95
|
-
const returnError = /* @__PURE__ */ __name((code, message = "An error occurred", details) => {
|
|
96
|
-
const error = new ModuleErrorBuilder().message(message).details(details).build();
|
|
97
|
-
res.locals.rawResponse = false;
|
|
98
|
-
res.status(code).json(error);
|
|
99
|
-
next();
|
|
100
|
-
}, "returnError");
|
|
101
|
-
const { address } = req.params;
|
|
102
|
-
const { node } = req.app.context;
|
|
103
|
-
const [bw, payloads] = Array.isArray(req.body) ? req.body : [];
|
|
104
|
-
if (!isAddress(address)) {
|
|
105
|
-
return returnError(StatusCodes2.BAD_REQUEST, "Missing address");
|
|
106
|
-
}
|
|
107
|
-
if (!bw) {
|
|
108
|
-
return returnError(StatusCodes2.BAD_REQUEST, "Missing boundwitness");
|
|
109
|
-
}
|
|
110
|
-
if (!isQueryBoundWitness(bw)) {
|
|
111
|
-
return returnError(StatusCodes2.BAD_REQUEST, "Invalid query boundwitness");
|
|
112
|
-
}
|
|
113
|
-
let modules = [];
|
|
114
|
-
const normalizedAddress = toAddress(address);
|
|
115
|
-
if (node.address === normalizedAddress) modules = [
|
|
116
|
-
node
|
|
117
|
-
];
|
|
118
|
-
else {
|
|
119
|
-
const typedAddress = asAddress2(address);
|
|
120
|
-
const byAddress = typedAddress === void 0 ? void 0 : await node.resolve(typedAddress, {
|
|
121
|
-
maxDepth: 10
|
|
122
|
-
});
|
|
123
|
-
if (byAddress) modules = [
|
|
124
|
-
byAddress
|
|
125
|
-
];
|
|
126
|
-
else {
|
|
127
|
-
const byName = await node.resolve(address, {
|
|
128
|
-
direction: "down"
|
|
129
|
-
});
|
|
130
|
-
if (byName) {
|
|
131
|
-
const moduleAddress = assertEx(byName?.address, () => "Error redirecting to module by address");
|
|
132
|
-
res.redirect(StatusCodes2.TEMPORARY_REDIRECT, `/${moduleAddress}`);
|
|
133
|
-
return;
|
|
134
|
-
} else {
|
|
135
|
-
return returnError(StatusCodes2.NOT_FOUND, "Module not found", {
|
|
136
|
-
address
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
if (modules.length > 0) {
|
|
142
|
-
const mod = modules[0];
|
|
143
|
-
const queryConfig = getQueryConfig(mod, req, bw, payloads);
|
|
144
|
-
try {
|
|
145
|
-
const queryResult = await mod.query(bw, payloads, queryConfig);
|
|
146
|
-
res.json(queryResult);
|
|
147
|
-
} catch (ex) {
|
|
148
|
-
return returnError(StatusCodes2.INTERNAL_SERVER_ERROR, "Query Failed", {
|
|
149
|
-
message: ex?.message ?? "Unknown Error"
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
} else {
|
|
153
|
-
return returnError(StatusCodes2.NOT_FOUND, "Module not found", {
|
|
154
|
-
address
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
}, "handler");
|
|
158
|
-
var postAddress = asyncHandler2(handler2);
|
|
159
|
-
|
|
160
|
-
// src/server/routes/address/addNodeRoutes.ts
|
|
161
|
-
var addNodeRoutes = /* @__PURE__ */ __name((app) => {
|
|
162
|
-
const defaultModule = app.context.node;
|
|
163
|
-
const address = defaultModule.address;
|
|
164
|
-
const defaultModuleEndpoint = `/${address}`;
|
|
165
|
-
app.get("/", (_req, res) => res.redirect(StatusCodes3.MOVED_TEMPORARILY, defaultModuleEndpoint));
|
|
166
|
-
app.post("/", (_req, res) => res.redirect(StatusCodes3.TEMPORARY_REDIRECT, defaultModuleEndpoint));
|
|
167
|
-
app.get("/:address", getAddress);
|
|
168
|
-
app.post("/:address", postAddress);
|
|
169
|
-
app.get("/:hash", (_req, res) => {
|
|
170
|
-
res.sendStatus(StatusCodes3.NOT_FOUND);
|
|
171
|
-
});
|
|
172
|
-
app.post("/:hash", (_req, res) => {
|
|
173
|
-
res.sendStatus(StatusCodes3.NOT_FOUND);
|
|
174
|
-
});
|
|
175
|
-
}, "addNodeRoutes");
|
|
176
|
-
|
|
177
28
|
// src/server/routes/dataLake/archivistMiddleware.ts
|
|
178
29
|
import { setRawResponseFormat } from "@xylabs/express";
|
|
179
|
-
import { asHash, isDefined
|
|
30
|
+
import { asHash, isDefined } from "@xylabs/sdk-js";
|
|
180
31
|
import { asArchivistInstance } from "@xyo-network/archivist-model";
|
|
181
32
|
import { PayloadBuilder } from "@xyo-network/payload-builder";
|
|
182
33
|
import { isAnyPayload, isSequence } from "@xyo-network/payload-model";
|
|
@@ -189,7 +40,7 @@ var resolveArchivist = /* @__PURE__ */ __name(async (node, archivistModuleIdenti
|
|
|
189
40
|
}, "resolveArchivist");
|
|
190
41
|
var archivistInstance;
|
|
191
42
|
var getArchivist = /* @__PURE__ */ __name(async (node, archivistModuleIdentifier) => {
|
|
192
|
-
if (
|
|
43
|
+
if (isDefined(archivistInstance)) return archivistInstance;
|
|
193
44
|
archivistInstance = await resolveArchivist(node, archivistModuleIdentifier);
|
|
194
45
|
return archivistInstance;
|
|
195
46
|
}, "getArchivist");
|
|
@@ -211,8 +62,8 @@ var archivistMiddleware = /* @__PURE__ */ __name((options) => {
|
|
|
211
62
|
router.get("/next", async (req, res) => {
|
|
212
63
|
setRawResponseFormat(res);
|
|
213
64
|
const cursor = isSequence(req.query.cursor) ? req.query.cursor : void 0;
|
|
214
|
-
const limit =
|
|
215
|
-
const open =
|
|
65
|
+
const limit = isDefined(req.query.limit) ? Number(req.query.limit) : void 0;
|
|
66
|
+
const open = isDefined(req.query.open) ? Boolean(req.query.open) : void 0;
|
|
216
67
|
const order = req.query.order === "asc" ? "asc" : "desc";
|
|
217
68
|
const options2 = {
|
|
218
69
|
limit,
|
|
@@ -228,14 +79,14 @@ var archivistMiddleware = /* @__PURE__ */ __name((options) => {
|
|
|
228
79
|
setRawResponseFormat(res);
|
|
229
80
|
const options2 = req.body;
|
|
230
81
|
const archivist = await getArchivist(node, archivistModuleIdentifier);
|
|
231
|
-
const result = await (
|
|
82
|
+
const result = await (isDefined(options2) ? archivist.next(options2) : archivist.next());
|
|
232
83
|
res.status(200).json(result);
|
|
233
84
|
});
|
|
234
85
|
router.get("/get/:hash", async (req, res) => {
|
|
235
86
|
setRawResponseFormat(res);
|
|
236
87
|
const { hash: rawHash } = req.params;
|
|
237
88
|
const hash = asHash(rawHash);
|
|
238
|
-
if (
|
|
89
|
+
if (isDefined(hash)) {
|
|
239
90
|
const archivist = await getArchivist(node, archivistModuleIdentifier);
|
|
240
91
|
const [payload] = await archivist.get([
|
|
241
92
|
hash
|
|
@@ -280,7 +131,6 @@ var addRpcRoutes = /* @__PURE__ */ __name(async (app) => {
|
|
|
280
131
|
var addRoutes = /* @__PURE__ */ __name(async (app) => {
|
|
281
132
|
await addRpcRoutes(app);
|
|
282
133
|
addDataLakeRoutes(app);
|
|
283
|
-
addNodeRoutes(app);
|
|
284
134
|
}, "addRoutes");
|
|
285
135
|
|
|
286
136
|
// src/server/app.ts
|
|
@@ -304,142 +154,13 @@ var getApp = /* @__PURE__ */ __name(async (context) => {
|
|
|
304
154
|
return app;
|
|
305
155
|
}, "getApp");
|
|
306
156
|
|
|
307
|
-
// src/server/initApiParams.ts
|
|
308
|
-
import { assertEx as assertEx2 } from "@xylabs/sdk-js";
|
|
309
|
-
import { Account } from "@xyo-network/account";
|
|
310
|
-
import { buildTelemetryConfig, initApiWallet, initBalanceSummaryMap, initEvmProvidersIfAvailable, initHealthEndpoints, initServerNode, initStatusReporter, initTransferSummaryMap, MempoolActor, ValidatorActor } from "@xyo-network/chain-orchestration";
|
|
311
|
-
import { createBootstrapHead } from "@xyo-network/chain-services";
|
|
312
|
-
import { initTelemetry } from "@xyo-network/chain-telemetry";
|
|
313
|
-
import { startupSpanAsync } from "@xyo-network/chain-utils";
|
|
314
|
-
import { validateHydratedBlock, validateHydratedBlockState } from "@xyo-network/chain-validation";
|
|
315
|
-
import { AccountBalanceViewerMoniker, asAttoXL1, BlockViewerMoniker, buildLocalProviderLocator, DefaultMetricsScrapePorts, findMostRecentBlock, flattenHydratedBlock, MempoolRunnerMoniker, MempoolViewerMoniker, SimpleBlockValidationViewer, SimpleXyoConnection, XyoViewerMoniker } from "@xyo-network/xl1-sdk";
|
|
316
|
-
async function initApiParams(params) {
|
|
317
|
-
const { config, node: providedNode } = params;
|
|
318
|
-
const { id: configuredChainId } = config.chain;
|
|
319
|
-
const logger = assertEx2(params.logger, () => "Logger is required to init server");
|
|
320
|
-
const statusReporter = initStatusReporter({
|
|
321
|
-
logger
|
|
322
|
-
});
|
|
323
|
-
await startupSpanAsync("initHealthEndpoints", () => initHealthEndpoints({
|
|
324
|
-
config,
|
|
325
|
-
logger,
|
|
326
|
-
statusReporter
|
|
327
|
-
}));
|
|
328
|
-
const telemetryConfig = buildTelemetryConfig(config, "xl1-api", "1.0.0", DefaultMetricsScrapePorts.api);
|
|
329
|
-
const { traceProvider, meterProvider } = await startupSpanAsync("initTelemetry", () => initTelemetry(telemetryConfig));
|
|
330
|
-
const initContext = {
|
|
331
|
-
_id: "init-context",
|
|
332
|
-
config,
|
|
333
|
-
logger,
|
|
334
|
-
statusReporter,
|
|
335
|
-
timeBudgetLimit: 1e3,
|
|
336
|
-
meterProvider,
|
|
337
|
-
traceProvider,
|
|
338
|
-
singletons: {},
|
|
339
|
-
caches: {}
|
|
340
|
-
};
|
|
341
|
-
const wallet = await initApiWallet(initContext);
|
|
342
|
-
const balancesSummaryMap = assertEx2(await initBalanceSummaryMap(initContext), () => "Balance Summary Map not initialized");
|
|
343
|
-
const transfersSummaryMap = assertEx2(await initTransferSummaryMap(initContext), () => "Transfer Summary Map not initialized");
|
|
344
|
-
const { node, writableChainArchivist, readonlyChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist } = await initServerNode({
|
|
345
|
-
...initContext,
|
|
346
|
-
wallet,
|
|
347
|
-
node: providedNode,
|
|
348
|
-
transfersSummaryMap,
|
|
349
|
-
balancesSummaryMap
|
|
350
|
-
});
|
|
351
|
-
await writableChainArchivist.start();
|
|
352
|
-
await readonlyChainArchivist.start();
|
|
353
|
-
await pendingTransactionsArchivist.start();
|
|
354
|
-
await pendingBlocksArchivist.start();
|
|
355
|
-
const possibleHead = await findMostRecentBlock(readonlyChainArchivist);
|
|
356
|
-
if (configuredChainId && possibleHead && possibleHead.chain !== configuredChainId) {
|
|
357
|
-
throw new Error(`Configured chain ID (${configuredChainId}) does not match the existing chain ID (${possibleHead.chain})`);
|
|
358
|
-
}
|
|
359
|
-
let possibleChainId = configuredChainId;
|
|
360
|
-
if (!possibleHead) {
|
|
361
|
-
possibleChainId = possibleChainId ?? (await Account.random()).address;
|
|
362
|
-
const chain = await createBootstrapHead(wallet, possibleChainId, asAttoXL1(20000000000000000000000n), config.chain.genesisRewardAddress ?? wallet.address);
|
|
363
|
-
const payloads = chain.flatMap((block) => flattenHydratedBlock(block));
|
|
364
|
-
await writableChainArchivist.insert(payloads);
|
|
365
|
-
}
|
|
366
|
-
const head = possibleHead ?? assertEx2(await findMostRecentBlock(readonlyChainArchivist), () => "No blocks found in chain archivist");
|
|
367
|
-
const chainId = assertEx2(possibleChainId, () => "Chain ID could not be determined");
|
|
368
|
-
assertEx2(head.chain === chainId, () => `Chain ID does not match head block chain ID [init] [${head.chain} !== ${chainId}]`);
|
|
369
|
-
const mods = await node.resolve("*");
|
|
370
|
-
await Promise.all(mods.map((mod) => {
|
|
371
|
-
return mod.start?.() ?? (() => true);
|
|
372
|
-
}));
|
|
373
|
-
const locator = buildLocalProviderLocator({
|
|
374
|
-
context: initContext,
|
|
375
|
-
finalizedArchivist: writableChainArchivist,
|
|
376
|
-
pendingTransactionsArchivist,
|
|
377
|
-
pendingBlocksArchivist,
|
|
378
|
-
balancesSummaryMap,
|
|
379
|
-
transfersSummaryMap,
|
|
380
|
-
node,
|
|
381
|
-
chainId
|
|
382
|
-
});
|
|
383
|
-
await initEvmProvidersIfAvailable(locator);
|
|
384
|
-
locator.register(SimpleBlockValidationViewer.factory(SimpleBlockValidationViewer.dependencies, {
|
|
385
|
-
state: validateHydratedBlockState,
|
|
386
|
-
protocol: validateHydratedBlock
|
|
387
|
-
}));
|
|
388
|
-
locator.register(SimpleXyoConnection.factory(SimpleXyoConnection.dependencies, {}));
|
|
389
|
-
const apiContext = {
|
|
390
|
-
...initContext,
|
|
391
|
-
...locator.context,
|
|
392
|
-
_id: "api-context",
|
|
393
|
-
node
|
|
394
|
-
};
|
|
395
|
-
const blockViewer = await locator.getInstance(BlockViewerMoniker);
|
|
396
|
-
assertEx2(await blockViewer.start(), () => "Failed to start BlockViewer");
|
|
397
|
-
const blk = await blockViewer.currentBlock();
|
|
398
|
-
assertEx2(blk, () => "No blocks found after initialization");
|
|
399
|
-
const accountBalanceViewer = await locator.getInstance(AccountBalanceViewerMoniker);
|
|
400
|
-
assertEx2(await accountBalanceViewer.start(), () => "Failed to start AccountBalanceViewer");
|
|
401
|
-
const xyoViewer = await locator.getInstance(XyoViewerMoniker);
|
|
402
|
-
assertEx2(await xyoViewer.start(), () => "Failed to start XyoViewer");
|
|
403
|
-
const mempoolViewer = await locator.getInstance(MempoolViewerMoniker);
|
|
404
|
-
assertEx2(await mempoolViewer.start(), () => "Failed to start MempoolViewer");
|
|
405
|
-
const mempoolRunner = await locator.getInstance(MempoolRunnerMoniker);
|
|
406
|
-
assertEx2(await mempoolRunner.start(), () => "Failed to start MempoolRunner");
|
|
407
|
-
console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`);
|
|
408
|
-
const validatorActor = config.mempool.enabled ? void 0 : await ValidatorActor.create({
|
|
409
|
-
id: "validator-mempool-server",
|
|
410
|
-
account: wallet,
|
|
411
|
-
context: locator.context,
|
|
412
|
-
finalizedArchivist: writableChainArchivist,
|
|
413
|
-
mempoolViewer,
|
|
414
|
-
blockViewer
|
|
415
|
-
});
|
|
416
|
-
await validatorActor?.start();
|
|
417
|
-
const mempoolActor = config.mempool.enabled ? void 0 : await MempoolActor.create({
|
|
418
|
-
id: "mempool-mempool-server",
|
|
419
|
-
account: wallet,
|
|
420
|
-
context: locator.context,
|
|
421
|
-
mempoolRunner,
|
|
422
|
-
pendingBlocksArchivist,
|
|
423
|
-
pendingTransactionsArchivist
|
|
424
|
-
});
|
|
425
|
-
await mempoolActor?.start();
|
|
426
|
-
return {
|
|
427
|
-
id: "api-actor",
|
|
428
|
-
account: wallet,
|
|
429
|
-
context: apiContext,
|
|
430
|
-
transfersSummaryMap,
|
|
431
|
-
balancesSummaryMap
|
|
432
|
-
};
|
|
433
|
-
}
|
|
434
|
-
__name(initApiParams, "initApiParams");
|
|
435
|
-
|
|
436
157
|
// src/server/server.ts
|
|
437
158
|
var hostname = "::";
|
|
438
159
|
async function getServer(context) {
|
|
439
160
|
const { logger } = context;
|
|
440
|
-
const { port } = context.config.api;
|
|
161
|
+
const { port } = context.config.actors.api;
|
|
441
162
|
const app = await getApp(context);
|
|
442
|
-
const server = app.listen(port, hostname, () => logger?.
|
|
163
|
+
const server = app.listen(port, hostname, () => logger?.info(`[API] Server listening at http://${hostname}:${port}`));
|
|
443
164
|
server.setTimeout(2e4);
|
|
444
165
|
return server;
|
|
445
166
|
}
|
|
@@ -453,34 +174,11 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
453
174
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
454
175
|
}
|
|
455
176
|
__name(_ts_decorate, "_ts_decorate");
|
|
456
|
-
var ApiActor = class extends
|
|
177
|
+
var ApiActor = class extends ActorV3 {
|
|
457
178
|
static {
|
|
458
179
|
__name(this, "ApiActor");
|
|
459
180
|
}
|
|
460
181
|
server;
|
|
461
|
-
get context() {
|
|
462
|
-
return this.params.context;
|
|
463
|
-
}
|
|
464
|
-
static defaultFactories() {
|
|
465
|
-
return [
|
|
466
|
-
...super.defaultFactories()
|
|
467
|
-
];
|
|
468
|
-
}
|
|
469
|
-
static async paramsHandler(params) {
|
|
470
|
-
const logger = params?.context?.logger;
|
|
471
|
-
let account = params?.account;
|
|
472
|
-
if (account === void 0) {
|
|
473
|
-
const newAccount = await Account2.random();
|
|
474
|
-
logger?.warn(`No account provided to ApiActor, generating random account ${newAccount.address}`);
|
|
475
|
-
account = newAccount;
|
|
476
|
-
}
|
|
477
|
-
logger?.info(`Running api for account ${account.address}`);
|
|
478
|
-
return {
|
|
479
|
-
...await super.paramsHandler(params),
|
|
480
|
-
context: params.context,
|
|
481
|
-
account: assertEx3(account, () => "ApiActor requires an account to run")
|
|
482
|
-
};
|
|
483
|
-
}
|
|
484
182
|
async createHandler() {
|
|
485
183
|
await super.createHandler();
|
|
486
184
|
}
|
|
@@ -506,17 +204,18 @@ ApiActor = _ts_decorate([
|
|
|
506
204
|
], ApiActor);
|
|
507
205
|
|
|
508
206
|
// src/runApi.ts
|
|
509
|
-
import { exists
|
|
510
|
-
import {
|
|
511
|
-
var runApi = /* @__PURE__ */ __name(async (
|
|
512
|
-
const
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
207
|
+
import { exists } from "@xylabs/sdk-js";
|
|
208
|
+
import { initApiWallet } from "@xyo-network/chain-orchestration";
|
|
209
|
+
var runApi = /* @__PURE__ */ __name(async (config, orchestrator, locator) => {
|
|
210
|
+
const account = await initApiWallet({
|
|
211
|
+
config,
|
|
212
|
+
logger: locator.context.logger
|
|
213
|
+
});
|
|
214
|
+
const api = await ApiActor.create({
|
|
215
|
+
account,
|
|
516
216
|
config,
|
|
517
|
-
|
|
217
|
+
locator
|
|
518
218
|
});
|
|
519
|
-
const api = await ApiActor.create(actorParams);
|
|
520
219
|
const actors = [
|
|
521
220
|
api
|
|
522
221
|
].filter(exists);
|
|
@@ -529,7 +228,6 @@ export {
|
|
|
529
228
|
ApiActor,
|
|
530
229
|
getApp,
|
|
531
230
|
getServer,
|
|
532
|
-
initApiParams,
|
|
533
231
|
runApi
|
|
534
232
|
};
|
|
535
233
|
//# sourceMappingURL=index.mjs.map
|
package/dist/node/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ApiActor.ts","../../src/server/app.ts","../../src/server/instrumentation.ts","../../src/server/routes/address/addNodeRoutes.ts","../../src/server/routes/address/get/get.ts","../../src/server/routes/address/post/post.ts","../../src/server/routes/address/post/getQueryConfig.ts","../../src/server/routes/dataLake/archivistMiddleware.ts","../../src/server/routes/dataLake/addDataLakeRoutes.ts","../../src/server/routes/rpc/routes/addRpcRoutes.ts","../../src/server/routes/addRoutes.ts","../../src/server/initApiParams.ts","../../src/server/server.ts","../../src/runApi.ts"],"sourcesContent":["import { Server } from 'node:http'\n\nimport { assertEx, creatable } from '@xylabs/sdk-js'\nimport { Account } from '@xyo-network/account'\nimport { WithStorageMeta } from '@xyo-network/payload-model'\nimport {\n Actor, ActorParams, BalancesStepSummary, CreatableProviderFactory,\n MapType,\n TransfersStepSummary,\n} from '@xyo-network/xl1-sdk'\n\nimport { ApiContext } from './ApiContext.ts'\nimport { getServer } from './server/index.ts'\n\nexport type ApiActorParams = ActorParams<{\n balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>\n context: ApiContext\n transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>\n}>\n\n@creatable()\nexport class ApiActor extends Actor<ApiActorParams> {\n private server?: Server\n\n protected override get context() {\n return this.params.context!\n }\n\n static override defaultFactories(): CreatableProviderFactory[] {\n return [\n ...super.defaultFactories(),\n ]\n }\n\n static override async paramsHandler<T extends ApiActor>(params: T['params']) {\n const logger = params?.context?.logger\n\n let account = params?.account\n if (account === undefined) {\n const newAccount = await Account.random()\n logger?.warn(`No account provided to ApiActor, generating random account ${newAccount.address}`)\n account = newAccount\n }\n logger?.info(`Running api for account ${account.address}`)\n\n return {\n ...await super.paramsHandler(params),\n context: params.context,\n account: assertEx(account, () => 'ApiActor requires an account to run'),\n }\n }\n\n override async createHandler() {\n await super.createHandler()\n }\n\n override async startHandler() {\n await super.startHandler()\n this.stopServer()\n await this.startServer()\n }\n\n override async stopHandler() {\n await super.stopHandler()\n this.stopServer()\n }\n\n private async startServer() {\n this.server = await getServer(this.context)\n }\n\n private stopServer() {\n this.server?.close()\n this.server = undefined\n }\n}\n","import {\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n getJsonBodyParser,\n getJsonBodyParserOptions,\n responseProfiler,\n standardErrors,\n standardResponses,\n} from '@xylabs/express'\nimport compression from 'compression'\nimport cors from 'cors'\nimport type { Express } from 'express'\nimport express from 'express'\n\nimport type { ApiContext } from '../ApiContext.ts'\nimport { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = async (context: ApiContext): Promise<Express> => {\n addInstrumentation()\n const app = express()\n app.set('etag', false)\n\n app.use(cors())\n app.use(compression())\n app.use(responseProfiler)\n app.use(getJsonBodyParser(getJsonBodyParserOptions({ limit: '1mb' })))\n app.use(standardResponses)\n disableExpressDefaultPoweredByHeader(app)\n app.use(customPoweredByHeader)\n disableCaseSensitiveRouting(app)\n app.context = context\n await addRoutes(app)\n app.use(standardErrors)\n return app\n}\n","import { registerInstrumentations } from '@opentelemetry/instrumentation'\nimport { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http'\n\n/**\n * Registers OpenTelemetry instrumentations for HTTP and Express.\n * This function is used to set up the necessary instrumentations for monitoring\n * HTTP requests and Express applications. Since it monkey patches the Express\n * router & middleware system, it should be called before any Express applications\n * are defined.\n */\nexport const addInstrumentation = () => {\n const instrumentations = [new HttpInstrumentation(), new ExpressInstrumentation()]\n registerInstrumentations({ instrumentations })\n}\n","import type { Express } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport { getAddress } from './get/index.ts'\nimport { postAddress } from './post/index.ts'\n\nexport const addNodeRoutes = (app: Express) => {\n const defaultModule = app.context.node\n const address = defaultModule.address\n const defaultModuleEndpoint = `/${address}`\n app.get('/', (_req, res) => res.redirect(StatusCodes.MOVED_TEMPORARILY, defaultModuleEndpoint))\n app.post('/', (_req, res) => res.redirect(StatusCodes.TEMPORARY_REDIRECT, defaultModuleEndpoint))\n app.get('/:address', getAddress)\n app.post('/:address', postAddress)\n app.get('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n app.post('/:hash', (_req, res) => {\n res.sendStatus(StatusCodes.NOT_FOUND)\n })\n}\n","import { asyncHandler } from '@xylabs/express'\nimport { asAddress, isDefined } from '@xylabs/sdk-js'\nimport { isModuleName } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\n\nconst handler: RequestHandler<AddressPathParams, Payload[]> = async (req, res, next) => {\n const { address: moduleIdentifier } = req.params\n const { node } = req.app.context\n const address = asAddress(moduleIdentifier)\n if (isDefined(address)) {\n let mod = node.address === address ? node : (await node.resolve(address, { direction: 'down' }))\n if (mod) {\n res.json(await mod.state())\n return\n }\n }\n if (isModuleName(moduleIdentifier)) {\n const mod = await node.resolve(moduleIdentifier, { direction: 'down' })\n if (mod) {\n res.redirect(StatusCodes.MOVED_TEMPORARILY, `/${mod.address}`)\n return\n }\n }\n next('route')\n}\nexport const getAddress = asyncHandler(handler)\n","import { asyncHandler } from '@xylabs/express'\nimport type { JsonObject } from '@xylabs/sdk-js'\nimport {\n asAddress, assertEx,\n isAddress,\n toAddress,\n} from '@xylabs/sdk-js'\nimport { isQueryBoundWitness, type QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { ModuleErrorBuilder } from '@xyo-network/module-abstract'\nimport type { ModuleInstance, ModuleQueryResult } from '@xyo-network/module-model'\nimport type { ModuleError, Payload } from '@xyo-network/payload-model'\nimport type { RequestHandler } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nimport type { AddressPathParams } from '../AddressPathParams.ts'\nimport { getQueryConfig } from './getQueryConfig.ts'\n\ntype PostAddressRequestBody = [QueryBoundWitness, undefined | Payload[]]\n\nconst handler: RequestHandler<AddressPathParams, ModuleQueryResult | ModuleError, PostAddressRequestBody> = async (req, res, next) => {\n const returnError = (code: number, message = 'An error occurred', details?: JsonObject) => {\n const error = new ModuleErrorBuilder().message(message).details(details).build()\n res.locals.rawResponse = false\n res.status(code).json(error)\n next()\n }\n\n const { address } = req.params\n const { node } = req.app.context\n const [bw, payloads] = Array.isArray(req.body) ? req.body : []\n if (!isAddress(address)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing address')\n }\n\n if (!bw) {\n return returnError(StatusCodes.BAD_REQUEST, 'Missing boundwitness')\n }\n\n if (!isQueryBoundWitness(bw)) {\n return returnError(StatusCodes.BAD_REQUEST, 'Invalid query boundwitness')\n }\n\n let modules: ModuleInstance[] = []\n const normalizedAddress = toAddress(address)\n if (node.address === normalizedAddress) modules = [node]\n else {\n const typedAddress = asAddress(address)\n const byAddress = (typedAddress === undefined) ? undefined : await node.resolve(typedAddress, { maxDepth: 10 })\n\n if (byAddress) modules = [byAddress]\n else {\n const byName = await node.resolve(address, { direction: 'down' })\n if (byName) {\n const moduleAddress = assertEx(byName?.address, () => 'Error redirecting to module by address')\n res.redirect(StatusCodes.TEMPORARY_REDIRECT, `/${moduleAddress}`)\n return\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n }\n }\n\n if (modules.length > 0) {\n const mod = modules[0]\n const queryConfig = getQueryConfig(mod, req, bw, payloads)\n try {\n const queryResult = await mod.query(bw, payloads, queryConfig)\n res.json(queryResult)\n } catch (ex) {\n return returnError(StatusCodes.INTERNAL_SERVER_ERROR, 'Query Failed', { message: (ex as Error)?.message ?? 'Unknown Error' })\n }\n } else {\n return returnError(StatusCodes.NOT_FOUND, 'Module not found', { address })\n }\n}\n\nexport const postAddress = asyncHandler(handler)\n","import type { BoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport type { ModuleConfig, ModuleInstance } from '@xyo-network/module-model'\nimport { ModuleConfigSchema } from '@xyo-network/module-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type { Request } from 'express'\n\nconst DEFAULT_DEPTH = 5 as const\n\nexport const getQueryConfig = (mod: ModuleInstance, req: Request, bw: QueryBoundWitness, payloads?: Payload[]): ModuleConfig | undefined => {\n // TODO: Filter based on query addresses?\n // Recurse through payloads for nested BWs\n const nestedBwAddresses\n = payloads\n ?.flat(DEFAULT_DEPTH)\n .filter<BoundWitness>((payload): payload is BoundWitness => payload?.schema === BoundWitnessSchema)\n .map(bw => bw.addresses) ?? []\n // TODO: Do we want to end up with a list of addresses or a list of address lists?\n const addresses = [bw.addresses, ...nestedBwAddresses].filter(address => address.length > 0)\n const allowed = addresses.length > 0 ? Object.fromEntries(mod.queries.map(schema => [schema, addresses])) : {}\n const security = { allowed }\n return { schema: ModuleConfigSchema, security }\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport { asHash, isDefined } from '@xylabs/sdk-js'\nimport type {\n ArchivistInstance,\n ArchivistNextOptions, NextOptions,\n} from '@xyo-network/archivist-model'\nimport { asArchivistInstance } from '@xyo-network/archivist-model'\nimport type { ModuleIdentifier } from '@xyo-network/module-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { isAnyPayload, isSequence } from '@xyo-network/payload-model'\nimport type { Router } from 'express'\nimport express from 'express'\nimport type { Request } from 'express-serve-static-core'\n\nconst resolveArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n const mod = await node.resolve(archivistModuleIdentifier)\n return asArchivistInstance(mod, { required: true })\n}\n\nlet archivistInstance: ArchivistInstance | undefined\n\nconst getArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n if (isDefined(archivistInstance)) return archivistInstance\n archivistInstance = await resolveArchivist(node, archivistModuleIdentifier)\n return archivistInstance\n}\n\ntype ArchivistMiddlewareOptions = {\n archivistModuleIdentifier: ModuleIdentifier\n node: NodeInstance\n}\n\nexport const archivistMiddleware = (options: ArchivistMiddlewareOptions): Router => {\n const { node, archivistModuleIdentifier } = options\n const router = express.Router({ mergeParams: true })\n\n router.post('/insert', async (req, res) => {\n setRawResponseFormat(res)\n const body = Array.isArray(req.body) ? req.body : [req.body]\n const payloads = (await PayloadBuilder.hashPairs<Payload>(body)).map(p => p[0])\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.insert(payloads)\n res.status(200).json(result)\n })\n\n router.get('/next', async (req: Request<Partial<NextOptions>>, res) => {\n setRawResponseFormat(res)\n const cursor = isSequence(req.query.cursor) ? req.query.cursor : undefined\n const limit = isDefined(req.query.limit) ? Number(req.query.limit) : undefined\n const open = isDefined(req.query.open) ? Boolean(req.query.open) : undefined\n const order = req.query.order === 'asc' ? 'asc' : 'desc'\n const options: ArchivistNextOptions = {\n limit, open, order, cursor,\n }\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.next(options)\n res.status(200).json(result)\n })\n router.post('/next', async (req: Request<{}, {}, ArchivistNextOptions | undefined>, res) => {\n setRawResponseFormat(res)\n const options = req.body\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await (isDefined(options) ? archivist.next(options) : archivist.next())\n res.status(200).json(result)\n })\n\n router.get('/get/:hash', async (req, res) => {\n setRawResponseFormat(res)\n const { hash: rawHash } = req.params\n const hash = asHash(rawHash)\n if (isDefined(hash)) {\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const [payload] = await archivist.get([hash])\n if (isAnyPayload(payload)) {\n res.json(payload)\n return\n }\n }\n res.status(400).send()\n })\n\n return router\n}\n","import type { Express } from 'express'\n\nimport { archivistMiddleware } from './archivistMiddleware.ts'\n\nexport const addDataLakeRoutes = (app: Express) => {\n const { node } = app.context\n const archivistModuleIdentifier = 'Chain:Finalized'\n app.use('/chain', archivistMiddleware({ node, archivistModuleIdentifier }))\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport type { XyoConnection } from '@xyo-network/xl1-sdk'\nimport { rpcEngineFromConnection, XyoConnectionMoniker } from '@xyo-network/xl1-sdk'\nimport type { Express } from 'express'\n\nexport const addRpcRoutes = async (\n app: Express,\n) => {\n const { context } = app\n const { locator } = context\n\n const connection = await locator.getInstance<XyoConnection>(XyoConnectionMoniker)\n const engine = rpcEngineFromConnection(connection)\n\n app.post('/rpc', (req, res) => {\n setRawResponseFormat(res)\n engine.handle(req.body, (_, rpcResponse) => {\n res.json(rpcResponse)\n })\n })\n}\n","import type { Express } from 'express'\n\nimport { addNodeRoutes } from './address/index.ts'\nimport { addDataLakeRoutes } from './dataLake/index.ts'\nimport { addRpcRoutes } from './rpc/index.ts'\n\nexport const addRoutes = async (\n app: Express,\n) => {\n await addRpcRoutes(app)\n addDataLakeRoutes(app)\n addNodeRoutes(app)\n}\n","/* eslint-disable max-statements */\nimport type { Logger } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { Account } from '@xyo-network/account'\nimport type { MempoolActorParams, ValidatorActorParams } from '@xyo-network/chain-orchestration'\nimport {\n buildTelemetryConfig, initApiWallet, initBalanceSummaryMap, initEvmProvidersIfAvailable, initHealthEndpoints, initServerNode,\n initStatusReporter, initTransferSummaryMap, MempoolActor, ValidatorActor,\n} from '@xyo-network/chain-orchestration'\nimport { createBootstrapHead } from '@xyo-network/chain-services'\nimport { initTelemetry } from '@xyo-network/chain-telemetry'\nimport { startupSpanAsync } from '@xyo-network/chain-utils'\nimport { validateHydratedBlock, validateHydratedBlockState } from '@xyo-network/chain-validation'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport type {\n AccountBalanceViewer, BlockViewer, ChainId, Config,\n MempoolRunner,\n MempoolViewer,\n XyoViewer,\n} from '@xyo-network/xl1-sdk'\nimport {\n AccountBalanceViewerMoniker, asAttoXL1, BlockViewerMoniker, buildLocalProviderLocator, DefaultMetricsScrapePorts, findMostRecentBlock, flattenHydratedBlock,\n MempoolRunnerMoniker, MempoolViewerMoniker, SimpleBlockValidationViewer, SimpleXyoConnection,\n XyoViewerMoniker,\n} from '@xyo-network/xl1-sdk'\n\nimport type { ApiActorParams } from '../ApiActor.ts'\nimport type { ApiContext } from '../ApiContext.ts'\n\ninterface InitServerContext {\n config: Config\n logger?: Logger\n node?: NodeInstance\n}\n\nexport async function initApiParams(params: InitServerContext): Promise<ApiActorParams> {\n const { config, node: providedNode } = params\n const { id: configuredChainId } = config.chain\n\n const logger = assertEx(params.logger, () => 'Logger is required to init server')\n\n const statusReporter = initStatusReporter({ logger })\n\n await startupSpanAsync('initHealthEndpoints', () => initHealthEndpoints({\n config, logger, statusReporter,\n }))\n\n const telemetryConfig = buildTelemetryConfig(config, 'xl1-api', '1.0.0', DefaultMetricsScrapePorts.api)\n\n const { traceProvider, meterProvider } = await startupSpanAsync('initTelemetry', () => initTelemetry(telemetryConfig))\n\n const initContext = {\n _id: 'init-context',\n config,\n logger,\n statusReporter,\n timeBudgetLimit: 1000,\n meterProvider,\n traceProvider,\n singletons: {},\n caches: {},\n }\n\n const wallet = await initApiWallet(initContext)\n\n const balancesSummaryMap = assertEx(await initBalanceSummaryMap(initContext), () => 'Balance Summary Map not initialized')\n const transfersSummaryMap = assertEx(await initTransferSummaryMap(initContext), () => 'Transfer Summary Map not initialized')\n\n const {\n node, writableChainArchivist, readonlyChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist,\n } = await initServerNode({\n ...initContext,\n wallet,\n node: providedNode,\n transfersSummaryMap,\n balancesSummaryMap,\n })\n\n await writableChainArchivist.start()\n await readonlyChainArchivist.start()\n await pendingTransactionsArchivist.start()\n await pendingBlocksArchivist.start()\n\n const possibleHead = await findMostRecentBlock(readonlyChainArchivist)\n if (configuredChainId && possibleHead && possibleHead.chain !== configuredChainId) {\n throw new Error(`Configured chain ID (${configuredChainId}) does not match the existing chain ID (${possibleHead.chain})`)\n }\n\n let possibleChainId: ChainId | undefined = configuredChainId\n\n // if there is no configured chain ID and no head, create a new chain\n if (!possibleHead) {\n possibleChainId = possibleChainId ?? (await Account.random()).address\n // If there is no head, create one\n const chain = await createBootstrapHead(\n wallet,\n possibleChainId,\n asAttoXL1(20_000_000_000_000_000_000_000n),\n config.chain.genesisRewardAddress ?? wallet.address,\n )\n const payloads = chain.flatMap(block => flattenHydratedBlock(block))\n await writableChainArchivist.insert(payloads)\n }\n\n const head = possibleHead ?? assertEx(await findMostRecentBlock(readonlyChainArchivist), () => 'No blocks found in chain archivist')\n const chainId = assertEx(possibleChainId, () => 'Chain ID could not be determined')\n assertEx(head.chain === chainId, () => `Chain ID does not match head block chain ID [init] [${head.chain} !== ${chainId}]`)\n\n const mods = await node.resolve('*')\n await Promise.all(mods.map((mod) => {\n return mod.start?.() ?? (() => true)\n }))\n\n const locator = buildLocalProviderLocator({\n context: initContext,\n finalizedArchivist: writableChainArchivist,\n pendingTransactionsArchivist,\n pendingBlocksArchivist,\n balancesSummaryMap,\n transfersSummaryMap,\n node,\n chainId,\n })\n\n await initEvmProvidersIfAvailable(locator)\n\n locator.register(SimpleBlockValidationViewer.factory<SimpleBlockValidationViewer>(\n SimpleBlockValidationViewer.dependencies,\n { state: validateHydratedBlockState, protocol: validateHydratedBlock },\n ))\n\n locator.register(SimpleXyoConnection.factory<SimpleXyoConnection>(SimpleXyoConnection.dependencies, {}))\n\n const apiContext = {\n ...initContext,\n ...locator.context,\n _id: 'api-context',\n node,\n } satisfies ApiContext\n\n const blockViewer = (await locator.getInstance<BlockViewer>(BlockViewerMoniker))\n assertEx(await blockViewer.start(), () => 'Failed to start BlockViewer')\n\n const blk = await blockViewer.currentBlock()\n assertEx(blk, () => 'No blocks found after initialization')\n\n const accountBalanceViewer = (await locator.getInstance<AccountBalanceViewer>(AccountBalanceViewerMoniker))\n assertEx(await accountBalanceViewer.start(), () => 'Failed to start AccountBalanceViewer')\n\n const xyoViewer = (await locator.getInstance<XyoViewer>(XyoViewerMoniker))\n assertEx(await xyoViewer.start(), () => 'Failed to start XyoViewer')\n\n const mempoolViewer = (await locator.getInstance<MempoolViewer>(MempoolViewerMoniker))\n assertEx(await mempoolViewer.start(), () => 'Failed to start MempoolViewer')\n\n const mempoolRunner = (await locator.getInstance<MempoolRunner>(MempoolRunnerMoniker))\n assertEx(await mempoolRunner.start(), () => 'Failed to start MempoolRunner')\n\n console.info(`[API] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`)\n\n const validatorActor = config.mempool.enabled\n ? undefined\n : await ValidatorActor.create({\n id: 'validator-mempool-server',\n account: wallet,\n context: locator.context,\n finalizedArchivist: writableChainArchivist,\n mempoolViewer,\n blockViewer,\n } satisfies ValidatorActorParams)\n\n await validatorActor?.start()\n\n const mempoolActor = config.mempool.enabled\n ? undefined\n : await MempoolActor.create({\n id: 'mempool-mempool-server',\n account: wallet,\n context: locator.context,\n mempoolRunner,\n pendingBlocksArchivist,\n pendingTransactionsArchivist,\n } satisfies MempoolActorParams)\n\n await mempoolActor?.start()\n\n return {\n id: 'api-actor',\n account: wallet,\n context: apiContext,\n transfersSummaryMap,\n balancesSummaryMap,\n }\n}\n","import type { ApiContext } from '../ApiContext.ts'\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n\nexport async function getServer(context: ApiContext) {\n const { logger } = context\n const { port } = context.config.api\n\n const app = await getApp(context)\n const server = app.listen(port, hostname, () => logger?.log(`[API] Server listening at http://${hostname}:${port}`))\n server.setTimeout(20_000)\n return server\n}\n","import { exists, IdLogger } from '@xylabs/sdk-js'\nimport { Account } from '@xyo-network/account'\nimport { type OrchestratorInstance } from '@xyo-network/chain-orchestration'\nimport { type BaseContext, type Config } from '@xyo-network/xl1-sdk'\n\nimport { ApiActor } from './ApiActor.ts'\nimport { initApiParams } from './server/index.ts'\n\nexport interface RunApiContext extends BaseContext {\n config: Config\n orchestrator: OrchestratorInstance\n}\n\nexport const runApi = async ({\n config, orchestrator, ...params\n}: RunApiContext) => {\n const logger = new IdLogger(params.logger ?? console, () => 'API')\n const account = await Account.random()\n logger.info(`Running api for account ${account.address} [random]`)\n\n const actorParams = await initApiParams({ config, logger })\n\n // Create actors\n const api = await ApiActor.create(actorParams)\n const actors = [api].filter(exists)\n\n for (const actor of actors) {\n // Register the actor with the orchestrator\n await orchestrator.registerActor(actor)\n }\n // Start the orchestrator => automatically activates the actor\n await orchestrator.start()\n}\n"],"mappings":"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","names":["assertEx","creatable","Account","Actor","customPoweredByHeader","disableCaseSensitiveRouting","disableExpressDefaultPoweredByHeader","getJsonBodyParser","getJsonBodyParserOptions","responseProfiler","standardErrors","standardResponses","compression","cors","express","registerInstrumentations","ExpressInstrumentation","HttpInstrumentation","addInstrumentation","instrumentations","HttpInstrumentation","ExpressInstrumentation","registerInstrumentations","StatusCodes","asyncHandler","asAddress","isDefined","isModuleName","StatusCodes","handler","req","res","next","address","moduleIdentifier","params","node","app","context","asAddress","isDefined","mod","resolve","direction","json","state","isModuleName","redirect","StatusCodes","MOVED_TEMPORARILY","getAddress","asyncHandler","asyncHandler","asAddress","assertEx","isAddress","toAddress","isQueryBoundWitness","ModuleErrorBuilder","StatusCodes","BoundWitnessSchema","ModuleConfigSchema","DEFAULT_DEPTH","getQueryConfig","mod","req","bw","payloads","nestedBwAddresses","flat","filter","payload","schema","BoundWitnessSchema","map","addresses","address","length","allowed","Object","fromEntries","queries","security","ModuleConfigSchema","handler","req","res","next","returnError","code","message","details","error","ModuleErrorBuilder","build","locals","rawResponse","status","json","address","params","node","app","context","bw","payloads","Array","isArray","body","isAddress","StatusCodes","BAD_REQUEST","isQueryBoundWitness","modules","normalizedAddress","toAddress","typedAddress","asAddress","byAddress","undefined","resolve","maxDepth","byName","direction","moduleAddress","assertEx","redirect","TEMPORARY_REDIRECT","NOT_FOUND","length","mod","queryConfig","getQueryConfig","queryResult","query","ex","INTERNAL_SERVER_ERROR","postAddress","asyncHandler","addNodeRoutes","app","defaultModule","context","node","address","defaultModuleEndpoint","get","_req","res","redirect","StatusCodes","MOVED_TEMPORARILY","post","TEMPORARY_REDIRECT","getAddress","postAddress","sendStatus","NOT_FOUND","setRawResponseFormat","asHash","isDefined","asArchivistInstance","PayloadBuilder","isAnyPayload","isSequence","express","resolveArchivist","node","archivistModuleIdentifier","mod","resolve","asArchivistInstance","required","archivistInstance","getArchivist","isDefined","archivistMiddleware","options","router","express","Router","mergeParams","post","req","res","setRawResponseFormat","body","Array","isArray","payloads","PayloadBuilder","hashPairs","map","p","archivist","result","insert","status","json","get","cursor","isSequence","query","undefined","limit","Number","open","Boolean","order","next","hash","rawHash","params","asHash","payload","isAnyPayload","send","addDataLakeRoutes","app","node","context","archivistModuleIdentifier","use","archivistMiddleware","setRawResponseFormat","rpcEngineFromConnection","XyoConnectionMoniker","addRpcRoutes","app","context","locator","connection","getInstance","XyoConnectionMoniker","engine","rpcEngineFromConnection","post","req","res","setRawResponseFormat","handle","body","_","rpcResponse","json","addRoutes","app","addRpcRoutes","addDataLakeRoutes","addNodeRoutes","getApp","context","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","assertEx","Account","buildTelemetryConfig","initApiWallet","initBalanceSummaryMap","initEvmProvidersIfAvailable","initHealthEndpoints","initServerNode","initStatusReporter","initTransferSummaryMap","MempoolActor","ValidatorActor","createBootstrapHead","initTelemetry","startupSpanAsync","validateHydratedBlock","validateHydratedBlockState","AccountBalanceViewerMoniker","asAttoXL1","BlockViewerMoniker","buildLocalProviderLocator","DefaultMetricsScrapePorts","findMostRecentBlock","flattenHydratedBlock","MempoolRunnerMoniker","MempoolViewerMoniker","SimpleBlockValidationViewer","SimpleXyoConnection","XyoViewerMoniker","initApiParams","params","config","node","providedNode","id","configuredChainId","chain","logger","assertEx","statusReporter","initStatusReporter","startupSpanAsync","initHealthEndpoints","telemetryConfig","buildTelemetryConfig","DefaultMetricsScrapePorts","api","traceProvider","meterProvider","initTelemetry","initContext","_id","timeBudgetLimit","singletons","caches","wallet","initApiWallet","balancesSummaryMap","initBalanceSummaryMap","transfersSummaryMap","initTransferSummaryMap","writableChainArchivist","readonlyChainArchivist","pendingTransactionsArchivist","pendingBlocksArchivist","initServerNode","start","possibleHead","findMostRecentBlock","Error","possibleChainId","Account","random","address","createBootstrapHead","asAttoXL1","genesisRewardAddress","payloads","flatMap","block","flattenHydratedBlock","insert","head","chainId","mods","resolve","Promise","all","map","mod","locator","buildLocalProviderLocator","context","finalizedArchivist","initEvmProvidersIfAvailable","register","SimpleBlockValidationViewer","factory","dependencies","state","validateHydratedBlockState","protocol","validateHydratedBlock","SimpleXyoConnection","apiContext","blockViewer","getInstance","BlockViewerMoniker","blk","currentBlock","accountBalanceViewer","AccountBalanceViewerMoniker","xyoViewer","XyoViewerMoniker","mempoolViewer","MempoolViewerMoniker","mempoolRunner","MempoolRunnerMoniker","console","info","_hash","validatorActor","mempool","enabled","undefined","ValidatorActor","create","account","mempoolActor","MempoolActor","hostname","getServer","context","logger","port","config","api","app","getApp","server","listen","log","setTimeout","ApiActor","Actor","server","context","params","defaultFactories","paramsHandler","logger","account","undefined","newAccount","Account","random","warn","address","info","assertEx","createHandler","startHandler","stopServer","startServer","stopHandler","getServer","close","exists","IdLogger","Account","runApi","config","orchestrator","params","logger","IdLogger","console","account","Account","random","info","address","actorParams","initApiParams","api","ApiActor","create","actors","filter","exists","actor","registerActor","start"]}
|
|
1
|
+
{"version":3,"sources":["../../src/ApiActor.ts","../../src/server/app.ts","../../src/server/instrumentation.ts","../../src/server/routes/dataLake/archivistMiddleware.ts","../../src/server/routes/dataLake/addDataLakeRoutes.ts","../../src/server/routes/rpc/routes/addRpcRoutes.ts","../../src/server/routes/addRoutes.ts","../../src/server/server.ts","../../src/runApi.ts"],"sourcesContent":["import { Server } from 'node:http'\n\nimport { creatable } from '@xylabs/sdk-js'\nimport {\n ActorParamsV3, ActorV3, Config,\n} from '@xyo-network/xl1-sdk'\n\nimport { getServer } from './server/index.ts'\n\nexport type ApiActorParams = ActorParamsV3<{\n config: Config\n}>\n\n@creatable()\nexport class ApiActor extends ActorV3<ApiActorParams> {\n private server?: Server\n\n override async createHandler() {\n await super.createHandler()\n }\n\n override async startHandler() {\n await super.startHandler()\n this.stopServer()\n await this.startServer()\n }\n\n override async stopHandler() {\n await super.stopHandler()\n this.stopServer()\n }\n\n private async startServer() {\n this.server = await getServer(this.context)\n }\n\n private stopServer() {\n this.server?.close()\n this.server = undefined\n }\n}\n","import {\n customPoweredByHeader,\n disableCaseSensitiveRouting,\n disableExpressDefaultPoweredByHeader,\n getJsonBodyParser,\n getJsonBodyParserOptions,\n responseProfiler,\n standardErrors,\n standardResponses,\n} from '@xylabs/express'\nimport type { CreatableProviderContext } from '@xyo-network/xl1-sdk'\nimport compression from 'compression'\nimport cors from 'cors'\nimport type { Express } from 'express'\nimport express from 'express'\n\nimport { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = async (context: CreatableProviderContext): Promise<Express> => {\n addInstrumentation()\n const app = express()\n app.set('etag', false)\n\n app.use(cors())\n app.use(compression())\n app.use(responseProfiler)\n app.use(getJsonBodyParser(getJsonBodyParserOptions({ limit: '1mb' })))\n app.use(standardResponses)\n disableExpressDefaultPoweredByHeader(app)\n app.use(customPoweredByHeader)\n disableCaseSensitiveRouting(app)\n app.context = context\n await addRoutes(app)\n app.use(standardErrors)\n return app\n}\n","import { registerInstrumentations } from '@opentelemetry/instrumentation'\nimport { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'\nimport { HttpInstrumentation } from '@opentelemetry/instrumentation-http'\n\n/**\n * Registers OpenTelemetry instrumentations for HTTP and Express.\n * This function is used to set up the necessary instrumentations for monitoring\n * HTTP requests and Express applications. Since it monkey patches the Express\n * router & middleware system, it should be called before any Express applications\n * are defined.\n */\nexport const addInstrumentation = () => {\n const instrumentations = [new HttpInstrumentation(), new ExpressInstrumentation()]\n registerInstrumentations({ instrumentations })\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport { asHash, isDefined } from '@xylabs/sdk-js'\nimport type {\n ArchivistInstance,\n ArchivistNextOptions, NextOptions,\n} from '@xyo-network/archivist-model'\nimport { asArchivistInstance } from '@xyo-network/archivist-model'\nimport type { ModuleIdentifier } from '@xyo-network/module-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload } from '@xyo-network/payload-model'\nimport { isAnyPayload, isSequence } from '@xyo-network/payload-model'\nimport type { Router } from 'express'\nimport express from 'express'\nimport type { Request } from 'express-serve-static-core'\n\nconst resolveArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n const mod = await node.resolve(archivistModuleIdentifier)\n return asArchivistInstance(mod, { required: true })\n}\n\nlet archivistInstance: ArchivistInstance | undefined\n\nconst getArchivist = async (node: NodeInstance, archivistModuleIdentifier: ModuleIdentifier): Promise<ArchivistInstance> => {\n if (isDefined(archivistInstance)) return archivistInstance\n archivistInstance = await resolveArchivist(node, archivistModuleIdentifier)\n return archivistInstance\n}\n\ntype ArchivistMiddlewareOptions = {\n archivistModuleIdentifier: ModuleIdentifier\n node: NodeInstance\n}\n\nexport const archivistMiddleware = (options: ArchivistMiddlewareOptions): Router => {\n const { node, archivistModuleIdentifier } = options\n const router = express.Router({ mergeParams: true })\n\n router.post('/insert', async (req, res) => {\n setRawResponseFormat(res)\n const body = Array.isArray(req.body) ? req.body : [req.body]\n const payloads = (await PayloadBuilder.hashPairs<Payload>(body)).map(p => p[0])\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.insert(payloads)\n res.status(200).json(result)\n })\n\n router.get('/next', async (req: Request<Partial<NextOptions>>, res) => {\n setRawResponseFormat(res)\n const cursor = isSequence(req.query.cursor) ? req.query.cursor : undefined\n const limit = isDefined(req.query.limit) ? Number(req.query.limit) : undefined\n const open = isDefined(req.query.open) ? Boolean(req.query.open) : undefined\n const order = req.query.order === 'asc' ? 'asc' : 'desc'\n const options: ArchivistNextOptions = {\n limit, open, order, cursor,\n }\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await archivist.next(options)\n res.status(200).json(result)\n })\n router.post('/next', async (req: Request<{}, {}, ArchivistNextOptions | undefined>, res) => {\n setRawResponseFormat(res)\n const options = req.body\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const result = await (isDefined(options) ? archivist.next(options) : archivist.next())\n res.status(200).json(result)\n })\n\n router.get('/get/:hash', async (req, res) => {\n setRawResponseFormat(res)\n const { hash: rawHash } = req.params\n const hash = asHash(rawHash)\n if (isDefined(hash)) {\n const archivist = await getArchivist(node, archivistModuleIdentifier)\n const [payload] = await archivist.get([hash])\n if (isAnyPayload(payload)) {\n res.json(payload)\n return\n }\n }\n res.status(400).send()\n })\n\n return router\n}\n","import type { Express } from 'express'\n\nimport { archivistMiddleware } from './archivistMiddleware.ts'\n\nexport const addDataLakeRoutes = (app: Express) => {\n const { node } = app.context\n const archivistModuleIdentifier = 'Chain:Finalized'\n app.use('/chain', archivistMiddleware({ node, archivistModuleIdentifier }))\n}\n","import { setRawResponseFormat } from '@xylabs/express'\nimport type { XyoConnection } from '@xyo-network/xl1-sdk'\nimport { rpcEngineFromConnection, XyoConnectionMoniker } from '@xyo-network/xl1-sdk'\nimport type { Express } from 'express'\n\nexport const addRpcRoutes = async (\n app: Express,\n) => {\n const { context } = app\n const { locator } = context\n\n const connection = await locator.getInstance<XyoConnection>(XyoConnectionMoniker)\n const engine = rpcEngineFromConnection(connection)\n\n app.post('/rpc', (req, res) => {\n setRawResponseFormat(res)\n engine.handle(req.body, (_, rpcResponse) => {\n res.json(rpcResponse)\n })\n })\n}\n","import type { Express } from 'express'\n\nimport { addDataLakeRoutes } from './dataLake/index.ts'\nimport { addRpcRoutes } from './rpc/index.ts'\n\nexport const addRoutes = async (\n app: Express,\n) => {\n await addRpcRoutes(app)\n addDataLakeRoutes(app)\n}\n","import type { CreatableProviderContext } from '@xyo-network/xl1-sdk'\n\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n\nexport async function getServer(context: CreatableProviderContext) {\n const { logger } = context\n const { port } = context.config.actors.api\n\n const app = await getApp(context)\n const server = app.listen(port, hostname, () => logger?.info(`[API] Server listening at http://${hostname}:${port}`))\n server.setTimeout(20_000)\n return server\n}\n","import { exists } from '@xylabs/sdk-js'\nimport { initApiWallet, type OrchestratorInstance } from '@xyo-network/chain-orchestration'\nimport type {\n Config,\n ProviderFactoryLocatorInstance,\n} from '@xyo-network/xl1-sdk'\n\nimport { ApiActor } from './ApiActor.ts'\n\nexport const runApi = async (\n config: Config,\n orchestrator: OrchestratorInstance,\n locator: ProviderFactoryLocatorInstance,\n) => {\n const account = await initApiWallet({ config, logger: locator.context.logger })\n // Create actors\n const api = await ApiActor.create({\n account, config, locator,\n })\n const actors = [api].filter(exists)\n\n for (const actor of actors) {\n // Register the actor with the orchestrator\n await orchestrator.registerActor(actor)\n }\n // Start the orchestrator => automatically activates the actor\n await orchestrator.start()\n}\n"],"mappings":"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","names":["creatable","ActorV3","customPoweredByHeader","disableCaseSensitiveRouting","disableExpressDefaultPoweredByHeader","getJsonBodyParser","getJsonBodyParserOptions","responseProfiler","standardErrors","standardResponses","compression","cors","express","registerInstrumentations","ExpressInstrumentation","HttpInstrumentation","addInstrumentation","instrumentations","HttpInstrumentation","ExpressInstrumentation","registerInstrumentations","setRawResponseFormat","asHash","isDefined","asArchivistInstance","PayloadBuilder","isAnyPayload","isSequence","express","resolveArchivist","node","archivistModuleIdentifier","mod","resolve","asArchivistInstance","required","archivistInstance","getArchivist","isDefined","archivistMiddleware","options","router","express","Router","mergeParams","post","req","res","setRawResponseFormat","body","Array","isArray","payloads","PayloadBuilder","hashPairs","map","p","archivist","result","insert","status","json","get","cursor","isSequence","query","undefined","limit","Number","open","Boolean","order","next","hash","rawHash","params","asHash","payload","isAnyPayload","send","addDataLakeRoutes","app","node","context","archivistModuleIdentifier","use","archivistMiddleware","setRawResponseFormat","rpcEngineFromConnection","XyoConnectionMoniker","addRpcRoutes","app","context","locator","connection","getInstance","XyoConnectionMoniker","engine","rpcEngineFromConnection","post","req","res","setRawResponseFormat","handle","body","_","rpcResponse","json","addRoutes","app","addRpcRoutes","addDataLakeRoutes","getApp","context","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","addRoutes","standardErrors","hostname","getServer","context","logger","port","config","actors","api","app","getApp","server","listen","info","setTimeout","ApiActor","ActorV3","server","createHandler","startHandler","stopServer","startServer","stopHandler","getServer","context","close","undefined","exists","initApiWallet","runApi","config","orchestrator","locator","account","initApiWallet","logger","context","api","ApiActor","create","actors","filter","exists","actor","registerActor","start"]}
|
package/dist/node/runApi.d.ts
CHANGED
|
@@ -1,8 +1,4 @@
|
|
|
1
1
|
import { type OrchestratorInstance } from '@xyo-network/chain-orchestration';
|
|
2
|
-
import {
|
|
3
|
-
export
|
|
4
|
-
config: Config;
|
|
5
|
-
orchestrator: OrchestratorInstance;
|
|
6
|
-
}
|
|
7
|
-
export declare const runApi: ({ config, orchestrator, ...params }: RunApiContext) => Promise<void>;
|
|
2
|
+
import type { Config, ProviderFactoryLocatorInstance } from '@xyo-network/xl1-sdk';
|
|
3
|
+
export declare const runApi: (config: Config, orchestrator: OrchestratorInstance, locator: ProviderFactoryLocatorInstance) => Promise<void>;
|
|
8
4
|
//# sourceMappingURL=runApi.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runApi.d.ts","sourceRoot":"","sources":["../../src/runApi.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runApi.d.ts","sourceRoot":"","sources":["../../src/runApi.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,KAAK,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AAC3F,OAAO,KAAK,EACV,MAAM,EACN,8BAA8B,EAC/B,MAAM,sBAAsB,CAAA;AAI7B,eAAO,MAAM,MAAM,GACjB,QAAQ,MAAM,EACd,cAAc,oBAAoB,EAClC,SAAS,8BAA8B,kBAexC,CAAA"}
|