@artblocks/abx-sdk 0.1.0-alpha.2 → 0.1.0-alpha.4

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/service.d.ts CHANGED
@@ -16,8 +16,56 @@ export declare const WELL_KNOWN_SERVICE_PATH = "/.well-known/abx-service";
16
16
  export declare const TOKEN_API_INTERFACE = "abx-token-api/v1";
17
17
  export declare const CONTROL_PLANE_INTERFACE = "abx-control-plane/v1";
18
18
  export declare const EFFECTS_PUBLISH_INTERFACE = "abx-effects-publish/v1";
19
+ /**
20
+ * The indexing lifecycle a registration moves through, closed and provider-neutral
21
+ * (specs/self-host-toolkit/remote-services.md → The indexing lifecycle). One vocabulary for a
22
+ * managed provider and for your own node — the reference resolver stamps these too.
23
+ *
24
+ * queued registered + accepted; catch-up hasn't started
25
+ * backfilling actively catching up (initial sync or a forced replay); may already serve partial state
26
+ * live caught up to head; tracking head incrementally
27
+ * stale was live, now lagging (watcher behind, or transient RPC trouble) — still serving
28
+ * failed catch-up errored; carries `error`; will be retried
29
+ *
30
+ * Observability, never a source of truth: token resolution never consults it, and a project
31
+ * reconstructs from chain regardless.
32
+ */
33
+ export type IndexStatus = 'queued' | 'backfilling' | 'live' | 'stale' | 'failed';
34
+ /** Statuses a caller can stop waiting on — see {@link AbxServiceClient.awaitIndexed}. */
35
+ export declare const TERMINAL_INDEX_STATUSES: readonly IndexStatus[];
36
+ /**
37
+ * Why catch-up failed, as a closed machine class — never free-form prose the client must parse.
38
+ * Deliberately NOT extended with a reorg class: the protocol defines no reorg detection (the repair
39
+ * is the deterministic full replay), so no implementation could emit one honestly.
40
+ */
41
+ export type IndexErrorClass =
42
+ /** The RPC didn't answer (down, timing out, network). Retryable — nothing is wrong with the add. */
43
+ 'rpc_unavailable'
44
+ /** The RPC answered "too many requests". Retryable, slower — the usual cause of a long backfill. */
45
+ | 'rpc_rate_limited'
46
+ /** The address doesn't look like an ABX contract on this chain. NOT emitted by the reference
47
+ * (it indexes what its operator tells it); a provider that validates clone-ness SHOULD refuse
48
+ * synchronously at register instead of accepting and failing here. */
49
+ | 'not_abx_contract'
50
+ /** Anything else. Carries no detail — the service logs the cause. */
51
+ | 'internal';
52
+ /** A catch-up failure as it crosses the wire: a machine class plus a short, CREDENTIAL-FREE hint.
53
+ * Messages come from a closed set (see {@link classifyIndexError}) rather than from a scrubber, so
54
+ * "no RPC URL can leak through here" is checkable by reading the code. */
55
+ export interface IndexError {
56
+ class: IndexErrorClass;
57
+ message?: string;
58
+ }
59
+ /** Map a catch-up failure to its wire form. Sniffs the underlying error's shape only to CHOOSE a
60
+ * class — nothing from it reaches the returned message. */
61
+ export declare function classifyIndexError(err: unknown): IndexError;
19
62
  /** Machine error codes every conforming service uses — clients key off these, never off prose. */
20
63
  export type ServiceErrorCode = 'invalid_request' | 'unsupported_chain' | 'unauthorized' | 'forbidden' | 'not_registered' | 'disabled'
64
+ /** 404 — this node serves no route at that path AT ALL (as opposed to a known route whose shape
65
+ * was wrong, which is a 400 `invalid_request` carrying the correct template). The pair exists so
66
+ * a client can tell "I built the wrong URL" from "this project isn't indexed here" from "this
67
+ * node is older than the route I want" — a bare 404 conflates all three and reads as an outage. */
68
+ | 'unknown_route'
21
69
  /** 500 — an unexpected server-side failure. Never carries internal detail (it could embed the
22
70
  * operator's own credentials); the node logs the cause. Retryable. */
