@xyo-network/chain-mempool 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/MempoolActor.d.ts +20 -0
- package/dist/node/MempoolActor.d.ts.map +1 -0
- package/dist/node/index.d.ts +2 -1
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.mjs +87 -385
- package/dist/node/index.mjs.map +1 -1
- package/dist/node/runMempool.d.ts +4 -0
- package/dist/node/runMempool.d.ts.map +1 -0
- package/package.json +9 -21
- package/src/MempoolActor.ts +83 -0
- package/src/index.ts +2 -1
- package/src/runMempool.ts +28 -0
- package/dist/node/MempoolContext.d.ts +0 -9
- package/dist/node/MempoolContext.d.ts.map +0 -1
- package/dist/node/helpers/index.d.ts +0 -2
- package/dist/node/helpers/index.d.ts.map +0 -1
- package/dist/node/helpers/initChainId.d.ts +0 -4
- package/dist/node/helpers/initChainId.d.ts.map +0 -1
- package/dist/node/manifest/getLocator.d.ts +0 -14
- package/dist/node/manifest/getLocator.d.ts.map +0 -1
- package/dist/node/manifest/getNode.d.ts +0 -15
- package/dist/node/manifest/getNode.d.ts.map +0 -1
- package/dist/node/manifest/index.d.ts +0 -6
- package/dist/node/manifest/index.d.ts.map +0 -1
- package/dist/node/manifest/nodeManifest.d.ts +0 -6
- package/dist/node/manifest/nodeManifest.d.ts.map +0 -1
- package/dist/node/manifest/private/index.d.ts +0 -5
- package/dist/node/manifest/private/index.d.ts.map +0 -1
- package/dist/node/manifest/public/index.d.ts +0 -14
- package/dist/node/manifest/public/index.d.ts.map +0 -1
- package/dist/node/server/app.d.ts +0 -4
- package/dist/node/server/app.d.ts.map +0 -1
- package/dist/node/server/index.d.ts +0 -11
- package/dist/node/server/index.d.ts.map +0 -1
- package/dist/node/server/instrumentation.d.ts +0 -9
- package/dist/node/server/instrumentation.d.ts.map +0 -1
- package/dist/node/server/model.d.ts +0 -5
- package/dist/node/server/model.d.ts.map +0 -1
- package/dist/node/server/routes/addRoutes.d.ts +0 -3
- package/dist/node/server/routes/addRoutes.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/dist/node/server/routes/dataLake/addDataLakeRoutes.d.ts +0 -3
- package/dist/node/server/routes/dataLake/addDataLakeRoutes.d.ts.map +0 -1
- package/dist/node/server/routes/dataLake/archivistMiddleware.d.ts +0 -10
- package/dist/node/server/routes/dataLake/archivistMiddleware.d.ts.map +0 -1
- package/dist/node/server/routes/dataLake/index.d.ts +0 -2
- package/dist/node/server/routes/dataLake/index.d.ts.map +0 -1
- package/dist/node/server/routes/healthz/addHealthRoutes.d.ts +0 -3
- package/dist/node/server/routes/healthz/addHealthRoutes.d.ts.map +0 -1
- package/dist/node/server/routes/healthz/index.d.ts +0 -2
- package/dist/node/server/routes/healthz/index.d.ts.map +0 -1
- package/dist/node/server/routes/index.d.ts +0 -4
- package/dist/node/server/routes/index.d.ts.map +0 -1
- package/dist/node/server/server.d.ts +0 -11
- package/dist/node/server/server.d.ts.map +0 -1
- package/src/MempoolContext.ts +0 -12
- package/src/global.d.ts +0 -13
- package/src/helpers/index.ts +0 -1
- package/src/helpers/initChainId.ts +0 -20
- package/src/manifest/getLocator.ts +0 -70
- package/src/manifest/getNode.ts +0 -32
- package/src/manifest/index.ts +0 -5
- package/src/manifest/node.json +0 -17
- package/src/manifest/nodeManifest.ts +0 -8
- package/src/manifest/private/index.ts +0 -4
- package/src/manifest/public/Chain.json +0 -63
- package/src/manifest/public/Pending.json +0 -35
- package/src/manifest/public/index.ts +0 -20
- package/src/server/app.ts +0 -31
- package/src/server/index.ts +0 -13
- package/src/server/instrumentation.ts +0 -15
- package/src/server/model.ts +0 -5
- package/src/server/routes/addRoutes.ts +0 -11
- 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/src/server/routes/dataLake/addDataLakeRoutes.ts +0 -9
- package/src/server/routes/dataLake/archivistMiddleware.ts +0 -85
- package/src/server/routes/dataLake/index.ts +0 -1
- package/src/server/routes/healthz/addHealthRoutes.ts +0 -14
- package/src/server/routes/healthz/index.ts +0 -1
- package/src/server/routes/index.ts +0 -3
- package/src/server/server.ts +0 -147
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ActorParamsV3, ActorV3, Config, MempoolRunner } from '@xyo-network/xl1-sdk';
|
|
2
|
+
export type MempoolActorParams = ActorParamsV3<{
|
|
3
|
+
config: Config;
|
|
4
|
+
}>;
|
|
5
|
+
export declare class MempoolActor extends ActorV3<MempoolActorParams> {
|
|
6
|
+
protected _mempoolRunner: MempoolRunner;
|
|
7
|
+
private _blockTimerId;
|
|
8
|
+
private _blockTimerMutex;
|
|
9
|
+
private _transactionTimerId;
|
|
10
|
+
private _transactionTimerMutex;
|
|
11
|
+
protected get mempoolRunner(): MempoolRunner;
|
|
12
|
+
createHandler(): Promise<void>;
|
|
13
|
+
startHandler(): Promise<void>;
|
|
14
|
+
stopHandler(): Promise<void>;
|
|
15
|
+
private restartBlockTimer;
|
|
16
|
+
private restartTransactionTimer;
|
|
17
|
+
private stopBlockTimer;
|
|
18
|
+
private stopTransactionTimer;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=MempoolActor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MempoolActor.d.ts","sourceRoot":"","sources":["../../src/MempoolActor.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,OAAO,EACP,MAAM,EACN,aAAa,EAEd,MAAM,sBAAsB,CAAA;AAG7B,MAAM,MAAM,kBAAkB,GAAG,aAAa,CAAC;IAC7C,MAAM,EAAE,MAAM,CAAA;CACf,CAAC,CAAA;AAEF,qBACa,YAAa,SAAQ,OAAO,CAAC,kBAAkB,CAAC;IAC3D,SAAS,CAAC,cAAc,EAAG,aAAa,CAAA;IAExC,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,gBAAgB,CAAc;IAEtC,OAAO,CAAC,mBAAmB,CAA8C;IACzE,OAAO,CAAC,sBAAsB,CAAc;IAE5C,SAAS,KAAK,aAAa,kBAE1B;IAEc,aAAa;IAKb,YAAY;IAMZ,WAAW;IAM1B,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,uBAAuB;IAY/B,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,oBAAoB;CAM7B"}
|
package/dist/node/index.d.ts
CHANGED
package/dist/node/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA"}
|
package/dist/node/index.mjs
CHANGED
|
@@ -1,407 +1,109 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
3
|
|
|
4
|
-
// src/
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
];
|
|
19
|
-
registerInstrumentations({
|
|
20
|
-
instrumentations
|
|
21
|
-
});
|
|
22
|
-
}, "addInstrumentation");
|
|
23
|
-
|
|
24
|
-
// src/server/routes/address/addNodeRoutes.ts
|
|
25
|
-
import { StatusCodes as StatusCodes3 } from "http-status-codes";
|
|
26
|
-
|
|
27
|
-
// src/server/routes/address/get/get.ts
|
|
28
|
-
import { asyncHandler } from "@xylabs/express";
|
|
29
|
-
import { asAddress, isDefined } from "@xylabs/sdk-js";
|
|
30
|
-
import { isModuleName } from "@xyo-network/module-model";
|
|
31
|
-
import { StatusCodes } from "http-status-codes";
|
|
32
|
-
var handler = /* @__PURE__ */ __name(async (req, res, next) => {
|
|
33
|
-
const { address: moduleIdentifier } = req.params;
|
|
34
|
-
const { node } = req.app;
|
|
35
|
-
const address = asAddress(moduleIdentifier);
|
|
36
|
-
if (isDefined(address)) {
|
|
37
|
-
let mod = node.address === address ? node : await node.resolve(address, {
|
|
38
|
-
direction: "down"
|
|
39
|
-
});
|
|
40
|
-
if (mod) {
|
|
41
|
-
res.json(await mod.state());
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
4
|
+
// src/MempoolActor.ts
|
|
5
|
+
import { creatable } from "@xylabs/sdk-js";
|
|
6
|
+
import { ActorV3, MempoolRunnerMoniker } from "@xyo-network/xl1-sdk";
|
|
7
|
+
import { Mutex } from "async-mutex";
|
|
8
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
9
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
10
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
11
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
12
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
13
|
+
}
|
|
14
|
+
__name(_ts_decorate, "_ts_decorate");
|
|
15
|
+
var MempoolActor = class extends ActorV3 {
|
|
16
|
+
static {
|
|
17
|
+
__name(this, "MempoolActor");
|
|
44
18
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
}
|
|
19
|
+
_mempoolRunner;
|
|
20
|
+
_blockTimerId = null;
|
|
21
|
+
_blockTimerMutex = new Mutex();
|
|
22
|
+
_transactionTimerId = null;
|
|
23
|
+
_transactionTimerMutex = new Mutex();
|
|
24
|
+
get mempoolRunner() {
|
|
25
|
+
return this._mempoolRunner;
|
|
53
26
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
// src/server/routes/address/post/post.ts
|
|
59
|
-
import { asyncHandler as asyncHandler2 } from "@xylabs/express";
|
|
60
|
-
import { asAddress as asAddress2, assertEx, isAddress, toAddress } from "@xylabs/sdk-js";
|
|
61
|
-
import { isQueryBoundWitness } from "@xyo-network/boundwitness-model";
|
|
62
|
-
import { ModuleErrorBuilder } from "@xyo-network/module-abstract";
|
|
63
|
-
import { StatusCodes as StatusCodes2 } from "http-status-codes";
|
|
64
|
-
|
|
65
|
-
// src/server/routes/address/post/getQueryConfig.ts
|
|
66
|
-
import { BoundWitnessSchema } from "@xyo-network/boundwitness-model";
|
|
67
|
-
import { ModuleConfigSchema } from "@xyo-network/module-model";
|
|
68
|
-
var DEFAULT_DEPTH = 5;
|
|
69
|
-
var getQueryConfig = /* @__PURE__ */ __name((mod, req, bw, payloads) => {
|
|
70
|
-
const nestedBwAddresses = payloads?.flat(DEFAULT_DEPTH).filter((payload) => payload?.schema === BoundWitnessSchema).map((bw2) => bw2.addresses) ?? [];
|
|
71
|
-
const addresses = [
|
|
72
|
-
bw.addresses,
|
|
73
|
-
...nestedBwAddresses
|
|
74
|
-
].filter((address) => address.length > 0);
|
|
75
|
-
const allowed = addresses.length > 0 ? Object.fromEntries(mod.queries.map((schema) => [
|
|
76
|
-
schema,
|
|
77
|
-
addresses
|
|
78
|
-
])) : {};
|
|
79
|
-
const security = {
|
|
80
|
-
allowed
|
|
81
|
-
};
|
|
82
|
-
return {
|
|
83
|
-
schema: ModuleConfigSchema,
|
|
84
|
-
security
|
|
85
|
-
};
|
|
86
|
-
}, "getQueryConfig");
|
|
87
|
-
|
|
88
|
-
// src/server/routes/address/post/post.ts
|
|
89
|
-
var handler2 = /* @__PURE__ */ __name(async (req, res, next) => {
|
|
90
|
-
const returnError = /* @__PURE__ */ __name((code, message = "An error occurred", details) => {
|
|
91
|
-
const error = new ModuleErrorBuilder().message(message).details(details).build();
|
|
92
|
-
res.locals.rawResponse = false;
|
|
93
|
-
res.status(code).json(error);
|
|
94
|
-
next();
|
|
95
|
-
}, "returnError");
|
|
96
|
-
const { address } = req.params;
|
|
97
|
-
const { node } = req.app;
|
|
98
|
-
const [bw, payloads] = Array.isArray(req.body) ? req.body : [];
|
|
99
|
-
if (!isAddress(address)) {
|
|
100
|
-
return returnError(StatusCodes2.BAD_REQUEST, "Missing address");
|
|
27
|
+
async createHandler() {
|
|
28
|
+
await super.createHandler();
|
|
29
|
+
this._mempoolRunner = await this.locator.getInstance(MempoolRunnerMoniker);
|
|
101
30
|
}
|
|
102
|
-
|
|
103
|
-
|
|
31
|
+
async startHandler() {
|
|
32
|
+
await super.startHandler();
|
|
33
|
+
this.restartTransactionTimer();
|
|
34
|
+
this.restartBlockTimer();
|
|
104
35
|
}
|
|
105
|
-
|
|
106
|
-
|
|
36
|
+
async stopHandler() {
|
|
37
|
+
await super.stopHandler();
|
|
38
|
+
this.stopTransactionTimer();
|
|
39
|
+
this.stopBlockTimer();
|
|
107
40
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
];
|
|
113
|
-
else {
|
|
114
|
-
const typedAddress = asAddress2(address);
|
|
115
|
-
const byAddress = typedAddress === void 0 ? void 0 : await node.resolve(typedAddress, {
|
|
116
|
-
maxDepth: 10
|
|
117
|
-
});
|
|
118
|
-
if (byAddress) modules = [
|
|
119
|
-
byAddress
|
|
120
|
-
];
|
|
121
|
-
else {
|
|
122
|
-
const byName = await node.resolve(address, {
|
|
123
|
-
direction: "down"
|
|
124
|
-
});
|
|
125
|
-
if (byName) {
|
|
126
|
-
const moduleAddress = assertEx(byName?.address, () => "Error redirecting to module by address");
|
|
127
|
-
res.redirect(StatusCodes2.TEMPORARY_REDIRECT, `/${moduleAddress}`);
|
|
41
|
+
restartBlockTimer() {
|
|
42
|
+
this.stopBlockTimer();
|
|
43
|
+
this._blockTimerId = setInterval(() => {
|
|
44
|
+
if (this._blockTimerMutex.isLocked()) {
|
|
128
45
|
return;
|
|
129
|
-
} else {
|
|
130
|
-
return returnError(StatusCodes2.NOT_FOUND, "Module not found", {
|
|
131
|
-
address
|
|
132
|
-
});
|
|
133
46
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
const queryConfig = getQueryConfig(mod, req, bw, payloads);
|
|
139
|
-
try {
|
|
140
|
-
const queryResult = await mod.query(bw, payloads, queryConfig);
|
|
141
|
-
res.json(queryResult);
|
|
142
|
-
} catch (ex) {
|
|
143
|
-
return returnError(StatusCodes2.INTERNAL_SERVER_ERROR, "Query Failed", {
|
|
144
|
-
message: ex?.message ?? "Unknown Error"
|
|
47
|
+
void this._blockTimerMutex.runExclusive(async () => {
|
|
48
|
+
await this.mempoolRunner.prunePendingBlocks({
|
|
49
|
+
batchSize: 50
|
|
50
|
+
});
|
|
145
51
|
});
|
|
146
|
-
}
|
|
147
|
-
} else {
|
|
148
|
-
return returnError(StatusCodes2.NOT_FOUND, "Module not found", {
|
|
149
|
-
address
|
|
150
|
-
});
|
|
52
|
+
}, 1e3);
|
|
151
53
|
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
var addNodeRoutes = /* @__PURE__ */ __name((app) => {
|
|
157
|
-
const defaultModule = app.node;
|
|
158
|
-
const address = defaultModule.address;
|
|
159
|
-
const defaultModuleEndpoint = `/${address}`;
|
|
160
|
-
app.get("/", (_req, res) => res.redirect(StatusCodes3.MOVED_TEMPORARILY, defaultModuleEndpoint));
|
|
161
|
-
app.post("/", (_req, res) => res.redirect(StatusCodes3.TEMPORARY_REDIRECT, defaultModuleEndpoint));
|
|
162
|
-
app.get("/:address", getAddress);
|
|
163
|
-
app.post("/:address", postAddress);
|
|
164
|
-
app.get("/:hash", (_req, res) => {
|
|
165
|
-
res.sendStatus(StatusCodes3.NOT_FOUND);
|
|
166
|
-
});
|
|
167
|
-
app.post("/:hash", (_req, res) => {
|
|
168
|
-
res.sendStatus(StatusCodes3.NOT_FOUND);
|
|
169
|
-
});
|
|
170
|
-
}, "addNodeRoutes");
|
|
171
|
-
|
|
172
|
-
// src/server/routes/dataLake/archivistMiddleware.ts
|
|
173
|
-
import { setRawResponseFormat } from "@xylabs/express";
|
|
174
|
-
import { asHash, isDefined as isDefined2 } from "@xylabs/sdk-js";
|
|
175
|
-
import { asArchivistInstance } from "@xyo-network/archivist-model";
|
|
176
|
-
import { PayloadBuilder } from "@xyo-network/payload-builder";
|
|
177
|
-
import { isAnyPayload, isSequence } from "@xyo-network/payload-model";
|
|
178
|
-
import express from "express";
|
|
179
|
-
var resolveArchivist = /* @__PURE__ */ __name(async (node, archivistModuleIdentifier) => {
|
|
180
|
-
const mod = await node.resolve(archivistModuleIdentifier);
|
|
181
|
-
return asArchivistInstance(mod, {
|
|
182
|
-
required: true
|
|
183
|
-
});
|
|
184
|
-
}, "resolveArchivist");
|
|
185
|
-
var archivistInstance;
|
|
186
|
-
var getArchivist = /* @__PURE__ */ __name(async (node, archivistModuleIdentifier) => {
|
|
187
|
-
if (isDefined2(archivistInstance)) return archivistInstance;
|
|
188
|
-
archivistInstance = await resolveArchivist(node, archivistModuleIdentifier);
|
|
189
|
-
return archivistInstance;
|
|
190
|
-
}, "getArchivist");
|
|
191
|
-
var archivistMiddleware = /* @__PURE__ */ __name((options) => {
|
|
192
|
-
const { node, archivistModuleIdentifier } = options;
|
|
193
|
-
const router = express.Router({
|
|
194
|
-
mergeParams: true
|
|
195
|
-
});
|
|
196
|
-
router.post("/insert", async (req, res) => {
|
|
197
|
-
setRawResponseFormat(res);
|
|
198
|
-
const body = Array.isArray(req.body) ? req.body : [
|
|
199
|
-
req.body
|
|
200
|
-
];
|
|
201
|
-
const payloads = (await PayloadBuilder.hashPairs(body)).map((p) => p[0]);
|
|
202
|
-
const archivist = await getArchivist(node, archivistModuleIdentifier);
|
|
203
|
-
const result = await archivist.insert(payloads);
|
|
204
|
-
res.status(200).json(result);
|
|
205
|
-
});
|
|
206
|
-
router.get("/next", async (req, res) => {
|
|
207
|
-
setRawResponseFormat(res);
|
|
208
|
-
const cursor = isSequence(req.query.cursor) ? req.query.cursor : void 0;
|
|
209
|
-
const limit = isDefined2(req.query.limit) ? Number(req.query.limit) : void 0;
|
|
210
|
-
const open = isDefined2(req.query.open) ? Boolean(req.query.open) : void 0;
|
|
211
|
-
const order = req.query.order === "asc" ? "asc" : "desc";
|
|
212
|
-
const options2 = {
|
|
213
|
-
limit,
|
|
214
|
-
open,
|
|
215
|
-
order,
|
|
216
|
-
cursor
|
|
217
|
-
};
|
|
218
|
-
const archivist = await getArchivist(node, archivistModuleIdentifier);
|
|
219
|
-
const result = await archivist.next(options2);
|
|
220
|
-
res.status(200).json(result);
|
|
221
|
-
});
|
|
222
|
-
router.post("/next", async (req, res) => {
|
|
223
|
-
setRawResponseFormat(res);
|
|
224
|
-
const options2 = req.body;
|
|
225
|
-
const archivist = await getArchivist(node, archivistModuleIdentifier);
|
|
226
|
-
const result = await (isDefined2(options2) ? archivist.next(options2) : archivist.next());
|
|
227
|
-
res.status(200).json(result);
|
|
228
|
-
});
|
|
229
|
-
router.get("/get/:hash", async (req, res) => {
|
|
230
|
-
setRawResponseFormat(res);
|
|
231
|
-
const { hash: rawHash } = req.params;
|
|
232
|
-
const hash = asHash(rawHash);
|
|
233
|
-
if (isDefined2(hash)) {
|
|
234
|
-
const archivist = await getArchivist(node, archivistModuleIdentifier);
|
|
235
|
-
const [payload] = await archivist.get([
|
|
236
|
-
hash
|
|
237
|
-
]);
|
|
238
|
-
if (isAnyPayload(payload)) {
|
|
239
|
-
res.json(payload);
|
|
54
|
+
restartTransactionTimer() {
|
|
55
|
+
this.stopTransactionTimer();
|
|
56
|
+
this._transactionTimerId = setInterval(() => {
|
|
57
|
+
if (this._transactionTimerMutex.isLocked()) {
|
|
240
58
|
return;
|
|
241
59
|
}
|
|
60
|
+
void this._transactionTimerMutex.runExclusive(async () => {
|
|
61
|
+
await this.mempoolRunner.prunePendingTransactions({
|
|
62
|
+
batchSize: 50
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
}, 1e3);
|
|
66
|
+
}
|
|
67
|
+
stopBlockTimer() {
|
|
68
|
+
if (this._blockTimerId !== null) {
|
|
69
|
+
clearInterval(this._blockTimerId);
|
|
242
70
|
}
|
|
243
|
-
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
}));
|
|
256
|
-
}, "addDataLakeRoutes");
|
|
257
|
-
|
|
258
|
-
// src/server/routes/healthz/addHealthRoutes.ts
|
|
259
|
-
import { StatusCodes as StatusCodes4 } from "http-status-codes";
|
|
260
|
-
var addHealthRoutes = /* @__PURE__ */ __name((app) => {
|
|
261
|
-
app.get("/healthz", (_req, res) => {
|
|
262
|
-
res.status(StatusCodes4.OK).send();
|
|
263
|
-
});
|
|
264
|
-
app.get("/livez", (_req, res) => {
|
|
265
|
-
res.status(StatusCodes4.OK).send();
|
|
266
|
-
});
|
|
267
|
-
app.get("/readyz", (_req, res) => {
|
|
268
|
-
res.status(StatusCodes4.OK).send();
|
|
269
|
-
});
|
|
270
|
-
}, "addHealthRoutes");
|
|
271
|
-
|
|
272
|
-
// src/server/routes/addRoutes.ts
|
|
273
|
-
var addRoutes = /* @__PURE__ */ __name((app) => {
|
|
274
|
-
addHealthRoutes(app);
|
|
275
|
-
addDataLakeRoutes(app);
|
|
276
|
-
addNodeRoutes(app);
|
|
277
|
-
}, "addRoutes");
|
|
278
|
-
|
|
279
|
-
// src/server/app.ts
|
|
280
|
-
var getApp = /* @__PURE__ */ __name((context) => {
|
|
281
|
-
addInstrumentation();
|
|
282
|
-
const app = express2();
|
|
283
|
-
app.set("etag", false);
|
|
284
|
-
app.use(cors());
|
|
285
|
-
app.use(compression());
|
|
286
|
-
app.use(responseProfiler);
|
|
287
|
-
app.use(getJsonBodyParser(getJsonBodyParserOptions({
|
|
288
|
-
limit: "1mb"
|
|
289
|
-
})));
|
|
290
|
-
app.use(standardResponses);
|
|
291
|
-
disableExpressDefaultPoweredByHeader(app);
|
|
292
|
-
app.use(customPoweredByHeader);
|
|
293
|
-
disableCaseSensitiveRouting(app);
|
|
294
|
-
app.context = context;
|
|
295
|
-
app.node = context.node;
|
|
296
|
-
addRoutes(app);
|
|
297
|
-
app.use(standardErrors);
|
|
298
|
-
return app;
|
|
299
|
-
}, "getApp");
|
|
71
|
+
this._blockTimerId = null;
|
|
72
|
+
}
|
|
73
|
+
stopTransactionTimer() {
|
|
74
|
+
if (this._transactionTimerId !== null) {
|
|
75
|
+
clearInterval(this._transactionTimerId);
|
|
76
|
+
}
|
|
77
|
+
this._transactionTimerId = null;
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
MempoolActor = _ts_decorate([
|
|
81
|
+
creatable()
|
|
82
|
+
], MempoolActor);
|
|
300
83
|
|
|
301
|
-
// src/
|
|
302
|
-
import {
|
|
303
|
-
import {
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
import { validateHydratedBlock, validateHydratedBlockState } from "@xyo-network/chain-validation";
|
|
307
|
-
import { BlockViewerMoniker, DefaultMetricsScrapePorts, findMostRecentBlock, MempoolViewerMoniker, ProviderFactoryLocator, SimpleBlockValidationViewer, SimpleBlockViewer, SimpleMempoolRunner, SimpleMempoolViewer, SimpleStakeEventsViewer, SimpleStakeViewer, SimpleWindowedBlockViewer } from "@xyo-network/xl1-sdk";
|
|
308
|
-
var hostname = "::";
|
|
309
|
-
var getProviderFactoryLocator = /* @__PURE__ */ __name((context, finalizedArchivist, pendingTransactionsArchivist, pendingBlocksArchivist) => {
|
|
310
|
-
const locator = new ProviderFactoryLocator(context);
|
|
311
|
-
locator.register(SimpleBlockValidationViewer.factory(SimpleBlockValidationViewer.dependencies, {
|
|
312
|
-
state: validateHydratedBlockState,
|
|
313
|
-
protocol: validateHydratedBlock
|
|
314
|
-
}));
|
|
315
|
-
locator.register(SimpleMempoolViewer.factory(SimpleMempoolViewer.dependencies, {
|
|
316
|
-
pendingTransactionsArchivist,
|
|
317
|
-
pendingBlocksArchivist
|
|
318
|
-
}));
|
|
319
|
-
locator.register(SimpleMempoolRunner.factory(SimpleMempoolRunner.dependencies, {
|
|
320
|
-
pendingTransactionsArchivist,
|
|
321
|
-
pendingBlocksArchivist
|
|
322
|
-
}));
|
|
323
|
-
locator.register(SimpleBlockViewer.factory(SimpleBlockViewer.dependencies, {
|
|
324
|
-
finalizedArchivist
|
|
325
|
-
}));
|
|
326
|
-
locator.register(SimpleWindowedBlockViewer.factory(SimpleWindowedBlockViewer.dependencies, {
|
|
327
|
-
maxWindowSize: 1e4,
|
|
328
|
-
syncInterval: 1e4
|
|
329
|
-
}));
|
|
330
|
-
locator.register(SimpleStakeViewer.factory(SimpleStakeViewer.dependencies, {}));
|
|
331
|
-
locator.register(SimpleStakeEventsViewer.factory(SimpleStakeEventsViewer.dependencies, {}));
|
|
332
|
-
return locator;
|
|
333
|
-
}, "getProviderFactoryLocator");
|
|
334
|
-
var getServer = /* @__PURE__ */ __name(async (context) => {
|
|
335
|
-
const { config, node: providedNode } = context;
|
|
336
|
-
const { port } = context.config.api;
|
|
337
|
-
const logger = assertEx2(context.logger, () => "Logger is required to init server");
|
|
338
|
-
const statusReporter = initStatusReporter({
|
|
339
|
-
logger
|
|
340
|
-
});
|
|
341
|
-
await startupSpanAsync("initHealthEndpoints", () => initHealthEndpoints({
|
|
342
|
-
config,
|
|
343
|
-
logger,
|
|
344
|
-
statusReporter
|
|
345
|
-
}));
|
|
346
|
-
const telemetryConfig = buildTelemetryConfig(config, "xl1-mempool", "1.0.0", DefaultMetricsScrapePorts.mempool);
|
|
347
|
-
const { traceProvider, meterProvider } = await startupSpanAsync("initTelemetry", () => initTelemetry(telemetryConfig));
|
|
348
|
-
const initContext = {
|
|
349
|
-
_id: "init-context",
|
|
84
|
+
// src/runMempool.ts
|
|
85
|
+
import { exists } from "@xylabs/sdk-js";
|
|
86
|
+
import { initMempoolWallet } from "@xyo-network/chain-orchestration";
|
|
87
|
+
var runMempool = /* @__PURE__ */ __name(async (config, orchestrator, locator) => {
|
|
88
|
+
const account = await initMempoolWallet({
|
|
350
89
|
config,
|
|
351
|
-
logger
|
|
352
|
-
statusReporter,
|
|
353
|
-
meterProvider,
|
|
354
|
-
traceProvider,
|
|
355
|
-
singletons: {},
|
|
356
|
-
caches: {}
|
|
357
|
-
};
|
|
358
|
-
const wallet = await initMempoolWallet(initContext);
|
|
359
|
-
const balancesSummaryMap = assertEx2(await initBalanceSummaryMap(initContext), () => "Balance Summary Map not initialized");
|
|
360
|
-
const transfersSummaryMap = assertEx2(await initTransferSummaryMap(initContext), () => "Transfer Summary Map not initialized");
|
|
361
|
-
const { node, writableChainArchivist, readonlyChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist } = await initServerNode({
|
|
362
|
-
...initContext,
|
|
363
|
-
wallet,
|
|
364
|
-
node: providedNode,
|
|
365
|
-
transfersSummaryMap,
|
|
366
|
-
balancesSummaryMap
|
|
90
|
+
logger: locator.context.logger
|
|
367
91
|
});
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
}));
|
|
373
|
-
const locator = getProviderFactoryLocator(initContext, writableChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist);
|
|
374
|
-
const mempoolContext = {
|
|
375
|
-
...initContext,
|
|
376
|
-
node,
|
|
377
|
-
transfersSummaryMap,
|
|
378
|
-
balancesSummaryMap,
|
|
379
|
-
...locator.context,
|
|
380
|
-
_id: "mempool-context"
|
|
381
|
-
};
|
|
382
|
-
const blockViewer = await locator.getInstance(BlockViewerMoniker);
|
|
383
|
-
assertEx2(await blockViewer.start(), () => "Failed to start BlockViewer");
|
|
384
|
-
const blk = await blockViewer.currentBlock();
|
|
385
|
-
assertEx2(blk, () => "No blocks found after initialization");
|
|
386
|
-
const mempoolViewer = await locator.getInstance(MempoolViewerMoniker);
|
|
387
|
-
assertEx2(await mempoolViewer.start(), () => "Failed to start MempoolViewer");
|
|
388
|
-
console.info(`[Mempool] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`);
|
|
389
|
-
const actor = await ValidatorActor.create({
|
|
390
|
-
id: "validator-mempool-server",
|
|
391
|
-
account: wallet,
|
|
392
|
-
context: locator.context,
|
|
393
|
-
finalizedArchivist: writableChainArchivist,
|
|
394
|
-
blockViewer,
|
|
395
|
-
mempoolViewer
|
|
92
|
+
const mempool = await MempoolActor.create({
|
|
93
|
+
account,
|
|
94
|
+
config,
|
|
95
|
+
locator
|
|
396
96
|
});
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
}
|
|
97
|
+
const actors = [
|
|
98
|
+
mempool
|
|
99
|
+
].filter(exists);
|
|
100
|
+
for (const actor of actors) {
|
|
101
|
+
await orchestrator.registerActor(actor);
|
|
102
|
+
}
|
|
103
|
+
await orchestrator.start();
|
|
104
|
+
}, "runMempool");
|
|
403
105
|
export {
|
|
404
|
-
|
|
405
|
-
|
|
106
|
+
MempoolActor,
|
|
107
|
+
runMempool
|
|
406
108
|
};
|
|
407
109
|
//# sourceMappingURL=index.mjs.map
|
package/dist/node/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../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/healthz/addHealthRoutes.ts","../../src/server/routes/addRoutes.ts","../../src/server/server.ts"],"sourcesContent":["import {\n customPoweredByHeader, disableCaseSensitiveRouting, disableExpressDefaultPoweredByHeader, getJsonBodyParser, getJsonBodyParserOptions, responseProfiler,\n standardErrors, 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 { MempoolContext } from '../MempoolContext.ts'\nimport { addInstrumentation } from './instrumentation.ts'\nimport { addRoutes } from './routes/index.ts'\n\nexport const getApp = (context: MempoolContext): Express => {\n addInstrumentation()\n const app = express()\n app.set('etag', false)\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 app.node = context.node\n 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.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\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\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\n const archivistModuleIdentifier = 'Chain:Finalized'\n app.use('/chain', archivistMiddleware({ node, archivistModuleIdentifier }))\n}\n","import type { Express } from 'express'\nimport { StatusCodes } from 'http-status-codes'\n\nexport const addHealthRoutes = (app: Express) => {\n app.get('/healthz', (_req, res) => {\n res.status(StatusCodes.OK).send()\n })\n app.get('/livez', (_req, res) => {\n res.status(StatusCodes.OK).send()\n })\n app.get('/readyz', (_req, res) => {\n res.status(StatusCodes.OK).send()\n })\n}\n","import type { Express } from 'express'\n\nimport { addNodeRoutes } from './address/index.ts'\nimport { addDataLakeRoutes } from './dataLake/index.ts'\nimport { addHealthRoutes } from './healthz/index.ts'\n\nexport const addRoutes = (app: Express) => {\n addHealthRoutes(app)\n addDataLakeRoutes(app)\n addNodeRoutes(app)\n}\n","import type { Logger } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { ValidatorActorParams } from '@xyo-network/chain-orchestration'\nimport {\n buildTelemetryConfig, initBalanceSummaryMap, initHealthEndpoints, initMempoolWallet, initServerNode, initStatusReporter, initTransferSummaryMap,\n ValidatorActor,\n} from '@xyo-network/chain-orchestration'\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 BlockViewer,\n Config, CreatableProviderContext, CreatableProviderParams,\n MempoolViewer,\n} from '@xyo-network/xl1-sdk'\nimport {\n BlockViewerMoniker, DefaultMetricsScrapePorts, findMostRecentBlock, MempoolViewerMoniker,\n ProviderFactoryLocator, SimpleBlockValidationViewer, SimpleBlockViewer, SimpleMempoolRunner, SimpleMempoolViewer,\n SimpleStakeEventsViewer, SimpleStakeViewer, SimpleWindowedBlockViewer,\n} from '@xyo-network/xl1-sdk'\n\nimport type { MempoolContext } from '../MempoolContext.ts'\nimport { getApp } from './app.ts'\n\nconst hostname = '::'\n// const hostname = '0.0.0.0'\n\ninterface GetServerContext {\n config: Config\n logger?: Logger\n node?: NodeInstance\n}\n\nconst getProviderFactoryLocator = (\n context: Omit<CreatableProviderContext, 'locator'>,\n finalizedArchivist: ArchivistInstance,\n pendingTransactionsArchivist: ArchivistInstance,\n pendingBlocksArchivist: ArchivistInstance,\n) => {\n const locator = new ProviderFactoryLocator(context)\n locator.register(SimpleBlockValidationViewer.factory<SimpleBlockValidationViewer>(\n SimpleBlockValidationViewer.dependencies,\n { state: validateHydratedBlockState, protocol: validateHydratedBlock },\n ))\n locator.register(SimpleMempoolViewer.factory(SimpleMempoolViewer.dependencies, {\n pendingTransactionsArchivist,\n pendingBlocksArchivist,\n } as Partial<CreatableProviderParams>))\n locator.register(SimpleMempoolRunner.factory(SimpleMempoolRunner.dependencies, {\n pendingTransactionsArchivist,\n pendingBlocksArchivist,\n } as Partial<CreatableProviderParams>))\n locator.register(SimpleBlockViewer.factory<SimpleBlockViewer>(SimpleBlockViewer.dependencies, { finalizedArchivist }))\n locator.register(SimpleWindowedBlockViewer.factory<SimpleWindowedBlockViewer>(\n SimpleWindowedBlockViewer.dependencies,\n { maxWindowSize: 10_000, syncInterval: 10_000 },\n ))\n locator.register(SimpleStakeViewer.factory(SimpleStakeViewer.dependencies, {}))\n locator.register(SimpleStakeEventsViewer.factory(SimpleStakeEventsViewer.dependencies, {}))\n return locator\n}\n\nexport const getServer = async (context: GetServerContext) => {\n const { config, node: providedNode } = context\n const { port } = context.config.api\n\n const logger = assertEx(context.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-mempool', '1.0.0', DefaultMetricsScrapePorts.mempool)\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 meterProvider,\n traceProvider,\n singletons: {},\n caches: {},\n }\n\n const wallet = await initMempoolWallet(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, wallet, node: providedNode, transfersSummaryMap, balancesSummaryMap,\n })\n\n assertEx(await findMostRecentBlock(readonlyChainArchivist), () => 'No head found')\n\n const mods = await node.resolve('*')\n await Promise.all(mods.map((mod) => {\n return mod.start?.() ?? (() => true)\n }))\n\n const locator = getProviderFactoryLocator(initContext, writableChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist)\n\n const mempoolContext = {\n ...initContext,\n node,\n transfersSummaryMap,\n balancesSummaryMap,\n ...locator.context,\n _id: 'mempool-context',\n } satisfies MempoolContext\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 mempoolViewer = (await locator.getInstance<MempoolViewer>(MempoolViewerMoniker))\n assertEx(await mempoolViewer.start(), () => 'Failed to start MempoolViewer')\n\n console.info(`[Mempool] Current block after initialization: #${blk[0].block} (${blk[0]._hash})`)\n\n const actor = await ValidatorActor.create({\n id: 'validator-mempool-server',\n account: wallet,\n context: locator.context,\n finalizedArchivist: writableChainArchivist,\n blockViewer,\n mempoolViewer,\n } satisfies ValidatorActorParams)\n\n await actor.start()\n\n const app = getApp(mempoolContext)\n const server = app.listen(port, hostname, () => logger?.log(`[Mempool] Server listening at http://${hostname}:${port}`))\n server.setTimeout(20_000)\n return server\n}\n"],"mappings":"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","names":["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","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","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","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","archivistModuleIdentifier","use","archivistMiddleware","StatusCodes","addHealthRoutes","app","get","_req","res","status","StatusCodes","OK","send","addRoutes","app","addHealthRoutes","addDataLakeRoutes","addNodeRoutes","getApp","context","addInstrumentation","app","express","set","use","cors","compression","responseProfiler","getJsonBodyParser","getJsonBodyParserOptions","limit","standardResponses","disableExpressDefaultPoweredByHeader","customPoweredByHeader","disableCaseSensitiveRouting","node","addRoutes","standardErrors","assertEx","buildTelemetryConfig","initBalanceSummaryMap","initHealthEndpoints","initMempoolWallet","initServerNode","initStatusReporter","initTransferSummaryMap","ValidatorActor","initTelemetry","startupSpanAsync","validateHydratedBlock","validateHydratedBlockState","BlockViewerMoniker","DefaultMetricsScrapePorts","findMostRecentBlock","MempoolViewerMoniker","ProviderFactoryLocator","SimpleBlockValidationViewer","SimpleBlockViewer","SimpleMempoolRunner","SimpleMempoolViewer","SimpleStakeEventsViewer","SimpleStakeViewer","SimpleWindowedBlockViewer","hostname","getProviderFactoryLocator","context","finalizedArchivist","pendingTransactionsArchivist","pendingBlocksArchivist","locator","ProviderFactoryLocator","register","SimpleBlockValidationViewer","factory","dependencies","state","validateHydratedBlockState","protocol","validateHydratedBlock","SimpleMempoolViewer","SimpleMempoolRunner","SimpleBlockViewer","SimpleWindowedBlockViewer","maxWindowSize","syncInterval","SimpleStakeViewer","SimpleStakeEventsViewer","getServer","config","node","providedNode","port","api","logger","assertEx","statusReporter","initStatusReporter","startupSpanAsync","initHealthEndpoints","telemetryConfig","buildTelemetryConfig","DefaultMetricsScrapePorts","mempool","traceProvider","meterProvider","initTelemetry","initContext","_id","singletons","caches","wallet","initMempoolWallet","balancesSummaryMap","initBalanceSummaryMap","transfersSummaryMap","initTransferSummaryMap","writableChainArchivist","readonlyChainArchivist","initServerNode","findMostRecentBlock","mods","resolve","Promise","all","map","mod","start","mempoolContext","blockViewer","getInstance","BlockViewerMoniker","blk","currentBlock","mempoolViewer","MempoolViewerMoniker","console","info","block","_hash","actor","ValidatorActor","create","id","account","app","getApp","server","listen","log","setTimeout"]}
|
|
1
|
+
{"version":3,"sources":["../../src/MempoolActor.ts","../../src/runMempool.ts"],"sourcesContent":["import { creatable } from '@xylabs/sdk-js'\nimport {\n ActorParamsV3,\n ActorV3,\n Config,\n MempoolRunner,\n MempoolRunnerMoniker,\n} from '@xyo-network/xl1-sdk'\nimport { Mutex } from 'async-mutex'\n\nexport type MempoolActorParams = ActorParamsV3<{\n config: Config\n}>\n\n@creatable()\nexport class MempoolActor extends ActorV3<MempoolActorParams> {\n protected _mempoolRunner!: MempoolRunner\n\n private _blockTimerId: ReturnType<typeof setInterval> | null = null\n private _blockTimerMutex = new Mutex()\n\n private _transactionTimerId: ReturnType<typeof setInterval> | null = null\n private _transactionTimerMutex = new Mutex()\n\n protected get mempoolRunner() {\n return this._mempoolRunner\n }\n\n override async createHandler() {\n await super.createHandler()\n this._mempoolRunner = await this.locator.getInstance(MempoolRunnerMoniker)\n }\n\n override async startHandler() {\n await super.startHandler()\n this.restartTransactionTimer()\n this.restartBlockTimer()\n }\n\n override async stopHandler() {\n await super.stopHandler()\n this.stopTransactionTimer()\n this.stopBlockTimer()\n }\n\n private restartBlockTimer() {\n this.stopBlockTimer()\n this._blockTimerId = setInterval(() => {\n if (this._blockTimerMutex.isLocked()) {\n return\n }\n void this._blockTimerMutex.runExclusive(async () => {\n await this.mempoolRunner.prunePendingBlocks({ batchSize: 50 })\n })\n }, 1000)\n }\n\n private restartTransactionTimer() {\n this.stopTransactionTimer()\n this._transactionTimerId = setInterval(() => {\n if (this._transactionTimerMutex.isLocked()) {\n return\n }\n void this._transactionTimerMutex.runExclusive(async () => {\n await this.mempoolRunner.prunePendingTransactions({ batchSize: 50 })\n })\n }, 1000)\n }\n\n private stopBlockTimer() {\n if (this._blockTimerId !== null) {\n clearInterval(this._blockTimerId)\n }\n this._blockTimerId = null\n }\n\n private stopTransactionTimer() {\n if (this._transactionTimerId !== null) {\n clearInterval(this._transactionTimerId)\n }\n this._transactionTimerId = null\n }\n}\n","import { exists } from '@xylabs/sdk-js'\nimport { initMempoolWallet, type OrchestratorInstance } from '@xyo-network/chain-orchestration'\nimport type {\n Config,\n ProviderFactoryLocatorInstance,\n} from '@xyo-network/xl1-sdk'\n\nimport { MempoolActor } from './MempoolActor.ts'\n\nexport const runMempool = async (\n config: Config,\n orchestrator: OrchestratorInstance,\n locator: ProviderFactoryLocatorInstance,\n) => {\n const account = await initMempoolWallet({ config, logger: locator.context.logger })\n // Create actors\n const mempool = await MempoolActor.create({\n account, config, locator,\n })\n const actors = [mempool].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":";;;;AAAA,SAASA,iBAAiB;AAC1B,SAEEC,SAGAC,4BACK;AACP,SAASC,aAAa;;;;;;;;AAOf,IAAMC,eAAN,cAA2BC,QAAAA;SAAAA;;;EACtBC;EAEFC,gBAAuD;EACvDC,mBAAmB,IAAIC,MAAAA;EAEvBC,sBAA6D;EAC7DC,yBAAyB,IAAIF,MAAAA;EAErC,IAAcG,gBAAgB;AAC5B,WAAO,KAAKN;EACd;EAEA,MAAeO,gBAAgB;AAC7B,UAAM,MAAMA,cAAAA;AACZ,SAAKP,iBAAiB,MAAM,KAAKQ,QAAQC,YAAYC,oBAAAA;EACvD;EAEA,MAAeC,eAAe;AAC5B,UAAM,MAAMA,aAAAA;AACZ,SAAKC,wBAAuB;AAC5B,SAAKC,kBAAiB;EACxB;EAEA,MAAeC,cAAc;AAC3B,UAAM,MAAMA,YAAAA;AACZ,SAAKC,qBAAoB;AACzB,SAAKC,eAAc;EACrB;EAEQH,oBAAoB;AAC1B,SAAKG,eAAc;AACnB,SAAKf,gBAAgBgB,YAAY,MAAA;AAC/B,UAAI,KAAKf,iBAAiBgB,SAAQ,GAAI;AACpC;MACF;AACA,WAAK,KAAKhB,iBAAiBiB,aAAa,YAAA;AACtC,cAAM,KAAKb,cAAcc,mBAAmB;UAAEC,WAAW;QAAG,CAAA;MAC9D,CAAA;IACF,GAAG,GAAA;EACL;EAEQT,0BAA0B;AAChC,SAAKG,qBAAoB;AACzB,SAAKX,sBAAsBa,YAAY,MAAA;AACrC,UAAI,KAAKZ,uBAAuBa,SAAQ,GAAI;AAC1C;MACF;AACA,WAAK,KAAKb,uBAAuBc,aAAa,YAAA;AAC5C,cAAM,KAAKb,cAAcgB,yBAAyB;UAAED,WAAW;QAAG,CAAA;MACpE,CAAA;IACF,GAAG,GAAA;EACL;EAEQL,iBAAiB;AACvB,QAAI,KAAKf,kBAAkB,MAAM;AAC/BsB,oBAAc,KAAKtB,aAAa;IAClC;AACA,SAAKA,gBAAgB;EACvB;EAEQc,uBAAuB;AAC7B,QAAI,KAAKX,wBAAwB,MAAM;AACrCmB,oBAAc,KAAKnB,mBAAmB;IACxC;AACA,SAAKA,sBAAsB;EAC7B;AACF;;;;;;AClFA,SAASoB,cAAc;AACvB,SAASC,yBAAoD;AAQtD,IAAMC,aAAa,8BACxBC,QACAC,cACAC,YAAAA;AAEA,QAAMC,UAAU,MAAMC,kBAAkB;IAAEJ;IAAQK,QAAQH,QAAQI,QAAQD;EAAO,CAAA;AAEjF,QAAME,UAAU,MAAMC,aAAaC,OAAO;IACxCN;IAASH;IAAQE;EACnB,CAAA;AACA,QAAMQ,SAAS;IAACH;IAASI,OAAOC,MAAAA;AAEhC,aAAWC,SAASH,QAAQ;AAE1B,UAAMT,aAAaa,cAAcD,KAAAA;EACnC;AAEA,QAAMZ,aAAac,MAAK;AAC1B,GAlB0B;","names":["creatable","ActorV3","MempoolRunnerMoniker","Mutex","MempoolActor","ActorV3","_mempoolRunner","_blockTimerId","_blockTimerMutex","Mutex","_transactionTimerId","_transactionTimerMutex","mempoolRunner","createHandler","locator","getInstance","MempoolRunnerMoniker","startHandler","restartTransactionTimer","restartBlockTimer","stopHandler","stopTransactionTimer","stopBlockTimer","setInterval","isLocked","runExclusive","prunePendingBlocks","batchSize","prunePendingTransactions","clearInterval","exists","initMempoolWallet","runMempool","config","orchestrator","locator","account","initMempoolWallet","logger","context","mempool","MempoolActor","create","actors","filter","exists","actor","registerActor","start"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type OrchestratorInstance } from '@xyo-network/chain-orchestration';
|
|
2
|
+
import type { Config, ProviderFactoryLocatorInstance } from '@xyo-network/xl1-sdk';
|
|
3
|
+
export declare const runMempool: (config: Config, orchestrator: OrchestratorInstance, locator: ProviderFactoryLocatorInstance) => Promise<void>;
|
|
4
|
+
//# sourceMappingURL=runMempool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runMempool.d.ts","sourceRoot":"","sources":["../../src/runMempool.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AAC/F,OAAO,KAAK,EACV,MAAM,EACN,8BAA8B,EAC/B,MAAM,sBAAsB,CAAA;AAI7B,eAAO,MAAM,UAAU,GACrB,QAAQ,MAAM,EACd,cAAc,oBAAoB,EAClC,SAAS,8BAA8B,kBAexC,CAAA"}
|