@bsv/wallet-toolbox-mobile 2.3.2 → 2.4.0
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/out/src/WalletPermissionsManager.d.ts +19 -0
- package/out/src/WalletPermissionsManager.d.ts.map +1 -1
- package/out/src/WalletPermissionsManager.js +55 -0
- package/out/src/WalletPermissionsManager.js.map +1 -1
- package/out/src/monitor/Monitor.d.ts +3 -4
- package/out/src/monitor/Monitor.d.ts.map +1 -1
- package/out/src/monitor/Monitor.js +1 -1
- package/out/src/monitor/Monitor.js.map +1 -1
- package/out/src/monitor/tasks/TaskArcSSE.d.ts +5 -3
- package/out/src/monitor/tasks/TaskArcSSE.d.ts.map +1 -1
- package/out/src/monitor/tasks/TaskArcSSE.js +42 -55
- package/out/src/monitor/tasks/TaskArcSSE.js.map +1 -1
- package/out/src/sdk/WalletServices.interfaces.d.ts +23 -1
- package/out/src/sdk/WalletServices.interfaces.d.ts.map +1 -1
- package/out/src/services/Services.d.ts +3 -0
- package/out/src/services/Services.d.ts.map +1 -1
- package/out/src/services/Services.js +20 -1
- package/out/src/services/Services.js.map +1 -1
- package/out/src/services/chaintracker/ChaintracksChainTracker.d.ts +1 -0
- package/out/src/services/chaintracker/ChaintracksChainTracker.d.ts.map +1 -1
- package/out/src/services/chaintracker/ChaintracksChainTracker.js +9 -6
- package/out/src/services/chaintracker/ChaintracksChainTracker.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Chaintracks.d.ts +2 -0
- package/out/src/services/chaintracker/chaintracks/Chaintracks.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Chaintracks.js +29 -1
- package/out/src/services/chaintracker/chaintracks/Chaintracks.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/GoChaintracksServiceClient.d.ts +52 -0
- package/out/src/services/chaintracker/chaintracks/GoChaintracksServiceClient.d.ts.map +1 -0
- package/out/src/services/chaintracker/chaintracks/GoChaintracksServiceClient.js +228 -0
- package/out/src/services/chaintracker/chaintracks/GoChaintracksServiceClient.js.map +1 -0
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorChaintracksSSE.d.ts +24 -0
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorChaintracksSSE.d.ts.map +1 -0
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorChaintracksSSE.js +55 -0
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorChaintracksSSE.js.map +1 -0
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.d.ts +13 -0
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.js +45 -7
- package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/index.mobile.d.ts +2 -0
- package/out/src/services/chaintracker/chaintracks/index.mobile.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/index.mobile.js +2 -0
- package/out/src/services/chaintracker/chaintracks/index.mobile.js.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.d.ts +8 -0
- package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.d.ts.map +1 -1
- package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.js +53 -10
- package/out/src/services/chaintracker/chaintracks/util/ChaintracksFetch.js.map +1 -1
- package/out/src/services/createDefaultWalletServicesOptions.d.ts +19 -1
- package/out/src/services/createDefaultWalletServicesOptions.d.ts.map +1 -1
- package/out/src/services/createDefaultWalletServicesOptions.js +49 -2
- package/out/src/services/createDefaultWalletServicesOptions.js.map +1 -1
- package/out/src/services/providers/ARC.d.ts +4 -0
- package/out/src/services/providers/ARC.d.ts.map +1 -1
- package/out/src/services/providers/ARC.js +65 -4
- package/out/src/services/providers/ARC.js.map +1 -1
- package/out/src/services/providers/ArcSSEClient.d.ts +1 -0
- package/out/src/services/providers/ArcSSEClient.d.ts.map +1 -1
- package/out/src/services/providers/ArcSSEClient.js +12 -9
- package/out/src/services/providers/ArcSSEClient.js.map +1 -1
- package/out/src/services/providers/Arcade.d.ts +72 -0
- package/out/src/services/providers/Arcade.d.ts.map +1 -0
- package/out/src/services/providers/Arcade.js +299 -0
- package/out/src/services/providers/Arcade.js.map +1 -0
- package/out/src/signer/methods/buildSignableTransaction.d.ts +54 -0
- package/out/src/signer/methods/buildSignableTransaction.d.ts.map +1 -1
- package/out/src/signer/methods/buildSignableTransaction.js +118 -2
- package/out/src/signer/methods/buildSignableTransaction.js.map +1 -1
- package/out/src/storage/methods/processAction.d.ts.map +1 -1
- package/out/src/storage/methods/processAction.js +38 -1
- package/out/src/storage/methods/processAction.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GoChaintracksServiceClient = void 0;
|
|
4
|
+
const utilityHelpers_noBuffer_1 = require("../../../utility/utilityHelpers.noBuffer");
|
|
5
|
+
/**
|
|
6
|
+
* Client for go-chaintracks compatible HTTP services, including Arcade's
|
|
7
|
+
* `/chaintracks/v2` surface. Unlike the legacy ChaintracksServiceClient, this
|
|
8
|
+
* can subscribe to tip/reorg SSE streams and therefore drive Monitor block
|
|
9
|
+
* processing without a local WhatsOnChain polling ingestor.
|
|
10
|
+
*/
|
|
11
|
+
class GoChaintracksServiceClient {
|
|
12
|
+
chain;
|
|
13
|
+
baseUrl;
|
|
14
|
+
fetcher;
|
|
15
|
+
subscriptions = new Map();
|
|
16
|
+
nextSubscriptionId = 1;
|
|
17
|
+
constructor(chain, serviceUrl, options = {}) {
|
|
18
|
+
this.chain = chain;
|
|
19
|
+
let base = serviceUrl;
|
|
20
|
+
while (base.endsWith('/'))
|
|
21
|
+
base = base.slice(0, -1);
|
|
22
|
+
let prefix = options.apiPrefix ?? '';
|
|
23
|
+
if (prefix !== '') {
|
|
24
|
+
if (!prefix.startsWith('/'))
|
|
25
|
+
prefix = `/${prefix}`;
|
|
26
|
+
while (prefix.endsWith('/'))
|
|
27
|
+
prefix = prefix.slice(0, -1);
|
|
28
|
+
}
|
|
29
|
+
this.baseUrl = `${base}${prefix}`;
|
|
30
|
+
this.fetcher = options.fetch ?? fetch;
|
|
31
|
+
}
|
|
32
|
+
async currentHeight() {
|
|
33
|
+
return await this.getPresentHeight();
|
|
34
|
+
}
|
|
35
|
+
async isValidRootForHeight(root, height) {
|
|
36
|
+
const h = await this.findHeaderForHeight(height);
|
|
37
|
+
return h != null && root === (0, utilityHelpers_noBuffer_1.asString)(h.merkleRoot);
|
|
38
|
+
}
|
|
39
|
+
async getChain() {
|
|
40
|
+
try {
|
|
41
|
+
const r = await this.getJson('/network');
|
|
42
|
+
return this.normalizeChain(r.network);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return this.chain;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async getInfo() {
|
|
49
|
+
const tip = await this.findChainTipHeader();
|
|
50
|
+
return {
|
|
51
|
+
chain: await this.getChain(),
|
|
52
|
+
heightBulk: tip.height,
|
|
53
|
+
heightLive: tip.height,
|
|
54
|
+
storage: 'go-chaintracks',
|
|
55
|
+
bulkIngestors: [],
|
|
56
|
+
liveIngestors: ['GoChaintracksServiceClient'],
|
|
57
|
+
packages: []
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
async getPresentHeight() {
|
|
61
|
+
return (await this.getJson('/height')).height;
|
|
62
|
+
}
|
|
63
|
+
async getHeaders(height, count) {
|
|
64
|
+
const bytes = await this.getBinary(`/headers.bin?height=${height}&count=${count}`);
|
|
65
|
+
return Buffer.from(bytes).toString('hex');
|
|
66
|
+
}
|
|
67
|
+
async findChainTipHeader() {
|
|
68
|
+
return await this.getJson('/tip');
|
|
69
|
+
}
|
|
70
|
+
async findChainTipHash() {
|
|
71
|
+
return (await this.findChainTipHeader()).hash;
|
|
72
|
+
}
|
|
73
|
+
async findHeaderForHeight(height) {
|
|
74
|
+
return await this.getJsonOrUndefined(`/header/height/${height}`);
|
|
75
|
+
}
|
|
76
|
+
async findHeaderForBlockHash(hash) {
|
|
77
|
+
return await this.getJsonOrUndefined(`/header/hash/${hash}`);
|
|
78
|
+
}
|
|
79
|
+
async addHeader(_header) {
|
|
80
|
+
throw new Error('GoChaintracksServiceClient.addHeader is not supported by the remote v2 API.');
|
|
81
|
+
}
|
|
82
|
+
async startListening() {
|
|
83
|
+
await this.getPresentHeight();
|
|
84
|
+
}
|
|
85
|
+
async listening() {
|
|
86
|
+
await this.getPresentHeight();
|
|
87
|
+
}
|
|
88
|
+
async isListening() {
|
|
89
|
+
try {
|
|
90
|
+
await this.getPresentHeight();
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async isSynchronized() {
|
|
98
|
+
return await this.isListening();
|
|
99
|
+
}
|
|
100
|
+
async subscribeHeaders(listener) {
|
|
101
|
+
return this.subscribe('header', '/tip/stream', (payload) => {
|
|
102
|
+
listener(payload);
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
async subscribeReorgs(listener) {
|
|
106
|
+
return this.subscribe('reorg', '/reorg/stream', (payload) => {
|
|
107
|
+
const event = payload;
|
|
108
|
+
if (event.oldTip != null && event.newTip != null) {
|
|
109
|
+
listener(event.depth ?? 0, event.oldTip, event.newTip, event.deactivatedHeaders);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
async unsubscribe(subscriptionId) {
|
|
114
|
+
const sub = this.subscriptions.get(subscriptionId);
|
|
115
|
+
if (sub == null)
|
|
116
|
+
return false;
|
|
117
|
+
this.subscriptions.delete(subscriptionId);
|
|
118
|
+
sub.abort.abort();
|
|
119
|
+
await sub.done.catch(() => { });
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
async subscribe(type, path, onPayload) {
|
|
123
|
+
const id = `${type}-${this.nextSubscriptionId++}`;
|
|
124
|
+
const abort = new AbortController();
|
|
125
|
+
const done = this.runSse(path, abort.signal, onPayload);
|
|
126
|
+
this.subscriptions.set(id, { id, type, abort, done });
|
|
127
|
+
done.catch(() => { }).finally(() => {
|
|
128
|
+
const active = this.subscriptions.get(id);
|
|
129
|
+
if (active?.abort === abort)
|
|
130
|
+
this.subscriptions.delete(id);
|
|
131
|
+
});
|
|
132
|
+
return id;
|
|
133
|
+
}
|
|
134
|
+
async runSse(path, signal, onPayload) {
|
|
135
|
+
const response = await this.fetcher(this.url(path), {
|
|
136
|
+
headers: { Accept: 'text/event-stream' },
|
|
137
|
+
signal
|
|
138
|
+
});
|
|
139
|
+
if (!response.ok) {
|
|
140
|
+
throw new Error(`GET ${this.url(path)} failed ${response.status} ${response.statusText}`);
|
|
141
|
+
}
|
|
142
|
+
if (response.body == null) {
|
|
143
|
+
throw new Error(`GET ${this.url(path)} returned no response body`);
|
|
144
|
+
}
|
|
145
|
+
const reader = response.body.getReader();
|
|
146
|
+
const decoder = new TextDecoder();
|
|
147
|
+
let buffer = '';
|
|
148
|
+
try {
|
|
149
|
+
for (;;) {
|
|
150
|
+
const { done, value } = await reader.read();
|
|
151
|
+
if (done)
|
|
152
|
+
break;
|
|
153
|
+
buffer += decoder.decode(value, { stream: true });
|
|
154
|
+
buffer = this.processSseBuffer(buffer, onPayload);
|
|
155
|
+
}
|
|
156
|
+
buffer += decoder.decode();
|
|
157
|
+
this.processSseBuffer(`${buffer}\n\n`, onPayload);
|
|
158
|
+
}
|
|
159
|
+
finally {
|
|
160
|
+
reader.releaseLock();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
processSseBuffer(buffer, onPayload) {
|
|
164
|
+
for (;;) {
|
|
165
|
+
const boundary = buffer.indexOf('\n\n');
|
|
166
|
+
if (boundary < 0)
|
|
167
|
+
return buffer;
|
|
168
|
+
const eventText = buffer.slice(0, boundary);
|
|
169
|
+
buffer = buffer.slice(boundary + 2);
|
|
170
|
+
const data = eventText
|
|
171
|
+
.split(/\r?\n/)
|
|
172
|
+
.filter(line => line.startsWith('data:'))
|
|
173
|
+
.map(line => line.slice(5).trimStart())
|
|
174
|
+
.join('\n');
|
|
175
|
+
if (data === '')
|
|
176
|
+
continue;
|
|
177
|
+
try {
|
|
178
|
+
onPayload(JSON.parse(data));
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
// Ignore malformed events; the next SSE event can still be valid.
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
async getJson(path) {
|
|
186
|
+
const r = await this.getJsonOrUndefined(path);
|
|
187
|
+
if (r === undefined)
|
|
188
|
+
throw new Error(`Value was undefined for ${path}. Requested object may not exist.`);
|
|
189
|
+
return r;
|
|
190
|
+
}
|
|
191
|
+
async getJsonOrUndefined(path) {
|
|
192
|
+
const response = await this.fetcher(this.url(path), { headers: { Accept: 'application/json' } });
|
|
193
|
+
if (response.status === 404)
|
|
194
|
+
return undefined;
|
|
195
|
+
if (!response.ok) {
|
|
196
|
+
throw new Error(`GET ${this.url(path)} failed ${response.status} ${response.statusText}`);
|
|
197
|
+
}
|
|
198
|
+
return await response.json();
|
|
199
|
+
}
|
|
200
|
+
async getBinary(path) {
|
|
201
|
+
const response = await this.fetcher(this.url(path), { headers: { Accept: 'application/octet-stream' } });
|
|
202
|
+
if (!response.ok) {
|
|
203
|
+
throw new Error(`GET ${this.url(path)} failed ${response.status} ${response.statusText}`);
|
|
204
|
+
}
|
|
205
|
+
return new Uint8Array(await response.arrayBuffer());
|
|
206
|
+
}
|
|
207
|
+
url(path) {
|
|
208
|
+
return `${this.baseUrl}${path}`;
|
|
209
|
+
}
|
|
210
|
+
normalizeChain(network) {
|
|
211
|
+
switch (network) {
|
|
212
|
+
case 'main':
|
|
213
|
+
case 'mainnet':
|
|
214
|
+
return 'main';
|
|
215
|
+
case 'test':
|
|
216
|
+
case 'testnet':
|
|
217
|
+
return 'test';
|
|
218
|
+
case 'ttn':
|
|
219
|
+
case 'teratest':
|
|
220
|
+
case 'teratestnet':
|
|
221
|
+
return 'ttn';
|
|
222
|
+
default:
|
|
223
|
+
return this.chain;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
exports.GoChaintracksServiceClient = GoChaintracksServiceClient;
|
|
228
|
+
//# sourceMappingURL=GoChaintracksServiceClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GoChaintracksServiceClient.js","sourceRoot":"","sources":["../../../../../../src/services/chaintracker/chaintracks/GoChaintracksServiceClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Chain } from '../../../../sdk';
|
|
2
|
+
import { ChaintracksClientApi } from '../Api/ChaintracksClientApi';
|
|
3
|
+
import { BlockHeader } from '../Api/BlockHeaderApi';
|
|
4
|
+
import { LiveIngestorBase, LiveIngestorBaseOptions } from './LiveIngestorBase';
|
|
5
|
+
export interface LiveIngestorChaintracksSSEOptions extends LiveIngestorBaseOptions {
|
|
6
|
+
chaintracks: ChaintracksClientApi;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Adapts a remote Chaintracks event stream, such as Arcade/go-chaintracks
|
|
10
|
+
* `/chaintracks/v2/tip/stream`, into the local Chaintracks live-ingestor API.
|
|
11
|
+
*/
|
|
12
|
+
export declare class LiveIngestorChaintracksSSE extends LiveIngestorBase {
|
|
13
|
+
private readonly options;
|
|
14
|
+
static createLiveIngestorChaintracksSSEOptions(chain: Chain, chaintracks: ChaintracksClientApi): LiveIngestorChaintracksSSEOptions;
|
|
15
|
+
private subscriptionId?;
|
|
16
|
+
private stopped;
|
|
17
|
+
private resolveStopped?;
|
|
18
|
+
constructor(options: LiveIngestorChaintracksSSEOptions);
|
|
19
|
+
getHeaderByHash(hash: string): Promise<BlockHeader | undefined>;
|
|
20
|
+
startListening(liveHeaders: BlockHeader[]): Promise<void>;
|
|
21
|
+
stopListening(): void;
|
|
22
|
+
shutdown(): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=LiveIngestorChaintracksSSE.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LiveIngestorChaintracksSSE.d.ts","sourceRoot":"","sources":["../../../../../../../src/services/chaintracker/chaintracks/Ingest/LiveIngestorChaintracksSSE.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAA;AAE9E,MAAM,WAAW,iCAAkC,SAAQ,uBAAuB;IAChF,WAAW,EAAE,oBAAoB,CAAA;CAClC;AAED;;;GAGG;AACH,qBAAa,0BAA2B,SAAQ,gBAAgB;IAejD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAdrC,MAAM,CAAC,uCAAuC,CAC5C,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,oBAAoB,GAChC,iCAAiC;IAOpC,OAAO,CAAC,cAAc,CAAC,CAAQ;IAC/B,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,cAAc,CAAC,CAAY;gBAEL,OAAO,EAAE,iCAAiC;IAIlE,eAAe,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAIhE,cAAc,CAAE,WAAW,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAWhE,aAAa,IAAK,IAAI;IAYP,QAAQ,IAAK,OAAO,CAAC,IAAI,CAAC;CAG1C"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LiveIngestorChaintracksSSE = void 0;
|
|
4
|
+
const LiveIngestorBase_1 = require("./LiveIngestorBase");
|
|
5
|
+
/**
|
|
6
|
+
* Adapts a remote Chaintracks event stream, such as Arcade/go-chaintracks
|
|
7
|
+
* `/chaintracks/v2/tip/stream`, into the local Chaintracks live-ingestor API.
|
|
8
|
+
*/
|
|
9
|
+
class LiveIngestorChaintracksSSE extends LiveIngestorBase_1.LiveIngestorBase {
|
|
10
|
+
options;
|
|
11
|
+
static createLiveIngestorChaintracksSSEOptions(chain, chaintracks) {
|
|
12
|
+
return {
|
|
13
|
+
...LiveIngestorBase_1.LiveIngestorBase.createLiveIngestorBaseOptions(chain),
|
|
14
|
+
chaintracks
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
subscriptionId;
|
|
18
|
+
stopped = false;
|
|
19
|
+
resolveStopped;
|
|
20
|
+
constructor(options) {
|
|
21
|
+
super(options);
|
|
22
|
+
this.options = options;
|
|
23
|
+
}
|
|
24
|
+
async getHeaderByHash(hash) {
|
|
25
|
+
return await this.options.chaintracks.findHeaderForBlockHash(hash);
|
|
26
|
+
}
|
|
27
|
+
async startListening(liveHeaders) {
|
|
28
|
+
this.stopped = false;
|
|
29
|
+
this.subscriptionId = await this.options.chaintracks.subscribeHeaders(header => {
|
|
30
|
+
if (!this.stopped)
|
|
31
|
+
liveHeaders.push(header);
|
|
32
|
+
});
|
|
33
|
+
await new Promise(resolve => {
|
|
34
|
+
this.resolveStopped = resolve;
|
|
35
|
+
if (this.stopped)
|
|
36
|
+
resolve();
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
stopListening() {
|
|
40
|
+
this.stopped = true;
|
|
41
|
+
const subscriptionId = this.subscriptionId;
|
|
42
|
+
this.subscriptionId = undefined;
|
|
43
|
+
if (subscriptionId != null) {
|
|
44
|
+
this.options.chaintracks.unsubscribe(subscriptionId).catch(e => {
|
|
45
|
+
this.log(`LiveIngestorChaintracksSSE unsubscribe failed: ${e}`);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
this.resolveStopped?.();
|
|
49
|
+
}
|
|
50
|
+
async shutdown() {
|
|
51
|
+
this.stopListening();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
exports.LiveIngestorChaintracksSSE = LiveIngestorChaintracksSSE;
|
|
55
|
+
//# sourceMappingURL=LiveIngestorChaintracksSSE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LiveIngestorChaintracksSSE.js","sourceRoot":"","sources":["../../../../../../../src/services/chaintracker/chaintracks/Ingest/LiveIngestorChaintracksSSE.ts"],"names":[],"mappings":";;;AAGA,yDAA8E;AAM9E;;;GAGG;AACH,MAAa,0BAA2B,SAAQ,mCAAgB;IAehC;IAd9B,MAAM,CAAC,uCAAuC,CAC5C,KAAY,EACZ,WAAiC;QAEjC,OAAO;YACL,GAAG,mCAAgB,CAAC,6BAA6B,CAAC,KAAK,CAAC;YACxD,WAAW;SACZ,CAAA;IACH,CAAC;IAEO,cAAc,CAAS;IACvB,OAAO,GAAG,KAAK,CAAA;IACf,cAAc,CAAa;IAEnC,YAA8B,OAA0C;QACtE,KAAK,CAAC,OAAO,CAAC,CAAA;QADc,YAAO,GAAP,OAAO,CAAmC;IAExE,CAAC;IAED,KAAK,CAAC,eAAe,CAAE,IAAY;QACjC,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAA;IACpE,CAAC;IAED,KAAK,CAAC,cAAc,CAAE,WAA0B;QAC9C,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QACpB,IAAI,CAAC,cAAc,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE;YAC7E,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC7C,CAAC,CAAC,CAAA;QACF,MAAM,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;YAChC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAA;YAC7B,IAAI,IAAI,CAAC,OAAO;gBAAE,OAAO,EAAE,CAAA;QAC7B,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,aAAa;QACX,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;QACnB,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAA;QAC1C,IAAI,CAAC,cAAc,GAAG,SAAS,CAAA;QAC/B,IAAI,cAAc,IAAI,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;gBAC7D,IAAI,CAAC,GAAG,CAAC,kDAAkD,CAAC,EAAE,CAAC,CAAA;YACjE,CAAC,CAAC,CAAA;QACJ,CAAC;QACD,IAAI,CAAC,cAAc,EAAE,EAAE,CAAA;IACzB,CAAC;IAEQ,KAAK,CAAC,QAAQ;QACrB,IAAI,CAAC,aAAa,EAAE,CAAA;IACtB,CAAC;CACF;AAjDD,gEAiDC"}
|
|
@@ -33,6 +33,14 @@ export interface LiveIngestorWhatsOnChainOptions extends LiveIngestorBaseOptions
|
|
|
33
33
|
* How long chainInfo is considered still valid before updating (msecs).
|
|
34
34
|
*/
|
|
35
35
|
chainInfoMsecs: number;
|
|
36
|
+
/**
|
|
37
|
+
* Initial delay before retrying a failed polling request.
|
|
38
|
+
*/
|
|
39
|
+
retryWait?: number;
|
|
40
|
+
/**
|
|
41
|
+
* Maximum delay before retrying repeated failed polling requests.
|
|
42
|
+
*/
|
|
43
|
+
retryWaitMax?: number;
|
|
36
44
|
}
|
|
37
45
|
/**
|
|
38
46
|
* Reports new headers by polling periodically.
|
|
@@ -40,11 +48,16 @@ export interface LiveIngestorWhatsOnChainOptions extends LiveIngestorBaseOptions
|
|
|
40
48
|
export declare class LiveIngestorWhatsOnChainPoll extends LiveIngestorBase {
|
|
41
49
|
static createLiveIngestorWhatsOnChainOptions(chain: Chain): LiveIngestorWhatsOnChainOptions;
|
|
42
50
|
idleWait: number;
|
|
51
|
+
retryWait: number;
|
|
52
|
+
retryWaitMax: number;
|
|
43
53
|
woc: WhatsOnChainServices;
|
|
44
54
|
done: boolean;
|
|
45
55
|
constructor(options: LiveIngestorWhatsOnChainOptions);
|
|
46
56
|
getHeaderByHash(hash: string): Promise<BlockHeader | undefined>;
|
|
47
57
|
startListening(liveHeaders: BlockHeader[]): Promise<void>;
|
|
58
|
+
private getRetryWaitMsecs;
|
|
59
|
+
private errorMessage;
|
|
60
|
+
private waitUnlessStopped;
|
|
48
61
|
stopListening(): void;
|
|
49
62
|
shutdown(): Promise<void>;
|
|
50
63
|
}
|
package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LiveIngestorWhatsOnChainPoll.d.ts","sourceRoot":"","sources":["../../../../../../../src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAEpD,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAA;AAC9E,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAG5B,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"LiveIngestorWhatsOnChainPoll.d.ts","sourceRoot":"","sources":["../../../../../../../src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAEpD,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAA;AAC9E,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAG5B,MAAM,wBAAwB,CAAA;AAG/B,MAAM,WAAW,+BAAgC,SAAQ,uBAAuB,EAAE,2BAA2B;IAC3G;;OAEG;IACH,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;IAC5B;;OAEG;IACH,KAAK,EAAE,KAAK,CAAA;IACZ;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IACjB;;OAEG;IACH,WAAW,EAAE,OAAO,CAAA;IACpB;;OAEG;IACH,cAAc,EAAE,MAAM,CAAA;IACtB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;GAEG;AACH,qBAAa,4BAA6B,SAAQ,gBAAgB;IAChE,MAAM,CAAC,qCAAqC,CAAE,KAAK,EAAE,KAAK,GAAG,+BAA+B;IAW5F,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,GAAG,EAAE,oBAAoB,CAAA;IACzB,IAAI,EAAE,OAAO,CAAQ;gBAER,OAAO,EAAE,+BAA+B;IAQ/C,eAAe,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAKhE,cAAc,CAAE,WAAW,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgChE,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,YAAY;YAMN,iBAAiB;IAS/B,aAAa,IAAK,IAAI;IAIP,QAAQ,IAAK,OAAO,CAAC,IAAI,CAAC;CAG1C"}
|
|
@@ -4,6 +4,7 @@ exports.LiveIngestorWhatsOnChainPoll = void 0;
|
|
|
4
4
|
const utilityHelpers_1 = require("../../../../utility/utilityHelpers");
|
|
5
5
|
const LiveIngestorBase_1 = require("./LiveIngestorBase");
|
|
6
6
|
const WhatsOnChainServices_1 = require("./WhatsOnChainServices");
|
|
7
|
+
const ChaintracksFetch_1 = require("../util/ChaintracksFetch");
|
|
7
8
|
/**
|
|
8
9
|
* Reports new headers by polling periodically.
|
|
9
10
|
*/
|
|
@@ -12,16 +13,22 @@ class LiveIngestorWhatsOnChainPoll extends LiveIngestorBase_1.LiveIngestorBase {
|
|
|
12
13
|
const options = {
|
|
13
14
|
...WhatsOnChainServices_1.WhatsOnChainServices.createWhatsOnChainServicesOptions(chain),
|
|
14
15
|
...LiveIngestorBase_1.LiveIngestorBase.createLiveIngestorBaseOptions(chain),
|
|
15
|
-
idleWait: 100000
|
|
16
|
+
idleWait: 100000,
|
|
17
|
+
retryWait: 5000,
|
|
18
|
+
retryWaitMax: 120000
|
|
16
19
|
};
|
|
17
20
|
return options;
|
|
18
21
|
}
|
|
19
22
|
idleWait;
|
|
23
|
+
retryWait;
|
|
24
|
+
retryWaitMax;
|
|
20
25
|
woc;
|
|
21
26
|
done = false;
|
|
22
27
|
constructor(options) {
|
|
23
28
|
super(options);
|
|
24
|
-
this.idleWait = options.idleWait
|
|
29
|
+
this.idleWait = options.idleWait ?? 100000;
|
|
30
|
+
this.retryWait = options.retryWait ?? 5000;
|
|
31
|
+
this.retryWaitMax = options.retryWaitMax ?? 120000;
|
|
25
32
|
this.woc = new WhatsOnChainServices_1.WhatsOnChainServices(options);
|
|
26
33
|
}
|
|
27
34
|
async getHeaderByHash(hash) {
|
|
@@ -31,21 +38,52 @@ class LiveIngestorWhatsOnChainPoll extends LiveIngestorBase_1.LiveIngestorBase {
|
|
|
31
38
|
async startListening(liveHeaders) {
|
|
32
39
|
this.done = false;
|
|
33
40
|
let lastHeaders = [];
|
|
41
|
+
let failureCount = 0;
|
|
34
42
|
while (!this.done) {
|
|
35
|
-
|
|
43
|
+
let headers;
|
|
44
|
+
try {
|
|
45
|
+
headers = await this.woc.getHeaders();
|
|
46
|
+
failureCount = 0;
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
failureCount++;
|
|
50
|
+
const retryMsecs = this.getRetryWaitMsecs(error, failureCount);
|
|
51
|
+
this.log(`LiveIngestorWhatsOnChainPoll getHeaders failed attempt=${failureCount} retryMsecs=${retryMsecs} error=${this.errorMessage(error)}`);
|
|
52
|
+
await this.waitUnlessStopped(retryMsecs);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
36
55
|
const newHeaders = headers.filter(h => !lastHeaders.some(lh => lh.hash === h.hash));
|
|
37
56
|
for (const h of newHeaders) {
|
|
38
57
|
const bh = (0, WhatsOnChainServices_1.wocGetHeadersHeaderToBlockHeader)(h);
|
|
39
58
|
liveHeaders.unshift(bh);
|
|
40
59
|
}
|
|
41
60
|
lastHeaders = headers;
|
|
42
|
-
|
|
43
|
-
// Only wait a second at a time so we notice `done` sooner...
|
|
44
|
-
await (0, utilityHelpers_1.wait)(1000);
|
|
45
|
-
}
|
|
61
|
+
await this.waitUnlessStopped(60 * 1000);
|
|
46
62
|
}
|
|
47
63
|
this.log('LiveIngestorWhatsOnChainPoll stopped');
|
|
48
64
|
}
|
|
65
|
+
getRetryWaitMsecs(error, failureCount) {
|
|
66
|
+
if (error instanceof ChaintracksFetch_1.ChaintracksFetchError && error.retryAfterMsecs != null) {
|
|
67
|
+
return Math.min(Math.max(error.retryAfterMsecs, 0), this.retryWaitMax);
|
|
68
|
+
}
|
|
69
|
+
const multiplier = Math.min(2 ** (failureCount - 1), 16);
|
|
70
|
+
return Math.min(this.retryWait * multiplier, this.retryWaitMax);
|
|
71
|
+
}
|
|
72
|
+
errorMessage(error) {
|
|
73
|
+
if (error instanceof ChaintracksFetch_1.ChaintracksFetchError)
|
|
74
|
+
return `${error.status} ${error.statusText}: ${error.message}`;
|
|
75
|
+
if (error instanceof Error)
|
|
76
|
+
return error.message;
|
|
77
|
+
return String(error);
|
|
78
|
+
}
|
|
79
|
+
async waitUnlessStopped(msecs) {
|
|
80
|
+
let remaining = msecs;
|
|
81
|
+
while (remaining > 0 && !this.done) {
|
|
82
|
+
const chunk = Math.min(1000, remaining);
|
|
83
|
+
await (0, utilityHelpers_1.wait)(chunk);
|
|
84
|
+
remaining -= chunk;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
49
87
|
stopListening() {
|
|
50
88
|
this.done = true;
|
|
51
89
|
}
|
package/out/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LiveIngestorWhatsOnChainPoll.js","sourceRoot":"","sources":["../../../../../../../src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.ts"],"names":[],"mappings":";;;AACA,uEAAyD;AACzD,yDAA8E;AAC9E,iEAK+B;
|
|
1
|
+
{"version":3,"file":"LiveIngestorWhatsOnChainPoll.js","sourceRoot":"","sources":["../../../../../../../src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,12 +9,14 @@ export * from './Api/LiveIngestorApi';
|
|
|
9
9
|
export * from './Api/BlockHeaderApi';
|
|
10
10
|
export * from './Chaintracks';
|
|
11
11
|
export * from './ChaintracksServiceClient';
|
|
12
|
+
export * from './GoChaintracksServiceClient';
|
|
12
13
|
export * from './Ingest/BulkIngestorBase';
|
|
13
14
|
export * from './Ingest/LiveIngestorBase';
|
|
14
15
|
export * from './Ingest/BulkIngestorCDN';
|
|
15
16
|
export * from './Ingest/BulkIngestorCDNBabbage';
|
|
16
17
|
export * from './Ingest/BulkIngestorWhatsOnChainCdn';
|
|
17
18
|
export * from './Ingest/LiveIngestorWhatsOnChainPoll';
|
|
19
|
+
export * from './Ingest/LiveIngestorChaintracksSSE';
|
|
18
20
|
export * from './Ingest/WhatsOnChainServices';
|
|
19
21
|
export * from './Storage/BulkStorageBase';
|
|
20
22
|
export * from './Storage/ChaintracksStorageBase';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mobile.d.ts","sourceRoot":"","sources":["../../../../../../src/services/chaintracker/chaintracks/index.mobile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAE1C,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AACtC,cAAc,2BAA2B,CAAA;AACzC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,sBAAsB,CAAA;AACpC,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA;AAEpC,cAAc,eAAe,CAAA;AAC7B,cAAc,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"index.mobile.d.ts","sourceRoot":"","sources":["../../../../../../src/services/chaintracker/chaintracks/index.mobile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAE1C,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AACtC,cAAc,2BAA2B,CAAA;AACzC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,sBAAsB,CAAA;AACpC,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA;AAEpC,cAAc,eAAe,CAAA;AAC7B,cAAc,4BAA4B,CAAA;AAC1C,cAAc,8BAA8B,CAAA;AAE5C,cAAc,2BAA2B,CAAA;AACzC,cAAc,2BAA2B,CAAA;AAEzC,cAAc,0BAA0B,CAAA;AACxC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,sCAAsC,CAAA;AACpD,cAAc,uCAAuC,CAAA;AACrD,cAAc,qCAAqC,CAAA;AACnD,cAAc,+BAA+B,CAAA;AAE7C,cAAc,2BAA2B,CAAA;AACzC,cAAc,kCAAkC,CAAA;AAChD,cAAc,kCAAkC,CAAA;AAChD,cAAc,iCAAiC,CAAA;AAE/C,cAAc,uCAAuC,CAAA;AACrD,cAAc,yBAAyB,CAAA;AAEvC,cAAc,wBAAwB,CAAA;AACtC,cAAc,oBAAoB,CAAA;AAClC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA;AAEvC,OAAO,KAAK,KAAK,MAAM,6BAA6B,CAAA"}
|
|
@@ -47,12 +47,14 @@ __exportStar(require("./Api/LiveIngestorApi"), exports);
|
|
|
47
47
|
__exportStar(require("./Api/BlockHeaderApi"), exports);
|
|
48
48
|
__exportStar(require("./Chaintracks"), exports);
|
|
49
49
|
__exportStar(require("./ChaintracksServiceClient"), exports);
|
|
50
|
+
__exportStar(require("./GoChaintracksServiceClient"), exports);
|
|
50
51
|
__exportStar(require("./Ingest/BulkIngestorBase"), exports);
|
|
51
52
|
__exportStar(require("./Ingest/LiveIngestorBase"), exports);
|
|
52
53
|
__exportStar(require("./Ingest/BulkIngestorCDN"), exports);
|
|
53
54
|
__exportStar(require("./Ingest/BulkIngestorCDNBabbage"), exports);
|
|
54
55
|
__exportStar(require("./Ingest/BulkIngestorWhatsOnChainCdn"), exports);
|
|
55
56
|
__exportStar(require("./Ingest/LiveIngestorWhatsOnChainPoll"), exports);
|
|
57
|
+
__exportStar(require("./Ingest/LiveIngestorChaintracksSSE"), exports);
|
|
56
58
|
__exportStar(require("./Ingest/WhatsOnChainServices"), exports);
|
|
57
59
|
__exportStar(require("./Storage/BulkStorageBase"), exports);
|
|
58
60
|
__exportStar(require("./Storage/ChaintracksStorageBase"), exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mobile.js","sourceRoot":"","sources":["../../../../../../src/services/chaintracker/chaintracks/index.mobile.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,uDAAoC;AACpC,yDAAsC;AACtC,4DAAyC;AACzC,8DAA2C;AAC3C,uDAAoC;AACpC,wDAAqC;AACrC,wDAAqC;AACrC,uDAAoC;AAEpC,gDAA6B;AAC7B,6DAA0C;
|
|
1
|
+
{"version":3,"file":"index.mobile.js","sourceRoot":"","sources":["../../../../../../src/services/chaintracker/chaintracks/index.mobile.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,uDAAoC;AACpC,yDAAsC;AACtC,4DAAyC;AACzC,8DAA2C;AAC3C,uDAAoC;AACpC,wDAAqC;AACrC,wDAAqC;AACrC,uDAAoC;AAEpC,gDAA6B;AAC7B,6DAA0C;AAC1C,+DAA4C;AAE5C,4DAAyC;AACzC,4DAAyC;AAEzC,2DAAwC;AACxC,kEAA+C;AAC/C,uEAAoD;AACpD,wEAAqD;AACrD,sEAAmD;AACnD,gEAA6C;AAE7C,4DAAyC;AACzC,mEAAgD;AAChD,mEAAgD;AAChD,kEAA+C;AAE/C,wEAAqD;AACrD,0DAAuC;AAEvC,yDAAsC;AACtC,qDAAkC;AAClC,6DAA0C;AAC1C,0DAAuC;AAEvC,qEAAoD"}
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { HttpClient } from '@bsv/sdk';
|
|
2
2
|
import { ChaintracksFetchApi } from '../Api/ChaintracksFetchApi';
|
|
3
|
+
export declare class ChaintracksFetchError extends Error {
|
|
4
|
+
readonly url: string;
|
|
5
|
+
readonly status: number;
|
|
6
|
+
readonly statusText: string;
|
|
7
|
+
readonly retryAfterMsecs?: number | undefined;
|
|
8
|
+
constructor(message: string, url: string, status: number, statusText: string, retryAfterMsecs?: number | undefined);
|
|
9
|
+
get retryable(): boolean;
|
|
10
|
+
}
|
|
3
11
|
/**
|
|
4
12
|
* This class implements the ChaintracksFetchApi
|
|
5
13
|
* using the @bsv/sdk `defaultHttpClient`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChaintracksFetch.d.ts","sourceRoot":"","sources":["../../../../../../../src/services/chaintracker/chaintracks/util/ChaintracksFetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,UAAU,EAAE,MAAM,UAAU,CAAA;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"ChaintracksFetch.d.ts","sourceRoot":"","sources":["../../../../../../../src/services/chaintracker/chaintracks/util/ChaintracksFetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,UAAU,EAAE,MAAM,UAAU,CAAA;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAMhE,qBAAa,qBAAsB,SAAQ,KAAK;aAG5B,GAAG,EAAE,MAAM;aACX,MAAM,EAAE,MAAM;aACd,UAAU,EAAE,MAAM;aAClB,eAAe,CAAC,EAAE,MAAM;gBAJxC,OAAO,EAAE,MAAM,EACC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,eAAe,CAAC,EAAE,MAAM,YAAA;IAM1C,IAAI,SAAS,IAAK,OAAO,CAExB;CACF;AAqCD;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,mBAAmB;IAC1D,UAAU,EAAE,UAAU,CAAsB;IAEtC,QAAQ,CAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAoB3C,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAoB3C,QAAQ,CAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM;CAQpD"}
|
|
@@ -1,8 +1,56 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ChaintracksFetch = void 0;
|
|
3
|
+
exports.ChaintracksFetch = exports.ChaintracksFetchError = void 0;
|
|
4
4
|
const sdk_1 = require("@bsv/sdk");
|
|
5
5
|
const utilityHelpers_1 = require("../../../../utility/utilityHelpers");
|
|
6
|
+
const MAX_RETRIES = 3;
|
|
7
|
+
const DEFAULT_RETRY_MSECS = 1000;
|
|
8
|
+
class ChaintracksFetchError extends Error {
|
|
9
|
+
url;
|
|
10
|
+
status;
|
|
11
|
+
statusText;
|
|
12
|
+
retryAfterMsecs;
|
|
13
|
+
constructor(message, url, status, statusText, retryAfterMsecs) {
|
|
14
|
+
super(message);
|
|
15
|
+
this.url = url;
|
|
16
|
+
this.status = status;
|
|
17
|
+
this.statusText = statusText;
|
|
18
|
+
this.retryAfterMsecs = retryAfterMsecs;
|
|
19
|
+
this.name = 'ChaintracksFetchError';
|
|
20
|
+
}
|
|
21
|
+
get retryable() {
|
|
22
|
+
return isRetryableHttpStatus(this.status);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.ChaintracksFetchError = ChaintracksFetchError;
|
|
26
|
+
function isRetryableHttpStatus(status) {
|
|
27
|
+
return status === 408 || status === 429 || status >= 500;
|
|
28
|
+
}
|
|
29
|
+
function retryAfterMsecs(response) {
|
|
30
|
+
const retryAfter = response.headers.get('retry-after');
|
|
31
|
+
if (retryAfter == null || retryAfter === '')
|
|
32
|
+
return undefined;
|
|
33
|
+
const seconds = Number(retryAfter);
|
|
34
|
+
if (Number.isFinite(seconds) && seconds >= 0)
|
|
35
|
+
return seconds * 1000;
|
|
36
|
+
const dateMsecs = Date.parse(retryAfter);
|
|
37
|
+
if (!Number.isFinite(dateMsecs))
|
|
38
|
+
return undefined;
|
|
39
|
+
return Math.max(0, dateMsecs - Date.now());
|
|
40
|
+
}
|
|
41
|
+
function retryWaitMsecs(retry, retryAfter) {
|
|
42
|
+
return Math.min(retryAfter ?? DEFAULT_RETRY_MSECS * (retry + 1), 2 * 60 * 1000);
|
|
43
|
+
}
|
|
44
|
+
async function waitIfRetryable(response, retry) {
|
|
45
|
+
if (!isRetryableHttpStatus(response.status) || retry >= MAX_RETRIES)
|
|
46
|
+
return false;
|
|
47
|
+
await (0, utilityHelpers_1.wait)(retryWaitMsecs(retry, retryAfterMsecs(response)));
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
function fetchError(url, response, kind) {
|
|
51
|
+
const retryAfter = retryAfterMsecs(response);
|
|
52
|
+
return new ChaintracksFetchError(`Failed to ${kind} from ${url}: ${response.status} ${response.statusText}`, url, response.status, response.statusText, retryAfter);
|
|
53
|
+
}
|
|
6
54
|
/**
|
|
7
55
|
* This class implements the ChaintracksFetchApi
|
|
8
56
|
* using the @bsv/sdk `defaultHttpClient`.
|
|
@@ -18,12 +66,9 @@ class ChaintracksFetch {
|
|
|
18
66
|
}
|
|
19
67
|
});
|
|
20
68
|
if (!response.ok) {
|
|
21
|
-
if (response
|
|
22
|
-
// WhatsOnChain rate limits requests, so backoff and retry
|
|
23
|
-
await (0, utilityHelpers_1.wait)(1000 * (retry + 1));
|
|
69
|
+
if (await waitIfRetryable(response, retry))
|
|
24
70
|
continue;
|
|
25
|
-
|
|
26
|
-
throw new Error(`Failed to download from ${url}: ${response.statusText}`);
|
|
71
|
+
throw fetchError(url, response, 'download');
|
|
27
72
|
}
|
|
28
73
|
const data = await response.arrayBuffer();
|
|
29
74
|
return new Uint8Array(data);
|
|
@@ -40,11 +85,9 @@ class ChaintracksFetch {
|
|
|
40
85
|
for (let retry = 0;; retry++) {
|
|
41
86
|
const response = await fetch(url, requestJsonOptions);
|
|
42
87
|
if (!response.ok) {
|
|
43
|
-
if (response
|
|
44
|
-
await (0, utilityHelpers_1.wait)(1000 * (retry + 1));
|
|
88
|
+
if (await waitIfRetryable(response, retry))
|
|
45
89
|
continue;
|
|
46
|
-
|
|
47
|
-
throw new Error(`Failed to fetch JSON from ${url}: ${response.statusText}`);
|
|
90
|
+
throw fetchError(url, response, 'fetch JSON');
|
|
48
91
|
}
|
|
49
92
|
json = (await response.json());
|
|
50
93
|
break;
|