@gibwork/sdk 0.0.2 → 0.0.3
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 +1 -0
- package/README.md +7 -0
- package/dist/{chunk-24XHBDMZ.js → chunk-C5WLJVVP.js} +10 -3
- package/dist/chunk-C5WLJVVP.js.map +1 -0
- package/dist/index.cjs +8 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +1 -1
- package/dist/node.cjs +9 -1
- package/dist/node.cjs.map +1 -1
- package/dist/node.js +3 -2
- package/dist/node.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-24XHBDMZ.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -9,3 +9,4 @@ All notable changes to this package will be documented here.
|
|
|
9
9
|
- Add injected-wallet and Node private-key signer support.
|
|
10
10
|
- Add typed HTTP, timeout, cancellation, and ambiguous-submit errors.
|
|
11
11
|
- Embed `https://sdk.gib.work` by default with a build-time API URL override.
|
|
12
|
+
- Add a `production` client option for routing requests to the production API.
|
package/README.md
CHANGED
|
@@ -30,12 +30,18 @@ import { createGibworkClient } from '@gibwork/sdk/node';
|
|
|
30
30
|
|
|
31
31
|
const gibwork = createGibworkClient({
|
|
32
32
|
privateKey: process.env.SOLANA_PRIVATE_KEY!,
|
|
33
|
+
production: true,
|
|
33
34
|
});
|
|
34
35
|
```
|
|
35
36
|
|
|
36
37
|
The SDK uses the embedded `https://sdk.gib.work` API URL by default, so
|
|
37
38
|
application users do not need to configure an API origin.
|
|
38
39
|
|
|
40
|
+
Requests use the stage environment by default. Set `production: true` when
|
|
41
|
+
creating the client to route all of its requests to production. The setting is
|
|
42
|
+
client-wide, so prepare and transaction-submit requests always use the same
|
|
43
|
+
environment.
|
|
44
|
+
|
|
39
45
|
`SOLANA_PRIVATE_KEY` may be a base58-encoded 32-byte seed or 64-byte secret
|
|
40
46
|
key, or a JSON array containing 32 or 64 byte values.
|
|
41
47
|
|
|
@@ -49,6 +55,7 @@ declare const signer: WalletSigner;
|
|
|
49
55
|
|
|
50
56
|
const gibwork = new GibworkClient({
|
|
51
57
|
signer,
|
|
58
|
+
production: true,
|
|
52
59
|
});
|
|
53
60
|
```
|
|
54
61
|
|
|
@@ -608,10 +608,15 @@ function assertNotAborted2(options, path) {
|
|
|
608
608
|
var HttpTransport = class {
|
|
609
609
|
baseUrl;
|
|
610
610
|
fetchImplementation;
|
|
611
|
+
production;
|
|
611
612
|
timeoutMs;
|
|
612
613
|
constructor(options) {
|
|
613
614
|
this.baseUrl = normalizeBaseUrl(options.baseUrl);
|
|
614
615
|
this.fetchImplementation = options.fetch ?? globalThis.fetch;
|
|
616
|
+
if (options.production !== void 0 && typeof options.production !== "boolean") {
|
|
617
|
+
throw new GibworkConfigurationError("production must be a boolean");
|
|
618
|
+
}
|
|
619
|
+
this.production = options.production ?? false;
|
|
615
620
|
this.timeoutMs = options.timeoutMs ?? 6e4;
|
|
616
621
|
if (typeof this.fetchImplementation !== "function") {
|
|
617
622
|
throw new GibworkConfigurationError(
|
|
@@ -641,7 +646,8 @@ var HttpTransport = class {
|
|
|
641
646
|
}, this.timeoutMs);
|
|
642
647
|
const headers = {
|
|
643
648
|
accept: "application/json",
|
|
644
|
-
...request.headers
|
|
649
|
+
...request.headers,
|
|
650
|
+
...this.production ? { "x-gibwork-environment": "prod" } : {}
|
|
645
651
|
};
|
|
646
652
|
const init = {
|
|
647
653
|
method: request.method,
|
|
@@ -754,6 +760,7 @@ var GibworkClient = class {
|
|
|
754
760
|
const transport = new HttpTransport({
|
|
755
761
|
baseUrl: options.baseUrl ?? DEFAULT_GIBWORK_API_URL,
|
|
756
762
|
...options.fetch ? { fetch: options.fetch } : {},
|
|
763
|
+
...options.production !== void 0 ? { production: options.production } : {},
|
|
757
764
|
...options.timeoutMs !== void 0 ? { timeoutMs: options.timeoutMs } : {}
|
|
758
765
|
});
|
|
759
766
|
this.tasks = new TasksResource(transport, options.signer);
|
|
@@ -769,5 +776,5 @@ function assertSigner(signer) {
|
|
|
769
776
|
}
|
|
770
777
|
|
|
771
778
|
export { DEFAULT_GIBWORK_API_URL, GibworkAmbiguousSubmitError, GibworkApiError, GibworkClient, GibworkConfigurationError, GibworkError, GibworkNetworkError, GibworkRequestAbortedError, GibworkTimeoutError, signPreparedTransaction };
|
|
772
|
-
//# sourceMappingURL=chunk-
|
|
773
|
-
//# sourceMappingURL=chunk-
|
|
779
|
+
//# sourceMappingURL=chunk-C5WLJVVP.js.map
|
|
780
|
+
//# sourceMappingURL=chunk-C5WLJVVP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/errors/index.ts","../src/auth/sanitize.ts","../src/auth/normalize.ts","../src/auth/wallet-auth.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-C5WLJVVP.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 ) {\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';\n\nexport interface AmbiguousSubmitContext {\n operation: SubmitOperation;\n taskId?: string;\n submissionId?: string;\n intentId: 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","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 CreateTaskInput,\n PaginationQuery,\n SubmissionPaginationQuery,\n} from '../types/index.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 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 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","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';\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 { 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 normalizeRejection,\n normalizeSubmissionPagination,\n sha256Json,\n toQueryString,\n} from '../../auth/normalize.js';\nimport { createWalletAuthHeaders } from '../../auth/wallet-auth.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 ApprovalSubmitResult,\n ApproveSubmissionInput,\n ApproveSubmissionResult,\n Paginated,\n PreparedApprovalIntent,\n RejectSubmissionResult,\n RequestOptions,\n SubmissionPaginationQuery,\n TaskSubmission,\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 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 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 normalizeTaskPagination,\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 CreateTaskResult,\n Paginated,\n PaginationQuery,\n PreparedRefundIntent,\n PreparedTaskIntent,\n RefundSubmitResult,\n RefundTaskResult,\n RequestOptions,\n TaskSubmitResult,\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 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 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';\n path: string;\n headers?: Record<string, string>;\n body?: unknown;\n options?: RequestOptions;\n ambiguousSubmit?: AmbiguousSubmitContext;\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 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 const abortFromCaller = (): void => controller.abort(callerSignal?.reason);\n callerSignal?.addEventListener('abort', abortFromCaller, { once: true });\n\n const timeout = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, this.timeoutMs);\n\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 let response: Response;\n try {\n response = await this.fetchImplementation(\n `${this.baseUrl}${request.path}`,\n init,\n );\n } catch (cause) {\n if (request.ambiguousSubmit) {\n throw new GibworkAmbiguousSubmitError(\n request.method,\n request.path,\n request.ambiguousSubmit,\n { cause },\n );\n }\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 reach the Gibwork API',\n request.method,\n request.path,\n { cause },\n );\n } finally {\n clearTimeout(timeout);\n callerSignal?.removeEventListener('abort', abortFromCaller);\n }\n\n const body = await parseResponseBody(response);\n if (!response.ok) {\n const requestId = response.headers.get('x-request-id') ?? undefined;\n const apiError = new GibworkApiError(\n response.status,\n body,\n request.method,\n request.path,\n requestId,\n );\n if (request.ambiguousSubmit && response.status >= 500) {\n throw new GibworkAmbiguousSubmitError(\n request.method,\n request.path,\n request.ambiguousSubmit,\n { cause: apiError },\n );\n }\n throw apiError;\n }\n\n return body as T;\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
|
@@ -614,10 +614,15 @@ function assertNotAborted2(options, path) {
|
|
|
614
614
|
var HttpTransport = class {
|
|
615
615
|
baseUrl;
|
|
616
616
|
fetchImplementation;
|
|
617
|
+
production;
|
|
617
618
|
timeoutMs;
|
|
618
619
|
constructor(options) {
|
|
619
620
|
this.baseUrl = normalizeBaseUrl(options.baseUrl);
|
|
620
621
|
this.fetchImplementation = options.fetch ?? globalThis.fetch;
|
|
622
|
+
if (options.production !== void 0 && typeof options.production !== "boolean") {
|
|
623
|
+
throw new GibworkConfigurationError("production must be a boolean");
|
|
624
|
+
}
|
|
625
|
+
this.production = options.production ?? false;
|
|
621
626
|
this.timeoutMs = options.timeoutMs ?? 6e4;
|
|
622
627
|
if (typeof this.fetchImplementation !== "function") {
|
|
623
628
|
throw new GibworkConfigurationError(
|
|
@@ -647,7 +652,8 @@ var HttpTransport = class {
|
|
|
647
652
|
}, this.timeoutMs);
|
|
648
653
|
const headers = {
|
|
649
654
|
accept: "application/json",
|
|
650
|
-
...request.headers
|
|
655
|
+
...request.headers,
|
|
656
|
+
...this.production ? { "x-gibwork-environment": "prod" } : {}
|
|
651
657
|
};
|
|
652
658
|
const init = {
|
|
653
659
|
method: request.method,
|
|
@@ -760,6 +766,7 @@ var GibworkClient = class {
|
|
|
760
766
|
const transport = new HttpTransport({
|
|
761
767
|
baseUrl: options.baseUrl ?? DEFAULT_GIBWORK_API_URL,
|
|
762
768
|
...options.fetch ? { fetch: options.fetch } : {},
|
|
769
|
+
...options.production !== void 0 ? { production: options.production } : {},
|
|
763
770
|
...options.timeoutMs !== void 0 ? { timeoutMs: options.timeoutMs } : {}
|
|
764
771
|
});
|
|
765
772
|
this.tasks = new TasksResource(transport, options.signer);
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/errors/index.ts","../src/auth/sanitize.ts","../src/auth/normalize.ts","../src/auth/wallet-auth.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":["sanitizeHtml","createHash","randomUUID","VersionedTransaction","assertNotAborted"],"mappings":"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","file":"index.cjs","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 ) {\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';\n\nexport interface AmbiguousSubmitContext {\n operation: SubmitOperation;\n taskId?: string;\n submissionId?: string;\n intentId: 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","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 CreateTaskInput,\n PaginationQuery,\n SubmissionPaginationQuery,\n} from '../types/index.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 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 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","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';\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 { 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 normalizeRejection,\n normalizeSubmissionPagination,\n sha256Json,\n toQueryString,\n} from '../../auth/normalize.js';\nimport { createWalletAuthHeaders } from '../../auth/wallet-auth.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 ApprovalSubmitResult,\n ApproveSubmissionInput,\n ApproveSubmissionResult,\n Paginated,\n PreparedApprovalIntent,\n RejectSubmissionResult,\n RequestOptions,\n SubmissionPaginationQuery,\n TaskSubmission,\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 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 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 normalizeTaskPagination,\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 CreateTaskResult,\n Paginated,\n PaginationQuery,\n PreparedRefundIntent,\n PreparedTaskIntent,\n RefundSubmitResult,\n RefundTaskResult,\n RequestOptions,\n TaskSubmitResult,\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 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 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 timeoutMs?: number;\n}\n\nexport interface HttpRequest {\n method: 'GET' | 'POST';\n path: string;\n headers?: Record<string, string>;\n body?: unknown;\n options?: RequestOptions;\n ambiguousSubmit?: AmbiguousSubmitContext;\n}\n\nexport class HttpTransport {\n private readonly baseUrl: string;\n private readonly fetchImplementation: FetchImplementation;\n private readonly timeoutMs: number;\n\n constructor(options: HttpTransportOptions) {\n this.baseUrl = normalizeBaseUrl(options.baseUrl);\n this.fetchImplementation = options.fetch ?? globalThis.fetch;\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 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 const abortFromCaller = (): void => controller.abort(callerSignal?.reason);\n callerSignal?.addEventListener('abort', abortFromCaller, { once: true });\n\n const timeout = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, this.timeoutMs);\n\n const headers: Record<string, string> = {\n accept: 'application/json',\n ...request.headers,\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 let response: Response;\n try {\n response = await this.fetchImplementation(\n `${this.baseUrl}${request.path}`,\n init,\n );\n } catch (cause) {\n if (request.ambiguousSubmit) {\n throw new GibworkAmbiguousSubmitError(\n request.method,\n request.path,\n request.ambiguousSubmit,\n { cause },\n );\n }\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 reach the Gibwork API',\n request.method,\n request.path,\n { cause },\n );\n } finally {\n clearTimeout(timeout);\n callerSignal?.removeEventListener('abort', abortFromCaller);\n }\n\n const body = await parseResponseBody(response);\n if (!response.ok) {\n const requestId = response.headers.get('x-request-id') ?? undefined;\n const apiError = new GibworkApiError(\n response.status,\n body,\n request.method,\n request.path,\n requestId,\n );\n if (request.ambiguousSubmit && response.status >= 500) {\n throw new GibworkAmbiguousSubmitError(\n request.method,\n request.path,\n request.ambiguousSubmit,\n { cause: apiError },\n );\n }\n throw apiError;\n }\n\n return body as T;\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 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.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"]}
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/errors/index.ts","../src/auth/sanitize.ts","../src/auth/normalize.ts","../src/auth/wallet-auth.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":["sanitizeHtml","createHash","randomUUID","VersionedTransaction","assertNotAborted"],"mappings":"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","file":"index.cjs","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 ) {\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';\n\nexport interface AmbiguousSubmitContext {\n operation: SubmitOperation;\n taskId?: string;\n submissionId?: string;\n intentId: 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","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 CreateTaskInput,\n PaginationQuery,\n SubmissionPaginationQuery,\n} from '../types/index.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 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 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","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';\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 { 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 normalizeRejection,\n normalizeSubmissionPagination,\n sha256Json,\n toQueryString,\n} from '../../auth/normalize.js';\nimport { createWalletAuthHeaders } from '../../auth/wallet-auth.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 ApprovalSubmitResult,\n ApproveSubmissionInput,\n ApproveSubmissionResult,\n Paginated,\n PreparedApprovalIntent,\n RejectSubmissionResult,\n RequestOptions,\n SubmissionPaginationQuery,\n TaskSubmission,\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 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 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 normalizeTaskPagination,\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 CreateTaskResult,\n Paginated,\n PaginationQuery,\n PreparedRefundIntent,\n PreparedTaskIntent,\n RefundSubmitResult,\n RefundTaskResult,\n RequestOptions,\n TaskSubmitResult,\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 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 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';\n path: string;\n headers?: Record<string, string>;\n body?: unknown;\n options?: RequestOptions;\n ambiguousSubmit?: AmbiguousSubmitContext;\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 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 const abortFromCaller = (): void => controller.abort(callerSignal?.reason);\n callerSignal?.addEventListener('abort', abortFromCaller, { once: true });\n\n const timeout = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, this.timeoutMs);\n\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 let response: Response;\n try {\n response = await this.fetchImplementation(\n `${this.baseUrl}${request.path}`,\n init,\n );\n } catch (cause) {\n if (request.ambiguousSubmit) {\n throw new GibworkAmbiguousSubmitError(\n request.method,\n request.path,\n request.ambiguousSubmit,\n { cause },\n );\n }\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 reach the Gibwork API',\n request.method,\n request.path,\n { cause },\n );\n } finally {\n clearTimeout(timeout);\n callerSignal?.removeEventListener('abort', abortFromCaller);\n }\n\n const body = await parseResponseBody(response);\n if (!response.ok) {\n const requestId = response.headers.get('x-request-id') ?? undefined;\n const apiError = new GibworkApiError(\n response.status,\n body,\n request.method,\n request.path,\n requestId,\n );\n if (request.ambiguousSubmit && response.status >= 500) {\n throw new GibworkAmbiguousSubmitError(\n request.method,\n request.path,\n request.ambiguousSubmit,\n { cause: apiError },\n );\n }\n throw apiError;\n }\n\n return body as T;\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.d.cts
CHANGED
|
@@ -282,6 +282,7 @@ type FetchImplementation = typeof fetch;
|
|
|
282
282
|
interface HttpTransportOptions {
|
|
283
283
|
baseUrl: string;
|
|
284
284
|
fetch?: FetchImplementation;
|
|
285
|
+
production?: boolean;
|
|
285
286
|
timeoutMs?: number;
|
|
286
287
|
}
|
|
287
288
|
interface HttpRequest {
|
|
@@ -295,6 +296,7 @@ interface HttpRequest {
|
|
|
295
296
|
declare class HttpTransport {
|
|
296
297
|
private readonly baseUrl;
|
|
297
298
|
private readonly fetchImplementation;
|
|
299
|
+
private readonly production;
|
|
298
300
|
private readonly timeoutMs;
|
|
299
301
|
constructor(options: HttpTransportOptions);
|
|
300
302
|
request<T>(request: HttpRequest): Promise<T>;
|
|
@@ -340,6 +342,8 @@ interface GibworkClientOptions {
|
|
|
340
342
|
baseUrl?: string;
|
|
341
343
|
signer: WalletSigner;
|
|
342
344
|
fetch?: FetchImplementation;
|
|
345
|
+
/** Routes all client requests to production when true. Defaults to stage. */
|
|
346
|
+
production?: boolean;
|
|
343
347
|
timeoutMs?: number;
|
|
344
348
|
}
|
|
345
349
|
declare class GibworkClient {
|
package/dist/index.d.ts
CHANGED
|
@@ -282,6 +282,7 @@ type FetchImplementation = typeof fetch;
|
|
|
282
282
|
interface HttpTransportOptions {
|
|
283
283
|
baseUrl: string;
|
|
284
284
|
fetch?: FetchImplementation;
|
|
285
|
+
production?: boolean;
|
|
285
286
|
timeoutMs?: number;
|
|
286
287
|
}
|
|
287
288
|
interface HttpRequest {
|
|
@@ -295,6 +296,7 @@ interface HttpRequest {
|
|
|
295
296
|
declare class HttpTransport {
|
|
296
297
|
private readonly baseUrl;
|
|
297
298
|
private readonly fetchImplementation;
|
|
299
|
+
private readonly production;
|
|
298
300
|
private readonly timeoutMs;
|
|
299
301
|
constructor(options: HttpTransportOptions);
|
|
300
302
|
request<T>(request: HttpRequest): Promise<T>;
|
|
@@ -340,6 +342,8 @@ interface GibworkClientOptions {
|
|
|
340
342
|
baseUrl?: string;
|
|
341
343
|
signer: WalletSigner;
|
|
342
344
|
fetch?: FetchImplementation;
|
|
345
|
+
/** Routes all client requests to production when true. Defaults to stage. */
|
|
346
|
+
production?: boolean;
|
|
343
347
|
timeoutMs?: number;
|
|
344
348
|
}
|
|
345
349
|
declare class GibworkClient {
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { DEFAULT_GIBWORK_API_URL, GibworkAmbiguousSubmitError, GibworkApiError, GibworkClient, GibworkConfigurationError, GibworkError, GibworkNetworkError, GibworkRequestAbortedError, GibworkTimeoutError, signPreparedTransaction } from './chunk-
|
|
1
|
+
export { DEFAULT_GIBWORK_API_URL, GibworkAmbiguousSubmitError, GibworkApiError, GibworkClient, GibworkConfigurationError, GibworkError, GibworkNetworkError, GibworkRequestAbortedError, GibworkTimeoutError, signPreparedTransaction } from './chunk-C5WLJVVP.js';
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
package/dist/node.cjs
CHANGED
|
@@ -618,10 +618,15 @@ function assertNotAborted2(options, path) {
|
|
|
618
618
|
var HttpTransport = class {
|
|
619
619
|
baseUrl;
|
|
620
620
|
fetchImplementation;
|
|
621
|
+
production;
|
|
621
622
|
timeoutMs;
|
|
622
623
|
constructor(options) {
|
|
623
624
|
this.baseUrl = normalizeBaseUrl(options.baseUrl);
|
|
624
625
|
this.fetchImplementation = options.fetch ?? globalThis.fetch;
|
|
626
|
+
if (options.production !== void 0 && typeof options.production !== "boolean") {
|
|
627
|
+
throw new GibworkConfigurationError("production must be a boolean");
|
|
628
|
+
}
|
|
629
|
+
this.production = options.production ?? false;
|
|
625
630
|
this.timeoutMs = options.timeoutMs ?? 6e4;
|
|
626
631
|
if (typeof this.fetchImplementation !== "function") {
|
|
627
632
|
throw new GibworkConfigurationError(
|
|
@@ -651,7 +656,8 @@ var HttpTransport = class {
|
|
|
651
656
|
}, this.timeoutMs);
|
|
652
657
|
const headers = {
|
|
653
658
|
accept: "application/json",
|
|
654
|
-
...request.headers
|
|
659
|
+
...request.headers,
|
|
660
|
+
...this.production ? { "x-gibwork-environment": "prod" } : {}
|
|
655
661
|
};
|
|
656
662
|
const init = {
|
|
657
663
|
method: request.method,
|
|
@@ -764,6 +770,7 @@ var GibworkClient = class {
|
|
|
764
770
|
const transport = new HttpTransport({
|
|
765
771
|
baseUrl: options.baseUrl ?? DEFAULT_GIBWORK_API_URL,
|
|
766
772
|
...options.fetch ? { fetch: options.fetch } : {},
|
|
773
|
+
...options.production !== void 0 ? { production: options.production } : {},
|
|
767
774
|
...options.timeoutMs !== void 0 ? { timeoutMs: options.timeoutMs } : {}
|
|
768
775
|
});
|
|
769
776
|
this.tasks = new TasksResource(transport, options.signer);
|
|
@@ -849,6 +856,7 @@ function createGibworkClient(options) {
|
|
|
849
856
|
signer: createKeypairSigner(options.privateKey),
|
|
850
857
|
...options.baseUrl !== void 0 ? { baseUrl: options.baseUrl } : {},
|
|
851
858
|
...options.fetch ? { fetch: options.fetch } : {},
|
|
859
|
+
...options.production !== void 0 ? { production: options.production } : {},
|
|
852
860
|
...options.timeoutMs !== void 0 ? { timeoutMs: options.timeoutMs } : {}
|
|
853
861
|
});
|
|
854
862
|
}
|
package/dist/node.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/errors/index.ts","../src/auth/sanitize.ts","../src/auth/normalize.ts","../src/auth/wallet-auth.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","../src/signers/keypair-signer.ts","../src/node.ts"],"names":["sanitizeHtml","createHash","randomUUID","VersionedTransaction","assertNotAborted","nacl","Keypair","bs58"],"mappings":"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","file":"node.cjs","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 ) {\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';\n\nexport interface AmbiguousSubmitContext {\n operation: SubmitOperation;\n taskId?: string;\n submissionId?: string;\n intentId: 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","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 CreateTaskInput,\n PaginationQuery,\n SubmissionPaginationQuery,\n} from '../types/index.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 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 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","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';\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 { 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 normalizeRejection,\n normalizeSubmissionPagination,\n sha256Json,\n toQueryString,\n} from '../../auth/normalize.js';\nimport { createWalletAuthHeaders } from '../../auth/wallet-auth.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 ApprovalSubmitResult,\n ApproveSubmissionInput,\n ApproveSubmissionResult,\n Paginated,\n PreparedApprovalIntent,\n RejectSubmissionResult,\n RequestOptions,\n SubmissionPaginationQuery,\n TaskSubmission,\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 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 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 normalizeTaskPagination,\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 CreateTaskResult,\n Paginated,\n PaginationQuery,\n PreparedRefundIntent,\n PreparedTaskIntent,\n RefundSubmitResult,\n RefundTaskResult,\n RequestOptions,\n TaskSubmitResult,\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 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 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 timeoutMs?: number;\n}\n\nexport interface HttpRequest {\n method: 'GET' | 'POST';\n path: string;\n headers?: Record<string, string>;\n body?: unknown;\n options?: RequestOptions;\n ambiguousSubmit?: AmbiguousSubmitContext;\n}\n\nexport class HttpTransport {\n private readonly baseUrl: string;\n private readonly fetchImplementation: FetchImplementation;\n private readonly timeoutMs: number;\n\n constructor(options: HttpTransportOptions) {\n this.baseUrl = normalizeBaseUrl(options.baseUrl);\n this.fetchImplementation = options.fetch ?? globalThis.fetch;\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 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 const abortFromCaller = (): void => controller.abort(callerSignal?.reason);\n callerSignal?.addEventListener('abort', abortFromCaller, { once: true });\n\n const timeout = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, this.timeoutMs);\n\n const headers: Record<string, string> = {\n accept: 'application/json',\n ...request.headers,\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 let response: Response;\n try {\n response = await this.fetchImplementation(\n `${this.baseUrl}${request.path}`,\n init,\n );\n } catch (cause) {\n if (request.ambiguousSubmit) {\n throw new GibworkAmbiguousSubmitError(\n request.method,\n request.path,\n request.ambiguousSubmit,\n { cause },\n );\n }\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 reach the Gibwork API',\n request.method,\n request.path,\n { cause },\n );\n } finally {\n clearTimeout(timeout);\n callerSignal?.removeEventListener('abort', abortFromCaller);\n }\n\n const body = await parseResponseBody(response);\n if (!response.ok) {\n const requestId = response.headers.get('x-request-id') ?? undefined;\n const apiError = new GibworkApiError(\n response.status,\n body,\n request.method,\n request.path,\n requestId,\n );\n if (request.ambiguousSubmit && response.status >= 500) {\n throw new GibworkAmbiguousSubmitError(\n request.method,\n request.path,\n request.ambiguousSubmit,\n { cause: apiError },\n );\n }\n throw apiError;\n }\n\n return body as T;\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 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.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","import { Keypair, type VersionedTransaction } from '@solana/web3.js';\nimport bs58 from 'bs58';\nimport nacl from 'tweetnacl';\n\nimport { GibworkConfigurationError } from '../errors/index.js';\nimport type { WalletSigner } from './wallet-signer.js';\n\nexport type SolanaPrivateKey = string | Uint8Array | readonly number[];\n\nexport function createKeypairSigner(\n privateKey: SolanaPrivateKey,\n): WalletSigner {\n const keypair = keypairFromPrivateKey(privateKey);\n\n return {\n publicKey: keypair.publicKey,\n async signMessage(message: Uint8Array): Promise<Uint8Array> {\n return nacl.sign.detached(message, keypair.secretKey);\n },\n async signTransaction(\n transaction: VersionedTransaction,\n ): Promise<VersionedTransaction> {\n transaction.sign([keypair]);\n return transaction;\n },\n };\n}\n\nexport function keypairFromPrivateKey(privateKey: SolanaPrivateKey): Keypair {\n const bytes = decodePrivateKey(privateKey);\n\n try {\n if (bytes.length === 32) return Keypair.fromSeed(bytes);\n if (bytes.length === 64) return Keypair.fromSecretKey(bytes);\n } catch {\n throw new GibworkConfigurationError('SOLANA_PRIVATE_KEY is invalid');\n }\n\n throw new GibworkConfigurationError(\n 'SOLANA_PRIVATE_KEY must contain a 32-byte seed or 64-byte secret key',\n );\n}\n\nfunction decodePrivateKey(privateKey: SolanaPrivateKey): Uint8Array {\n if (privateKey instanceof Uint8Array) return new Uint8Array(privateKey);\n if (Array.isArray(privateKey)) return validateByteArray(privateKey);\n if (typeof privateKey !== 'string') {\n throw new GibworkConfigurationError('SOLANA_PRIVATE_KEY is required');\n }\n\n const value = privateKey.trim();\n if (!value) {\n throw new GibworkConfigurationError('SOLANA_PRIVATE_KEY is required');\n }\n\n if (value.startsWith('[')) {\n try {\n const parsed: unknown = JSON.parse(value);\n if (!Array.isArray(parsed)) throw new Error('Expected a JSON array');\n return validateByteArray(parsed);\n } catch (error) {\n if (error instanceof GibworkConfigurationError) throw error;\n throw new GibworkConfigurationError(\n 'SOLANA_PRIVATE_KEY must be a valid JSON byte array or base58 string',\n );\n }\n }\n\n try {\n return bs58.decode(value);\n } catch {\n throw new GibworkConfigurationError(\n 'SOLANA_PRIVATE_KEY must be a valid JSON byte array or base58 string',\n );\n }\n}\n\nfunction validateByteArray(values: readonly unknown[]): Uint8Array {\n if (\n !values.every(\n (value) =>\n typeof value === 'number' &&\n Number.isInteger(value) &&\n value >= 0 &&\n value <= 255,\n )\n ) {\n throw new GibworkConfigurationError(\n 'SOLANA_PRIVATE_KEY JSON values must be integers between 0 and 255',\n );\n }\n\n return Uint8Array.from(values as number[]);\n}\n","import {\n GibworkClient,\n type GibworkClientOptions,\n} from './client/gibwork-client.js';\nimport {\n createKeypairSigner,\n keypairFromPrivateKey,\n type SolanaPrivateKey,\n} from './signers/keypair-signer.js';\n\nexport * from './index.js';\nexport { createKeypairSigner, keypairFromPrivateKey, type SolanaPrivateKey };\n\nexport interface CreateGibworkClientOptions extends Omit<\n GibworkClientOptions,\n 'signer'\n> {\n privateKey: SolanaPrivateKey;\n}\n\nexport function createGibworkClient(\n options: CreateGibworkClientOptions,\n): GibworkClient {\n return new GibworkClient({\n signer: createKeypairSigner(options.privateKey),\n ...(options.baseUrl !== undefined ? { baseUrl: options.baseUrl } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n ...(options.timeoutMs !== undefined\n ? { timeoutMs: options.timeoutMs }\n : {}),\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/errors/index.ts","../src/auth/sanitize.ts","../src/auth/normalize.ts","../src/auth/wallet-auth.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","../src/signers/keypair-signer.ts","../src/node.ts"],"names":["sanitizeHtml","createHash","randomUUID","VersionedTransaction","assertNotAborted","nacl","Keypair","bs58"],"mappings":"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","file":"node.cjs","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 ) {\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';\n\nexport interface AmbiguousSubmitContext {\n operation: SubmitOperation;\n taskId?: string;\n submissionId?: string;\n intentId: 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","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 CreateTaskInput,\n PaginationQuery,\n SubmissionPaginationQuery,\n} from '../types/index.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 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 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","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';\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 { 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 normalizeRejection,\n normalizeSubmissionPagination,\n sha256Json,\n toQueryString,\n} from '../../auth/normalize.js';\nimport { createWalletAuthHeaders } from '../../auth/wallet-auth.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 ApprovalSubmitResult,\n ApproveSubmissionInput,\n ApproveSubmissionResult,\n Paginated,\n PreparedApprovalIntent,\n RejectSubmissionResult,\n RequestOptions,\n SubmissionPaginationQuery,\n TaskSubmission,\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 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 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 normalizeTaskPagination,\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 CreateTaskResult,\n Paginated,\n PaginationQuery,\n PreparedRefundIntent,\n PreparedTaskIntent,\n RefundSubmitResult,\n RefundTaskResult,\n RequestOptions,\n TaskSubmitResult,\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 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 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';\n path: string;\n headers?: Record<string, string>;\n body?: unknown;\n options?: RequestOptions;\n ambiguousSubmit?: AmbiguousSubmitContext;\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 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 const abortFromCaller = (): void => controller.abort(callerSignal?.reason);\n callerSignal?.addEventListener('abort', abortFromCaller, { once: true });\n\n const timeout = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, this.timeoutMs);\n\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 let response: Response;\n try {\n response = await this.fetchImplementation(\n `${this.baseUrl}${request.path}`,\n init,\n );\n } catch (cause) {\n if (request.ambiguousSubmit) {\n throw new GibworkAmbiguousSubmitError(\n request.method,\n request.path,\n request.ambiguousSubmit,\n { cause },\n );\n }\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 reach the Gibwork API',\n request.method,\n request.path,\n { cause },\n );\n } finally {\n clearTimeout(timeout);\n callerSignal?.removeEventListener('abort', abortFromCaller);\n }\n\n const body = await parseResponseBody(response);\n if (!response.ok) {\n const requestId = response.headers.get('x-request-id') ?? undefined;\n const apiError = new GibworkApiError(\n response.status,\n body,\n request.method,\n request.path,\n requestId,\n );\n if (request.ambiguousSubmit && response.status >= 500) {\n throw new GibworkAmbiguousSubmitError(\n request.method,\n request.path,\n request.ambiguousSubmit,\n { cause: apiError },\n );\n }\n throw apiError;\n }\n\n return body as T;\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","import { Keypair, type VersionedTransaction } from '@solana/web3.js';\nimport bs58 from 'bs58';\nimport nacl from 'tweetnacl';\n\nimport { GibworkConfigurationError } from '../errors/index.js';\nimport type { WalletSigner } from './wallet-signer.js';\n\nexport type SolanaPrivateKey = string | Uint8Array | readonly number[];\n\nexport function createKeypairSigner(\n privateKey: SolanaPrivateKey,\n): WalletSigner {\n const keypair = keypairFromPrivateKey(privateKey);\n\n return {\n publicKey: keypair.publicKey,\n async signMessage(message: Uint8Array): Promise<Uint8Array> {\n return nacl.sign.detached(message, keypair.secretKey);\n },\n async signTransaction(\n transaction: VersionedTransaction,\n ): Promise<VersionedTransaction> {\n transaction.sign([keypair]);\n return transaction;\n },\n };\n}\n\nexport function keypairFromPrivateKey(privateKey: SolanaPrivateKey): Keypair {\n const bytes = decodePrivateKey(privateKey);\n\n try {\n if (bytes.length === 32) return Keypair.fromSeed(bytes);\n if (bytes.length === 64) return Keypair.fromSecretKey(bytes);\n } catch {\n throw new GibworkConfigurationError('SOLANA_PRIVATE_KEY is invalid');\n }\n\n throw new GibworkConfigurationError(\n 'SOLANA_PRIVATE_KEY must contain a 32-byte seed or 64-byte secret key',\n );\n}\n\nfunction decodePrivateKey(privateKey: SolanaPrivateKey): Uint8Array {\n if (privateKey instanceof Uint8Array) return new Uint8Array(privateKey);\n if (Array.isArray(privateKey)) return validateByteArray(privateKey);\n if (typeof privateKey !== 'string') {\n throw new GibworkConfigurationError('SOLANA_PRIVATE_KEY is required');\n }\n\n const value = privateKey.trim();\n if (!value) {\n throw new GibworkConfigurationError('SOLANA_PRIVATE_KEY is required');\n }\n\n if (value.startsWith('[')) {\n try {\n const parsed: unknown = JSON.parse(value);\n if (!Array.isArray(parsed)) throw new Error('Expected a JSON array');\n return validateByteArray(parsed);\n } catch (error) {\n if (error instanceof GibworkConfigurationError) throw error;\n throw new GibworkConfigurationError(\n 'SOLANA_PRIVATE_KEY must be a valid JSON byte array or base58 string',\n );\n }\n }\n\n try {\n return bs58.decode(value);\n } catch {\n throw new GibworkConfigurationError(\n 'SOLANA_PRIVATE_KEY must be a valid JSON byte array or base58 string',\n );\n }\n}\n\nfunction validateByteArray(values: readonly unknown[]): Uint8Array {\n if (\n !values.every(\n (value) =>\n typeof value === 'number' &&\n Number.isInteger(value) &&\n value >= 0 &&\n value <= 255,\n )\n ) {\n throw new GibworkConfigurationError(\n 'SOLANA_PRIVATE_KEY JSON values must be integers between 0 and 255',\n );\n }\n\n return Uint8Array.from(values as number[]);\n}\n","import {\n GibworkClient,\n type GibworkClientOptions,\n} from './client/gibwork-client.js';\nimport {\n createKeypairSigner,\n keypairFromPrivateKey,\n type SolanaPrivateKey,\n} from './signers/keypair-signer.js';\n\nexport * from './index.js';\nexport { createKeypairSigner, keypairFromPrivateKey, type SolanaPrivateKey };\n\nexport interface CreateGibworkClientOptions extends Omit<\n GibworkClientOptions,\n 'signer'\n> {\n privateKey: SolanaPrivateKey;\n}\n\nexport function createGibworkClient(\n options: CreateGibworkClientOptions,\n): GibworkClient {\n return new GibworkClient({\n signer: createKeypairSigner(options.privateKey),\n ...(options.baseUrl !== undefined ? { baseUrl: options.baseUrl } : {}),\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"]}
|
package/dist/node.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { GibworkConfigurationError, GibworkClient } from './chunk-
|
|
2
|
-
export { DEFAULT_GIBWORK_API_URL, GibworkAmbiguousSubmitError, GibworkApiError, GibworkClient, GibworkConfigurationError, GibworkError, GibworkNetworkError, GibworkRequestAbortedError, GibworkTimeoutError, signPreparedTransaction } from './chunk-
|
|
1
|
+
import { GibworkConfigurationError, GibworkClient } from './chunk-C5WLJVVP.js';
|
|
2
|
+
export { DEFAULT_GIBWORK_API_URL, GibworkAmbiguousSubmitError, GibworkApiError, GibworkClient, GibworkConfigurationError, GibworkError, GibworkNetworkError, GibworkRequestAbortedError, GibworkTimeoutError, signPreparedTransaction } from './chunk-C5WLJVVP.js';
|
|
3
3
|
import { Keypair } from '@solana/web3.js';
|
|
4
4
|
import bs58 from 'bs58';
|
|
5
5
|
import nacl from 'tweetnacl';
|
|
@@ -76,6 +76,7 @@ function createGibworkClient(options) {
|
|
|
76
76
|
signer: createKeypairSigner(options.privateKey),
|
|
77
77
|
...options.baseUrl !== void 0 ? { baseUrl: options.baseUrl } : {},
|
|
78
78
|
...options.fetch ? { fetch: options.fetch } : {},
|
|
79
|
+
...options.production !== void 0 ? { production: options.production } : {},
|
|
79
80
|
...options.timeoutMs !== void 0 ? { timeoutMs: options.timeoutMs } : {}
|
|
80
81
|
});
|
|
81
82
|
}
|
package/dist/node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/signers/keypair-signer.ts","../src/node.ts"],"names":[],"mappings":"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","file":"node.js","sourcesContent":["import { Keypair, type VersionedTransaction } from '@solana/web3.js';\nimport bs58 from 'bs58';\nimport nacl from 'tweetnacl';\n\nimport { GibworkConfigurationError } from '../errors/index.js';\nimport type { WalletSigner } from './wallet-signer.js';\n\nexport type SolanaPrivateKey = string | Uint8Array | readonly number[];\n\nexport function createKeypairSigner(\n privateKey: SolanaPrivateKey,\n): WalletSigner {\n const keypair = keypairFromPrivateKey(privateKey);\n\n return {\n publicKey: keypair.publicKey,\n async signMessage(message: Uint8Array): Promise<Uint8Array> {\n return nacl.sign.detached(message, keypair.secretKey);\n },\n async signTransaction(\n transaction: VersionedTransaction,\n ): Promise<VersionedTransaction> {\n transaction.sign([keypair]);\n return transaction;\n },\n };\n}\n\nexport function keypairFromPrivateKey(privateKey: SolanaPrivateKey): Keypair {\n const bytes = decodePrivateKey(privateKey);\n\n try {\n if (bytes.length === 32) return Keypair.fromSeed(bytes);\n if (bytes.length === 64) return Keypair.fromSecretKey(bytes);\n } catch {\n throw new GibworkConfigurationError('SOLANA_PRIVATE_KEY is invalid');\n }\n\n throw new GibworkConfigurationError(\n 'SOLANA_PRIVATE_KEY must contain a 32-byte seed or 64-byte secret key',\n );\n}\n\nfunction decodePrivateKey(privateKey: SolanaPrivateKey): Uint8Array {\n if (privateKey instanceof Uint8Array) return new Uint8Array(privateKey);\n if (Array.isArray(privateKey)) return validateByteArray(privateKey);\n if (typeof privateKey !== 'string') {\n throw new GibworkConfigurationError('SOLANA_PRIVATE_KEY is required');\n }\n\n const value = privateKey.trim();\n if (!value) {\n throw new GibworkConfigurationError('SOLANA_PRIVATE_KEY is required');\n }\n\n if (value.startsWith('[')) {\n try {\n const parsed: unknown = JSON.parse(value);\n if (!Array.isArray(parsed)) throw new Error('Expected a JSON array');\n return validateByteArray(parsed);\n } catch (error) {\n if (error instanceof GibworkConfigurationError) throw error;\n throw new GibworkConfigurationError(\n 'SOLANA_PRIVATE_KEY must be a valid JSON byte array or base58 string',\n );\n }\n }\n\n try {\n return bs58.decode(value);\n } catch {\n throw new GibworkConfigurationError(\n 'SOLANA_PRIVATE_KEY must be a valid JSON byte array or base58 string',\n );\n }\n}\n\nfunction validateByteArray(values: readonly unknown[]): Uint8Array {\n if (\n !values.every(\n (value) =>\n typeof value === 'number' &&\n Number.isInteger(value) &&\n value >= 0 &&\n value <= 255,\n )\n ) {\n throw new GibworkConfigurationError(\n 'SOLANA_PRIVATE_KEY JSON values must be integers between 0 and 255',\n );\n }\n\n return Uint8Array.from(values as number[]);\n}\n","import {\n GibworkClient,\n type GibworkClientOptions,\n} from './client/gibwork-client.js';\nimport {\n createKeypairSigner,\n keypairFromPrivateKey,\n type SolanaPrivateKey,\n} from './signers/keypair-signer.js';\n\nexport * from './index.js';\nexport { createKeypairSigner, keypairFromPrivateKey, type SolanaPrivateKey };\n\nexport interface CreateGibworkClientOptions extends Omit<\n GibworkClientOptions,\n 'signer'\n> {\n privateKey: SolanaPrivateKey;\n}\n\nexport function createGibworkClient(\n options: CreateGibworkClientOptions,\n): GibworkClient {\n return new GibworkClient({\n signer: createKeypairSigner(options.privateKey),\n ...(options.baseUrl !== undefined ? { baseUrl: options.baseUrl } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n ...(options.timeoutMs !== undefined\n ? { timeoutMs: options.timeoutMs }\n : {}),\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/signers/keypair-signer.ts","../src/node.ts"],"names":[],"mappings":"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","file":"node.js","sourcesContent":["import { Keypair, type VersionedTransaction } from '@solana/web3.js';\nimport bs58 from 'bs58';\nimport nacl from 'tweetnacl';\n\nimport { GibworkConfigurationError } from '../errors/index.js';\nimport type { WalletSigner } from './wallet-signer.js';\n\nexport type SolanaPrivateKey = string | Uint8Array | readonly number[];\n\nexport function createKeypairSigner(\n privateKey: SolanaPrivateKey,\n): WalletSigner {\n const keypair = keypairFromPrivateKey(privateKey);\n\n return {\n publicKey: keypair.publicKey,\n async signMessage(message: Uint8Array): Promise<Uint8Array> {\n return nacl.sign.detached(message, keypair.secretKey);\n },\n async signTransaction(\n transaction: VersionedTransaction,\n ): Promise<VersionedTransaction> {\n transaction.sign([keypair]);\n return transaction;\n },\n };\n}\n\nexport function keypairFromPrivateKey(privateKey: SolanaPrivateKey): Keypair {\n const bytes = decodePrivateKey(privateKey);\n\n try {\n if (bytes.length === 32) return Keypair.fromSeed(bytes);\n if (bytes.length === 64) return Keypair.fromSecretKey(bytes);\n } catch {\n throw new GibworkConfigurationError('SOLANA_PRIVATE_KEY is invalid');\n }\n\n throw new GibworkConfigurationError(\n 'SOLANA_PRIVATE_KEY must contain a 32-byte seed or 64-byte secret key',\n );\n}\n\nfunction decodePrivateKey(privateKey: SolanaPrivateKey): Uint8Array {\n if (privateKey instanceof Uint8Array) return new Uint8Array(privateKey);\n if (Array.isArray(privateKey)) return validateByteArray(privateKey);\n if (typeof privateKey !== 'string') {\n throw new GibworkConfigurationError('SOLANA_PRIVATE_KEY is required');\n }\n\n const value = privateKey.trim();\n if (!value) {\n throw new GibworkConfigurationError('SOLANA_PRIVATE_KEY is required');\n }\n\n if (value.startsWith('[')) {\n try {\n const parsed: unknown = JSON.parse(value);\n if (!Array.isArray(parsed)) throw new Error('Expected a JSON array');\n return validateByteArray(parsed);\n } catch (error) {\n if (error instanceof GibworkConfigurationError) throw error;\n throw new GibworkConfigurationError(\n 'SOLANA_PRIVATE_KEY must be a valid JSON byte array or base58 string',\n );\n }\n }\n\n try {\n return bs58.decode(value);\n } catch {\n throw new GibworkConfigurationError(\n 'SOLANA_PRIVATE_KEY must be a valid JSON byte array or base58 string',\n );\n }\n}\n\nfunction validateByteArray(values: readonly unknown[]): Uint8Array {\n if (\n !values.every(\n (value) =>\n typeof value === 'number' &&\n Number.isInteger(value) &&\n value >= 0 &&\n value <= 255,\n )\n ) {\n throw new GibworkConfigurationError(\n 'SOLANA_PRIVATE_KEY JSON values must be integers between 0 and 255',\n );\n }\n\n return Uint8Array.from(values as number[]);\n}\n","import {\n GibworkClient,\n type GibworkClientOptions,\n} from './client/gibwork-client.js';\nimport {\n createKeypairSigner,\n keypairFromPrivateKey,\n type SolanaPrivateKey,\n} from './signers/keypair-signer.js';\n\nexport * from './index.js';\nexport { createKeypairSigner, keypairFromPrivateKey, type SolanaPrivateKey };\n\nexport interface CreateGibworkClientOptions extends Omit<\n GibworkClientOptions,\n 'signer'\n> {\n privateKey: SolanaPrivateKey;\n}\n\nexport function createGibworkClient(\n options: CreateGibworkClientOptions,\n): GibworkClient {\n return new GibworkClient({\n signer: createKeypairSigner(options.privateKey),\n ...(options.baseUrl !== undefined ? { baseUrl: options.baseUrl } : {}),\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"]}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/errors/index.ts","../src/auth/sanitize.ts","../src/auth/normalize.ts","../src/auth/wallet-auth.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-24XHBDMZ.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 ) {\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';\n\nexport interface AmbiguousSubmitContext {\n operation: SubmitOperation;\n taskId?: string;\n submissionId?: string;\n intentId: 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","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 CreateTaskInput,\n PaginationQuery,\n SubmissionPaginationQuery,\n} from '../types/index.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 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 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","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';\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 { 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 normalizeRejection,\n normalizeSubmissionPagination,\n sha256Json,\n toQueryString,\n} from '../../auth/normalize.js';\nimport { createWalletAuthHeaders } from '../../auth/wallet-auth.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 ApprovalSubmitResult,\n ApproveSubmissionInput,\n ApproveSubmissionResult,\n Paginated,\n PreparedApprovalIntent,\n RejectSubmissionResult,\n RequestOptions,\n SubmissionPaginationQuery,\n TaskSubmission,\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 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 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 normalizeTaskPagination,\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 CreateTaskResult,\n Paginated,\n PaginationQuery,\n PreparedRefundIntent,\n PreparedTaskIntent,\n RefundSubmitResult,\n RefundTaskResult,\n RequestOptions,\n TaskSubmitResult,\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 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 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 timeoutMs?: number;\n}\n\nexport interface HttpRequest {\n method: 'GET' | 'POST';\n path: string;\n headers?: Record<string, string>;\n body?: unknown;\n options?: RequestOptions;\n ambiguousSubmit?: AmbiguousSubmitContext;\n}\n\nexport class HttpTransport {\n private readonly baseUrl: string;\n private readonly fetchImplementation: FetchImplementation;\n private readonly timeoutMs: number;\n\n constructor(options: HttpTransportOptions) {\n this.baseUrl = normalizeBaseUrl(options.baseUrl);\n this.fetchImplementation = options.fetch ?? globalThis.fetch;\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 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 const abortFromCaller = (): void => controller.abort(callerSignal?.reason);\n callerSignal?.addEventListener('abort', abortFromCaller, { once: true });\n\n const timeout = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, this.timeoutMs);\n\n const headers: Record<string, string> = {\n accept: 'application/json',\n ...request.headers,\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 let response: Response;\n try {\n response = await this.fetchImplementation(\n `${this.baseUrl}${request.path}`,\n init,\n );\n } catch (cause) {\n if (request.ambiguousSubmit) {\n throw new GibworkAmbiguousSubmitError(\n request.method,\n request.path,\n request.ambiguousSubmit,\n { cause },\n );\n }\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 reach the Gibwork API',\n request.method,\n request.path,\n { cause },\n );\n } finally {\n clearTimeout(timeout);\n callerSignal?.removeEventListener('abort', abortFromCaller);\n }\n\n const body = await parseResponseBody(response);\n if (!response.ok) {\n const requestId = response.headers.get('x-request-id') ?? undefined;\n const apiError = new GibworkApiError(\n response.status,\n body,\n request.method,\n request.path,\n requestId,\n );\n if (request.ambiguousSubmit && response.status >= 500) {\n throw new GibworkAmbiguousSubmitError(\n request.method,\n request.path,\n request.ambiguousSubmit,\n { cause: apiError },\n );\n }\n throw apiError;\n }\n\n return body as T;\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 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.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"]}
|