@gscdump/sdk 1.4.0 → 1.4.1

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.
@@ -0,0 +1,418 @@
1
+ import { buildHttpOperationPath, createGscdumpV1Protocol } from "@gscdump/contracts/v1";
2
+ var GscdumpV1Error = class extends Error {
3
+ tag = "GscdumpV1Error";
4
+ code;
5
+ status;
6
+ requestId;
7
+ retryable;
8
+ details;
9
+ cause;
10
+ constructor(options) {
11
+ super(options.message);
12
+ this.name = "GscdumpV1Error";
13
+ this.code = options.code;
14
+ this.status = options.status;
15
+ this.requestId = options.requestId;
16
+ this.retryable = options.retryable;
17
+ this.details = options.details;
18
+ this.cause = options.cause;
19
+ }
20
+ };
21
+ function isGscdumpV1Error(error) {
22
+ return error instanceof GscdumpV1Error;
23
+ }
24
+ const DEFAULT_API_ROOT = "https://gscdump.com/api";
25
+ const API_PREFIX_RE = /^\/api(?=\/)/;
26
+ const TRAILING_SLASH_RE = /\/+$/;
27
+ const LEADING_SLASH_RE = /^\/+/;
28
+ function validationDetails(cause) {
29
+ if (typeof cause === "object" && cause !== null && "issues" in cause) return { issues: cause.issues };
30
+ return {};
31
+ }
32
+ function requestValidationError(operationId, location, cause) {
33
+ return new GscdumpV1Error({
34
+ code: "request_validation",
35
+ message: `${operationId}: invalid request ${location}`,
36
+ retryable: false,
37
+ details: {
38
+ location,
39
+ ...validationDetails(cause)
40
+ },
41
+ cause
42
+ });
43
+ }
44
+ function responseValidationError(operationId, status, requestId, cause) {
45
+ return new GscdumpV1Error({
46
+ code: "response_validation",
47
+ message: `${operationId}: response ${status} did not match the v1 contract`,
48
+ status,
49
+ requestId,
50
+ retryable: false,
51
+ details: validationDetails(cause),
52
+ cause
53
+ });
54
+ }
55
+ function clampInteger(value, fallback, min, max) {
56
+ if (value === void 0) return fallback;
57
+ if (!Number.isFinite(value)) throw new TypeError("Retry configuration values must be finite numbers.");
58
+ return Math.min(max, Math.max(min, Math.trunc(value)));
59
+ }
60
+ function resolveRetryOptions(options) {
61
+ const baseDelayMs = clampInteger(options?.baseDelayMs, 250, 0, 6e4);
62
+ const maxDelayMs = clampInteger(options?.maxDelayMs, 2e3, baseDelayMs, 3e5);
63
+ return {
64
+ maxAttempts: clampInteger(options?.maxAttempts, 3, 1, 5),
65
+ baseDelayMs,
66
+ maxDelayMs
67
+ };
68
+ }
69
+ function resolveApiUrl(apiRoot, contractPath) {
70
+ const relative = contractPath.replace(API_PREFIX_RE, "").replace(LEADING_SLASH_RE, "");
71
+ return `${apiRoot.replace(TRAILING_SLASH_RE, "")}/${relative}`;
72
+ }
73
+ function appendQueryValue(search, key, value) {
74
+ if (value === void 0) return;
75
+ if (Array.isArray(value)) {
76
+ for (const item of value) appendQueryValue(search, key, item);
77
+ return;
78
+ }
79
+ if (value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
80
+ search.append(key, value === null ? "null" : String(value));
81
+ return;
82
+ }
83
+ search.append(key, JSON.stringify(value));
84
+ }
85
+ function appendQuery(url, query) {
86
+ if (query === void 0 || query === null) return url;
87
+ if (typeof query !== "object" || Array.isArray(query)) throw new TypeError("A query schema must produce an object.");
88
+ const search = new URLSearchParams();
89
+ for (const key of Object.keys(query).sort()) appendQueryValue(search, key, query[key]);
90
+ const serialized = search.toString();
91
+ return serialized ? `${url}?${serialized}` : url;
92
+ }
93
+ function assertAbsentLocation(operationId, location, value) {
94
+ if (value !== void 0) throw requestValidationError(operationId, location, /* @__PURE__ */ new TypeError(`${location} is not accepted by this operation.`));
95
+ }
96
+ function parseLocation(operation, location, value) {
97
+ const schema = operation.request[location];
98
+ if (schema === null) {
99
+ assertAbsentLocation(operation.id, location, value);
100
+ return;
101
+ }
102
+ try {
103
+ return schema.parse(location === "headers" && value === void 0 ? {} : value);
104
+ } catch (cause) {
105
+ throw requestValidationError(operation.id, location, cause);
106
+ }
107
+ }
108
+ function prepareRequest(surface, operation, input, options) {
109
+ let path;
110
+ if (operation.request.params === null) {
111
+ assertAbsentLocation(operation.id, "params", input.params);
112
+ path = buildHttpOperationPath(surface, operation);
113
+ } else try {
114
+ path = buildHttpOperationPath(surface, operation, input.params);
115
+ } catch (cause) {
116
+ throw requestValidationError(operation.id, "params", cause);
117
+ }
118
+ const inputHeaders = input.headers;
119
+ const headerRequestId = inputHeaders?.["x-request-id"];
120
+ if (options.requestId && headerRequestId && options.requestId !== headerRequestId) throw requestValidationError(operation.id, "headers", /* @__PURE__ */ new TypeError("requestId conflicts with headers.x-request-id."));
121
+ const requestHeaders = options.requestId ? {
122
+ ...inputHeaders ?? {},
123
+ "x-request-id": options.requestId
124
+ } : input.headers;
125
+ return {
126
+ path,
127
+ query: parseLocation(operation, "query", input.query),
128
+ headers: parseLocation(operation, "headers", requestHeaders),
129
+ body: parseLocation(operation, "body", input.body)
130
+ };
131
+ }
132
+ async function resolveCredential(resolver) {
133
+ let credential;
134
+ try {
135
+ credential = typeof resolver === "function" ? await resolver() : resolver;
136
+ } catch (cause) {
137
+ throw new GscdumpV1Error({
138
+ code: "credential_resolution",
139
+ message: "Could not resolve the v1 Bearer credential.",
140
+ retryable: false,
141
+ details: {},
142
+ cause
143
+ });
144
+ }
145
+ if (typeof credential !== "string" || !credential.trim()) throw new GscdumpV1Error({
146
+ code: "credential_resolution",
147
+ message: "The v1 Bearer credential cannot be empty.",
148
+ retryable: false,
149
+ details: {}
150
+ });
151
+ return credential;
152
+ }
153
+ async function resolveBaseHeaders(resolver) {
154
+ return typeof resolver === "function" ? await resolver() : resolver;
155
+ }
156
+ async function buildRequestHeaders(options, operation, prepared, executeOptions) {
157
+ try {
158
+ const [baseHeaders, credential] = await Promise.all([resolveBaseHeaders(options.headers), resolveCredential(options.credential)]);
159
+ const headers = new Headers(baseHeaders);
160
+ for (const [key, value] of Object.entries(prepared.headers)) if (value !== void 0) headers.set(key, String(value));
161
+ headers.delete("x-api-key");
162
+ headers.set("accept", "application/json");
163
+ headers.set("authorization", `Bearer ${credential}`);
164
+ if (executeOptions.idempotencyKey) headers.set("idempotency-key", executeOptions.idempotencyKey);
165
+ if (prepared.body !== void 0) headers.set("content-type", "application/json");
166
+ return headers;
167
+ } catch (cause) {
168
+ if (cause instanceof GscdumpV1Error) throw cause;
169
+ throw requestValidationError(operation.id, "headers", cause);
170
+ }
171
+ }
172
+ function isAbortError(error, signal) {
173
+ return signal?.aborted === true || typeof error === "object" && error !== null && "name" in error && error.name === "AbortError";
174
+ }
175
+ function abortedRequestError(operation, executeOptions, cause = executeOptions.signal?.reason) {
176
+ return new GscdumpV1Error({
177
+ code: "aborted",
178
+ message: `${operation.id}: request aborted`,
179
+ requestId: executeOptions.requestId,
180
+ retryable: false,
181
+ details: {},
182
+ cause
183
+ });
184
+ }
185
+ async function waitForRetry(ms, operation, executeOptions) {
186
+ try {
187
+ await sleep(ms, executeOptions.signal);
188
+ } catch (cause) {
189
+ if (isAbortError(cause, executeOptions.signal)) throw abortedRequestError(operation, executeOptions, cause);
190
+ throw cause;
191
+ }
192
+ }
193
+ function awaitWithAbort(promise, operation, executeOptions) {
194
+ const signal = executeOptions.signal;
195
+ if (!signal) return promise;
196
+ if (signal.aborted) return Promise.reject(abortedRequestError(operation, executeOptions));
197
+ return new Promise((resolve, reject) => {
198
+ function onAbort() {
199
+ reject(abortedRequestError(operation, executeOptions));
200
+ }
201
+ signal.addEventListener("abort", onAbort, { once: true });
202
+ promise.then((value) => {
203
+ signal.removeEventListener("abort", onAbort);
204
+ resolve(value);
205
+ }, (cause) => {
206
+ signal.removeEventListener("abort", onAbort);
207
+ reject(cause);
208
+ });
209
+ });
210
+ }
211
+ function parseRetryAfter(value, now) {
212
+ if (value === null) return void 0;
213
+ const seconds = Number(value);
214
+ if (Number.isFinite(seconds) && seconds >= 0) return Math.ceil(seconds * 1e3);
215
+ const date = Date.parse(value);
216
+ if (Number.isNaN(date)) return void 0;
217
+ return Math.max(0, date - now);
218
+ }
219
+ function retryDelay(attempt, retryAfter, options) {
220
+ const exponential = Math.min(options.maxDelayMs, options.baseDelayMs * 2 ** Math.max(0, attempt - 1));
221
+ return Math.max(exponential, parseRetryAfter(retryAfter, Date.now()) ?? 0);
222
+ }
223
+ function sleep(ms, signal) {
224
+ if (signal?.aborted) return Promise.reject(signal.reason ?? new DOMException("The operation was aborted.", "AbortError"));
225
+ return new Promise((resolve, reject) => {
226
+ const handle = setTimeout(() => {
227
+ signal?.removeEventListener("abort", onAbort);
228
+ resolve();
229
+ }, ms);
230
+ function onAbort() {
231
+ clearTimeout(handle);
232
+ reject(signal?.reason ?? new DOMException("The operation was aborted.", "AbortError"));
233
+ }
234
+ signal?.addEventListener("abort", onAbort, { once: true });
235
+ });
236
+ }
237
+ async function readJson(response) {
238
+ const text = await response.text();
239
+ if (!text) return null;
240
+ return JSON.parse(text);
241
+ }
242
+ function requestIdFrom(response) {
243
+ return response.headers.get("x-request-id") ?? void 0;
244
+ }
245
+ function operationLookup(protocol) {
246
+ const operations = /* @__PURE__ */ new Map();
247
+ for (const surface of Object.values(protocol.surfaces)) for (const operation of Object.values(surface.operations)) operations.set(operation.id, {
248
+ operation,
249
+ surface
250
+ });
251
+ return operations;
252
+ }
253
+ function createGscdumpV1Client(options) {
254
+ const protocol = createGscdumpV1Protocol();
255
+ const operations = operationLookup(protocol);
256
+ const retryOptions = resolveRetryOptions(options.retry);
257
+ const apiRoot = options.apiRoot ?? DEFAULT_API_ROOT;
258
+ const fetchImpl = options.fetch ?? globalThis.fetch;
259
+ if (typeof fetchImpl !== "function") throw new TypeError("createGscdumpV1Client requires a fetch implementation in this runtime.");
260
+ const execute = executeUntyped;
261
+ async function executeUntyped(operationId, input, executeOptions = {}) {
262
+ const entry = operations.get(operationId);
263
+ if (!entry) throw new GscdumpV1Error({
264
+ code: "request_validation",
265
+ message: `Unknown gscdump v1 operation: ${operationId}`,
266
+ retryable: false,
267
+ details: { operationId }
268
+ });
269
+ const { operation, surface } = entry;
270
+ if (typeof input !== "object" || input === null || Array.isArray(input)) throw requestValidationError(operation.id, "input", /* @__PURE__ */ new TypeError("input must be an object."));
271
+ const prepared = prepareRequest(surface, operation, input, executeOptions);
272
+ let url;
273
+ try {
274
+ url = appendQuery(resolveApiUrl(apiRoot, prepared.path), prepared.query);
275
+ } catch (cause) {
276
+ throw requestValidationError(operation.id, "query", cause);
277
+ }
278
+ const canRetry = operation.semantics.retry === "idempotent";
279
+ for (let attempt = 1; attempt <= retryOptions.maxAttempts; attempt++) {
280
+ if (executeOptions.signal?.aborted) throw abortedRequestError(operation, executeOptions);
281
+ const headers = await awaitWithAbort(buildRequestHeaders(options, operation, prepared, executeOptions), operation, executeOptions);
282
+ if (executeOptions.signal?.aborted) throw abortedRequestError(operation, executeOptions);
283
+ let response;
284
+ try {
285
+ response = await fetchImpl(url, {
286
+ method: operation.method,
287
+ headers,
288
+ body: prepared.body === void 0 ? void 0 : JSON.stringify(prepared.body),
289
+ signal: executeOptions.signal
290
+ });
291
+ } catch (cause) {
292
+ if (isAbortError(cause, executeOptions.signal)) throw abortedRequestError(operation, executeOptions, cause);
293
+ if (canRetry && attempt < retryOptions.maxAttempts) {
294
+ await waitForRetry(retryDelay(attempt, null, retryOptions), operation, executeOptions);
295
+ continue;
296
+ }
297
+ throw new GscdumpV1Error({
298
+ code: "network_error",
299
+ message: `${operation.id}: network request failed`,
300
+ requestId: executeOptions.requestId,
301
+ retryable: canRetry,
302
+ details: { attempts: attempt },
303
+ cause
304
+ });
305
+ }
306
+ const requestId = requestIdFrom(response) ?? executeOptions.requestId;
307
+ let payload;
308
+ try {
309
+ payload = await readJson(response);
310
+ } catch (cause) {
311
+ if (isAbortError(cause, executeOptions.signal)) throw abortedRequestError(operation, executeOptions, cause);
312
+ throw responseValidationError(operation.id, response.status, requestId, cause);
313
+ }
314
+ if (executeOptions.signal?.aborted) throw abortedRequestError(operation, executeOptions);
315
+ const responseContract = operation.responses[response.status];
316
+ if (responseContract) try {
317
+ return responseContract.client.parse(payload);
318
+ } catch (cause) {
319
+ throw responseValidationError(operation.id, response.status, requestId, cause);
320
+ }
321
+ if (response.ok) throw new GscdumpV1Error({
322
+ code: "protocol_error",
323
+ message: `${operation.id}: undeclared success status ${response.status}`,
324
+ status: response.status,
325
+ requestId,
326
+ retryable: false,
327
+ details: { status: response.status }
328
+ });
329
+ let envelope;
330
+ try {
331
+ envelope = protocol.schemas.errorEnvelope.client.parse(payload);
332
+ } catch (cause) {
333
+ throw responseValidationError(operation.id, response.status, requestId, cause);
334
+ }
335
+ if (!operation.errors.includes(envelope.error.code)) throw new GscdumpV1Error({
336
+ code: "protocol_error",
337
+ message: `${operation.id}: undeclared error code ${envelope.error.code}`,
338
+ status: response.status,
339
+ requestId: envelope.error.requestId,
340
+ retryable: false,
341
+ details: { code: envelope.error.code }
342
+ });
343
+ const apiError = new GscdumpV1Error({
344
+ code: envelope.error.code,
345
+ message: envelope.error.message,
346
+ status: response.status,
347
+ requestId: envelope.error.requestId,
348
+ retryable: envelope.error.retryable,
349
+ details: envelope.error.details ?? {}
350
+ });
351
+ if (canRetry && apiError.retryable && attempt < retryOptions.maxAttempts) {
352
+ await waitForRetry(retryDelay(attempt, response.headers.get("retry-after"), retryOptions), operation, executeOptions);
353
+ continue;
354
+ }
355
+ throw apiError;
356
+ }
357
+ throw new GscdumpV1Error({
358
+ code: "network_error",
359
+ message: `${operationId}: retry budget exhausted`,
360
+ retryable: false,
361
+ details: {}
362
+ });
363
+ }
364
+ return {
365
+ execute,
366
+ getUserLifecycle: (input, executeOptions) => execute("partner.users.lifecycle.get", input, executeOptions),
367
+ listAvailableSites: (input, executeOptions) => execute("partner.users.sites.available.list", input, executeOptions),
368
+ createSite: (input, executeOptions) => execute("partner.users.sites.create", input, executeOptions),
369
+ createUser: (input, executeOptions) => execute("partner.users.create", input, executeOptions),
370
+ updateUserTokens: (input, executeOptions) => execute("partner.users.tokens.update", input, executeOptions),
371
+ getSiteIndexing: (input, executeOptions) => execute("partner.sites.indexing.get", input, executeOptions),
372
+ listSiteIndexingUrls: (input, executeOptions) => execute("partner.sites.indexing.urls.list", input, executeOptions),
373
+ getSiteIndexingDiagnostics: (input, executeOptions) => execute("partner.sites.indexing.diagnostics.get", input, executeOptions),
374
+ getSiteSitemaps: (input, executeOptions) => execute("partner.sites.sitemaps.get", input, executeOptions),
375
+ getSiteSitemapChanges: (input, executeOptions) => execute("partner.sites.sitemaps.changes.get", input, executeOptions),
376
+ getSiteAnalysis: (input, executeOptions) => execute("partner.sites.analysis.get", input, executeOptions),
377
+ getSiteAnalysisBundle: (input, executeOptions) => execute("partner.sites.analysis.bundle.get", input, executeOptions),
378
+ deleteSite: (input, executeOptions) => execute("partner.sites.delete", input, executeOptions),
379
+ getCanonicalMismatches: (input, executeOptions) => execute("partner.sites.canonical.mismatches.get", input, executeOptions),
380
+ inspectSiteUrls: (input, executeOptions) => execute("partner.sites.indexing.inspect.create", input, executeOptions),
381
+ recoverSitePermission: (input, executeOptions) => execute("partner.sites.permission.recover", input, executeOptions),
382
+ queryKeywordSparklines: (input, executeOptions) => execute("partner.sites.keyword.sparklines.query", input, executeOptions),
383
+ getQueryTrend: (input, executeOptions) => execute("partner.sites.query.trend.get", input, executeOptions),
384
+ getPageTrend: (input, executeOptions) => execute("partner.sites.page.trend.get", input, executeOptions),
385
+ getContentVelocity: (input, executeOptions) => execute("partner.sites.content.velocity.get", input, executeOptions),
386
+ getCtrCurve: (input, executeOptions) => execute("partner.sites.ctr.curve.get", input, executeOptions),
387
+ getDarkTraffic: (input, executeOptions) => execute("partner.sites.dark.traffic.get", input, executeOptions),
388
+ getDeviceGap: (input, executeOptions) => execute("partner.sites.device.gap.get", input, executeOptions),
389
+ getKeywordBreadth: (input, executeOptions) => execute("partner.sites.keyword.breadth.get", input, executeOptions),
390
+ getPositionDistribution: (input, executeOptions) => execute("partner.sites.position.distribution.get", input, executeOptions),
391
+ getTopAssociation: (input, executeOptions) => execute("partner.sites.top.association.get", input, executeOptions),
392
+ getIndexPercent: (input, executeOptions) => execute("partner.sites.index.percent.get", input, executeOptions),
393
+ createSitemapAction: (input, executeOptions) => execute("partner.sites.sitemaps.action.create", input, executeOptions),
394
+ querySitemapMembership: (input, executeOptions) => execute("partner.sites.sitemaps.membership.query", input, executeOptions),
395
+ createTeam: (input, executeOptions) => execute("partner.teams.create", input, executeOptions),
396
+ renameTeam: (input, executeOptions) => execute("partner.teams.rename", input, executeOptions),
397
+ deleteTeam: (input, executeOptions) => execute("partner.teams.delete", input, executeOptions),
398
+ listTeamMembers: (input, executeOptions) => execute("partner.teams.members.list", input, executeOptions),
399
+ addTeamMember: (input, executeOptions) => execute("partner.teams.members.add", input, executeOptions),
400
+ updateTeamMemberRole: (input, executeOptions) => execute("partner.teams.members.role.update", input, executeOptions),
401
+ removeTeamMember: (input, executeOptions) => execute("partner.teams.members.remove", input, executeOptions),
402
+ updateSiteTeam: (input, executeOptions) => execute("partner.sites.team.update", input, executeOptions),
403
+ getTeamCatalog: (input, executeOptions) => execute("partner.teams.catalog.get", input, executeOptions),
404
+ bindTeamCatalog: (input, executeOptions) => execute("partner.teams.catalog.bind", input, executeOptions),
405
+ getSiteIntIdCrosswalk: (input, executeOptions) => execute("partner.users.sites.crosswalk.get", input, executeOptions),
406
+ deleteUser: (input, executeOptions) => execute("partner.users.delete", input, executeOptions),
407
+ createVerificationToken: (input, executeOptions) => execute("partner.users.verification.token.create", input, executeOptions),
408
+ addAndVerifySite: (input, executeOptions) => execute("partner.users.sites.verify.create", input, executeOptions),
409
+ queryCrossSource: (input, executeOptions) => execute("partner.sites.cross.source.query", input, executeOptions),
410
+ enrichKeywords: (input, executeOptions) => execute("partner.keywords.enrich.query", input, executeOptions),
411
+ queryAnalyticsRows: (input, executeOptions) => execute("analytics.rows.query", input, executeOptions),
412
+ queryAnalyticsReport: (input, executeOptions) => execute("analytics.reports.query", input, executeOptions),
413
+ queryAnalyticsReportDetail: (input, executeOptions) => execute("analytics.reports.detail.query", input, executeOptions),
414
+ getRealtimeStreamHead: (input = {}, executeOptions) => execute("realtime.stream.head.get", input, executeOptions),
415
+ createRealtimeTicket: (input, executeOptions) => execute("realtime.tickets.create", input, executeOptions)
416
+ };
417
+ }
418
+ export { GscdumpV1Error, createGscdumpV1Client, isGscdumpV1Error };
@@ -1,233 +1,3 @@
1
- import { GscdumpV1ErrorEnvelope, RealtimeV1Cursor, RealtimeV1Event, RealtimeV1StreamHead, RealtimeV1StreamId, createGscdumpV1Protocol } from "@gscdump/contracts/v1";
2
- import { ZodTypeAny, z } from "zod";
3
- type MaybePromise$1<T> = T | Promise<T>;
4
- type ValueOf<T> = T[keyof T];
5
- type ValueOfUnion<T> = T extends unknown ? ValueOf<T> : never;
6
- type GscdumpV1ProtocolShape = ReturnType<typeof createGscdumpV1Protocol>;
7
- type GscdumpV1Surface = ValueOf<GscdumpV1ProtocolShape['surfaces']>;
8
- type GscdumpV1OperationRegistry = GscdumpV1Surface['operations'];
9
- type GscdumpV1Operation = ValueOfUnion<GscdumpV1OperationRegistry>;
10
- type GscdumpV1OperationId = GscdumpV1Operation['id'];
11
- type OperationById<TId extends GscdumpV1OperationId> = Extract<GscdumpV1Operation, {
12
- id: TId;
13
- }>;
14
- type SchemaInput<TSchema> = TSchema extends ZodTypeAny ? z.input<TSchema> : never;
15
- type SchemaOutput<TSchema> = TSchema extends ZodTypeAny ? z.output<TSchema> : never;
16
- type RequiredLocation<TKey extends string, TSchema> = TSchema extends ZodTypeAny ? { [K in TKey]: SchemaInput<TSchema>; } : { [K in TKey]?: never; };
17
- type OptionalLocation<TKey extends string, TSchema> = TSchema extends ZodTypeAny ? { [K in TKey]?: SchemaInput<TSchema>; } : { [K in TKey]?: never; };
18
- type GscdumpV1OperationInput<TId extends GscdumpV1OperationId> = RequiredLocation<'params', OperationById<TId>['request']['params']> & RequiredLocation<'query', OperationById<TId>['request']['query']> & OptionalLocation<'headers', OperationById<TId>['request']['headers']> & RequiredLocation<'body', OperationById<TId>['request']['body']>;
19
- type OperationResponseSchema<TId extends GscdumpV1OperationId> = ValueOf<OperationById<TId>['responses']> extends (infer TResponse) ? TResponse extends {
20
- client: infer TClient extends ZodTypeAny;
21
- } ? TClient : never : never;
22
- type GscdumpV1OperationResponse<TId extends GscdumpV1OperationId> = SchemaOutput<OperationResponseSchema<TId>>;
23
- type GscdumpV1CredentialResolver = string | (() => MaybePromise$1<string>);
24
- type GscdumpV1HeadersResolver = HeadersInit | (() => MaybePromise$1<HeadersInit>);
25
- interface GscdumpV1RetryOptions {
26
- /** Total attempts, including the initial request. Defaults to 3 and is capped at 5. */
27
- maxAttempts?: number;
28
- /** Deterministic exponential-backoff base. Defaults to 250 ms. */
29
- baseDelayMs?: number;
30
- /** Backoff ceiling. Defaults to 2 seconds. Retry-After can exceed this ceiling. */
31
- maxDelayMs?: number;
32
- }
33
- interface CreateGscdumpV1ClientOptions {
34
- /**
35
- * Root replacing the contract's `/api` segment. Direct calls default to
36
- * `https://gscdump.com/api`; a same-origin proxy can use `/api/_gscdump`.
37
- */
38
- apiRoot?: string;
39
- credential: GscdumpV1CredentialResolver;
40
- fetch?: typeof fetch;
41
- headers?: GscdumpV1HeadersResolver;
42
- retry?: GscdumpV1RetryOptions;
43
- }
44
- interface GscdumpV1ExecuteOptions {
45
- signal?: AbortSignal;
46
- requestId?: string;
47
- idempotencyKey?: string;
48
- }
49
- type GscdumpV1SdkErrorCode = GscdumpV1ErrorEnvelope['error']['code'] | 'aborted' | 'credential_resolution' | 'network_error' | 'protocol_error' | 'request_validation' | 'response_validation';
50
- interface GscdumpV1ErrorOptions {
51
- code: GscdumpV1SdkErrorCode;
52
- message: string;
53
- status?: number;
54
- requestId?: string;
55
- retryable: boolean;
56
- details: Record<string, unknown>;
57
- cause?: unknown;
58
- }
59
- /** One stable, tagged failure shape for validation, transport, and API errors. */
60
- declare class GscdumpV1Error extends Error {
61
- readonly tag: 'GscdumpV1Error';
62
- readonly code: GscdumpV1SdkErrorCode;
63
- readonly status?: number;
64
- readonly requestId?: string;
65
- readonly retryable: boolean;
66
- readonly details: Record<string, unknown>;
67
- readonly cause?: unknown;
68
- constructor(options: GscdumpV1ErrorOptions);
69
- }
70
- declare function isGscdumpV1Error(error: unknown): error is GscdumpV1Error;
71
- interface GscdumpV1Client {
72
- execute: <TId extends GscdumpV1OperationId>(operation: TId, input: NoInfer<GscdumpV1OperationInput<TId>>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<TId>>;
73
- getUserLifecycle: (input: GscdumpV1OperationInput<'partner.users.lifecycle.get'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.users.lifecycle.get'>>;
74
- listAvailableSites: (input: GscdumpV1OperationInput<'partner.users.sites.available.list'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.users.sites.available.list'>>;
75
- createSite: (input: GscdumpV1OperationInput<'partner.users.sites.create'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.users.sites.create'>>;
76
- createUser: (input: GscdumpV1OperationInput<'partner.users.create'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.users.create'>>;
77
- updateUserTokens: (input: GscdumpV1OperationInput<'partner.users.tokens.update'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.users.tokens.update'>>;
78
- getSiteIndexing: (input: GscdumpV1OperationInput<'partner.sites.indexing.get'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.sites.indexing.get'>>;
79
- listSiteIndexingUrls: (input: GscdumpV1OperationInput<'partner.sites.indexing.urls.list'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.sites.indexing.urls.list'>>;
80
- getSiteIndexingDiagnostics: (input: GscdumpV1OperationInput<'partner.sites.indexing.diagnostics.get'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.sites.indexing.diagnostics.get'>>;
81
- getSiteSitemaps: (input: GscdumpV1OperationInput<'partner.sites.sitemaps.get'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.sites.sitemaps.get'>>;
82
- getSiteSitemapChanges: (input: GscdumpV1OperationInput<'partner.sites.sitemaps.changes.get'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.sites.sitemaps.changes.get'>>;
83
- getSiteAnalysis: (input: GscdumpV1OperationInput<'partner.sites.analysis.get'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.sites.analysis.get'>>;
84
- getSiteAnalysisBundle: (input: GscdumpV1OperationInput<'partner.sites.analysis.bundle.get'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.sites.analysis.bundle.get'>>;
85
- deleteSite: (input: GscdumpV1OperationInput<'partner.sites.delete'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.sites.delete'>>;
86
- getCanonicalMismatches: (input: GscdumpV1OperationInput<'partner.sites.canonical.mismatches.get'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.sites.canonical.mismatches.get'>>;
87
- inspectSiteUrls: (input: GscdumpV1OperationInput<'partner.sites.indexing.inspect.create'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.sites.indexing.inspect.create'>>;
88
- recoverSitePermission: (input: GscdumpV1OperationInput<'partner.sites.permission.recover'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.sites.permission.recover'>>;
89
- queryKeywordSparklines: (input: GscdumpV1OperationInput<'partner.sites.keyword.sparklines.query'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.sites.keyword.sparklines.query'>>;
90
- getQueryTrend: (input: GscdumpV1OperationInput<'partner.sites.query.trend.get'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.sites.query.trend.get'>>;
91
- getPageTrend: (input: GscdumpV1OperationInput<'partner.sites.page.trend.get'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.sites.page.trend.get'>>;
92
- getContentVelocity: (input: GscdumpV1OperationInput<'partner.sites.content.velocity.get'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.sites.content.velocity.get'>>;
93
- getCtrCurve: (input: GscdumpV1OperationInput<'partner.sites.ctr.curve.get'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.sites.ctr.curve.get'>>;
94
- getDarkTraffic: (input: GscdumpV1OperationInput<'partner.sites.dark.traffic.get'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.sites.dark.traffic.get'>>;
95
- getDeviceGap: (input: GscdumpV1OperationInput<'partner.sites.device.gap.get'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.sites.device.gap.get'>>;
96
- getKeywordBreadth: (input: GscdumpV1OperationInput<'partner.sites.keyword.breadth.get'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.sites.keyword.breadth.get'>>;
97
- getPositionDistribution: (input: GscdumpV1OperationInput<'partner.sites.position.distribution.get'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.sites.position.distribution.get'>>;
98
- getTopAssociation: (input: GscdumpV1OperationInput<'partner.sites.top.association.get'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.sites.top.association.get'>>;
99
- getIndexPercent: (input: GscdumpV1OperationInput<'partner.sites.index.percent.get'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.sites.index.percent.get'>>;
100
- createSitemapAction: (input: GscdumpV1OperationInput<'partner.sites.sitemaps.action.create'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.sites.sitemaps.action.create'>>;
101
- querySitemapMembership: (input: GscdumpV1OperationInput<'partner.sites.sitemaps.membership.query'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.sites.sitemaps.membership.query'>>;
102
- createTeam: (input: GscdumpV1OperationInput<'partner.teams.create'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.teams.create'>>;
103
- renameTeam: (input: GscdumpV1OperationInput<'partner.teams.rename'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.teams.rename'>>;
104
- deleteTeam: (input: GscdumpV1OperationInput<'partner.teams.delete'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.teams.delete'>>;
105
- listTeamMembers: (input: GscdumpV1OperationInput<'partner.teams.members.list'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.teams.members.list'>>;
106
- addTeamMember: (input: GscdumpV1OperationInput<'partner.teams.members.add'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.teams.members.add'>>;
107
- updateTeamMemberRole: (input: GscdumpV1OperationInput<'partner.teams.members.role.update'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.teams.members.role.update'>>;
108
- removeTeamMember: (input: GscdumpV1OperationInput<'partner.teams.members.remove'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.teams.members.remove'>>;
109
- updateSiteTeam: (input: GscdumpV1OperationInput<'partner.sites.team.update'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.sites.team.update'>>;
110
- getTeamCatalog: (input: GscdumpV1OperationInput<'partner.teams.catalog.get'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.teams.catalog.get'>>;
111
- bindTeamCatalog: (input: GscdumpV1OperationInput<'partner.teams.catalog.bind'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.teams.catalog.bind'>>;
112
- getSiteIntIdCrosswalk: (input: GscdumpV1OperationInput<'partner.users.sites.crosswalk.get'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.users.sites.crosswalk.get'>>;
113
- deleteUser: (input: GscdumpV1OperationInput<'partner.users.delete'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.users.delete'>>;
114
- createVerificationToken: (input: GscdumpV1OperationInput<'partner.users.verification.token.create'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.users.verification.token.create'>>;
115
- addAndVerifySite: (input: GscdumpV1OperationInput<'partner.users.sites.verify.create'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.users.sites.verify.create'>>;
116
- queryCrossSource: (input: GscdumpV1OperationInput<'partner.sites.cross.source.query'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.sites.cross.source.query'>>;
117
- enrichKeywords: (input: GscdumpV1OperationInput<'partner.keywords.enrich.query'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'partner.keywords.enrich.query'>>;
118
- queryAnalyticsRows: (input: GscdumpV1OperationInput<'analytics.rows.query'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'analytics.rows.query'>>;
119
- queryAnalyticsReport: (input: GscdumpV1OperationInput<'analytics.reports.query'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'analytics.reports.query'>>;
120
- queryAnalyticsReportDetail: (input: GscdumpV1OperationInput<'analytics.reports.detail.query'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'analytics.reports.detail.query'>>;
121
- getRealtimeStreamHead: (input?: GscdumpV1OperationInput<'realtime.stream.head.get'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'realtime.stream.head.get'>>;
122
- createRealtimeTicket: (input: GscdumpV1OperationInput<'realtime.tickets.create'>, options?: GscdumpV1ExecuteOptions) => Promise<GscdumpV1OperationResponse<'realtime.tickets.create'>>;
123
- }
124
- /** Create one framework-neutral client whose behavior is driven by the v1 registry. */
125
- declare function createGscdumpV1Client(options: CreateGscdumpV1ClientOptions): GscdumpV1Client;
126
- type MaybePromise<T> = T | Promise<T>;
127
- declare const GSCDUMP_REALTIME_V1_SDK_VERSION: '1.4.0';
128
- type GscdumpRealtimeV1TransportState = 'idle' | 'ticketing' | 'connecting' | 'handshaking' | 'replaying' | 'live' | 'waiting' | 'stopped' | 'terminal';
129
- type GscdumpRealtimeV1Freshness = 'unknown' | 'stale' | 'applying' | 'fresh' | 'resyncing' | 'degraded';
130
- type GscdumpRealtimeV1ErrorCode = 'cursor_store_failed' | 'effect_failed' | 'heartbeat_stale' | 'integration_failed' | 'protocol_error' | 'resync_failed' | 'runtime_unavailable' | 'socket_error' | 'ticket_invalid' | 'ticket_provider_failed' | 'upgrade_rejected';
131
- interface GscdumpRealtimeV1ErrorOptions {
132
- code: GscdumpRealtimeV1ErrorCode;
133
- message: string;
134
- retryable: boolean;
135
- terminal: boolean;
136
- details?: Record<string, unknown>;
137
- cause?: unknown;
138
- }
139
- declare class GscdumpRealtimeV1Error extends Error {
140
- readonly tag: 'GscdumpRealtimeV1Error';
141
- readonly code: GscdumpRealtimeV1ErrorCode;
142
- readonly retryable: boolean;
143
- readonly terminal: boolean;
144
- readonly details: Record<string, unknown>;
145
- readonly cause?: unknown;
146
- constructor(options: GscdumpRealtimeV1ErrorOptions);
147
- }
148
- interface GscdumpRealtimeV1CursorStore {
149
- load: () => MaybePromise<RealtimeV1Cursor | null>;
150
- save: (cursor: RealtimeV1Cursor) => MaybePromise<void>;
151
- }
152
- interface GscdumpRealtimeV1SocketLike {
153
- readonly readyState: number;
154
- readonly protocol: string;
155
- onopen: ((event: unknown) => void) | null;
156
- onmessage: ((event: {
157
- data: unknown;
158
- }) => void) | null;
159
- onerror: ((event: unknown) => void) | null;
160
- onclose: ((event: {
161
- code?: number;
162
- reason?: string;
163
- wasClean?: boolean;
164
- }) => void) | null;
165
- send: (data: string) => void;
166
- close: (code?: number, reason?: string) => void;
167
- }
168
- interface GscdumpRealtimeV1Runtime {
169
- createSocket: (url: string, protocols: readonly string[]) => GscdumpRealtimeV1SocketLike;
170
- setTimeout: (handler: () => void, ms: number) => unknown;
171
- clearTimeout: (handle: unknown) => void;
172
- random: () => number;
173
- now: () => number;
174
- }
175
- type GscdumpRealtimeV1ResyncReason = 'cursor_expired' | 'retention_gap' | 'sequence_gap' | 'stream_mismatch' | 'initial_cursor_missing' | 'effect_application_failed';
176
- interface GscdumpRealtimeV1ResyncRequest {
177
- reason: GscdumpRealtimeV1ResyncReason;
178
- source: 'server' | 'client';
179
- streamId: RealtimeV1StreamId;
180
- previousCursor: RealtimeV1Cursor | null;
181
- resumeAfter: RealtimeV1Cursor;
182
- failedEvent?: RealtimeV1Event;
183
- cause?: unknown;
184
- }
185
- interface GscdumpRealtimeV1Snapshot {
186
- transport: GscdumpRealtimeV1TransportState;
187
- freshness: GscdumpRealtimeV1Freshness;
188
- attempt: number;
189
- streamId: RealtimeV1StreamId | null;
190
- cursor: RealtimeV1Cursor | null;
191
- head: RealtimeV1StreamHead | null;
192
- error: GscdumpRealtimeV1Error | null;
193
- }
194
- type GscdumpRealtimeV1Observation = {
195
- type: 'state';
196
- state: GscdumpRealtimeV1Snapshot;
197
- } | {
198
- type: 'event';
199
- event: RealtimeV1Event;
200
- cursor: RealtimeV1Cursor | null;
201
- } | {
202
- type: 'error';
203
- error: GscdumpRealtimeV1Error;
204
- state: GscdumpRealtimeV1Snapshot;
205
- } | {
206
- type: 'advisory';
207
- code: 'unknown_event' | 'unknown_resource' | 'unsupported_event_version';
208
- event: RealtimeV1Event;
209
- };
210
- interface CreateGscdumpRealtimeV1ClientOptions {
211
- /** Called for every connection attempt. A ticket is never reused. */
212
- ticketProvider: () => MaybePromise<unknown>;
213
- /** Required correctness effect for each contiguous durable event. */
214
- applyEvent: (event: RealtimeV1Event) => Promise<void>;
215
- /** Required full authoritative reseed used whenever replay is unsafe. */
216
- resync: (request: GscdumpRealtimeV1ResyncRequest) => Promise<void>;
217
- cursorStore?: GscdumpRealtimeV1CursorStore;
218
- /** One isolated callback for state, event, advisory, and error observations. */
219
- onObservation?: (observation: GscdumpRealtimeV1Observation) => unknown;
220
- runtime?: GscdumpRealtimeV1Runtime;
221
- sdkVersion?: string;
222
- }
223
- interface GscdumpRealtimeV1Client {
224
- start: () => Promise<void>;
225
- stop: () => void;
226
- getSnapshot: () => GscdumpRealtimeV1Snapshot;
227
- }
228
- /**
229
- * Own the v1 cursor/ACK correctness state machine. Framework adapters provide
230
- * required effects; they never need to reproduce transport ordering rules.
231
- */
232
- declare function createGscdumpRealtimeV1Client(options: CreateGscdumpRealtimeV1ClientOptions): GscdumpRealtimeV1Client;
1
+ import { CreateGscdumpV1ClientOptions, GscdumpV1Client, GscdumpV1CredentialResolver, GscdumpV1Error, GscdumpV1ErrorOptions, GscdumpV1ExecuteOptions, GscdumpV1HeadersResolver, GscdumpV1Operation, GscdumpV1OperationId, GscdumpV1OperationInput, GscdumpV1OperationResponse, GscdumpV1RetryOptions, GscdumpV1SdkErrorCode, createGscdumpV1Client, isGscdumpV1Error } from "./http.mjs";
2
+ import { CreateGscdumpRealtimeV1ClientOptions, GSCDUMP_REALTIME_V1_SDK_VERSION, GscdumpRealtimeV1Client, GscdumpRealtimeV1CursorStore, GscdumpRealtimeV1Error, GscdumpRealtimeV1ErrorCode, GscdumpRealtimeV1ErrorOptions, GscdumpRealtimeV1Freshness, GscdumpRealtimeV1Observation, GscdumpRealtimeV1ResyncReason, GscdumpRealtimeV1ResyncRequest, GscdumpRealtimeV1Runtime, GscdumpRealtimeV1Snapshot, GscdumpRealtimeV1SocketLike, GscdumpRealtimeV1TransportState, createGscdumpRealtimeV1Client } from "./realtime.mjs";
233
3
  export { type CreateGscdumpRealtimeV1ClientOptions, type CreateGscdumpV1ClientOptions, GSCDUMP_REALTIME_V1_SDK_VERSION, type GscdumpRealtimeV1Client, type GscdumpRealtimeV1CursorStore, GscdumpRealtimeV1Error, type GscdumpRealtimeV1ErrorCode, type GscdumpRealtimeV1ErrorOptions, type GscdumpRealtimeV1Freshness, type GscdumpRealtimeV1Observation, type GscdumpRealtimeV1ResyncReason, type GscdumpRealtimeV1ResyncRequest, type GscdumpRealtimeV1Runtime, type GscdumpRealtimeV1Snapshot, type GscdumpRealtimeV1SocketLike, type GscdumpRealtimeV1TransportState, type GscdumpV1Client, type GscdumpV1CredentialResolver, GscdumpV1Error, type GscdumpV1ErrorOptions, type GscdumpV1ExecuteOptions, type GscdumpV1HeadersResolver, type GscdumpV1Operation, type GscdumpV1OperationId, type GscdumpV1OperationInput, type GscdumpV1OperationResponse, type GscdumpV1RetryOptions, type GscdumpV1SdkErrorCode, createGscdumpRealtimeV1Client, createGscdumpV1Client, isGscdumpV1Error };