@xyo-network/chain-orchestration 1.20.27 → 1.20.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/index.mjs +357 -77
- package/dist/browser/index.mjs.map +1 -1
- package/dist/browser/neutral/config/locators/basicRemoteViewerLocator.d.ts +1 -1
- package/dist/browser/neutral/config/locators/basicRemoteViewerLocator.d.ts.map +1 -1
- package/dist/browser/node/config/capabilities/Capability.d.ts +36 -0
- package/dist/browser/node/config/capabilities/Capability.d.ts.map +1 -0
- package/dist/browser/node/config/capabilities/ProcessSharedResources.d.ts +30 -0
- package/dist/browser/node/config/capabilities/ProcessSharedResources.d.ts.map +1 -0
- package/dist/browser/node/config/capabilities/Provider.d.ts +50 -0
- package/dist/browser/node/config/capabilities/Provider.d.ts.map +1 -0
- package/dist/browser/node/config/capabilities/XL1ResolutionContext.d.ts +18 -0
- package/dist/browser/node/config/capabilities/XL1ResolutionContext.d.ts.map +1 -0
- package/dist/browser/node/config/capabilities/defaultCapabilityRegistry.d.ts +8 -0
- package/dist/browser/node/config/capabilities/defaultCapabilityRegistry.d.ts.map +1 -0
- package/dist/browser/node/config/capabilities/descriptors.d.ts +15 -0
- package/dist/browser/node/config/capabilities/descriptors.d.ts.map +1 -0
- package/dist/browser/node/config/capabilities/index.d.ts +9 -0
- package/dist/browser/node/config/capabilities/index.d.ts.map +1 -0
- package/dist/browser/node/config/capabilities/locatorFromActorNeeds.d.ts +36 -0
- package/dist/browser/node/config/capabilities/locatorFromActorNeeds.d.ts.map +1 -0
- package/dist/browser/node/config/capabilities/resolveProviders.d.ts +30 -0
- package/dist/browser/node/config/capabilities/resolveProviders.d.ts.map +1 -0
- package/dist/browser/node/config/index.d.ts +1 -0
- package/dist/browser/node/config/index.d.ts.map +1 -1
- package/dist/browser/node/config/locators/actors/producerLocatorFromConfig.d.ts.map +1 -1
- package/dist/browser/node/config/locators/basicRemoteViewerLocator.d.ts +1 -1
- package/dist/browser/node/config/locators/basicRemoteViewerLocator.d.ts.map +1 -1
- package/dist/browser/node/config/locators/localLocatorFromConfig.d.ts +10 -2
- package/dist/browser/node/config/locators/localLocatorFromConfig.d.ts.map +1 -1
- package/dist/browser/shared/actor/FinalizerActor.d.ts +6 -2
- package/dist/browser/shared/actor/FinalizerActor.d.ts.map +1 -1
- package/dist/browser/shared/actor/index.d.ts +1 -0
- package/dist/browser/shared/actor/index.d.ts.map +1 -1
- package/dist/browser/shared/actor/v3/ActorV3.d.ts +85 -0
- package/dist/browser/shared/actor/v3/ActorV3.d.ts.map +1 -0
- package/dist/browser/shared/actor/v3/index.d.ts +2 -0
- package/dist/browser/shared/actor/v3/index.d.ts.map +1 -0
- package/dist/browser/shared/config/actors/Api.d.ts +4 -4
- package/dist/browser/shared/config/actors/Bridge.d.ts +4 -4
- package/dist/browser/shared/config/actors/Finalizer.d.ts +10 -4
- package/dist/browser/shared/config/actors/Finalizer.d.ts.map +1 -1
- package/dist/browser/shared/config/actors/Mempool.d.ts +4 -4
- package/dist/browser/shared/config/actors/Producer.d.ts +6 -6
- package/dist/browser/shared/config/actors/Producer.d.ts.map +1 -1
- package/dist/browser/shared/config/actors/RewardRedemption.d.ts +4 -4
- package/dist/browser/shared/orchestrator/Orchestrator.d.ts +16 -2
- package/dist/browser/shared/orchestrator/Orchestrator.d.ts.map +1 -1
- package/dist/neutral/index.mjs +357 -77
- package/dist/neutral/index.mjs.map +1 -1
- package/dist/neutral/neutral/config/locators/basicRemoteViewerLocator.d.ts +1 -1
- package/dist/neutral/neutral/config/locators/basicRemoteViewerLocator.d.ts.map +1 -1
- package/dist/neutral/node/config/capabilities/Capability.d.ts +36 -0
- package/dist/neutral/node/config/capabilities/Capability.d.ts.map +1 -0
- package/dist/neutral/node/config/capabilities/ProcessSharedResources.d.ts +30 -0
- package/dist/neutral/node/config/capabilities/ProcessSharedResources.d.ts.map +1 -0
- package/dist/neutral/node/config/capabilities/Provider.d.ts +50 -0
- package/dist/neutral/node/config/capabilities/Provider.d.ts.map +1 -0
- package/dist/neutral/node/config/capabilities/XL1ResolutionContext.d.ts +18 -0
- package/dist/neutral/node/config/capabilities/XL1ResolutionContext.d.ts.map +1 -0
- package/dist/neutral/node/config/capabilities/defaultCapabilityRegistry.d.ts +8 -0
- package/dist/neutral/node/config/capabilities/defaultCapabilityRegistry.d.ts.map +1 -0
- package/dist/neutral/node/config/capabilities/descriptors.d.ts +15 -0
- package/dist/neutral/node/config/capabilities/descriptors.d.ts.map +1 -0
- package/dist/neutral/node/config/capabilities/index.d.ts +9 -0
- package/dist/neutral/node/config/capabilities/index.d.ts.map +1 -0
- package/dist/neutral/node/config/capabilities/locatorFromActorNeeds.d.ts +36 -0
- package/dist/neutral/node/config/capabilities/locatorFromActorNeeds.d.ts.map +1 -0
- package/dist/neutral/node/config/capabilities/resolveProviders.d.ts +30 -0
- package/dist/neutral/node/config/capabilities/resolveProviders.d.ts.map +1 -0
- package/dist/neutral/node/config/index.d.ts +1 -0
- package/dist/neutral/node/config/index.d.ts.map +1 -1
- package/dist/neutral/node/config/locators/actors/producerLocatorFromConfig.d.ts.map +1 -1
- package/dist/neutral/node/config/locators/basicRemoteViewerLocator.d.ts +1 -1
- package/dist/neutral/node/config/locators/basicRemoteViewerLocator.d.ts.map +1 -1
- package/dist/neutral/node/config/locators/localLocatorFromConfig.d.ts +10 -2
- package/dist/neutral/node/config/locators/localLocatorFromConfig.d.ts.map +1 -1
- package/dist/neutral/shared/actor/FinalizerActor.d.ts +6 -2
- package/dist/neutral/shared/actor/FinalizerActor.d.ts.map +1 -1
- package/dist/neutral/shared/actor/index.d.ts +1 -0
- package/dist/neutral/shared/actor/index.d.ts.map +1 -1
- package/dist/neutral/shared/actor/v3/ActorV3.d.ts +85 -0
- package/dist/neutral/shared/actor/v3/ActorV3.d.ts.map +1 -0
- package/dist/neutral/shared/actor/v3/index.d.ts +2 -0
- package/dist/neutral/shared/actor/v3/index.d.ts.map +1 -0
- package/dist/neutral/shared/config/actors/Api.d.ts +4 -4
- package/dist/neutral/shared/config/actors/Bridge.d.ts +4 -4
- package/dist/neutral/shared/config/actors/Finalizer.d.ts +10 -4
- package/dist/neutral/shared/config/actors/Finalizer.d.ts.map +1 -1
- package/dist/neutral/shared/config/actors/Mempool.d.ts +4 -4
- package/dist/neutral/shared/config/actors/Producer.d.ts +6 -6
- package/dist/neutral/shared/config/actors/Producer.d.ts.map +1 -1
- package/dist/neutral/shared/config/actors/RewardRedemption.d.ts +4 -4
- package/dist/neutral/shared/orchestrator/Orchestrator.d.ts +16 -2
- package/dist/neutral/shared/orchestrator/Orchestrator.d.ts.map +1 -1
- package/dist/node/index.mjs +1036 -223
- package/dist/node/index.mjs.map +1 -1
- package/dist/node/neutral/config/locators/basicRemoteViewerLocator.d.ts +1 -1
- package/dist/node/neutral/config/locators/basicRemoteViewerLocator.d.ts.map +1 -1
- package/dist/node/node/config/capabilities/Capability.d.ts +36 -0
- package/dist/node/node/config/capabilities/Capability.d.ts.map +1 -0
- package/dist/node/node/config/capabilities/ProcessSharedResources.d.ts +30 -0
- package/dist/node/node/config/capabilities/ProcessSharedResources.d.ts.map +1 -0
- package/dist/node/node/config/capabilities/Provider.d.ts +50 -0
- package/dist/node/node/config/capabilities/Provider.d.ts.map +1 -0
- package/dist/node/node/config/capabilities/XL1ResolutionContext.d.ts +18 -0
- package/dist/node/node/config/capabilities/XL1ResolutionContext.d.ts.map +1 -0
- package/dist/node/node/config/capabilities/defaultCapabilityRegistry.d.ts +8 -0
- package/dist/node/node/config/capabilities/defaultCapabilityRegistry.d.ts.map +1 -0
- package/dist/node/node/config/capabilities/descriptors.d.ts +15 -0
- package/dist/node/node/config/capabilities/descriptors.d.ts.map +1 -0
- package/dist/node/node/config/capabilities/index.d.ts +9 -0
- package/dist/node/node/config/capabilities/index.d.ts.map +1 -0
- package/dist/node/node/config/capabilities/locatorFromActorNeeds.d.ts +36 -0
- package/dist/node/node/config/capabilities/locatorFromActorNeeds.d.ts.map +1 -0
- package/dist/node/node/config/capabilities/resolveProviders.d.ts +30 -0
- package/dist/node/node/config/capabilities/resolveProviders.d.ts.map +1 -0
- package/dist/node/node/config/index.d.ts +1 -0
- package/dist/node/node/config/index.d.ts.map +1 -1
- package/dist/node/node/config/locators/actors/producerLocatorFromConfig.d.ts.map +1 -1
- package/dist/node/node/config/locators/basicRemoteViewerLocator.d.ts +1 -1
- package/dist/node/node/config/locators/basicRemoteViewerLocator.d.ts.map +1 -1
- package/dist/node/node/config/locators/localLocatorFromConfig.d.ts +10 -2
- package/dist/node/node/config/locators/localLocatorFromConfig.d.ts.map +1 -1
- package/dist/node/shared/actor/FinalizerActor.d.ts +6 -2
- package/dist/node/shared/actor/FinalizerActor.d.ts.map +1 -1
- package/dist/node/shared/actor/index.d.ts +1 -0
- package/dist/node/shared/actor/index.d.ts.map +1 -1
- package/dist/node/shared/actor/v3/ActorV3.d.ts +85 -0
- package/dist/node/shared/actor/v3/ActorV3.d.ts.map +1 -0
- package/dist/node/shared/actor/v3/index.d.ts +2 -0
- package/dist/node/shared/actor/v3/index.d.ts.map +1 -0
- package/dist/node/shared/config/actors/Api.d.ts +4 -4
- package/dist/node/shared/config/actors/Bridge.d.ts +4 -4
- package/dist/node/shared/config/actors/Finalizer.d.ts +10 -4
- package/dist/node/shared/config/actors/Finalizer.d.ts.map +1 -1
- package/dist/node/shared/config/actors/Mempool.d.ts +4 -4
- package/dist/node/shared/config/actors/Producer.d.ts +6 -6
- package/dist/node/shared/config/actors/Producer.d.ts.map +1 -1
- package/dist/node/shared/config/actors/RewardRedemption.d.ts +4 -4
- package/dist/node/shared/orchestrator/Orchestrator.d.ts +16 -2
- package/dist/node/shared/orchestrator/Orchestrator.d.ts.map +1 -1
- package/package.json +134 -134
package/dist/browser/index.mjs
CHANGED
|
@@ -4,7 +4,201 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
|
|
|
4
4
|
// src/shared/actor/FinalizerActor.ts
|
|
5
5
|
import { creatable } from "@xylabs/sdk-js";
|
|
6
6
|
import { processPendingBlocks } from "@xyo-network/chain-sdk";
|
|
7
|
-
import {
|
|
7
|
+
import { BlockValidationViewerMoniker, BlockViewerMoniker, DeadLetterQueueRunnerMoniker, FinalizationRunnerMoniker, MempoolViewerMoniker } from "@xyo-network/xl1-sdk";
|
|
8
|
+
|
|
9
|
+
// src/shared/actor/v3/ActorV3.ts
|
|
10
|
+
import { AbstractCreatable, assertEx, delay, IdLogger } from "@xylabs/sdk-js";
|
|
11
|
+
import { Semaphore } from "async-mutex";
|
|
12
|
+
import z from "zod";
|
|
13
|
+
var CreatableNameZod = z.custom((val) => typeof val === "string" && val.length > 0);
|
|
14
|
+
var StatusReporterInstanceZod = z.custom((val) => val !== null && typeof val === "object" && "report" in val);
|
|
15
|
+
var AccountInstanceZod = z.custom((val) => val !== null && typeof val === "object" && "address" in val);
|
|
16
|
+
var ActorParamsV3Zod = z.object({
|
|
17
|
+
account: AccountInstanceZod,
|
|
18
|
+
locator: z.unknown(),
|
|
19
|
+
name: CreatableNameZod,
|
|
20
|
+
statusReporter: StatusReporterInstanceZod.optional()
|
|
21
|
+
});
|
|
22
|
+
function createDeferred() {
|
|
23
|
+
let resolve;
|
|
24
|
+
let reject;
|
|
25
|
+
const promise = new Promise((res, rej) => {
|
|
26
|
+
resolve = res;
|
|
27
|
+
reject = rej;
|
|
28
|
+
});
|
|
29
|
+
return {
|
|
30
|
+
promise,
|
|
31
|
+
resolve,
|
|
32
|
+
reject
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
__name(createDeferred, "createDeferred");
|
|
36
|
+
var ActorV3 = class extends AbstractCreatable {
|
|
37
|
+
static {
|
|
38
|
+
__name(this, "ActorV3");
|
|
39
|
+
}
|
|
40
|
+
_intervals = /* @__PURE__ */ new Map();
|
|
41
|
+
_semaphores = /* @__PURE__ */ new Map();
|
|
42
|
+
_timeouts = /* @__PURE__ */ new Map();
|
|
43
|
+
_logger;
|
|
44
|
+
_readyDeferred = createDeferred();
|
|
45
|
+
_readyError;
|
|
46
|
+
_readyState = "pending";
|
|
47
|
+
get logger() {
|
|
48
|
+
this._logger = new IdLogger(assertEx(this.context.logger, () => `Logger is required in context for actor ${this.name}.`), () => this.name);
|
|
49
|
+
return this._logger;
|
|
50
|
+
}
|
|
51
|
+
get readyError() {
|
|
52
|
+
return this._readyError;
|
|
53
|
+
}
|
|
54
|
+
get readyState() {
|
|
55
|
+
return this._readyState;
|
|
56
|
+
}
|
|
57
|
+
get account() {
|
|
58
|
+
return this.params.account;
|
|
59
|
+
}
|
|
60
|
+
get context() {
|
|
61
|
+
return this.locator.context;
|
|
62
|
+
}
|
|
63
|
+
get locator() {
|
|
64
|
+
return this.params.locator;
|
|
65
|
+
}
|
|
66
|
+
static async paramsHandler(params) {
|
|
67
|
+
const baseParams = await super.paramsHandler({
|
|
68
|
+
...params,
|
|
69
|
+
name: params.name ?? "UnknownActor"
|
|
70
|
+
});
|
|
71
|
+
const account = assertEx(params.account, () => `params.account is required for actor ${baseParams.name}.`);
|
|
72
|
+
const locator = assertEx(params.locator, () => `params.locator is required for actor ${baseParams.name}.`);
|
|
73
|
+
return {
|
|
74
|
+
...baseParams,
|
|
75
|
+
account,
|
|
76
|
+
locator
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* The timer runs until the actor is deactivated (or you manually stop it).
|
|
81
|
+
*/
|
|
82
|
+
registerTimer(timerName, callback, dueTimeMs, periodMs) {
|
|
83
|
+
if (this.status !== "starting") {
|
|
84
|
+
this.logger?.warn(`Cannot register timer '${timerName}' because actor is not starting.`);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
let running = false;
|
|
88
|
+
this._semaphores.set(timerName, new Semaphore(1));
|
|
89
|
+
const timeoutId = setTimeout(() => {
|
|
90
|
+
const intervalId = setInterval(() => {
|
|
91
|
+
const semaphore = this._semaphores.get(timerName);
|
|
92
|
+
if (this.status !== "started" || !this._intervals.has(timerName) || !semaphore || running) return;
|
|
93
|
+
if (semaphore.isLocked()) {
|
|
94
|
+
this.logger?.warn(`Skipping timer '${this.name}:${timerName}' execution because previous execution is still running.`);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
semaphore.acquire().then(([, release]) => {
|
|
98
|
+
const startTime = Date.now();
|
|
99
|
+
running = true;
|
|
100
|
+
callback().then(() => {
|
|
101
|
+
const duration = Date.now() - startTime;
|
|
102
|
+
if (duration > periodMs) {
|
|
103
|
+
this.logger?.warn(`Timer '${this.name}:${timerName}' execution took longer (${duration}ms) than the period (${periodMs}ms).`);
|
|
104
|
+
} else if (duration > 5e3) {
|
|
105
|
+
this.logger?.warn(`Timer '${this.name}:${timerName}' execution took longer (${duration}ms) than 5000ms.`);
|
|
106
|
+
}
|
|
107
|
+
}).catch((error) => {
|
|
108
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
109
|
+
this.logger?.error(`Error in timer '${this.name}:${timerName}': ${err.message}`);
|
|
110
|
+
if (err.stack) this.logger?.error(err.stack);
|
|
111
|
+
}).finally(() => {
|
|
112
|
+
release();
|
|
113
|
+
running = false;
|
|
114
|
+
});
|
|
115
|
+
}).catch((error) => {
|
|
116
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
117
|
+
this.logger?.error(`Error acquiring semaphore for timer '${this.name}:${timerName}': ${err.message}`);
|
|
118
|
+
});
|
|
119
|
+
}, periodMs);
|
|
120
|
+
this._intervals.set(timerName, intervalId);
|
|
121
|
+
}, dueTimeMs);
|
|
122
|
+
this._timeouts.set(timerName, timeoutId);
|
|
123
|
+
this.logger?.debug(`Timer '${this.name}:${timerName}' registered: first call after ${dueTimeMs}ms, recurring every ${periodMs}ms.`);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Invoked by the Orchestrator after `start()` to run the warm-pass.
|
|
127
|
+
* Idempotent: returns immediately if already invoked.
|
|
128
|
+
* Throws if `readyHandler` throws; resolves once `readyHandler` resolves.
|
|
129
|
+
*/
|
|
130
|
+
async runReadyHandler() {
|
|
131
|
+
if (this._readyState !== "pending") return;
|
|
132
|
+
try {
|
|
133
|
+
await this.readyHandler();
|
|
134
|
+
this._readyState = "ready";
|
|
135
|
+
this._readyDeferred.resolve();
|
|
136
|
+
} catch (err) {
|
|
137
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
138
|
+
this._readyState = "failed";
|
|
139
|
+
this._readyError = error;
|
|
140
|
+
this._readyDeferred.reject(error);
|
|
141
|
+
throw error;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
async stopHandler() {
|
|
145
|
+
await super.stopHandler();
|
|
146
|
+
this.logger?.debug("Stopping all timers...");
|
|
147
|
+
await Promise.all([
|
|
148
|
+
...this._semaphores.values()
|
|
149
|
+
].map(async (semaphore) => {
|
|
150
|
+
while (semaphore.isLocked()) {
|
|
151
|
+
this.logger?.debug("Waiting for running timer task to complete...");
|
|
152
|
+
await delay(500);
|
|
153
|
+
}
|
|
154
|
+
await semaphore.acquire();
|
|
155
|
+
}));
|
|
156
|
+
this._semaphores.clear();
|
|
157
|
+
for (const [, timeoutRef] of this._timeouts.entries()) {
|
|
158
|
+
clearTimeout(timeoutRef);
|
|
159
|
+
}
|
|
160
|
+
this._timeouts.clear();
|
|
161
|
+
for (const [, intervalRef] of this._intervals.entries()) {
|
|
162
|
+
clearInterval(intervalRef);
|
|
163
|
+
}
|
|
164
|
+
this._intervals.clear();
|
|
165
|
+
this.logger?.debug("Stopped.");
|
|
166
|
+
}
|
|
167
|
+
async whenReady(timeoutMs) {
|
|
168
|
+
if (timeoutMs === void 0) {
|
|
169
|
+
await this._readyDeferred.promise;
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
let timer;
|
|
173
|
+
const timeout = new Promise((_, reject) => {
|
|
174
|
+
timer = setTimeout(() => {
|
|
175
|
+
reject(new Error(`Actor ${this.name} did not become ready within ${timeoutMs}ms`));
|
|
176
|
+
}, timeoutMs);
|
|
177
|
+
});
|
|
178
|
+
try {
|
|
179
|
+
await Promise.race([
|
|
180
|
+
this._readyDeferred.promise,
|
|
181
|
+
timeout
|
|
182
|
+
]);
|
|
183
|
+
} finally {
|
|
184
|
+
if (timer) clearTimeout(timer);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Override in subclasses to prove the actor can do useful work.
|
|
189
|
+
* Default: no-op (the actor declares itself ready as soon as `start()` returns).
|
|
190
|
+
*/
|
|
191
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
192
|
+
async readyHandler() {
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
var Actor = class extends ActorV3 {
|
|
196
|
+
static {
|
|
197
|
+
__name(this, "Actor");
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
// src/shared/actor/FinalizerActor.ts
|
|
8
202
|
function _ts_decorate(decorators, target, key, desc) {
|
|
9
203
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
10
204
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -16,6 +210,17 @@ var FinalizerActor = class extends ActorV3 {
|
|
|
16
210
|
static {
|
|
17
211
|
__name(this, "FinalizerActor");
|
|
18
212
|
}
|
|
213
|
+
static needs = {
|
|
214
|
+
required: [
|
|
215
|
+
BlockValidationViewerMoniker,
|
|
216
|
+
BlockViewerMoniker,
|
|
217
|
+
FinalizationRunnerMoniker,
|
|
218
|
+
MempoolViewerMoniker
|
|
219
|
+
],
|
|
220
|
+
optional: [
|
|
221
|
+
DeadLetterQueueRunnerMoniker
|
|
222
|
+
]
|
|
223
|
+
};
|
|
19
224
|
_blockValidationViewer;
|
|
20
225
|
_blockViewer;
|
|
21
226
|
_deadLetterQueueRunner;
|
|
@@ -49,25 +254,32 @@ var FinalizerActor = class extends ActorV3 {
|
|
|
49
254
|
}
|
|
50
255
|
async startHandler() {
|
|
51
256
|
await super.startHandler();
|
|
257
|
+
const interval = this.params.config.finalizationCheckInterval ?? 500;
|
|
52
258
|
this.registerTimer("FinalizerActor", async () => {
|
|
53
|
-
await this.
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
259
|
+
await this.runFinalizationPass();
|
|
260
|
+
}, 2e3, interval);
|
|
261
|
+
}
|
|
262
|
+
async readyHandler() {
|
|
263
|
+
await this.runFinalizationPass();
|
|
264
|
+
}
|
|
265
|
+
async runFinalizationPass() {
|
|
266
|
+
await this.spanAsync("processPendingBlocks", async () => {
|
|
267
|
+
this.logger?.debug("FinalizerActor: Processing pending blocks...");
|
|
268
|
+
await processPendingBlocks({
|
|
269
|
+
blockValidationViewer: this.blockValidationViewer,
|
|
270
|
+
context: this.context,
|
|
271
|
+
logger: this.logger,
|
|
272
|
+
mempoolViewer: this.mempoolViewer,
|
|
273
|
+
blockViewer: this.blockViewer,
|
|
274
|
+
finalizationRunner: this.finalizationRunner,
|
|
275
|
+
allowedProducers: this.allowedProducers,
|
|
276
|
+
minCandidates: this.minCandidates,
|
|
277
|
+
deadLetterQueueRunner: this._deadLetterQueueRunner
|
|
69
278
|
});
|
|
70
|
-
},
|
|
279
|
+
}, {
|
|
280
|
+
...this.context,
|
|
281
|
+
timeBudgetLimit: 1500
|
|
282
|
+
});
|
|
71
283
|
}
|
|
72
284
|
};
|
|
73
285
|
FinalizerActor = _ts_decorate([
|
|
@@ -96,12 +308,12 @@ __name(buildTelemetryConfig, "buildTelemetryConfig");
|
|
|
96
308
|
// src/shared/config/actors/Api.ts
|
|
97
309
|
import { zodAsFactory, zodIsFactory, zodToFactory } from "@xylabs/sdk-js";
|
|
98
310
|
import { BaseConfigContextZod, HostActorConfigZod } from "@xyo-network/xl1-sdk";
|
|
99
|
-
import { globalRegistry, z } from "zod";
|
|
100
|
-
var ApiConfigZod = HostActorConfigZod.extend(
|
|
101
|
-
initRewardsCache:
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
311
|
+
import { globalRegistry, z as z2 } from "zod";
|
|
312
|
+
var ApiConfigZod = HostActorConfigZod.extend(z2.object({
|
|
313
|
+
initRewardsCache: z2.union([
|
|
314
|
+
z2.number(),
|
|
315
|
+
z2.string(),
|
|
316
|
+
z2.boolean()
|
|
105
317
|
]).transform((v) => v !== "0" && v !== "false" && v !== false && v != 0).default(true).register(globalRegistry, {
|
|
106
318
|
description: "Whether to initialize the rewards cache on startup",
|
|
107
319
|
title: "api.initRewardsCache",
|
|
@@ -121,7 +333,7 @@ var toApiConfigContext = zodToFactory(ApiConfigContext, "toApiConfigContext");
|
|
|
121
333
|
// src/shared/config/actors/Bridge.ts
|
|
122
334
|
import { AddressZod, HexZod, toAddress, toHex, zodAsFactory as zodAsFactory2, zodIsFactory as zodIsFactory2, zodToFactory as zodToFactory2 } from "@xylabs/sdk-js";
|
|
123
335
|
import { AttoXL1ConvertFactor, BaseConfigContextZod as BaseConfigContextZod2, HostActorConfigZod as HostActorConfigZod2, XL1 } from "@xyo-network/xl1-sdk";
|
|
124
|
-
import { globalRegistry as globalRegistry2, z as
|
|
336
|
+
import { globalRegistry as globalRegistry2, z as z3 } from "zod";
|
|
125
337
|
var DEFAULT_FIXED_FEE = toHex(XL1(1000n) * AttoXL1ConvertFactor.xl1);
|
|
126
338
|
var DEFAULT_VARIABLE_FEE_BASIS_POINTS = 300;
|
|
127
339
|
var DEFAULT_HARDHAT_BRIDGE_CONTRACT = toAddress("2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6");
|
|
@@ -130,7 +342,7 @@ var DEFAULT_HARDHAT_REMOTE_CHAIN_WALLET_PRIVATE_KEY = toHex("0xac0974bec39a17e36
|
|
|
130
342
|
var DEFAULT_HARDHAT_TOKEN_CONTRACT = toAddress("5FbDB2315678afecb367f032d93F642f64180aa3");
|
|
131
343
|
var DEFAULT_MAX_BRIDGE_AMOUNT = toHex(XL1(1000000n) * AttoXL1ConvertFactor.xl1);
|
|
132
344
|
var DEFAULT_MIN_BRIDGE_AMOUNT = toHex(XL1(1500n) * AttoXL1ConvertFactor.xl1);
|
|
133
|
-
var BasisPointsZod =
|
|
345
|
+
var BasisPointsZod = z3.coerce.number().int().nonnegative().max(1e4);
|
|
134
346
|
var BridgeConfigZod = HostActorConfigZod2.extend({
|
|
135
347
|
escrowAddress: AddressZod.optional().register(globalRegistry2, {
|
|
136
348
|
description: "Address to which bridge escrow will be sent",
|
|
@@ -166,13 +378,13 @@ var BridgeConfigZod = HostActorConfigZod2.extend({
|
|
|
166
378
|
title: "bridge.minBridgeAmount",
|
|
167
379
|
type: "string"
|
|
168
380
|
}),
|
|
169
|
-
redisHost:
|
|
381
|
+
redisHost: z3.string().default("localhost").register(globalRegistry2, {
|
|
170
382
|
default: "localhost",
|
|
171
383
|
description: "Host for the Bridge Redis instance",
|
|
172
384
|
title: "bridge.redisHost",
|
|
173
385
|
type: "string"
|
|
174
386
|
}),
|
|
175
|
-
redisPort:
|
|
387
|
+
redisPort: z3.coerce.number().int().positive().default(6379).register(globalRegistry2, {
|
|
176
388
|
default: 6379,
|
|
177
389
|
description: "Port for the Bridge Redis instance",
|
|
178
390
|
title: "bridge.redisPort",
|
|
@@ -237,10 +449,14 @@ var toBridgeConfigContext = zodToFactory2(BridgeConfigContext, "toBridgeConfigCo
|
|
|
237
449
|
// src/shared/config/actors/Finalizer.ts
|
|
238
450
|
import { AddressZod as AddressZod2, zodAsFactory as zodAsFactory3, zodIsFactory as zodIsFactory3, zodToFactory as zodToFactory3 } from "@xylabs/sdk-js";
|
|
239
451
|
import { BaseConfigContextZod as BaseConfigContextZod3, DEFAULT_MIN_CANDIDATES, HostActorConfigZod as HostActorConfigZod3 } from "@xyo-network/xl1-sdk";
|
|
240
|
-
import { z as
|
|
452
|
+
import { z as z4 } from "zod";
|
|
241
453
|
var FinalizerConfigZod = HostActorConfigZod3.extend({
|
|
242
|
-
allowedProducers:
|
|
243
|
-
|
|
454
|
+
allowedProducers: z4.array(AddressZod2).optional(),
|
|
455
|
+
// Period (ms) between finalizer ticks. Default matches the historical
|
|
456
|
+
// hardcoded value in FinalizerActor; tests can lower it to drive faster
|
|
457
|
+
// block finalization.
|
|
458
|
+
finalizationCheckInterval: z4.coerce.number().default(500),
|
|
459
|
+
minCandidates: z4.number().int().min(0).default(DEFAULT_MIN_CANDIDATES)
|
|
244
460
|
});
|
|
245
461
|
var isFinalizerConfig = zodIsFactory3(FinalizerConfigZod);
|
|
246
462
|
var asFinalizerConfig = zodAsFactory3(FinalizerConfigZod, "asFinalizerConfig");
|
|
@@ -255,13 +471,13 @@ var toFinalizerConfigContext = zodToFactory3(FinalizerConfigContext, "toFinalize
|
|
|
255
471
|
// src/shared/config/actors/Mempool.ts
|
|
256
472
|
import { zodAsFactory as zodAsFactory4, zodIsFactory as zodIsFactory4, zodToFactory as zodToFactory4 } from "@xylabs/sdk-js";
|
|
257
473
|
import { BaseConfigContextZod as BaseConfigContextZod4, HostActorConfigZod as HostActorConfigZod4 } from "@xyo-network/xl1-sdk";
|
|
258
|
-
import { globalRegistry as globalRegistry3, z as
|
|
474
|
+
import { globalRegistry as globalRegistry3, z as z5 } from "zod";
|
|
259
475
|
var DEFAULT_MEMPOOL_BLOCK_PRUNE_INTERVAL = 1e3;
|
|
260
476
|
var DEFAULT_MEMPOOL_TRANSACTION_PRUNE_INTERVAL = 1e3;
|
|
261
477
|
var MempoolConfigZod = HostActorConfigZod4.extend({
|
|
262
|
-
enabled:
|
|
263
|
-
|
|
264
|
-
|
|
478
|
+
enabled: z5.union([
|
|
479
|
+
z5.string(),
|
|
480
|
+
z5.boolean()
|
|
265
481
|
]).default("false").transform((val, ctx) => {
|
|
266
482
|
if (typeof val === "boolean") return val;
|
|
267
483
|
const normalized = val.toLowerCase().trim();
|
|
@@ -282,19 +498,19 @@ var MempoolConfigZod = HostActorConfigZod4.extend({
|
|
|
282
498
|
expected: "boolean",
|
|
283
499
|
message: `Invalid boolean value: "${val}". Use true/false, 1/0, yes/no.`
|
|
284
500
|
});
|
|
285
|
-
return
|
|
501
|
+
return z5.NEVER;
|
|
286
502
|
}).register(globalRegistry3, {
|
|
287
503
|
default: "false",
|
|
288
504
|
description: "Enable the Mempool",
|
|
289
505
|
title: "mempool.enabled",
|
|
290
506
|
type: "boolean"
|
|
291
507
|
}),
|
|
292
|
-
blockPruneInterval:
|
|
508
|
+
blockPruneInterval: z5.coerce.number().default(DEFAULT_MEMPOOL_BLOCK_PRUNE_INTERVAL).register(globalRegistry3, {
|
|
293
509
|
description: "The interval time (in milliseconds) between pending block prune attempts",
|
|
294
510
|
title: "mempool.blockPruneInterval",
|
|
295
511
|
type: "number"
|
|
296
512
|
}),
|
|
297
|
-
transactionPruneInterval:
|
|
513
|
+
transactionPruneInterval: z5.coerce.number().default(DEFAULT_MEMPOOL_TRANSACTION_PRUNE_INTERVAL).register(globalRegistry3, {
|
|
298
514
|
description: "The interval time (in milliseconds) between pending transaction prune attempts",
|
|
299
515
|
title: "mempool.transactionPruneInterval",
|
|
300
516
|
type: "number"
|
|
@@ -311,44 +527,39 @@ var asMempoolConfigContext = zodAsFactory4(MempoolConfigContext, "asMempoolConfi
|
|
|
311
527
|
var toMempoolConfigContext = zodToFactory4(MempoolConfigContext, "toMempoolConfigContext");
|
|
312
528
|
|
|
313
529
|
// src/shared/config/actors/Producer.ts
|
|
314
|
-
import { AddressZod as AddressZod3,
|
|
530
|
+
import { AddressZod as AddressZod3, zodAsFactory as zodAsFactory5, zodIsFactory as zodIsFactory5, zodToFactory as zodToFactory5 } from "@xylabs/sdk-js";
|
|
315
531
|
import { ActorConfigZod, BaseConfigContextZod as BaseConfigContextZod5 } from "@xyo-network/xl1-sdk";
|
|
316
|
-
import { globalRegistry as globalRegistry4, z as
|
|
532
|
+
import { globalRegistry as globalRegistry4, z as z6 } from "zod";
|
|
317
533
|
var DEFAULT_BLOCK_PRODUCTION_CHECK_INTERVAL = 1e4;
|
|
318
|
-
var ProducerConfigZod = ActorConfigZod.extend(
|
|
319
|
-
allowlist:
|
|
320
|
-
if (typeof val === "string") {
|
|
321
|
-
return val.split(",").map((s) => asAddress(s.trim()));
|
|
322
|
-
}
|
|
323
|
-
return val;
|
|
324
|
-
}, z5.array(AddressZod3).optional().register(globalRegistry4, {
|
|
534
|
+
var ProducerConfigZod = ActorConfigZod.extend(z6.object({
|
|
535
|
+
allowlist: z6.array(AddressZod3).optional().register(globalRegistry4, {
|
|
325
536
|
description: "List of allowed producer addresses, if undefined anyone can participate",
|
|
326
537
|
title: "allowlist",
|
|
327
538
|
type: "array"
|
|
328
|
-
})
|
|
329
|
-
blockProductionCheckInterval:
|
|
539
|
+
}),
|
|
540
|
+
blockProductionCheckInterval: z6.coerce.number().default(DEFAULT_BLOCK_PRODUCTION_CHECK_INTERVAL).register(globalRegistry4, {
|
|
330
541
|
description: "The interval time (in milliseconds) between block production attempts",
|
|
331
542
|
title: "producer.blockProductionCheckInterval",
|
|
332
543
|
type: "number"
|
|
333
544
|
}),
|
|
334
|
-
disableIntentRedeclaration:
|
|
545
|
+
disableIntentRedeclaration: z6.boolean().optional().register(globalRegistry4, {
|
|
335
546
|
description: "Should the producer skip redeclaring their intent to continue producing blocks",
|
|
336
547
|
title: "producer.disableIntentRedeclaration",
|
|
337
548
|
type: "boolean"
|
|
338
549
|
}),
|
|
339
|
-
heartbeatInterval:
|
|
550
|
+
heartbeatInterval: z6.coerce.number().default(36e5).register(globalRegistry4, {
|
|
340
551
|
description: "The number of milliseconds between heartbeats if no blocks are produced",
|
|
341
552
|
title: "producer.heartbeatInterval",
|
|
342
553
|
type: "number"
|
|
343
554
|
}),
|
|
344
555
|
// TODO: BigInt schema
|
|
345
|
-
minStake:
|
|
556
|
+
minStake: z6.coerce.number().default(1).register(globalRegistry4, {
|
|
346
557
|
description: "Minimum stake required to be a Producer",
|
|
347
558
|
title: "producer.minStake",
|
|
348
559
|
type: "number"
|
|
349
560
|
}),
|
|
350
561
|
// TODO: Address schema
|
|
351
|
-
rewardAddress:
|
|
562
|
+
rewardAddress: z6.string().optional().register(globalRegistry4, {
|
|
352
563
|
description: "Address to receive block rewards",
|
|
353
564
|
title: "producer.rewardAddress",
|
|
354
565
|
type: "string"
|
|
@@ -765,7 +976,7 @@ async function initActorAccount({ config, logger }) {
|
|
|
765
976
|
__name(initActorAccount, "initActorAccount");
|
|
766
977
|
|
|
767
978
|
// src/shared/init/initActorSeedPhrase.ts
|
|
768
|
-
import { assertEx, isString } from "@xylabs/sdk-js";
|
|
979
|
+
import { assertEx as assertEx2, isString } from "@xylabs/sdk-js";
|
|
769
980
|
async function initActorSeedPhrase(context, bios) {
|
|
770
981
|
const { logger, config } = context;
|
|
771
982
|
const walletKind = config.name;
|
|
@@ -774,12 +985,12 @@ async function initActorSeedPhrase(context, bios) {
|
|
|
774
985
|
if (isString(report?.root.mnemonic)) return report.root.mnemonic;
|
|
775
986
|
const fallback = getBuiltInDevMnemonic();
|
|
776
987
|
logger?.debug(`[${walletKind}] Falling back to built-in development mnemonic`);
|
|
777
|
-
return
|
|
988
|
+
return assertEx2(fallback, () => "Unable to resolve mnemonic");
|
|
778
989
|
}
|
|
779
990
|
__name(initActorSeedPhrase, "initActorSeedPhrase");
|
|
780
991
|
|
|
781
992
|
// src/shared/init/initBridgedModule.ts
|
|
782
|
-
import { assertEx as
|
|
993
|
+
import { assertEx as assertEx3 } from "@xylabs/sdk-js";
|
|
783
994
|
import { asAttachableArchivistInstance, asAttachableModuleInstance } from "@xyo-network/sdk-js";
|
|
784
995
|
import { Mutex } from "async-mutex";
|
|
785
996
|
var initMutex = new Mutex();
|
|
@@ -788,8 +999,8 @@ async function initBridgedModule({ bridge, moduleName }) {
|
|
|
788
999
|
return await initMutex.runExclusive(async () => {
|
|
789
1000
|
const existing = bridgedModuleDictionary?.[bridge.address]?.[moduleName];
|
|
790
1001
|
if (existing) return existing;
|
|
791
|
-
const mod =
|
|
792
|
-
const moduleInstance =
|
|
1002
|
+
const mod = assertEx3(await bridge.resolve(moduleName), () => `Could not resolve ${moduleName}`);
|
|
1003
|
+
const moduleInstance = assertEx3(asAttachableModuleInstance(mod), () => `Could not convert ${moduleName} to attachable module instance`);
|
|
793
1004
|
let moduleMap = bridgedModuleDictionary[bridge.address];
|
|
794
1005
|
if (moduleMap === void 0) {
|
|
795
1006
|
moduleMap = {};
|
|
@@ -801,7 +1012,7 @@ async function initBridgedModule({ bridge, moduleName }) {
|
|
|
801
1012
|
}
|
|
802
1013
|
__name(initBridgedModule, "initBridgedModule");
|
|
803
1014
|
async function initBridgedArchivistModule({ bridge, moduleName }) {
|
|
804
|
-
return
|
|
1015
|
+
return assertEx3(asAttachableArchivistInstance(await initBridgedModule({
|
|
805
1016
|
bridge,
|
|
806
1017
|
moduleName
|
|
807
1018
|
})), () => `Could not convert ${moduleName} to attachable archivist instance`);
|
|
@@ -836,7 +1047,7 @@ async function initActorWallet(context) {
|
|
|
836
1047
|
__name(initActorWallet, "initActorWallet");
|
|
837
1048
|
|
|
838
1049
|
// src/shared/orchestrator/Orchestrator.ts
|
|
839
|
-
import { AbstractCreatable, creatable as creatable2 } from "@xylabs/sdk-js";
|
|
1050
|
+
import { AbstractCreatable as AbstractCreatable2, creatable as creatable2 } from "@xylabs/sdk-js";
|
|
840
1051
|
function _ts_decorate2(decorators, target, key, desc) {
|
|
841
1052
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
842
1053
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -844,25 +1055,43 @@ function _ts_decorate2(decorators, target, key, desc) {
|
|
|
844
1055
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
845
1056
|
}
|
|
846
1057
|
__name(_ts_decorate2, "_ts_decorate");
|
|
847
|
-
var Orchestrator = class extends
|
|
1058
|
+
var Orchestrator = class extends AbstractCreatable2 {
|
|
848
1059
|
static {
|
|
849
1060
|
__name(this, "Orchestrator");
|
|
850
1061
|
}
|
|
851
1062
|
actors = [];
|
|
852
|
-
keepAliveHandle = null;
|
|
853
1063
|
running = false;
|
|
1064
|
+
shuttingDown = false;
|
|
1065
|
+
get readyState() {
|
|
1066
|
+
if (this.actors.length === 0) return "pending";
|
|
1067
|
+
if (this.actors.some((a) => isLocalActor(a) && a.readyState === "failed")) return "failed";
|
|
1068
|
+
if (this.actors.every((a) => isLocalActor(a) && a.readyState === "ready")) return "ready";
|
|
1069
|
+
return "pending";
|
|
1070
|
+
}
|
|
1071
|
+
isReady() {
|
|
1072
|
+
return this.readyState === "ready" && !this.shuttingDown;
|
|
1073
|
+
}
|
|
1074
|
+
isShuttingDown() {
|
|
1075
|
+
return this.shuttingDown;
|
|
1076
|
+
}
|
|
854
1077
|
/**
|
|
855
1078
|
* Registers an actor.
|
|
856
1079
|
* (We won't activate the actor until `start()` is called.)
|
|
857
1080
|
*/
|
|
858
1081
|
async registerActor(actor) {
|
|
1082
|
+
this.actors.push(actor);
|
|
859
1083
|
if (this.running) {
|
|
860
1084
|
await actor.start();
|
|
1085
|
+
if (isLocalActor(actor)) {
|
|
1086
|
+
actor.runReadyHandler().catch((err) => {
|
|
1087
|
+
this.logger?.error(`[Orchestrator] Actor [${actor.name}] readyHandler failed: ${formatError(err)}`);
|
|
1088
|
+
});
|
|
1089
|
+
}
|
|
861
1090
|
}
|
|
862
|
-
this.actors.push(actor);
|
|
863
1091
|
}
|
|
864
1092
|
/**
|
|
865
|
-
* Starts the orchestrator: activates all actors.
|
|
1093
|
+
* Starts the orchestrator: activates all actors in parallel and kicks off their warm-pass.
|
|
1094
|
+
* `whenReady()` resolves once every actor's `readyHandler` has succeeded.
|
|
866
1095
|
*/
|
|
867
1096
|
async startHandler() {
|
|
868
1097
|
await super.startHandler();
|
|
@@ -870,13 +1099,26 @@ var Orchestrator = class extends AbstractCreatable {
|
|
|
870
1099
|
this.logger?.warn("[Orchestrator] Already started.");
|
|
871
1100
|
return;
|
|
872
1101
|
}
|
|
873
|
-
this.logger?.log(
|
|
1102
|
+
this.logger?.log(`[Orchestrator] Starting ${this.actors.length} actor(s) in parallel...`);
|
|
874
1103
|
this.running = true;
|
|
1104
|
+
const startResults = await Promise.allSettled(this.actors.map((a) => a.start()));
|
|
1105
|
+
const startFailures = startResults.flatMap((r, i) => r.status === "rejected" ? [
|
|
1106
|
+
{
|
|
1107
|
+
actor: this.actors[i],
|
|
1108
|
+
reason: r.reason
|
|
1109
|
+
}
|
|
1110
|
+
] : []);
|
|
1111
|
+
if (startFailures.length > 0) {
|
|
1112
|
+
for (const f of startFailures) this.logger?.error(`[Orchestrator] Actor [${f.actor?.name ?? "?"}] failed to start: ${formatError(f.reason)}`);
|
|
1113
|
+
throw new Error(`[Orchestrator] ${startFailures.length} actor(s) failed to start`);
|
|
1114
|
+
}
|
|
875
1115
|
for (const actor of this.actors) {
|
|
876
|
-
|
|
1116
|
+
if (isLocalActor(actor)) {
|
|
1117
|
+
actor.runReadyHandler().catch((err) => {
|
|
1118
|
+
this.logger?.error(`[Orchestrator] Actor [${actor.name}] readyHandler failed: ${formatError(err)}`);
|
|
1119
|
+
});
|
|
1120
|
+
}
|
|
877
1121
|
}
|
|
878
|
-
this.keepAliveHandle = setInterval(() => {
|
|
879
|
-
}, 2147483647);
|
|
880
1122
|
}
|
|
881
1123
|
/**
|
|
882
1124
|
* Stops the orchestrator: deactivates all actors.
|
|
@@ -888,20 +1130,55 @@ var Orchestrator = class extends AbstractCreatable {
|
|
|
888
1130
|
return;
|
|
889
1131
|
}
|
|
890
1132
|
this.logger?.log("[Orchestrator] Stopping...");
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
}
|
|
1133
|
+
this.shuttingDown = true;
|
|
1134
|
+
await Promise.allSettled(this.actors.map((a) => a.stop()));
|
|
894
1135
|
this.running = false;
|
|
895
|
-
|
|
896
|
-
this.logger?.log("[Orchestrator] Stopped
|
|
1136
|
+
this.shuttingDown = false;
|
|
1137
|
+
this.logger?.log("[Orchestrator] Stopped.");
|
|
1138
|
+
}
|
|
1139
|
+
/**
|
|
1140
|
+
* Resolves once every actor reports ready. Rejects if any actor's `readyHandler` throws,
|
|
1141
|
+
* or after `timeoutMs` if provided.
|
|
1142
|
+
*/
|
|
1143
|
+
async whenReady(timeoutMs) {
|
|
1144
|
+
const localActors = this.actors.filter(isLocalActor);
|
|
1145
|
+
if (localActors.length === 0) return;
|
|
1146
|
+
if (timeoutMs === void 0) {
|
|
1147
|
+
await Promise.all(localActors.map((a) => a.whenReady()));
|
|
1148
|
+
return;
|
|
1149
|
+
}
|
|
1150
|
+
let timer;
|
|
1151
|
+
const timeout = new Promise((_, reject) => {
|
|
1152
|
+
timer = setTimeout(() => {
|
|
1153
|
+
reject(new Error(`[Orchestrator] Not ready within ${timeoutMs}ms`));
|
|
1154
|
+
}, timeoutMs);
|
|
1155
|
+
});
|
|
1156
|
+
try {
|
|
1157
|
+
await Promise.race([
|
|
1158
|
+
Promise.all(localActors.map((a) => a.whenReady())),
|
|
1159
|
+
timeout
|
|
1160
|
+
]);
|
|
1161
|
+
} finally {
|
|
1162
|
+
if (timer) clearTimeout(timer);
|
|
1163
|
+
}
|
|
897
1164
|
}
|
|
898
1165
|
};
|
|
899
1166
|
Orchestrator = _ts_decorate2([
|
|
900
1167
|
creatable2()
|
|
901
1168
|
], Orchestrator);
|
|
1169
|
+
function isLocalActor(actor) {
|
|
1170
|
+
return actor instanceof ActorV3;
|
|
1171
|
+
}
|
|
1172
|
+
__name(isLocalActor, "isLocalActor");
|
|
1173
|
+
function formatError(err) {
|
|
1174
|
+
if (err instanceof Error) return `${err.message}${err.stack ? `
|
|
1175
|
+
${err.stack}` : ""}`;
|
|
1176
|
+
return String(err);
|
|
1177
|
+
}
|
|
1178
|
+
__name(formatError, "formatError");
|
|
902
1179
|
|
|
903
1180
|
// src/shared/provider/SimpleRejectedTransactionsArchivistProvider.ts
|
|
904
|
-
import { assertEx as
|
|
1181
|
+
import { assertEx as assertEx4 } from "@xylabs/sdk-js";
|
|
905
1182
|
import { AbstractCreatableProvider, creatableProvider } from "@xyo-network/xl1-sdk";
|
|
906
1183
|
function _ts_decorate3(decorators, target, key, desc) {
|
|
907
1184
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
@@ -927,7 +1204,7 @@ var SimpleRejectedTransactionsArchivistProvider = class _SimpleRejectedTransacti
|
|
|
927
1204
|
static async paramsHandler(params) {
|
|
928
1205
|
return {
|
|
929
1206
|
...await super.paramsHandler(params),
|
|
930
|
-
archivist:
|
|
1207
|
+
archivist: assertEx4(params?.archivist, () => "archivist is required")
|
|
931
1208
|
};
|
|
932
1209
|
}
|
|
933
1210
|
};
|
|
@@ -954,18 +1231,21 @@ function basicRemoteViewerLocator(name, remoteConfig, dataLakeEndpoint, validato
|
|
|
954
1231
|
__name(basicRemoteViewerLocator, "basicRemoteViewerLocator");
|
|
955
1232
|
|
|
956
1233
|
// src/neutral/config/locators/rootLocatorFromConfig.ts
|
|
957
|
-
import { assertEx as
|
|
1234
|
+
import { assertEx as assertEx5 } from "@xylabs/sdk-js";
|
|
958
1235
|
import { commonLocatorFromConfig, remoteLocatorFromConfig } from "@xyo-network/xl1-sdk";
|
|
959
1236
|
async function rootLocatorFromConfig(context, validateDepsOnRegister = false) {
|
|
960
1237
|
const { config } = context;
|
|
961
1238
|
await commonLocatorFromConfig(context, validateDepsOnRegister);
|
|
962
|
-
const locator =
|
|
1239
|
+
const locator = assertEx5(await (config.remote.rpc ? remoteLocatorFromConfig(context, validateDepsOnRegister) : void 0), () => "Root locator could not be created from config. No supported configuration found.");
|
|
963
1240
|
locator.freeze();
|
|
964
1241
|
return locator;
|
|
965
1242
|
}
|
|
966
1243
|
__name(rootLocatorFromConfig, "rootLocatorFromConfig");
|
|
967
1244
|
export {
|
|
1245
|
+
Actor,
|
|
968
1246
|
ActorMnemonicNotAllowedError,
|
|
1247
|
+
ActorParamsV3Zod,
|
|
1248
|
+
ActorV3,
|
|
969
1249
|
ApiConfigContext,
|
|
970
1250
|
ApiConfigZod,
|
|
971
1251
|
BUILT_IN_DEV_MNEMONIC,
|