@gibwork/sdk 0.0.6 → 0.1.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/CHANGELOG.md +7 -0
- package/README.md +85 -1
- package/dist/{chunk-3MLFNEQ5.js → chunk-HJ5D5SOE.js} +310 -37
- package/dist/chunk-HJ5D5SOE.js.map +1 -0
- package/dist/index.cjs +310 -34
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +130 -3
- package/dist/index.d.ts +130 -3
- package/dist/index.js +1 -1
- package/dist/node.cjs +310 -34
- package/dist/node.cjs.map +1 -1
- package/dist/node.d.cts +1 -1
- package/dist/node.d.ts +1 -1
- package/dist/node.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-3MLFNEQ5.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/errors/index.ts","../src/auth/validation.ts","../src/auth/sanitize.ts","../src/auth/normalize.ts","../src/auth/wallet-auth.ts","../src/resources/submissions/submission-intent.ts","../src/transactions/sign-prepared-transaction.ts","../src/resources/submissions/submission-comments-resource.ts","../src/resources/submissions/submissions-resource.ts","../src/resources/tasks/tasks-resource.ts","../src/transport/http-transport.ts","../src/client/gibwork-client.ts"],"names":["assertNotAborted"],"mappings":"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","file":"chunk-HJ5D5SOE.js","sourcesContent":["const FALLBACK_GIBWORK_API_URL = 'https://sdk.gib.work';\n\n/** The API origin embedded when this package was built. */\nexport const DEFAULT_GIBWORK_API_URL =\n process.env.GIBWORK_SDK_API_URL?.trim() || FALLBACK_GIBWORK_API_URL;\n","export class GibworkError extends Error {\n override readonly name: string = 'GibworkError';\n}\n\nexport class GibworkConfigurationError extends GibworkError {\n override readonly name: string = 'GibworkConfigurationError';\n}\n\nexport class GibworkApiError extends GibworkError {\n override readonly name: string = 'GibworkApiError';\n\n constructor(\n public readonly status: number,\n public readonly body: unknown,\n public readonly method: string,\n public readonly path: string,\n public readonly requestId?: string,\n public readonly retryAfter?: string,\n ) {\n super(`Gibwork API request failed with HTTP ${status}`);\n }\n}\n\nexport class GibworkNetworkError extends GibworkError {\n override readonly name: string = 'GibworkNetworkError';\n\n constructor(\n message: string,\n public readonly method: string,\n public readonly path: string,\n options?: ErrorOptions,\n ) {\n super(message, options);\n }\n}\n\nexport class GibworkTimeoutError extends GibworkNetworkError {\n override readonly name: string = 'GibworkTimeoutError';\n\n constructor(\n method: string,\n path: string,\n public readonly timeoutMs: number,\n options?: ErrorOptions,\n ) {\n super(\n `Gibwork API request timed out after ${timeoutMs}ms`,\n method,\n path,\n options,\n );\n }\n}\n\nexport class GibworkRequestAbortedError extends GibworkNetworkError {\n override readonly name: string = 'GibworkRequestAbortedError';\n\n constructor(method: string, path: string, options?: ErrorOptions) {\n super('Gibwork API request was aborted', method, path, options);\n }\n}\n\nexport type SubmitOperation =\n 'create-task' | 'refund-task' | 'approve-submission' | 'create-submission';\n\nexport interface AmbiguousSubmitContext {\n operation: SubmitOperation;\n taskId?: string;\n submissionId?: string;\n intentId: string;\n paymentAttemptId?: string;\n idempotencyKey?: string;\n walletAddress?: string;\n environment?: 'stage' | 'prod';\n apiUrl?: string;\n}\n\nexport class GibworkAmbiguousSubmitError extends GibworkNetworkError {\n override readonly name: string = 'GibworkAmbiguousSubmitError';\n\n constructor(\n method: string,\n path: string,\n public readonly context: AmbiguousSubmitContext,\n options?: ErrorOptions,\n ) {\n super(\n 'The transaction submit outcome is unknown; do not submit the same intent again',\n method,\n path,\n options,\n );\n }\n}\n\nexport class GibworkValidationError extends GibworkError {\n override readonly name: string = 'GibworkValidationError';\n}\n\nexport class GibworkProtocolError extends GibworkError {\n override readonly name: string = 'GibworkProtocolError';\n}\n\nexport interface SubmissionRecoveryContext {\n taskId: string;\n idempotencyKey: string;\n walletAddress: string;\n environment: 'stage' | 'prod';\n apiUrl: string;\n phase: 'prepare' | 'sign' | 'submit';\n intentId?: string;\n paymentAttemptId?: string;\n submissionId?: string;\n}\n\n/** Retains identifiers when creation stops, including before any payment is sent. */\nexport class GibworkSubmissionOperationError extends GibworkError {\n override readonly name: string = 'GibworkSubmissionOperationError';\n\n constructor(\n public readonly context: SubmissionRecoveryContext,\n options?: ErrorOptions,\n ) {\n super(\n 'Submission creation interrupted; recover using the original input/key or intent',\n options,\n );\n }\n}\n","import { GibworkValidationError } from '../errors/index.js';\n\nconst UUID =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\nconst UUID_V4 =\n /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function assertObjectKeys(value: unknown, keys: string[]): void {\n if (\n !isRecord(value) ||\n Object.keys(value).some((key) => !keys.includes(key))\n ) {\n throw new GibworkValidationError(\n `Expected an object containing only: ${keys.join(', ')}`,\n );\n }\n}\n\nexport function isUuid(value: unknown, v4 = false): value is string {\n return typeof value === 'string' && (v4 ? UUID_V4 : UUID).test(value);\n}\n\nexport function assertUuid(\n value: unknown,\n name: string,\n v4 = false,\n): asserts value is string {\n if (!isUuid(value, v4))\n throw new GibworkValidationError(`${name} must be a UUID${v4 ? 'v4' : ''}`);\n}\n\nexport function assertText(\n value: unknown,\n name: string,\n min: number,\n max: number,\n): asserts value is string {\n if (\n typeof value !== 'string' ||\n Array.from(value).length < min ||\n Array.from(value).length > max\n ) {\n throw new GibworkValidationError(\n `${name} must contain ${min}–${max} characters`,\n );\n }\n}\n","import sanitizeHtml from 'sanitize-html';\n\nconst HTML_SANITIZE_OPTIONS: sanitizeHtml.IOptions = {\n allowedTags: sanitizeHtml.defaults.allowedTags.concat(['img']),\n allowedAttributes: {\n ...sanitizeHtml.defaults.allowedAttributes,\n '*': ['class', 'id', 'style', 'data-type'],\n a: ['href', 'name', 'target'],\n img: [\n 'src',\n 'srcset',\n 'alt',\n 'title',\n 'limit',\n 'width',\n 'height',\n 'loading',\n 'maxSize',\n 'fileid',\n ],\n },\n transformTags: {\n a: (tagName, attributes) => {\n if (isAllowedExternalUrl(attributes.href)) {\n return { tagName, attribs: attributes };\n }\n\n const safeAttributes = { ...attributes };\n delete safeAttributes.href;\n return { tagName: 'span', attribs: safeAttributes };\n },\n },\n};\n\nexport function sanitizeContent(content: string): string {\n return sanitizeHtml(content, HTML_SANITIZE_OPTIONS).trim();\n}\n\nfunction isAllowedExternalUrl(value?: string): boolean {\n if (!value) return false;\n const normalized = value.toLowerCase().startsWith('www.')\n ? `https://${value}`\n : value;\n\n try {\n const url = new URL(normalized);\n return (\n (url.protocol === 'http:' || url.protocol === 'https:') &&\n Boolean(url.hostname) &&\n !url.username &&\n !url.password\n );\n } catch {\n return false;\n }\n}\n","import { createHash } from 'node:crypto';\n\nimport type {\n ApproveSubmissionInput,\n AvailableTasksQuery,\n CreateSubmissionInput,\n CreateTaskInput,\n PaginationQuery,\n SubmissionPaginationQuery,\n UpdateTaskInput,\n} from '../types/index.js';\nimport { GibworkValidationError } from '../errors/index.js';\nimport { assertObjectKeys, assertUuid, assertText } from './validation.js';\nimport { sanitizeContent } from './sanitize.js';\n\nexport interface NormalizedCreateTaskBody extends CreateTaskInput {\n walletAddress: string;\n deadline: string | null;\n allowOnlyVerifiedSubmissions: boolean;\n}\n\nexport interface NormalizedUpdateTaskBody extends UpdateTaskInput {\n walletAddress: string;\n}\n\nexport function normalizeCreateTask(\n input: CreateTaskInput,\n walletAddress: string,\n): NormalizedCreateTaskBody {\n const normalized: NormalizedCreateTaskBody = {\n walletAddress: walletAddress.trim(),\n title: input.title.trim(),\n content: sanitizeContent(input.content),\n tags: input.tags.map((tag) => tag.trim()),\n payment: {\n mintAddress: input.payment.mintAddress.trim(),\n amount: input.payment.amount.trim(),\n },\n minSubmissionAmount: input.minSubmissionAmount.trim(),\n deadline: input.deadline ?? null,\n allowOnlyVerifiedSubmissions: input.allowOnlyVerifiedSubmissions ?? false,\n };\n\n const primarySkillSlug = trimOptional(input.primarySkillSlug)?.toLowerCase();\n if (primarySkillSlug !== undefined && primarySkillSlug !== null) {\n normalized.primarySkillSlug = primarySkillSlug;\n }\n\n if (\n input.refundFeeOverride !== undefined &&\n input.refundFeeOverride !== null\n ) {\n normalized.refundFeeOverride = input.refundFeeOverride;\n }\n\n if (input.allowOnlyDiscordGuildSubmissions !== undefined) {\n normalized.allowOnlyDiscordGuildSubmissions =\n input.allowOnlyDiscordGuildSubmissions;\n }\n\n const requiredDiscordGuildId = trimOptional(input.requiredDiscordGuildId);\n if (requiredDiscordGuildId !== undefined) {\n normalized.requiredDiscordGuildId = requiredDiscordGuildId;\n }\n\n const requiredDiscordGuildName = trimOptional(input.requiredDiscordGuildName);\n if (requiredDiscordGuildName !== undefined) {\n normalized.requiredDiscordGuildName = requiredDiscordGuildName;\n }\n\n const discordGuildInvitationUrl = trimOptional(\n input.discordGuildInvitationUrl,\n );\n if (discordGuildInvitationUrl !== undefined) {\n normalized.discordGuildInvitationUrl = discordGuildInvitationUrl;\n }\n\n if (input.requiredDiscordRoleIds !== undefined) {\n const roles = input.requiredDiscordRoleIds\n .map((role) => role.trim())\n .filter(Boolean);\n if (roles.length > 0) normalized.requiredDiscordRoleIds = roles;\n }\n\n return normalized;\n}\n\nexport function normalizeUpdateTask(\n input: UpdateTaskInput,\n walletAddress: string,\n): NormalizedUpdateTaskBody {\n const normalized: NormalizedUpdateTaskBody = {\n walletAddress: walletAddress.trim(),\n };\n\n if (input.content !== undefined) {\n normalized.content = sanitizeContent(input.content);\n }\n if (input.allowOnlyVerifiedSubmissions !== undefined) {\n normalized.allowOnlyVerifiedSubmissions =\n input.allowOnlyVerifiedSubmissions;\n }\n if (input.deadline !== undefined) {\n normalized.deadline = input.deadline.trim();\n }\n\n return normalized;\n}\n\nexport function normalizeTaskPagination(query: PaginationQuery = {}): {\n page: number;\n limit: number;\n pageAll: boolean;\n} {\n return {\n page: query.page ?? 1,\n limit: query.limit ?? 15,\n pageAll: query.pageAll ?? false,\n };\n}\n\nexport function normalizeSubmissionPagination(\n query: SubmissionPaginationQuery = {},\n): {\n page: number;\n limit: number;\n pageAll: boolean;\n status: SubmissionPaginationQuery['status'] | null;\n} {\n return {\n page: query.page ?? 1,\n limit: query.limit ?? 15,\n pageAll: query.pageAll ?? false,\n status: query.status ?? null,\n };\n}\n\nexport function normalizeApproval(\n input: ApproveSubmissionInput,\n walletAddress: string,\n): { walletAddress: string; amount: string; rating?: number } {\n const normalized: {\n walletAddress: string;\n amount: string;\n rating?: number;\n } = {\n walletAddress,\n amount: input.amount.trim(),\n };\n\n if (input.rating !== undefined) normalized.rating = input.rating;\n return normalized;\n}\n\nexport function normalizeRejection(\n reason: string | null | undefined,\n walletAddress: string,\n): { walletAddress: string; rejectReason: string | null } {\n return {\n walletAddress,\n rejectReason: typeof reason === 'string' ? reason.trim() : (reason ?? null),\n };\n}\n\nexport function normalizeComment(\n content: string,\n walletAddress: string,\n): { walletAddress: string; content: string } {\n return {\n walletAddress,\n content: sanitizeContent(content),\n };\n}\n\nexport function sha256Json(value: unknown): string {\n return createHash('sha256')\n .update(JSON.stringify(value), 'utf8')\n .digest('hex');\n}\n\nexport function toQueryString(values: Record<string, unknown>): string {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(values)) {\n if (value !== undefined && value !== null) query.set(key, String(value));\n }\n return query.toString();\n}\n\nfunction trimOptional(\n value: string | null | undefined,\n): string | null | undefined {\n if (typeof value !== 'string') return value;\n const trimmed = value.trim();\n return trimmed === '' ? undefined : trimmed;\n}\n\nexport function normalizeAvailableTasksQuery(\n query: AvailableTasksQuery = {},\n): Required<AvailableTasksQuery> {\n assertObjectKeys(query, ['page', 'limit']);\n const page = query.page === undefined ? 1 : query.page;\n const limit = query.limit === undefined ? 15 : query.limit;\n if (\n !Number.isSafeInteger(page) ||\n page < 1 ||\n !Number.isSafeInteger(limit) ||\n limit < 1 ||\n limit > 100 ||\n !Number.isSafeInteger((page - 1) * limit)\n ) {\n throw new GibworkValidationError(\n 'page must be a positive safe integer, limit must be 1–100, and the offset must be safe',\n );\n }\n return { page, limit };\n}\n\nexport function normalizeCreateSubmission(\n input: CreateSubmissionInput,\n walletAddress: string,\n) {\n assertObjectKeys(input, [\n 'content',\n 'referral',\n 'mediaIds',\n 'idempotencyKey',\n ]);\n assertText(input.content, 'content', 1, 50000);\n if (input.referral != null) assertText(input.referral, 'referral', 0, 200);\n assertUuid(input.idempotencyKey, 'idempotencyKey', true);\n const mediaIds = input.mediaIds ?? [];\n if (\n !Array.isArray(mediaIds) ||\n mediaIds.length > 10 ||\n new Set(mediaIds).size !== mediaIds.length\n ) {\n throw new GibworkValidationError(\n 'mediaIds must contain at most ten distinct UUIDv4 values',\n );\n }\n for (const id of mediaIds) assertUuid(id, 'mediaIds', true);\n // Insertion order and raw content are part of the signed contract.\n return {\n walletAddress,\n content: input.content,\n referral: input.referral ?? null,\n mediaIds: [...mediaIds],\n idempotencyKey: input.idempotencyKey,\n };\n}\n","import { randomUUID } from 'node:crypto';\n\nimport { GibworkConfigurationError } from '../errors/index.js';\nimport type { WalletSigner } from '../signers/wallet-signer.js';\n\nexport interface WalletAuthDescriptor {\n operation: string;\n method: 'GET' | 'POST' | 'PATCH';\n path: string;\n resourceFields?: ReadonlyArray<readonly [name: string, value: string]>;\n hash: readonly [name: 'payloadHash' | 'queryHash', value: string];\n}\n\ninterface WalletAuthValues {\n walletAddress: string;\n timestamp: string;\n nonce: string;\n}\n\ninterface WalletAuthDependencies {\n now?: () => number;\n nonce?: () => string;\n}\n\nexport async function createWalletAuthHeaders(\n signer: WalletSigner,\n descriptor: WalletAuthDescriptor,\n dependencies: WalletAuthDependencies = {},\n): Promise<Record<string, string>> {\n const values: WalletAuthValues = {\n walletAddress: signer.publicKey.toBase58(),\n timestamp: Math.floor(\n (dependencies.now?.() ?? Date.now()) / 1000,\n ).toString(),\n nonce: dependencies.nonce?.() ?? randomUUID(),\n };\n const message = buildWalletAuthMessage(descriptor, values);\n const signature = await signer.signMessage(new TextEncoder().encode(message));\n\n if (!(signature instanceof Uint8Array) || signature.length !== 64) {\n throw new GibworkConfigurationError(\n 'WalletSigner.signMessage must return a 64-byte Ed25519 signature',\n );\n }\n\n return {\n 'x-gibwork-wallet-address': values.walletAddress,\n 'x-gibwork-timestamp': values.timestamp,\n 'x-gibwork-nonce': values.nonce,\n 'x-gibwork-signature': Buffer.from(signature).toString('base64'),\n };\n}\n\nexport function buildWalletAuthMessage(\n descriptor: WalletAuthDescriptor,\n values: WalletAuthValues,\n): string {\n return [\n descriptor.operation,\n `method:${descriptor.method}`,\n `path:${descriptor.path}`,\n ...(descriptor.resourceFields ?? []).map(\n ([name, value]) => `${name}:${value}`,\n ),\n `walletAddress:${values.walletAddress}`,\n `timestamp:${values.timestamp}`,\n `nonce:${values.nonce}`,\n `${descriptor.hash[0]}:${descriptor.hash[1]}`,\n ].join('\\n');\n}\n","import { assertUuid, isRecord, isUuid } from '../../auth/validation.js';\nimport { GibworkProtocolError } from '../../errors/index.js';\n\nexport function submissionIntentPath(\n taskId: string,\n intentId?: string,\n): string {\n assertUuid(taskId, 'taskId');\n if (intentId !== undefined) assertUuid(intentId, 'intentId');\n return `/v2/int/tasks/${taskId}/submission-intents${intentId === undefined ? '' : `/${intentId}`}`;\n}\n\nconst statuses = [\n 'pending',\n 'submitted',\n 'fulfilled',\n 'failed',\n 'expired',\n 'requires_review',\n];\nconst nonempty = (value: unknown): value is string =>\n typeof value === 'string' && value.length > 0;\nconst decimal = (value: unknown): boolean =>\n typeof value === 'string' && /^\\d+(\\.\\d+)?$/.test(value);\nconst natural = (value: unknown): boolean =>\n typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;\nconst sameId = (value: string, expected: string): boolean =>\n value.toLowerCase() === expected.toLowerCase();\n\n/** Validate before a response can drive signing or be reported as fulfillment. */\nexport function validateSubmissionIntent(\n value: unknown,\n taskId: string,\n intentId?: string,\n paymentAttemptId?: string,\n): void {\n if (\n !isRecord(value) ||\n !isUuid(value.intentId) ||\n !isUuid(value.taskId) ||\n !isUuid(value.taskSubmissionId) ||\n !isUuid(value.paymentAttemptId, true) ||\n !sameId(value.taskId, taskId) ||\n (intentId !== undefined && !sameId(value.intentId, intentId)) ||\n (paymentAttemptId !== undefined &&\n !sameId(value.paymentAttemptId, paymentAttemptId)) ||\n typeof value.status !== 'string' ||\n !statuses.includes(value.status) ||\n !(value.txHash === null || nonempty(value.txHash)) ||\n !nonempty(value.expiresAt) ||\n !Number.isFinite(Date.parse(value.expiresAt)) ||\n !natural(value.lastValidBlockHeight) ||\n (value.reviewReason !== undefined &&\n typeof value.reviewReason !== 'string') ||\n (value.serializedTransaction !== undefined &&\n !nonempty(value.serializedTransaction)) ||\n !isRecord(value.fee) ||\n !decimal(value.fee.amount) ||\n !decimal(value.fee.totalDebit) ||\n typeof value.fee.amountBaseUnits !== 'string' ||\n !/^\\d+$/.test(value.fee.amountBaseUnits) ||\n value.fee.symbol !== 'USDC' ||\n !natural(value.fee.decimals) ||\n !nonempty(value.fee.mintAddress) ||\n !nonempty(value.fee.destinationAddress)\n ) {\n // Never put a response/transaction in the error message.\n throw new GibworkProtocolError('Invalid submission intent response');\n }\n}\n","import { VersionedTransaction } from '@solana/web3.js';\n\nimport { GibworkConfigurationError } from '../errors/index.js';\nimport type { WalletSigner } from '../signers/wallet-signer.js';\n\nexport async function signPreparedTransaction(\n serializedTransaction: string,\n signer: WalletSigner,\n): Promise<string> {\n if (typeof serializedTransaction !== 'string' || !serializedTransaction) {\n throw new GibworkConfigurationError(\n 'serializedTransaction must be a non-empty base64 string',\n );\n }\n\n let transaction: VersionedTransaction;\n try {\n transaction = VersionedTransaction.deserialize(\n Buffer.from(serializedTransaction, 'base64'),\n );\n } catch (cause) {\n throw new GibworkConfigurationError(\n 'serializedTransaction is not a valid Solana VersionedTransaction',\n { cause },\n );\n }\n\n const signed = await signer.signTransaction(transaction);\n if (!(signed instanceof VersionedTransaction)) {\n throw new GibworkConfigurationError(\n 'WalletSigner.signTransaction must return a VersionedTransaction',\n );\n }\n\n return Buffer.from(signed.serialize()).toString('base64');\n}\n","import { normalizeComment, sha256Json } from '../../auth/normalize.js';\nimport { createWalletAuthHeaders } from '../../auth/wallet-auth.js';\nimport type { WalletSigner } from '../../signers/wallet-signer.js';\nimport type { HttpTransport } from '../../transport/http-transport.js';\nimport type { RequestOptions, SubmissionComment } from '../../types/index.js';\n\nexport class SubmissionCommentsResource {\n constructor(\n private readonly transport: HttpTransport,\n private readonly signer: WalletSigner,\n ) {}\n\n async list(\n taskId: string,\n submissionId: string,\n options?: RequestOptions,\n ): Promise<SubmissionComment[]> {\n const path = commentsPath(taskId, submissionId);\n const headers = await createWalletAuthHeaders(this.signer, {\n operation: 'gibwork:view-task-submission-comments',\n method: 'GET',\n path,\n resourceFields: [\n ['taskId', taskId],\n ['taskSubmissionId', submissionId],\n ],\n hash: ['queryHash', sha256Json({})],\n });\n\n return this.transport.request({\n method: 'GET',\n path,\n headers,\n ...(options ? { options } : {}),\n });\n }\n\n async create(\n taskId: string,\n submissionId: string,\n content: string,\n options?: RequestOptions,\n ): Promise<SubmissionComment> {\n const path = commentsPath(taskId, submissionId);\n const body = normalizeComment(content, this.signer.publicKey.toBase58());\n const headers = await createWalletAuthHeaders(this.signer, {\n operation: 'gibwork:create-task-submission-comment',\n method: 'POST',\n path,\n resourceFields: [\n ['taskId', taskId],\n ['taskSubmissionId', submissionId],\n ],\n hash: ['payloadHash', sha256Json(body)],\n });\n\n return this.transport.request({\n method: 'POST',\n path,\n headers,\n body,\n ...(options ? { options } : {}),\n });\n }\n}\n\nfunction commentsPath(taskId: string, submissionId: string): string {\n return `/v2/int/tasks/${encodeURIComponent(taskId)}/submission/${encodeURIComponent(submissionId)}/comments`;\n}\n","import {\n normalizeApproval,\n normalizeCreateSubmission,\n normalizeRejection,\n normalizeSubmissionPagination,\n sha256Json,\n toQueryString,\n} from '../../auth/normalize.js';\nimport { createWalletAuthHeaders } from '../../auth/wallet-auth.js';\nimport {\n GibworkRequestAbortedError,\n GibworkAmbiguousSubmitError,\n GibworkProtocolError,\n GibworkSubmissionOperationError,\n type SubmissionRecoveryContext,\n} from '../../errors/index.js';\nimport {\n assertObjectKeys,\n assertText,\n assertUuid,\n} from '../../auth/validation.js';\nimport {\n submissionIntentPath,\n validateSubmissionIntent,\n} from './submission-intent.js';\nimport type { WalletSigner } from '../../signers/wallet-signer.js';\nimport { signPreparedTransaction } from '../../transactions/sign-prepared-transaction.js';\nimport type { HttpTransport } from '../../transport/http-transport.js';\nimport type {\n ApprovalSubmitResult,\n CreateSubmissionInput,\n SubmitSubmissionInput,\n TaskSubmissionIntent,\n ApproveSubmissionInput,\n ApproveSubmissionResult,\n Paginated,\n PreparedApprovalIntent,\n RejectSubmissionResult,\n RequestOptions,\n SubmissionPaginationQuery,\n TaskSubmission,\n WalletTaskSubmissionDetails,\n} from '../../types/index.js';\nimport { SubmissionCommentsResource } from './submission-comments-resource.js';\n\nexport class SubmissionsResource {\n readonly comments: SubmissionCommentsResource;\n\n constructor(\n private readonly transport: HttpTransport,\n private readonly signer: WalletSigner,\n ) {\n this.comments = new SubmissionCommentsResource(transport, signer);\n }\n\n /** Creates work through a participation fee; only fulfilled confirms creation. */\n async create(\n taskId: string,\n input: CreateSubmissionInput,\n options?: RequestOptions,\n ): Promise<TaskSubmissionIntent> {\n // Snapshot input before any await and fail invalid input without an operation wrapper.\n const path = submissionIntentPath(taskId);\n const { walletAddress, ...snapshot } = normalizeCreateSubmission(\n input,\n this.walletAddress,\n );\n let context: SubmissionRecoveryContext = {\n taskId,\n idempotencyKey: snapshot.idempotencyKey,\n walletAddress,\n ...this.transport.recoveryLocation,\n phase: 'prepare',\n };\n try {\n assertNotAborted(options, path);\n const prepared = await this.prepareCreate(taskId, snapshot, options);\n context = {\n ...context,\n intentId: prepared.intentId,\n paymentAttemptId: prepared.paymentAttemptId,\n submissionId: prepared.taskSubmissionId,\n phase: 'sign',\n };\n if (prepared.status !== 'pending') return prepared;\n if (!prepared.serializedTransaction)\n throw new GibworkProtocolError(\n 'Pending prepare response is missing its transaction',\n );\n assertNotAborted(options, path);\n const signedTransaction = await signPreparedTransaction(\n prepared.serializedTransaction,\n this.signer,\n );\n assertNotAborted(options, path);\n context = { ...context, phase: 'submit' };\n return await this.submitCreate(\n taskId,\n prepared.intentId,\n { paymentAttemptId: prepared.paymentAttemptId, signedTransaction },\n options,\n );\n } catch (cause) {\n if (cause instanceof GibworkAmbiguousSubmitError) {\n throw new GibworkAmbiguousSubmitError(\n cause.method,\n cause.path,\n {\n ...cause.context,\n ...context,\n operation: 'create-submission',\n intentId: cause.context.intentId,\n },\n { cause },\n );\n }\n throw new GibworkSubmissionOperationError(context, { cause });\n }\n }\n\n /** Reuse the exact input and idempotency key after an interrupted prepare. */\n async prepareCreate(\n taskId: string,\n input: CreateSubmissionInput,\n options?: RequestOptions,\n ): Promise<TaskSubmissionIntent> {\n const path = submissionIntentPath(taskId);\n const body = normalizeCreateSubmission(input, this.walletAddress);\n assertNotAborted(options, path);\n const headers = await createWalletAuthHeaders(this.signer, {\n operation: 'gibwork:create-task-submission-intent',\n method: 'POST',\n path,\n resourceFields: [['taskId', taskId]],\n hash: ['payloadHash', sha256Json(body)],\n });\n return this.transport.request({\n method: 'POST',\n path,\n headers,\n body,\n ...(options ? { options } : {}),\n validateResponse: (value) => validateSubmissionIntent(value, taskId),\n });\n }\n\n /** Never automatically retries. Recover an uncertain payment with getIntent. */\n async submitCreate(\n taskId: string,\n intentId: string,\n input: SubmitSubmissionInput,\n options?: RequestOptions,\n ): Promise<TaskSubmissionIntent> {\n const path = `${submissionIntentPath(taskId, intentId)}/submit`;\n assertObjectKeys(input, ['paymentAttemptId', 'signedTransaction']);\n assertUuid(input.paymentAttemptId, 'paymentAttemptId', true);\n assertText(input.signedTransaction, 'signedTransaction', 1, 10000);\n const body = {\n paymentAttemptId: input.paymentAttemptId,\n signedTransaction: input.signedTransaction,\n };\n return this.transport.request({\n method: 'POST',\n path,\n body,\n ...(options ? { options } : {}),\n ambiguousSubmit: {\n operation: 'create-submission',\n taskId,\n intentId,\n paymentAttemptId: body.paymentAttemptId,\n walletAddress: this.walletAddress,\n ...this.transport.recoveryLocation,\n },\n validateResponse: (value) =>\n validateSubmissionIntent(\n value,\n taskId,\n intentId,\n body.paymentAttemptId,\n ),\n });\n }\n\n /** Reads/reconciles creation using the original wallet; does not report review/payout. */\n async getIntent(\n taskId: string,\n intentId: string,\n options?: RequestOptions,\n ): Promise<TaskSubmissionIntent> {\n const path = submissionIntentPath(taskId, intentId);\n if (options?.signal?.aborted)\n throw new GibworkRequestAbortedError('GET', path, {\n cause: options.signal.reason,\n });\n const headers = await createWalletAuthHeaders(this.signer, {\n operation: 'gibwork:view-task-submission-intent',\n method: 'GET',\n path,\n resourceFields: [\n ['taskId', taskId],\n ['intentId', intentId],\n ],\n hash: ['queryHash', sha256Json({})],\n });\n return this.transport.request({\n method: 'GET',\n path,\n headers,\n ...(options ? { options } : {}),\n validateResponse: (value) =>\n validateSubmissionIntent(value, taskId, intentId),\n });\n }\n\n async list(\n taskId: string,\n query: SubmissionPaginationQuery = {},\n options?: RequestOptions,\n ): Promise<Paginated<TaskSubmission>> {\n const normalized = normalizeSubmissionPagination(query);\n const path = `/v2/int/tasks/${encodeURIComponent(taskId)}/submissions`;\n const headers = await createWalletAuthHeaders(this.signer, {\n operation: 'gibwork:view-task-submissions',\n method: 'GET',\n path,\n resourceFields: [['taskId', taskId]],\n hash: ['queryHash', sha256Json(normalized)],\n });\n const requestQuery: Record<string, unknown> = { ...normalized };\n if (requestQuery.status === null) delete requestQuery.status;\n\n return this.transport.request({\n method: 'GET',\n path: `${path}?${toQueryString(requestQuery)}`,\n headers,\n ...(options ? { options } : {}),\n });\n }\n\n async get(\n taskId: string,\n submissionId: string,\n options?: RequestOptions,\n ): Promise<WalletTaskSubmissionDetails> {\n const path = `/v2/int/tasks/${encodeURIComponent(taskId)}/submissions/${encodeURIComponent(submissionId)}`;\n const headers = await createWalletAuthHeaders(this.signer, {\n operation: 'gibwork:view-task-submission',\n method: 'GET',\n path,\n resourceFields: [\n ['taskId', taskId],\n ['taskSubmissionId', submissionId],\n ],\n hash: ['queryHash', sha256Json({})],\n });\n\n return this.transport.request({\n method: 'GET',\n path,\n headers,\n ...(options ? { options } : {}),\n });\n }\n\n async approve(\n taskId: string,\n submissionId: string,\n input: ApproveSubmissionInput,\n options?: RequestOptions,\n ): Promise<ApproveSubmissionResult> {\n const prepared = await this.prepareApproval(\n taskId,\n submissionId,\n input,\n options,\n );\n const submitPath = approvalSubmitPath(\n taskId,\n submissionId,\n prepared.intentId,\n );\n assertNotAborted(options, submitPath);\n const signedTransaction = await signPreparedTransaction(\n prepared.serializedTransaction,\n this.signer,\n );\n assertNotAborted(options, submitPath);\n const submitted = await this.submitApproval(\n taskId,\n submissionId,\n prepared.intentId,\n signedTransaction,\n options,\n );\n\n return {\n ...submitted,\n intentId: prepared.intentId,\n lastValidBlockHeight: prepared.lastValidBlockHeight,\n approvalQuote: prepared.approvalQuote,\n };\n }\n\n async reject(\n taskId: string,\n submissionId: string,\n reason?: string | null,\n options?: RequestOptions,\n ): Promise<RejectSubmissionResult> {\n const path = `/v2/int/tasks/${encodeURIComponent(taskId)}/submission/${encodeURIComponent(submissionId)}/reject`;\n const body = normalizeRejection(reason, this.walletAddress);\n const headers = await createWalletAuthHeaders(this.signer, {\n operation: 'gibwork:reject-task-submission',\n method: 'POST',\n path,\n resourceFields: [\n ['taskId', taskId],\n ['taskSubmissionId', submissionId],\n ],\n hash: ['payloadHash', sha256Json(body)],\n });\n\n return this.transport.request({\n method: 'POST',\n path,\n headers,\n body,\n ...(options ? { options } : {}),\n });\n }\n\n async prepareApproval(\n taskId: string,\n submissionId: string,\n input: ApproveSubmissionInput,\n options?: RequestOptions,\n ): Promise<PreparedApprovalIntent> {\n const path = `/v2/int/tasks/${encodeURIComponent(taskId)}/submission/${encodeURIComponent(submissionId)}/pay`;\n const body = normalizeApproval(input, this.walletAddress);\n const headers = await createWalletAuthHeaders(this.signer, {\n operation: 'gibwork:approve-task-submission-intent',\n method: 'POST',\n path,\n resourceFields: [\n ['taskId', taskId],\n ['taskSubmissionId', submissionId],\n ],\n hash: ['payloadHash', sha256Json(body)],\n });\n\n return this.transport.request({\n method: 'POST',\n path,\n headers,\n body,\n ...(options ? { options } : {}),\n });\n }\n\n async submitApproval(\n taskId: string,\n submissionId: string,\n intentId: string,\n signedTransaction: string,\n options?: RequestOptions,\n ): Promise<ApprovalSubmitResult> {\n const path = approvalSubmitPath(taskId, submissionId, intentId);\n return this.transport.request({\n method: 'POST',\n path,\n body: { signedTransaction },\n ...(options ? { options } : {}),\n ambiguousSubmit: {\n operation: 'approve-submission',\n taskId,\n submissionId,\n intentId,\n },\n });\n }\n\n private get walletAddress(): string {\n return this.signer.publicKey.toBase58();\n }\n}\n\nfunction approvalSubmitPath(\n taskId: string,\n submissionId: string,\n intentId: string,\n): string {\n return `/v2/int/tasks/${encodeURIComponent(taskId)}/submission/${encodeURIComponent(submissionId)}/pay/${encodeURIComponent(intentId)}/submit`;\n}\n\nfunction assertNotAborted(\n options: RequestOptions | undefined,\n path: string,\n): void {\n if (options?.signal?.aborted) {\n throw new GibworkRequestAbortedError('POST', path, {\n cause: options.signal.reason,\n });\n }\n}\n","import {\n createWalletAuthHeaders,\n type WalletAuthDescriptor,\n} from '../../auth/wallet-auth.js';\nimport {\n normalizeCreateTask,\n normalizeAvailableTasksQuery,\n normalizeTaskPagination,\n normalizeUpdateTask,\n sha256Json,\n toQueryString,\n} from '../../auth/normalize.js';\nimport { GibworkRequestAbortedError } from '../../errors/index.js';\nimport type { WalletSigner } from '../../signers/wallet-signer.js';\nimport { signPreparedTransaction } from '../../transactions/sign-prepared-transaction.js';\nimport type { HttpTransport } from '../../transport/http-transport.js';\nimport type {\n CreateTaskInput,\n AvailableTasksQuery,\n AvailableTaskPage,\n CreateTaskResult,\n Paginated,\n PaginationQuery,\n PreparedRefundIntent,\n PreparedTaskIntent,\n RefundSubmitResult,\n RefundTaskResult,\n RequestOptions,\n TaskSubmitResult,\n UpdatedTask,\n UpdateTaskInput,\n WalletTaskSummary,\n} from '../../types/index.js';\n\nexport class TasksResource {\n constructor(\n private readonly transport: HttpTransport,\n private readonly signer: WalletSigner,\n ) {}\n\n async create(\n input: CreateTaskInput,\n options?: RequestOptions,\n ): Promise<CreateTaskResult> {\n const prepared = await this.prepareCreate(input, options);\n assertNotAborted(options, '/v2/int/tasks');\n const signedTransaction = await signPreparedTransaction(\n prepared.serializedTransaction,\n this.signer,\n );\n assertNotAborted(\n options,\n `/v2/int/tasks/${encodeURIComponent(prepared.intentId)}/submit`,\n );\n const submitted = await this.submitCreate(\n prepared.intentId,\n signedTransaction,\n options,\n );\n\n return {\n ...submitted,\n intentId: prepared.intentId,\n lastValidBlockHeight: prepared.lastValidBlockHeight,\n paymentQuote: prepared.paymentQuote,\n };\n }\n\n async list(\n query: PaginationQuery = {},\n options?: RequestOptions,\n ): Promise<Paginated<WalletTaskSummary>> {\n const normalized = normalizeTaskPagination(query);\n const path = '/v2/int/tasks';\n const headers = await this.auth({\n operation: 'gibwork:view-created-tasks',\n method: 'GET',\n path,\n hash: ['queryHash', sha256Json(normalized)],\n });\n\n return this.transport.request({\n method: 'GET',\n path: `${path}?${toQueryString(normalized)}`,\n headers,\n ...(options ? { options } : {}),\n });\n }\n\n /** Discover tasks across creators. Eligibility is checked when preparing work. */\n async listAvailable(\n query: AvailableTasksQuery = {},\n options?: RequestOptions,\n ): Promise<AvailableTaskPage> {\n const normalized = normalizeAvailableTasksQuery(query);\n const path = '/v2/int/tasks/available';\n const headers = await this.auth({\n operation: 'gibwork:view-available-tasks',\n method: 'GET',\n path,\n hash: ['queryHash', sha256Json(normalized)],\n });\n return this.transport.request({\n method: 'GET',\n path: `${path}?${toQueryString(normalized)}`,\n headers,\n ...(options ? { options } : {}),\n });\n }\n\n async update(\n taskId: string,\n input: UpdateTaskInput,\n options?: RequestOptions,\n ): Promise<UpdatedTask> {\n const path = `/v2/int/tasks/${encodeURIComponent(taskId)}`;\n const body = normalizeUpdateTask(input, this.walletAddress);\n if (Object.keys(body).length === 1) {\n throw new Error('At least one bounty field must be provided');\n }\n const headers = await this.auth({\n operation: 'gibwork:update-task',\n method: 'PATCH',\n path,\n resourceFields: [['taskId', taskId]],\n hash: ['payloadHash', sha256Json(body)],\n });\n\n return this.transport.request({\n method: 'PATCH',\n path,\n headers,\n body,\n ...(options ? { options } : {}),\n });\n }\n\n async refund(\n taskId: string,\n options?: RequestOptions,\n ): Promise<RefundTaskResult> {\n const prepared = await this.prepareRefund(taskId, options);\n const submitPath = `/v2/int/tasks/${encodeURIComponent(taskId)}/refund/${encodeURIComponent(prepared.intentId)}/submit`;\n assertNotAborted(options, submitPath);\n const signedTransaction = await signPreparedTransaction(\n prepared.serializedTransaction,\n this.signer,\n );\n assertNotAborted(options, submitPath);\n const submitted = await this.submitRefund(\n taskId,\n prepared.intentId,\n signedTransaction,\n options,\n );\n\n return {\n ...submitted,\n intentId: prepared.intentId,\n lastValidBlockHeight: prepared.lastValidBlockHeight,\n refundQuote: prepared.refundQuote,\n };\n }\n\n async prepareCreate(\n input: CreateTaskInput,\n options?: RequestOptions,\n ): Promise<PreparedTaskIntent> {\n const path = '/v2/int/tasks';\n const body = normalizeCreateTask(input, this.walletAddress);\n const headers = await this.auth({\n operation: 'gibwork:create-task-intent',\n method: 'POST',\n path,\n hash: ['payloadHash', sha256Json(body)],\n });\n\n return this.transport.request({\n method: 'POST',\n path,\n headers,\n body,\n ...(options ? { options } : {}),\n });\n }\n\n async submitCreate(\n intentId: string,\n signedTransaction: string,\n options?: RequestOptions,\n ): Promise<TaskSubmitResult> {\n const path = `/v2/int/tasks/${encodeURIComponent(intentId)}/submit`;\n return this.transport.request({\n method: 'POST',\n path,\n body: { signedTransaction },\n ...(options ? { options } : {}),\n ambiguousSubmit: {\n operation: 'create-task',\n intentId,\n },\n });\n }\n\n async prepareRefund(\n taskId: string,\n options?: RequestOptions,\n ): Promise<PreparedRefundIntent> {\n const path = `/v2/int/tasks/${encodeURIComponent(taskId)}/refund`;\n const body = { walletAddress: this.walletAddress };\n const headers = await this.auth({\n operation: 'gibwork:refund-task-intent',\n method: 'POST',\n path,\n resourceFields: [['taskId', taskId]],\n hash: ['payloadHash', sha256Json(body)],\n });\n\n return this.transport.request({\n method: 'POST',\n path,\n headers,\n body,\n ...(options ? { options } : {}),\n });\n }\n\n async submitRefund(\n taskId: string,\n intentId: string,\n signedTransaction: string,\n options?: RequestOptions,\n ): Promise<RefundSubmitResult> {\n const path = `/v2/int/tasks/${encodeURIComponent(taskId)}/refund/${encodeURIComponent(intentId)}/submit`;\n return this.transport.request({\n method: 'POST',\n path,\n body: { signedTransaction },\n ...(options ? { options } : {}),\n ambiguousSubmit: {\n operation: 'refund-task',\n taskId,\n intentId,\n },\n });\n }\n\n private get walletAddress(): string {\n return this.signer.publicKey.toBase58();\n }\n\n private auth(\n descriptor: WalletAuthDescriptor,\n ): Promise<Record<string, string>> {\n return createWalletAuthHeaders(this.signer, descriptor);\n }\n}\n\nfunction assertNotAborted(\n options: RequestOptions | undefined,\n path: string,\n): void {\n if (options?.signal?.aborted) {\n throw new GibworkRequestAbortedError('POST', path, {\n cause: options.signal.reason,\n });\n }\n}\n","import {\n GibworkAmbiguousSubmitError,\n GibworkApiError,\n GibworkConfigurationError,\n GibworkNetworkError,\n GibworkProtocolError,\n GibworkRequestAbortedError,\n GibworkTimeoutError,\n type AmbiguousSubmitContext,\n} from '../errors/index.js';\nimport type { RequestOptions } from '../types/index.js';\n\nexport type FetchImplementation = typeof fetch;\n\nexport interface HttpTransportOptions {\n baseUrl: string;\n fetch?: FetchImplementation;\n production?: boolean;\n timeoutMs?: number;\n}\n\nexport interface HttpRequest {\n method: 'GET' | 'POST' | 'PATCH';\n path: string;\n headers?: Record<string, string>;\n body?: unknown;\n options?: RequestOptions;\n ambiguousSubmit?: AmbiguousSubmitContext;\n validateResponse?: (body: unknown) => void;\n}\n\nexport class HttpTransport {\n private readonly baseUrl: string;\n private readonly fetchImplementation: FetchImplementation;\n private readonly production: boolean;\n private readonly timeoutMs: number;\n\n constructor(options: HttpTransportOptions) {\n this.baseUrl = normalizeBaseUrl(options.baseUrl);\n this.fetchImplementation = options.fetch ?? globalThis.fetch;\n if (\n options.production !== undefined &&\n typeof options.production !== 'boolean'\n ) {\n throw new GibworkConfigurationError('production must be a boolean');\n }\n this.production = options.production ?? false;\n this.timeoutMs = options.timeoutMs ?? 60_000;\n\n if (typeof this.fetchImplementation !== 'function') {\n throw new GibworkConfigurationError(\n 'A fetch implementation is required in this environment',\n );\n }\n if (!Number.isFinite(this.timeoutMs) || this.timeoutMs <= 0) {\n throw new GibworkConfigurationError(\n 'timeoutMs must be a positive number',\n );\n }\n }\n\n /** Recovery location without URL credentials. Retains reverse-proxy path prefixes. */\n get recoveryLocation(): { apiUrl: string; environment: 'stage' | 'prod' } {\n const url = new URL(this.baseUrl);\n url.username = '';\n url.password = '';\n return {\n apiUrl: url.toString().replace(/\\/+$/, ''),\n environment: this.production ? 'prod' : 'stage',\n };\n }\n\n async request<T>(request: HttpRequest): Promise<T> {\n const controller = new AbortController();\n const callerSignal = request.options?.signal;\n let timedOut = false;\n\n if (callerSignal?.aborted) {\n throw new GibworkRequestAbortedError(request.method, request.path, {\n cause: callerSignal.reason,\n });\n }\n\n // Serialize before dispatch: local serialization errors cannot be ambiguous.\n const headers: Record<string, string> = {\n accept: 'application/json',\n ...request.headers,\n ...(this.production ? { 'x-gibwork-environment': 'prod' } : {}),\n };\n const init: RequestInit = {\n method: request.method,\n headers,\n signal: controller.signal,\n };\n if (request.body !== undefined) {\n headers['content-type'] = 'application/json';\n init.body = JSON.stringify(request.body);\n }\n\n const abortFromCaller = (): void => controller.abort(callerSignal?.reason);\n callerSignal?.addEventListener('abort', abortFromCaller, { once: true });\n let rejectOnAbort: () => void = () => {};\n // Also bound injected fetch implementations/streams that ignore AbortSignal.\n const aborted = new Promise<never>((_, reject) => {\n rejectOnAbort = () => reject(controller.signal.reason);\n controller.signal.addEventListener('abort', rejectOnAbort, {\n once: true,\n });\n });\n const timeout = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, this.timeoutMs);\n\n try {\n const response = await Promise.race([\n this.fetchImplementation(`${this.baseUrl}${request.path}`, init),\n aborted,\n ]);\n const body = await Promise.race([parseResponseBody(response), aborted]);\n if (!response.ok) {\n throw new GibworkApiError(\n response.status,\n body,\n request.method,\n request.path,\n response.headers.get('x-request-id') ?? undefined,\n response.headers.get('retry-after') ?? undefined,\n );\n }\n request.validateResponse?.(body);\n return body as T;\n } catch (cause) {\n if (cause instanceof GibworkApiError && cause.status < 500) throw cause;\n if (request.ambiguousSubmit) {\n throw new GibworkAmbiguousSubmitError(\n request.method,\n request.path,\n request.ambiguousSubmit,\n { cause },\n );\n }\n if (\n cause instanceof GibworkApiError ||\n cause instanceof GibworkProtocolError\n )\n throw cause;\n if (timedOut) {\n throw new GibworkTimeoutError(\n request.method,\n request.path,\n this.timeoutMs,\n { cause },\n );\n }\n if (callerSignal?.aborted) {\n throw new GibworkRequestAbortedError(request.method, request.path, {\n cause,\n });\n }\n throw new GibworkNetworkError(\n 'Could not read the Gibwork API response',\n request.method,\n request.path,\n { cause },\n );\n } finally {\n clearTimeout(timeout);\n callerSignal?.removeEventListener('abort', abortFromCaller);\n controller.signal.removeEventListener('abort', rejectOnAbort);\n }\n }\n}\n\nfunction normalizeBaseUrl(value: string): string {\n if (typeof value !== 'string' || !value.trim()) {\n throw new GibworkConfigurationError('baseUrl is required');\n }\n\n let url: URL;\n try {\n url = new URL(value.trim());\n } catch (cause) {\n throw new GibworkConfigurationError('baseUrl must be a valid URL', {\n cause,\n });\n }\n\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new GibworkConfigurationError('baseUrl must use http or https');\n }\n if (url.search || url.hash) {\n throw new GibworkConfigurationError(\n 'baseUrl must not include a query string or fragment',\n );\n }\n\n return url.toString().replace(/\\/+$/, '');\n}\n\nasync function parseResponseBody(response: Response): Promise<unknown> {\n const text = await response.text();\n if (!text) return undefined;\n\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return text;\n }\n}\n","import { DEFAULT_GIBWORK_API_URL } from '../config.js';\nimport { GibworkConfigurationError } from '../errors/index.js';\nimport { SubmissionsResource } from '../resources/submissions/submissions-resource.js';\nimport { TasksResource } from '../resources/tasks/tasks-resource.js';\nimport type { WalletSigner } from '../signers/wallet-signer.js';\nimport {\n HttpTransport,\n type FetchImplementation,\n} from '../transport/http-transport.js';\n\nexport interface GibworkClientOptions {\n baseUrl?: string;\n signer: WalletSigner;\n fetch?: FetchImplementation;\n /** Routes all client requests to production when true. Defaults to stage. */\n production?: boolean;\n timeoutMs?: number;\n}\n\nexport class GibworkClient {\n readonly tasks: TasksResource;\n readonly submissions: SubmissionsResource;\n\n constructor(options: GibworkClientOptions) {\n assertSigner(options.signer);\n const transport = new HttpTransport({\n baseUrl: options.baseUrl ?? DEFAULT_GIBWORK_API_URL,\n ...(options.fetch ? { fetch: options.fetch } : {}),\n ...(options.production !== undefined\n ? { production: options.production }\n : {}),\n ...(options.timeoutMs !== undefined\n ? { timeoutMs: options.timeoutMs }\n : {}),\n });\n\n this.tasks = new TasksResource(transport, options.signer);\n this.submissions = new SubmissionsResource(transport, options.signer);\n }\n}\n\nfunction assertSigner(signer: WalletSigner): void {\n if (\n !signer ||\n typeof signer.publicKey?.toBase58 !== 'function' ||\n typeof signer.signMessage !== 'function' ||\n typeof signer.signTransaction !== 'function'\n ) {\n throw new GibworkConfigurationError(\n 'signer must provide publicKey, signMessage, and signTransaction',\n );\n }\n}\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -20,19 +20,21 @@ var GibworkConfigurationError = class extends GibworkError {
|
|
|
20
20
|
name = "GibworkConfigurationError";
|
|
21
21
|
};
|
|
22
22
|
var GibworkApiError = class extends GibworkError {
|
|
23
|
-
constructor(status, body, method, path, requestId) {
|
|
23
|
+
constructor(status, body, method, path, requestId, retryAfter) {
|
|
24
24
|
super(`Gibwork API request failed with HTTP ${status}`);
|
|
25
25
|
this.status = status;
|
|
26
26
|
this.body = body;
|
|
27
27
|
this.method = method;
|
|
28
28
|
this.path = path;
|
|
29
29
|
this.requestId = requestId;
|
|
30
|
+
this.retryAfter = retryAfter;
|
|
30
31
|
}
|
|
31
32
|
status;
|
|
32
33
|
body;
|
|
33
34
|
method;
|
|
34
35
|
path;
|
|
35
36
|
requestId;
|
|
37
|
+
retryAfter;
|
|
36
38
|
name = "GibworkApiError";
|
|
37
39
|
};
|
|
38
40
|
var GibworkNetworkError = class extends GibworkError {
|
|
@@ -77,6 +79,51 @@ var GibworkAmbiguousSubmitError = class extends GibworkNetworkError {
|
|
|
77
79
|
context;
|
|
78
80
|
name = "GibworkAmbiguousSubmitError";
|
|
79
81
|
};
|
|
82
|
+
var GibworkValidationError = class extends GibworkError {
|
|
83
|
+
name = "GibworkValidationError";
|
|
84
|
+
};
|
|
85
|
+
var GibworkProtocolError = class extends GibworkError {
|
|
86
|
+
name = "GibworkProtocolError";
|
|
87
|
+
};
|
|
88
|
+
var GibworkSubmissionOperationError = class extends GibworkError {
|
|
89
|
+
constructor(context, options) {
|
|
90
|
+
super(
|
|
91
|
+
"Submission creation interrupted; recover using the original input/key or intent",
|
|
92
|
+
options
|
|
93
|
+
);
|
|
94
|
+
this.context = context;
|
|
95
|
+
}
|
|
96
|
+
context;
|
|
97
|
+
name = "GibworkSubmissionOperationError";
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
// src/auth/validation.ts
|
|
101
|
+
var UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
102
|
+
var UUID_V4 = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
103
|
+
function isRecord(value) {
|
|
104
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
105
|
+
}
|
|
106
|
+
function assertObjectKeys(value, keys) {
|
|
107
|
+
if (!isRecord(value) || Object.keys(value).some((key) => !keys.includes(key))) {
|
|
108
|
+
throw new GibworkValidationError(
|
|
109
|
+
`Expected an object containing only: ${keys.join(", ")}`
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
function isUuid(value, v4 = false) {
|
|
114
|
+
return typeof value === "string" && (v4 ? UUID_V4 : UUID).test(value);
|
|
115
|
+
}
|
|
116
|
+
function assertUuid(value, name, v4 = false) {
|
|
117
|
+
if (!isUuid(value, v4))
|
|
118
|
+
throw new GibworkValidationError(`${name} must be a UUID${v4 ? "v4" : ""}`);
|
|
119
|
+
}
|
|
120
|
+
function assertText(value, name, min, max) {
|
|
121
|
+
if (typeof value !== "string" || Array.from(value).length < min || Array.from(value).length > max) {
|
|
122
|
+
throw new GibworkValidationError(
|
|
123
|
+
`${name} must contain ${min}\u2013${max} characters`
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
80
127
|
var HTML_SANITIZE_OPTIONS = {
|
|
81
128
|
allowedTags: sanitizeHtml__default.default.defaults.allowedTags.concat(["img"]),
|
|
82
129
|
allowedAttributes: {
|
|
@@ -231,6 +278,42 @@ function trimOptional(value) {
|
|
|
231
278
|
const trimmed = value.trim();
|
|
232
279
|
return trimmed === "" ? void 0 : trimmed;
|
|
233
280
|
}
|
|
281
|
+
function normalizeAvailableTasksQuery(query = {}) {
|
|
282
|
+
assertObjectKeys(query, ["page", "limit"]);
|
|
283
|
+
const page = query.page === void 0 ? 1 : query.page;
|
|
284
|
+
const limit = query.limit === void 0 ? 15 : query.limit;
|
|
285
|
+
if (!Number.isSafeInteger(page) || page < 1 || !Number.isSafeInteger(limit) || limit < 1 || limit > 100 || !Number.isSafeInteger((page - 1) * limit)) {
|
|
286
|
+
throw new GibworkValidationError(
|
|
287
|
+
"page must be a positive safe integer, limit must be 1\u2013100, and the offset must be safe"
|
|
288
|
+
);
|
|
289
|
+
}
|
|
290
|
+
return { page, limit };
|
|
291
|
+
}
|
|
292
|
+
function normalizeCreateSubmission(input, walletAddress) {
|
|
293
|
+
assertObjectKeys(input, [
|
|
294
|
+
"content",
|
|
295
|
+
"referral",
|
|
296
|
+
"mediaIds",
|
|
297
|
+
"idempotencyKey"
|
|
298
|
+
]);
|
|
299
|
+
assertText(input.content, "content", 1, 5e4);
|
|
300
|
+
if (input.referral != null) assertText(input.referral, "referral", 0, 200);
|
|
301
|
+
assertUuid(input.idempotencyKey, "idempotencyKey", true);
|
|
302
|
+
const mediaIds = input.mediaIds ?? [];
|
|
303
|
+
if (!Array.isArray(mediaIds) || mediaIds.length > 10 || new Set(mediaIds).size !== mediaIds.length) {
|
|
304
|
+
throw new GibworkValidationError(
|
|
305
|
+
"mediaIds must contain at most ten distinct UUIDv4 values"
|
|
306
|
+
);
|
|
307
|
+
}
|
|
308
|
+
for (const id of mediaIds) assertUuid(id, "mediaIds", true);
|
|
309
|
+
return {
|
|
310
|
+
walletAddress,
|
|
311
|
+
content: input.content,
|
|
312
|
+
referral: input.referral ?? null,
|
|
313
|
+
mediaIds: [...mediaIds],
|
|
314
|
+
idempotencyKey: input.idempotencyKey
|
|
315
|
+
};
|
|
316
|
+
}
|
|
234
317
|
async function createWalletAuthHeaders(signer, descriptor, dependencies = {}) {
|
|
235
318
|
const values = {
|
|
236
319
|
walletAddress: signer.publicKey.toBase58(),
|
|
@@ -267,6 +350,30 @@ function buildWalletAuthMessage(descriptor, values) {
|
|
|
267
350
|
`${descriptor.hash[0]}:${descriptor.hash[1]}`
|
|
268
351
|
].join("\n");
|
|
269
352
|
}
|
|
353
|
+
|
|
354
|
+
// src/resources/submissions/submission-intent.ts
|
|
355
|
+
function submissionIntentPath(taskId, intentId) {
|
|
356
|
+
assertUuid(taskId, "taskId");
|
|
357
|
+
if (intentId !== void 0) assertUuid(intentId, "intentId");
|
|
358
|
+
return `/v2/int/tasks/${taskId}/submission-intents${intentId === void 0 ? "" : `/${intentId}`}`;
|
|
359
|
+
}
|
|
360
|
+
var statuses = [
|
|
361
|
+
"pending",
|
|
362
|
+
"submitted",
|
|
363
|
+
"fulfilled",
|
|
364
|
+
"failed",
|
|
365
|
+
"expired",
|
|
366
|
+
"requires_review"
|
|
367
|
+
];
|
|
368
|
+
var nonempty = (value) => typeof value === "string" && value.length > 0;
|
|
369
|
+
var decimal = (value) => typeof value === "string" && /^\d+(\.\d+)?$/.test(value);
|
|
370
|
+
var natural = (value) => typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
|
|
371
|
+
var sameId = (value, expected) => value.toLowerCase() === expected.toLowerCase();
|
|
372
|
+
function validateSubmissionIntent(value, taskId, intentId, paymentAttemptId) {
|
|
373
|
+
if (!isRecord(value) || !isUuid(value.intentId) || !isUuid(value.taskId) || !isUuid(value.taskSubmissionId) || !isUuid(value.paymentAttemptId, true) || !sameId(value.taskId, taskId) || intentId !== void 0 && !sameId(value.intentId, intentId) || paymentAttemptId !== void 0 && !sameId(value.paymentAttemptId, paymentAttemptId) || typeof value.status !== "string" || !statuses.includes(value.status) || !(value.txHash === null || nonempty(value.txHash)) || !nonempty(value.expiresAt) || !Number.isFinite(Date.parse(value.expiresAt)) || !natural(value.lastValidBlockHeight) || value.reviewReason !== void 0 && typeof value.reviewReason !== "string" || value.serializedTransaction !== void 0 && !nonempty(value.serializedTransaction) || !isRecord(value.fee) || !decimal(value.fee.amount) || !decimal(value.fee.totalDebit) || typeof value.fee.amountBaseUnits !== "string" || !/^\d+$/.test(value.fee.amountBaseUnits) || value.fee.symbol !== "USDC" || !natural(value.fee.decimals) || !nonempty(value.fee.mintAddress) || !nonempty(value.fee.destinationAddress)) {
|
|
374
|
+
throw new GibworkProtocolError("Invalid submission intent response");
|
|
375
|
+
}
|
|
376
|
+
}
|
|
270
377
|
async function signPreparedTransaction(serializedTransaction, signer) {
|
|
271
378
|
if (typeof serializedTransaction !== "string" || !serializedTransaction) {
|
|
272
379
|
throw new GibworkConfigurationError(
|
|
@@ -356,6 +463,142 @@ var SubmissionsResource = class {
|
|
|
356
463
|
transport;
|
|
357
464
|
signer;
|
|
358
465
|
comments;
|
|
466
|
+
/** Creates work through a participation fee; only fulfilled confirms creation. */
|
|
467
|
+
async create(taskId, input, options) {
|
|
468
|
+
const path = submissionIntentPath(taskId);
|
|
469
|
+
const { walletAddress, ...snapshot } = normalizeCreateSubmission(
|
|
470
|
+
input,
|
|
471
|
+
this.walletAddress
|
|
472
|
+
);
|
|
473
|
+
let context = {
|
|
474
|
+
taskId,
|
|
475
|
+
idempotencyKey: snapshot.idempotencyKey,
|
|
476
|
+
walletAddress,
|
|
477
|
+
...this.transport.recoveryLocation,
|
|
478
|
+
phase: "prepare"
|
|
479
|
+
};
|
|
480
|
+
try {
|
|
481
|
+
assertNotAborted(options, path);
|
|
482
|
+
const prepared = await this.prepareCreate(taskId, snapshot, options);
|
|
483
|
+
context = {
|
|
484
|
+
...context,
|
|
485
|
+
intentId: prepared.intentId,
|
|
486
|
+
paymentAttemptId: prepared.paymentAttemptId,
|
|
487
|
+
submissionId: prepared.taskSubmissionId,
|
|
488
|
+
phase: "sign"
|
|
489
|
+
};
|
|
490
|
+
if (prepared.status !== "pending") return prepared;
|
|
491
|
+
if (!prepared.serializedTransaction)
|
|
492
|
+
throw new GibworkProtocolError(
|
|
493
|
+
"Pending prepare response is missing its transaction"
|
|
494
|
+
);
|
|
495
|
+
assertNotAborted(options, path);
|
|
496
|
+
const signedTransaction = await signPreparedTransaction(
|
|
497
|
+
prepared.serializedTransaction,
|
|
498
|
+
this.signer
|
|
499
|
+
);
|
|
500
|
+
assertNotAborted(options, path);
|
|
501
|
+
context = { ...context, phase: "submit" };
|
|
502
|
+
return await this.submitCreate(
|
|
503
|
+
taskId,
|
|
504
|
+
prepared.intentId,
|
|
505
|
+
{ paymentAttemptId: prepared.paymentAttemptId, signedTransaction },
|
|
506
|
+
options
|
|
507
|
+
);
|
|
508
|
+
} catch (cause) {
|
|
509
|
+
if (cause instanceof GibworkAmbiguousSubmitError) {
|
|
510
|
+
throw new GibworkAmbiguousSubmitError(
|
|
511
|
+
cause.method,
|
|
512
|
+
cause.path,
|
|
513
|
+
{
|
|
514
|
+
...cause.context,
|
|
515
|
+
...context,
|
|
516
|
+
operation: "create-submission",
|
|
517
|
+
intentId: cause.context.intentId
|
|
518
|
+
},
|
|
519
|
+
{ cause }
|
|
520
|
+
);
|
|
521
|
+
}
|
|
522
|
+
throw new GibworkSubmissionOperationError(context, { cause });
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
/** Reuse the exact input and idempotency key after an interrupted prepare. */
|
|
526
|
+
async prepareCreate(taskId, input, options) {
|
|
527
|
+
const path = submissionIntentPath(taskId);
|
|
528
|
+
const body = normalizeCreateSubmission(input, this.walletAddress);
|
|
529
|
+
assertNotAborted(options, path);
|
|
530
|
+
const headers = await createWalletAuthHeaders(this.signer, {
|
|
531
|
+
operation: "gibwork:create-task-submission-intent",
|
|
532
|
+
method: "POST",
|
|
533
|
+
path,
|
|
534
|
+
resourceFields: [["taskId", taskId]],
|
|
535
|
+
hash: ["payloadHash", sha256Json(body)]
|
|
536
|
+
});
|
|
537
|
+
return this.transport.request({
|
|
538
|
+
method: "POST",
|
|
539
|
+
path,
|
|
540
|
+
headers,
|
|
541
|
+
body,
|
|
542
|
+
...options ? { options } : {},
|
|
543
|
+
validateResponse: (value) => validateSubmissionIntent(value, taskId)
|
|
544
|
+
});
|
|
545
|
+
}
|
|
546
|
+
/** Never automatically retries. Recover an uncertain payment with getIntent. */
|
|
547
|
+
async submitCreate(taskId, intentId, input, options) {
|
|
548
|
+
const path = `${submissionIntentPath(taskId, intentId)}/submit`;
|
|
549
|
+
assertObjectKeys(input, ["paymentAttemptId", "signedTransaction"]);
|
|
550
|
+
assertUuid(input.paymentAttemptId, "paymentAttemptId", true);
|
|
551
|
+
assertText(input.signedTransaction, "signedTransaction", 1, 1e4);
|
|
552
|
+
const body = {
|
|
553
|
+
paymentAttemptId: input.paymentAttemptId,
|
|
554
|
+
signedTransaction: input.signedTransaction
|
|
555
|
+
};
|
|
556
|
+
return this.transport.request({
|
|
557
|
+
method: "POST",
|
|
558
|
+
path,
|
|
559
|
+
body,
|
|
560
|
+
...options ? { options } : {},
|
|
561
|
+
ambiguousSubmit: {
|
|
562
|
+
operation: "create-submission",
|
|
563
|
+
taskId,
|
|
564
|
+
intentId,
|
|
565
|
+
paymentAttemptId: body.paymentAttemptId,
|
|
566
|
+
walletAddress: this.walletAddress,
|
|
567
|
+
...this.transport.recoveryLocation
|
|
568
|
+
},
|
|
569
|
+
validateResponse: (value) => validateSubmissionIntent(
|
|
570
|
+
value,
|
|
571
|
+
taskId,
|
|
572
|
+
intentId,
|
|
573
|
+
body.paymentAttemptId
|
|
574
|
+
)
|
|
575
|
+
});
|
|
576
|
+
}
|
|
577
|
+
/** Reads/reconciles creation using the original wallet; does not report review/payout. */
|
|
578
|
+
async getIntent(taskId, intentId, options) {
|
|
579
|
+
const path = submissionIntentPath(taskId, intentId);
|
|
580
|
+
if (options?.signal?.aborted)
|
|
581
|
+
throw new GibworkRequestAbortedError("GET", path, {
|
|
582
|
+
cause: options.signal.reason
|
|
583
|
+
});
|
|
584
|
+
const headers = await createWalletAuthHeaders(this.signer, {
|
|
585
|
+
operation: "gibwork:view-task-submission-intent",
|
|
586
|
+
method: "GET",
|
|
587
|
+
path,
|
|
588
|
+
resourceFields: [
|
|
589
|
+
["taskId", taskId],
|
|
590
|
+
["intentId", intentId]
|
|
591
|
+
],
|
|
592
|
+
hash: ["queryHash", sha256Json({})]
|
|
593
|
+
});
|
|
594
|
+
return this.transport.request({
|
|
595
|
+
method: "GET",
|
|
596
|
+
path,
|
|
597
|
+
headers,
|
|
598
|
+
...options ? { options } : {},
|
|
599
|
+
validateResponse: (value) => validateSubmissionIntent(value, taskId, intentId)
|
|
600
|
+
});
|
|
601
|
+
}
|
|
359
602
|
async list(taskId, query = {}, options) {
|
|
360
603
|
const normalized = normalizeSubmissionPagination(query);
|
|
361
604
|
const path = `/v2/int/tasks/${encodeURIComponent(taskId)}/submissions`;
|
|
@@ -545,6 +788,23 @@ var TasksResource = class {
|
|
|
545
788
|
...options ? { options } : {}
|
|
546
789
|
});
|
|
547
790
|
}
|
|
791
|
+
/** Discover tasks across creators. Eligibility is checked when preparing work. */
|
|
792
|
+
async listAvailable(query = {}, options) {
|
|
793
|
+
const normalized = normalizeAvailableTasksQuery(query);
|
|
794
|
+
const path = "/v2/int/tasks/available";
|
|
795
|
+
const headers = await this.auth({
|
|
796
|
+
operation: "gibwork:view-available-tasks",
|
|
797
|
+
method: "GET",
|
|
798
|
+
path,
|
|
799
|
+
hash: ["queryHash", sha256Json(normalized)]
|
|
800
|
+
});
|
|
801
|
+
return this.transport.request({
|
|
802
|
+
method: "GET",
|
|
803
|
+
path: `${path}?${toQueryString(normalized)}`,
|
|
804
|
+
headers,
|
|
805
|
+
...options ? { options } : {}
|
|
806
|
+
});
|
|
807
|
+
}
|
|
548
808
|
async update(taskId, input, options) {
|
|
549
809
|
const path = `/v2/int/tasks/${encodeURIComponent(taskId)}`;
|
|
550
810
|
const body = normalizeUpdateTask(input, this.walletAddress);
|
|
@@ -690,6 +950,16 @@ var HttpTransport = class {
|
|
|
690
950
|
);
|
|
691
951
|
}
|
|
692
952
|
}
|
|
953
|
+
/** Recovery location without URL credentials. Retains reverse-proxy path prefixes. */
|
|
954
|
+
get recoveryLocation() {
|
|
955
|
+
const url = new URL(this.baseUrl);
|
|
956
|
+
url.username = "";
|
|
957
|
+
url.password = "";
|
|
958
|
+
return {
|
|
959
|
+
apiUrl: url.toString().replace(/\/+$/, ""),
|
|
960
|
+
environment: this.production ? "prod" : "stage"
|
|
961
|
+
};
|
|
962
|
+
}
|
|
693
963
|
async request(request) {
|
|
694
964
|
const controller = new AbortController();
|
|
695
965
|
const callerSignal = request.options?.signal;
|
|
@@ -699,12 +969,6 @@ var HttpTransport = class {
|
|
|
699
969
|
cause: callerSignal.reason
|
|
700
970
|
});
|
|
701
971
|
}
|
|
702
|
-
const abortFromCaller = () => controller.abort(callerSignal?.reason);
|
|
703
|
-
callerSignal?.addEventListener("abort", abortFromCaller, { once: true });
|
|
704
|
-
const timeout = setTimeout(() => {
|
|
705
|
-
timedOut = true;
|
|
706
|
-
controller.abort();
|
|
707
|
-
}, this.timeoutMs);
|
|
708
972
|
const headers = {
|
|
709
973
|
accept: "application/json",
|
|
710
974
|
...request.headers,
|
|
@@ -719,13 +983,40 @@ var HttpTransport = class {
|
|
|
719
983
|
headers["content-type"] = "application/json";
|
|
720
984
|
init.body = JSON.stringify(request.body);
|
|
721
985
|
}
|
|
722
|
-
|
|
986
|
+
const abortFromCaller = () => controller.abort(callerSignal?.reason);
|
|
987
|
+
callerSignal?.addEventListener("abort", abortFromCaller, { once: true });
|
|
988
|
+
let rejectOnAbort = () => {
|
|
989
|
+
};
|
|
990
|
+
const aborted = new Promise((_, reject) => {
|
|
991
|
+
rejectOnAbort = () => reject(controller.signal.reason);
|
|
992
|
+
controller.signal.addEventListener("abort", rejectOnAbort, {
|
|
993
|
+
once: true
|
|
994
|
+
});
|
|
995
|
+
});
|
|
996
|
+
const timeout = setTimeout(() => {
|
|
997
|
+
timedOut = true;
|
|
998
|
+
controller.abort();
|
|
999
|
+
}, this.timeoutMs);
|
|
723
1000
|
try {
|
|
724
|
-
response = await
|
|
725
|
-
`${this.baseUrl}${request.path}`,
|
|
726
|
-
|
|
727
|
-
);
|
|
1001
|
+
const response = await Promise.race([
|
|
1002
|
+
this.fetchImplementation(`${this.baseUrl}${request.path}`, init),
|
|
1003
|
+
aborted
|
|
1004
|
+
]);
|
|
1005
|
+
const body = await Promise.race([parseResponseBody(response), aborted]);
|
|
1006
|
+
if (!response.ok) {
|
|
1007
|
+
throw new GibworkApiError(
|
|
1008
|
+
response.status,
|
|
1009
|
+
body,
|
|
1010
|
+
request.method,
|
|
1011
|
+
request.path,
|
|
1012
|
+
response.headers.get("x-request-id") ?? void 0,
|
|
1013
|
+
response.headers.get("retry-after") ?? void 0
|
|
1014
|
+
);
|
|
1015
|
+
}
|
|
1016
|
+
request.validateResponse?.(body);
|
|
1017
|
+
return body;
|
|
728
1018
|
} catch (cause) {
|
|
1019
|
+
if (cause instanceof GibworkApiError && cause.status < 500) throw cause;
|
|
729
1020
|
if (request.ambiguousSubmit) {
|
|
730
1021
|
throw new GibworkAmbiguousSubmitError(
|
|
731
1022
|
request.method,
|
|
@@ -734,6 +1025,8 @@ var HttpTransport = class {
|
|
|
734
1025
|
{ cause }
|
|
735
1026
|
);
|
|
736
1027
|
}
|
|
1028
|
+
if (cause instanceof GibworkApiError || cause instanceof GibworkProtocolError)
|
|
1029
|
+
throw cause;
|
|
737
1030
|
if (timedOut) {
|
|
738
1031
|
throw new GibworkTimeoutError(
|
|
739
1032
|
request.method,
|
|
@@ -748,7 +1041,7 @@ var HttpTransport = class {
|
|
|
748
1041
|
});
|
|
749
1042
|
}
|
|
750
1043
|
throw new GibworkNetworkError(
|
|
751
|
-
"Could not
|
|
1044
|
+
"Could not read the Gibwork API response",
|
|
752
1045
|
request.method,
|
|
753
1046
|
request.path,
|
|
754
1047
|
{ cause }
|
|
@@ -756,28 +1049,8 @@ var HttpTransport = class {
|
|
|
756
1049
|
} finally {
|
|
757
1050
|
clearTimeout(timeout);
|
|
758
1051
|
callerSignal?.removeEventListener("abort", abortFromCaller);
|
|
1052
|
+
controller.signal.removeEventListener("abort", rejectOnAbort);
|
|
759
1053
|
}
|
|
760
|
-
const body = await parseResponseBody(response);
|
|
761
|
-
if (!response.ok) {
|
|
762
|
-
const requestId = response.headers.get("x-request-id") ?? void 0;
|
|
763
|
-
const apiError = new GibworkApiError(
|
|
764
|
-
response.status,
|
|
765
|
-
body,
|
|
766
|
-
request.method,
|
|
767
|
-
request.path,
|
|
768
|
-
requestId
|
|
769
|
-
);
|
|
770
|
-
if (request.ambiguousSubmit && response.status >= 500) {
|
|
771
|
-
throw new GibworkAmbiguousSubmitError(
|
|
772
|
-
request.method,
|
|
773
|
-
request.path,
|
|
774
|
-
request.ambiguousSubmit,
|
|
775
|
-
{ cause: apiError }
|
|
776
|
-
);
|
|
777
|
-
}
|
|
778
|
-
throw apiError;
|
|
779
|
-
}
|
|
780
|
-
return body;
|
|
781
1054
|
}
|
|
782
1055
|
};
|
|
783
1056
|
function normalizeBaseUrl(value) {
|
|
@@ -843,8 +1116,11 @@ exports.GibworkClient = GibworkClient;
|
|
|
843
1116
|
exports.GibworkConfigurationError = GibworkConfigurationError;
|
|
844
1117
|
exports.GibworkError = GibworkError;
|
|
845
1118
|
exports.GibworkNetworkError = GibworkNetworkError;
|
|
1119
|
+
exports.GibworkProtocolError = GibworkProtocolError;
|
|
846
1120
|
exports.GibworkRequestAbortedError = GibworkRequestAbortedError;
|
|
1121
|
+
exports.GibworkSubmissionOperationError = GibworkSubmissionOperationError;
|
|
847
1122
|
exports.GibworkTimeoutError = GibworkTimeoutError;
|
|
1123
|
+
exports.GibworkValidationError = GibworkValidationError;
|
|
848
1124
|
exports.signPreparedTransaction = signPreparedTransaction;
|
|
849
1125
|
//# sourceMappingURL=index.cjs.map
|
|
850
1126
|
//# sourceMappingURL=index.cjs.map
|