23
71
  | 'internal_error';
@@ -75,8 +123,11 @@ export interface RegisterProjectBody {
75
123
  /** Force a full replay even on a re-POST. */
76
124
  full?: boolean;
77
125
  }
78
- export interface RegisterProjectResult {
126
+ /** `200` — catch-up finished inside the request; the counts are facts. */
127
+ export interface RegisterProjectSummary {
79
128
  ok: boolean;
129
+ /** Discriminator. Normalized from the HTTP status by {@link AbxServiceClient.registerProject}. */
130
+ accepted: false;
80
131
  mode: 'full' | 'incremental';
81
132
  elapsedMs: number;
82
133
  project: {
@@ -85,8 +136,28 @@ export interface RegisterProjectResult {
85
136
  eventCount: number;
86
137
  tokenCount: number;
87
138
  mintedCount: number;
139
+ status?: IndexStatus;
140
+ };
141
+ }
142
+ /** `202` — the registration is durable and catch-up is deferred; there are no counts yet. Poll
143
+ * {@link AbxServiceClient.projectStatus} (or {@link AbxServiceClient.awaitIndexed}) for progress. */
144
+ export interface RegisterProjectAccepted {
145
+ ok: boolean;
146
+ accepted: true;
147
+ project: {
148
+ address: string;
149
+ name?: string | null;
150
+ status: IndexStatus;
88
151
  };
89
152
  }
153
+ /**
154
+ * `POST /v1/projects` answers in one of two shapes and **the HTTP status code is the discriminator**
155
+ * (200 = done, 202 = accepted). Both are conformant; a client MUST handle both, which is why this is
156
+ * a union rather than a shape with everything optional. Narrow with {@link isAccepted}.
157
+ */
158
+ export type RegisterProjectResult = RegisterProjectSummary | RegisterProjectAccepted;
159
+ /** Narrow a register response to the deferred-catch-up branch. */
160
+ export declare function isAccepted(r: RegisterProjectResult): r is RegisterProjectAccepted;
90
161
  /** One row of `GET /v1/projects` — the projects visible to this token. */
91
162
  export interface RemoteProjectSummary {
92
163
  chainId: number;
@@ -97,17 +168,33 @@ export interface RemoteProjectSummary {
97
168
  tokenCount?: number;
98
169
  mintedCount?: number;
99
170
  reconstructedAt?: string | null;
171
+ /** Where this project is in the indexing lifecycle — so a list renders "3 live, 1 backfilling,
172
+ * 1 failed" with no per-project round trip. */
173
+ status?: IndexStatus;
174
+ /** Present on `stale`/`failed` — the class only; the full hint lives on the status route. */
175
+ error?: {
176
+ class: IndexErrorClass;
177
+ };
100
178
  }
101
- /** `GET /v1/projects/{chainId}/{address}/status` — indexing freshness. */
179
+ /** `GET /v1/projects/{chainId}/{address}/status` — indexing freshness + lifecycle. */
102
180
  export interface RemoteProjectStatus {
103
181
  chainId: number;
104
182
  address: string;
183
+ /** Where this project is in the lifecycle. */
184
+ status: IndexStatus;
105
185
  fromBlock: string;
106
186
  toBlock: string | null;
187
+ /** Chain head as the service last saw it — so a client computes lag / % complete without knowing
188
+ * anything about the service's watcher. `null` when the service can't say. */
189
+ headBlock?: string | null;
107
190
  eventCount: number;
108
191
  tokenCount: number;
109
192
  mintedCount: number;
110
193
  reconstructedAt: string | null;
194
+ /** Present on `stale`/`failed`. Credential-free by contract. */
195
+ error?: IndexError;
196
+ /** Catch-up attempts since the last success. */
197
+ attempts?: number;
111
198
  watcher?: {
112
199
  watching: boolean;
113
200
  pollAt: string | null;
@@ -115,6 +202,21 @@ export interface RemoteProjectStatus {
115
202
  intervalMs?: number;
116
203
  };
117
204
  }
205
+ /**
206
+ * How far along a BACKFILL is, from a status read — `null` when there is no meaningful ratio.
207
+ *
208
+ * Deliberately `null` for anything but `backfilling`, because `toBlock` measures two different things
209
+ * depending on the state. During an initial sync it advances monotonically, so `toBlock` vs head IS
210
+ * progress. Once a project is `live` it only moves when that project has *events* — so a perfectly
211
+ * current project on a busy chain sits at a tiny fraction of head, and rendering that as "3%" reads
212
+ * as broken when nothing is wrong. Same reason the reference measures staleness against its watcher's
213
+ * watermark rather than a project's `toBlock`.
214
+ */
215
+ export declare function indexProgress(s: RemoteProjectStatus): {
216
+ done: bigint;
217
+ total: bigint;
218
+ percent: number;
219
+ } | null;
118
220
  /** `POST /v1/effect-artifacts` — a render producer publishes one output (locator or bytes). */
119
221
  export interface PublishEffectArtifactBody {
120
222
  chainId: number;
@@ -147,12 +249,30 @@ export declare class AbxServiceError extends Error {
147
249
  readonly status: number;
148
250
  readonly code?: ServiceErrorCode;
149
251
  readonly url: string;
252
+ /** The failure CLASS when the service volunteered one (a credential-free hint about *why* — an
253
+ * exhausted RPC reads very differently from a broken service). Optional on the wire. */
254
+ readonly class?: IndexErrorClass;
150
255
  constructor(message: string, opts: {
151
256
  status: number;
152
257
  code?: ServiceErrorCode;
153
258
  url: string;
259
+ class?: IndexErrorClass;
154
260
  });
155
261
  }
262
+ /** Waiting for a project to reach a terminal status ran out of time. The registration is durable —
263
+ * this is "still working", never "the add failed". */
264
+ export declare class AbxIndexTimeoutError extends Error {
265
+ readonly last?: RemoteProjectStatus;
266
+ constructor(message: string, last?: RemoteProjectStatus);
267
+ }
268
+ export interface AwaitIndexedOptions {
269
+ /** Give up after this long (default 5 min). The registration stays durable regardless. */
270
+ timeoutMs?: number;
271
+ /** Poll cadence (default 3s). */
272
+ intervalMs?: number;
273
+ /** Called on every poll — drive a progress line from it. */
274
+ onProgress?: (status: RemoteProjectStatus) => void;
275
+ }
156
276
  export interface ServiceClientOptions {
157
277
  baseUrl: string;
158
278
  /** Bearer token for the control plane. Omit for descriptor-only use. */
@@ -170,8 +290,23 @@ export declare class AbxServiceClient {
170
290
  constructor(opts: ServiceClientOptions);
171
291
  /** The public service descriptor — no auth, safe to fetch before trusting a provider. */
172
292
  descriptor(): Promise<ServiceDescriptor>;
173
- /** Register + index a project (the HTTP form of `abx add`; a re-POST is the nudge). */
293
+ /**
294
+ * Register + index a project (the HTTP form of `abx add`; a re-POST is the nudge). Returns the
295
+ * completed summary (HTTP 200) or the accepted-and-still-working shape (HTTP 202) — narrow with
296
+ * {@link isAccepted}, and follow a 202 with {@link awaitIndexed}.
297
+ *
298
+ * A timed-out register is NOT retried blind. A conforming service persists the registration before
299
+ * it starts catching up, so a timeout usually means "it's in there, still working" — and re-POSTing
300
+ * would kick off a *second* full reconstruct against the RPC that was already too slow to answer.
301
+ * So we ask the status route whether it landed, and if it did we return the async shape instead.
302
+ */
174
303
  registerProject(body: RegisterProjectBody): Promise<RegisterProjectResult>;
304
+ /**
305
+ * Poll a project's status until it reaches a terminal lifecycle state (`live` or `failed`) — the
306
+ * one implementation of the wait loop, so the CLI, the effects runner, and any hosted agent all
307
+ * behave identically against any provider. `stale` keeps polling: it means lagging, not caught up.
308
+ */
309
+ awaitIndexed(chainId: number, address: string, opts?: AwaitIndexedOptions): Promise<RemoteProjectStatus>;
175
310
  /** The projects this token may see. */
176
311
  listProjects(): Promise<RemoteProjectSummary[]>;
177
312
  /** Deregister (remote `abx forget`). `not_registered` means "already gone" — reported, not
@@ -179,7 +314,8 @@ export declare class AbxServiceClient {
179
314
  removeProject(chainId: number, address: string): Promise<{
180
315
  removed: boolean;
181
316
  }>;
182
- /** Nudge a re-index. */
317
+ /** Nudge a re-index. Answers in the same two shapes as {@link registerProject} — a full replay is
318
+ * the *most* likely call to outlive one HTTP request. */
183
319
  reindexProject(chainId: number, address: string): Promise<RegisterProjectResult>;
184
320
  /** Indexing freshness for one project. */
185
321
  projectStatus(chainId: number, address: string): Promise<RemoteProjectStatus>;
@@ -192,5 +328,6 @@ export declare class AbxServiceClient {
192
328
  /** Report a run's transient state for the artifact key it is producing. */
193
329
  reportEffectStatus(body: ReportEffectStatusBody): Promise<void>;
194
330
  private request;
331
+ private requestWithStatus;
195
332
  }
196
333
  //# sourceMappingURL=service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
package/dist/service.js CHANGED
@@ -14,18 +14,89 @@ export const WELL_KNOWN_SERVICE_PATH = '/.well-known/abx-service';
14
14
  export const TOKEN_API_INTERFACE = 'abx-token-api/v1';
15
15
  export const CONTROL_PLANE_INTERFACE = 'abx-control-plane/v1';
16
16
  export const EFFECTS_PUBLISH_INTERFACE = 'abx-effects-publish/v1';
17
+ /** Statuses a caller can stop waiting on — see {@link AbxServiceClient.awaitIndexed}. */
18
+ export const TERMINAL_INDEX_STATUSES = ['live', 'failed'];
19
+ /** The one message per class. Fixed strings — an upstream error is never interpolated, because a
20
+ * keyed RPC URL *is* a credential and upstream messages routinely embed one. */
21
+ const INDEX_ERROR_MESSAGES = {
22
+ rpc_unavailable: 'upstream RPC unavailable; will retry',
23
+ rpc_rate_limited: 'upstream RPC rate-limited; will retry',
24
+ not_abx_contract: 'address emits no ABX event spine on this chain',
25
+ internal: 'indexing failed; see the service operator’s logs',
26
+ };
27
+ /** Map a catch-up failure to its wire form. Sniffs the underlying error's shape only to CHOOSE a
28
+ * class — nothing from it reaches the returned message. */
29
+ export function classifyIndexError(err) {
30
+ const raw = err instanceof Error ? `${err.name} ${err.message}` : String(err);
31
+ const text = raw.toLowerCase();
32
+ let cls = 'internal';
33
+ if (/rate.?limit|too many requests|\b429\b|quota|exceeded .*(?:compute|cu)|throttl/.test(text)) {
34
+ cls = 'rpc_rate_limited';
35
+ }
36
+ else if (/timeout|timed out|econnrefused|econnreset|enotfound|eai_again|socket hang up|fetch failed|network|502|503|504|http request failed/.test(text)) {
37
+ cls = 'rpc_unavailable';
38
+ }
39
+ return { class: cls, message: INDEX_ERROR_MESSAGES[cls] };
40
+ }
41
+ /** Narrow a register response to the deferred-catch-up branch. */
42
+ export function isAccepted(r) {
43
+ return r.accepted === true;
44
+ }
45
+ /**
46
+ * How far along a BACKFILL is, from a status read — `null` when there is no meaningful ratio.
47
+ *
48
+ * Deliberately `null` for anything but `backfilling`, because `toBlock` measures two different things
49
+ * depending on the state. During an initial sync it advances monotonically, so `toBlock` vs head IS
50
+ * progress. Once a project is `live` it only moves when that project has *events* — so a perfectly
51
+ * current project on a busy chain sits at a tiny fraction of head, and rendering that as "3%" reads
52
+ * as broken when nothing is wrong. Same reason the reference measures staleness against its watcher's
53
+ * watermark rather than a project's `toBlock`.
54
+ */
55
+ export function indexProgress(s) {
56
+ if (s.status !== 'backfilling')
57
+ return null;
58
+ if (!s.headBlock || !s.toBlock)
59
+ return null;
60
+ try {
61
+ const from = BigInt(s.fromBlock);
62
+ const to = BigInt(s.toBlock);
63
+ const head = BigInt(s.headBlock);
64
+ if (head <= from || to < from)
65
+ return null;
66
+ const total = head - from;
67
+ const done = (to > head ? head : to) - from;
68
+ return { done, total, percent: Number((done * 100n) / total) };
69
+ }
70
+ catch {
71
+ return null;
72
+ }
73
+ }
17
74
  /** A non-2xx control-plane response (or an unreachable service, after retries). `code` is the
18
75
  * spec's machine code when the service sent one — key behavior off it, never off `message`. */
19
76
  export class AbxServiceError extends Error {
20
77
  status;
21
78
  code;
22
79
  url;
80
+ /** The failure CLASS when the service volunteered one (a credential-free hint about *why* — an
81
+ * exhausted RPC reads very differently from a broken service). Optional on the wire. */
82
+ class;
23
83
  constructor(message, opts) {
24
84
  super(message);
25
85
  this.name = 'AbxServiceError';
26
86
  this.status = opts.status;
27
87
  this.code = opts.code;
28
88
  this.url = opts.url;
89
+ this.class = opts.class;
90
+ }
91
+ }
92
+ /** Waiting for a project to reach a terminal status ran out of time. The registration is durable —
93
+ * this is "still working", never "the add failed". */
94
+ export class AbxIndexTimeoutError extends Error {
95
+ last;
96
+ constructor(message, last) {
97
+ super(message);
98
+ this.name = 'AbxIndexTimeoutError';
99
+ this.last = last;
29
100
  }
30
101
  }
31
102
  /**
@@ -51,11 +122,48 @@ export class AbxServiceClient {
51
122
  }
52
123
  /** The public service descriptor — no auth, safe to fetch before trusting a provider. */
53
124
  async descriptor() {
54
- return (await this.request('GET', WELL_KNOWN_SERVICE_PATH, undefined, DESCRIPTOR_ATTEMPTS));
125
+ return (await this.request('GET', WELL_KNOWN_SERVICE_PATH, undefined, { attempts: DESCRIPTOR_ATTEMPTS }));
55
126
  }
56
- /** Register + index a project (the HTTP form of `abx add`; a re-POST is the nudge). */
127
+ /**
128
+ * Register + index a project (the HTTP form of `abx add`; a re-POST is the nudge). Returns the
129
+ * completed summary (HTTP 200) or the accepted-and-still-working shape (HTTP 202) — narrow with
130
+ * {@link isAccepted}, and follow a 202 with {@link awaitIndexed}.
131
+ *
132
+ * A timed-out register is NOT retried blind. A conforming service persists the registration before
133
+ * it starts catching up, so a timeout usually means "it's in there, still working" — and re-POSTing
134
+ * would kick off a *second* full reconstruct against the RPC that was already too slow to answer.
135
+ * So we ask the status route whether it landed, and if it did we return the async shape instead.
136
+ */
57
137
  async registerProject(body) {
58
- return (await this.request('POST', '/v1/projects', body));
138
+ const landed = async () => {
139
+ const st = await this.projectStatus(body.chainId, body.address).catch(() => null);
140
+ if (!st)
141
+ return undefined; // not there (or the service is truly unreachable) — keep retrying
142
+ return { ok: true, accepted: true, project: { address: body.address, status: st.status } };
143
+ };
144
+ const { status, body: out } = await this.requestWithStatus('POST', '/v1/projects', body, { onTimeout: landed });
145
+ return normalizeRegisterResult(status, out, body.address);
146
+ }
147
+ /**
148
+ * Poll a project's status until it reaches a terminal lifecycle state (`live` or `failed`) — the
149
+ * one implementation of the wait loop, so the CLI, the effects runner, and any hosted agent all
150
+ * behave identically against any provider. `stale` keeps polling: it means lagging, not caught up.
151
+ */
152
+ async awaitIndexed(chainId, address, opts = {}) {
153
+ const timeoutMs = opts.timeoutMs ?? 300_000;
154
+ const intervalMs = opts.intervalMs ?? 3_000;
155
+ const deadline = Date.now() + timeoutMs;
156
+ let last;
157
+ for (;;) {
158
+ last = await this.projectStatus(chainId, address);
159
+ opts.onProgress?.(last);
160
+ if (TERMINAL_INDEX_STATUSES.includes(last.status))
161
+ return last;
162
+ if (Date.now() + intervalMs > deadline) {
163
+ throw new AbxIndexTimeoutError(`${address} was still '${last.status}' after ${Math.round(timeoutMs / 1000)}s — the registration is durable and the service keeps working; check back with \`abx status ${address} --remote\``, last);
164
+ }
165
+ await sleep(intervalMs);
166
+ }
59
167
  }
60
168
  /** The projects this token may see. */
61
169
  async listProjects() {
@@ -75,9 +183,16 @@ export class AbxServiceClient {
75
183
  throw err;
76
184
  }
77
185
  }
78
- /** Nudge a re-index. */
186
+ /** Nudge a re-index. Answers in the same two shapes as {@link registerProject} — a full replay is
187
+ * the *most* likely call to outlive one HTTP request. */
79
188
  async reindexProject(chainId, address) {
80
- return (await this.request('POST', `/v1/projects/${chainId}/${address}/reindex`));
189
+ const { status, body } = await this.requestWithStatus('POST', `/v1/projects/${chainId}/${address}/reindex`, undefined, {
190
+ onTimeout: async () => {
191
+ const st = await this.projectStatus(chainId, address).catch(() => null);
192
+ return st ? { ok: true, accepted: true, project: { address, status: st.status } } : undefined;
193
+ },
194
+ });
195
+ return normalizeRegisterResult(status, body, address);
81
196
  }
82
197
  /** Indexing freshness for one project. */
83
198
  async projectStatus(chainId, address) {
@@ -91,7 +206,11 @@ export class AbxServiceClient {
91
206
  async reportEffectStatus(body) {
92
207
  await this.request('POST', '/v1/effect-status', body);
93
208
  }
94
- async request(method, path, body, attempts = ATTEMPTS) {
209
+ async request(method, path, body, opts) {
210
+ return (await this.requestWithStatus(method, path, body, opts)).body;
211
+ }
212
+ async requestWithStatus(method, path, body, opts) {
213
+ const attempts = opts?.attempts ?? ATTEMPTS;
95
214
  const url = this.baseUrl + path;
96
215
  const headers = {};
97
216
  if (this.token)
@@ -101,6 +220,7 @@ export class AbxServiceClient {
101
220
  let lastFailure = '';
102
221
  let lastStatus = 0;
103
222
  let lastCode;
223
+ let lastClass;
104
224
  for (let attempt = 1; attempt <= attempts; attempt++) {
105
225
  let resp;
106
226
  try {
@@ -114,13 +234,21 @@ export class AbxServiceClient {
114
234
  catch (err) {
115
235
  lastFailure = err.message;
116
236
  lastStatus = 0;
237
+ // "We waited the full timeout" and "nothing is listening" are different failures, and for a
238
+ // mutating POST the difference decides whether retrying is safe: the request may still be
239
+ // running on the service. Let the caller check before we hammer it again.
240
+ if (opts?.onTimeout && err.name === 'TimeoutError') {
241
+ const resolved = await opts.onTimeout();
242
+ if (resolved !== undefined)
243
+ return { status: 202, body: resolved };
244
+ }
117
245
  if (attempt < attempts)
118
246
  await sleep(this.retryDelayMs * attempt);
119
247
  continue;
120
248
  }
121
249
  if (resp.ok) {
122
250
  const text = await resp.text();
123
- return text ? JSON.parse(text) : {};
251
+ return { status: resp.status, body: text ? JSON.parse(text) : {} };
124
252
  }
125
253
  if (resp.status >= 500 || resp.status === 429) {
126
254
  // Retryable — but KEEP the service's own words. A 5xx body carries the actual cause (an
@@ -129,6 +257,7 @@ export class AbxServiceClient {
129
257
  const said = await bodyMessage(resp);
130
258
  lastStatus = resp.status;
131
259
  lastCode = said.code;
260
+ lastClass = said.class;
132
261
  lastFailure = said.error ? `${resp.status} ${said.error}` : `${resp.status} ${resp.statusText}`;
133
262
  if (attempt < attempts)
134
263
  await sleep(this.retryDelayMs * attempt);
@@ -139,6 +268,7 @@ export class AbxServiceClient {
139
268
  throw new AbxServiceError(`${method} ${url}: ${resp.status} ${detail.error ?? resp.statusText}`, {
140
269
  status: resp.status,
141
270
  code: detail.code,
271
+ class: detail.class,
142
272
  url,
143
273
  });
144
274
  }
@@ -147,14 +277,37 @@ export class AbxServiceClient {
147
277
  const summary = lastStatus
148
278
  ? `service failed after ${attempts} attempt(s) — last response ${lastFailure}`
149
279
  : `nothing responded after ${attempts} attempt(s) (${lastFailure})`;
150
- throw new AbxServiceError(`${method} ${url}: ${summary}`, { status: lastStatus, code: lastCode, url });
280
+ throw new AbxServiceError(`${method} ${url}: ${summary}`, { status: lastStatus, code: lastCode, class: lastClass, url });
281
+ }
282
+ }
283
+ /** Normalize a register/reindex response: the HTTP status is the authoritative discriminator, and
284
+ * the `accepted` flag is derived from it so callers switch on one field even against a service that
285
+ * doesn't send it. */
286
+ function normalizeRegisterResult(status, out, fallbackAddress) {
287
+ if (status === 202) {
288
+ const r = out;
289
+ return {
290
+ ok: r.ok ?? true,
291
+ accepted: true,
292
+ project: {
293
+ address: r.project?.address ?? fallbackAddress,
294
+ name: r.project?.name ?? null,
295
+ status: r.project?.status ?? 'backfilling',
296
+ },
297
+ };
151
298
  }
299
+ return { ...out, accepted: false };
152
300
  }
153
- /** The service's own `{error, code}` from a non-2xx body (never throws — a body may be empty/HTML). */
301
+ /** The service's own `{error, code, class?}` from a non-2xx body (never throws — a body may be
302
+ * empty/HTML). `class` is the optional credential-free failure hint. */
154
303
  async function bodyMessage(resp) {
155
304
  try {
156
305
  const parsed = (await resp.json());
157
- return { error: parsed.error, code: parsed.code };
306
+ return {
307
+ error: parsed.error,
308
+ code: parsed.code,
309
+ class: parsed.class,
310
+ };
158
311
  }
159
312
  catch {
160
313
  return {};
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@artblocks/abx-sdk",
3
- "version": "0.1.0-alpha.2",
3
+ "version": "0.1.0-alpha.4",
4
4
  "license": "MIT",
5
5
  "description": "ABX SDK (Layer 2) — the neutral, low-level library that turns protocol operations into typed function calls. No provider, no chain, no UX baked in.",
6
6
  "type": "module",