@putdotio/sdk 10.3.0 → 10.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +88 -0
- package/dist/{forms-SpjrUB4N.js → forms-69GUrpXE.js} +3 -2
- package/dist/forms-69GUrpXE.js.map +1 -0
- package/dist/{index-FAgKSXHO.d.ts → index-C8wTOodJ.d.ts} +247 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +326 -2
- package/dist/index.js.map +1 -1
- package/dist/utilities.d.ts +1 -1
- package/dist/utilities.js +1 -1
- package/package.json +4 -2
- package/dist/forms-SpjrUB4N.js.map +0 -1
package/README.md
CHANGED
|
@@ -88,6 +88,23 @@ sdk.setAccessToken(undefined);
|
|
|
88
88
|
|
|
89
89
|
The token is snapshotted when each Promise-client operation is invoked. Token changes apply to subsequent operations; an operation already in flight keeps the snapshot it started with. Base, upload, and web app URLs remain fixed from client creation.
|
|
90
90
|
|
|
91
|
+
Authorization-code clients can exchange a code without configuring a default access token:
|
|
92
|
+
|
|
93
|
+
```ts
|
|
94
|
+
const sdk = createPutioSdkPromiseClient();
|
|
95
|
+
|
|
96
|
+
const accessToken = await sdk.auth.exchangeAuthorizationCode({
|
|
97
|
+
clientId,
|
|
98
|
+
clientSecret,
|
|
99
|
+
code,
|
|
100
|
+
redirectUri,
|
|
101
|
+
});
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
The exchange uses a form-encoded `POST` and never sends a configured bearer token. Known OAuth
|
|
105
|
+
failures are exposed as `OAuthAuthorizationCodeExchangeError`; client secrets and codes are not
|
|
106
|
+
included in validation errors.
|
|
107
|
+
|
|
91
108
|
## Utilities
|
|
92
109
|
|
|
93
110
|
Shared formatting, URL, and error-localization helpers are available from the utilities subpath:
|
|
@@ -192,6 +209,7 @@ If you create a long-lived Promise client in a script, test harness, or server i
|
|
|
192
209
|
| `ifttt` | IFTTT integration endpoints |
|
|
193
210
|
| `oauth` | OAuth app management |
|
|
194
211
|
| `payment` | plans, vouchers, payment flows, payment history |
|
|
212
|
+
| `podcast` | podcast feed links for folders and media types |
|
|
195
213
|
| `rss` | RSS feed management |
|
|
196
214
|
| `sharing` | friend shares, public shares, clone flows |
|
|
197
215
|
| `transfers` | transfer list, add/retry/cancel/clean flows |
|
|
@@ -304,6 +322,76 @@ const upload = await sdk.files.upload({
|
|
|
304
322
|
|
|
305
323
|
Upload targets `upload.put.io` internally because `api.put.io/v2/files/upload` is only a redirect shim.
|
|
306
324
|
|
|
325
|
+
## File Lookup and Mutations
|
|
326
|
+
|
|
327
|
+
Named-child lookup avoids listing an entire folder and preserves the same query-conditioned fields as
|
|
328
|
+
`files.get`:
|
|
329
|
+
|
|
330
|
+
```ts
|
|
331
|
+
const child = await sdk.files.getChild({
|
|
332
|
+
parentId: folderId,
|
|
333
|
+
name: "movie.mp4",
|
|
334
|
+
query: { stream_url: 1 },
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
await sdk.files.touch({ fileIds: [child.id], updatedAt: new Date() });
|
|
338
|
+
const copy = await sdk.files.copy({ fileId: child.id, parentId: 0, name: "movie copy.mp4" });
|
|
339
|
+
const writableUserId = await sdk.files.canWrite(copy.id);
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
`canWrite` resolves the user ID returned by the backend when the file is writable. A non-writable,
|
|
343
|
+
missing, or payment-gated file rejects with the corresponding typed SDK error rather than returning
|
|
344
|
+
`false`.
|
|
345
|
+
|
|
346
|
+
## Transfer Torrent Operations
|
|
347
|
+
|
|
348
|
+
Torrent-backed transfers expose their original metainfo bytes and tracker mutation:
|
|
349
|
+
|
|
350
|
+
```ts
|
|
351
|
+
const torrent = await sdk.transfers.getTorrent(transferId);
|
|
352
|
+
|
|
353
|
+
await sdk.transfers.addTrackers({
|
|
354
|
+
transferId,
|
|
355
|
+
trackers: ["udp://tracker.example:80", "https://tracker.example/announce"],
|
|
356
|
+
});
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
`getTorrent` rejects for magnet-backed or non-torrent transfers. Remove accepts exactly one selector,
|
|
360
|
+
preventing an ambiguous mix of IDs and filters:
|
|
361
|
+
|
|
362
|
+
```ts
|
|
363
|
+
await sdk.transfers.remove({ ids: [transferId] });
|
|
364
|
+
await sdk.transfers.remove({ filter: "completed" });
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
## Folder Sort and Podcast Feeds
|
|
368
|
+
|
|
369
|
+
Folder sort settings persist per folder and apply to subsequent file listings:
|
|
370
|
+
|
|
371
|
+
```ts
|
|
372
|
+
await sdk.files.setSort({
|
|
373
|
+
fileId: folderId,
|
|
374
|
+
sortBy: "MODIFIED_DESC",
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
await sdk.files.resetSortSettings();
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
`resetSortSettings()` clears the saved sort setting for every folder, including the root folder.
|
|
381
|
+
|
|
382
|
+
Podcast links can target a folder and an explicit non-empty selection of feed types. Omit
|
|
383
|
+
`types` to request the API defaults:
|
|
384
|
+
|
|
385
|
+
```ts
|
|
386
|
+
const { links, token } = await sdk.podcast.getLinks({
|
|
387
|
+
parentId: folderId,
|
|
388
|
+
types: ["audio", "mp4"],
|
|
389
|
+
});
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
`links` is a partial map keyed by `all`, `audio`, `video`, and `mp4`, so consumers should
|
|
393
|
+
check whether a requested link is present.
|
|
394
|
+
|
|
307
395
|
## TanStack Query
|
|
308
396
|
|
|
309
397
|
The Promise client plugs into TanStack Query directly:
|
|
@@ -2,6 +2,7 @@ import { Context, Data, Effect, Layer, Schema } from "effect";
|
|
|
2
2
|
//#region src/core/errors.ts
|
|
3
3
|
const PutioErrorEnvelopeSchema = Schema.Struct({
|
|
4
4
|
status: Schema.optional(Schema.String),
|
|
5
|
+
error: Schema.optional(Schema.String),
|
|
5
6
|
error_message: Schema.optional(Schema.String),
|
|
6
7
|
error_type: Schema.optional(Schema.String),
|
|
7
8
|
error_uri: Schema.optional(Schema.String),
|
|
@@ -63,7 +64,7 @@ var PutioRateLimitError = class extends Schema.TaggedErrorClass()("PutioRateLimi
|
|
|
63
64
|
var PutioOperationError = class extends Data.TaggedError("PutioOperationError") {};
|
|
64
65
|
const definePutioOperationErrorSpec = (spec) => spec;
|
|
65
66
|
const decodePutioErrorEnvelope = Schema.decodeUnknownEffect(PutioErrorEnvelopeSchema);
|
|
66
|
-
const isPutioErrorEnvelope = (value) => isRecord(value) && hasOptionalString(value, "status") && hasOptionalString(value, "error_message") && hasOptionalString(value, "error_type") && hasOptionalString(value, "error_uri") && hasOptionalNullableString(value, "error_id") && hasOptionalRecord(value, "extra") && hasOptionalInteger(value, "status_code");
|
|
67
|
+
const isPutioErrorEnvelope = (value) => isRecord(value) && hasOptionalString(value, "status") && hasOptionalString(value, "error") && hasOptionalString(value, "error_message") && hasOptionalString(value, "error_type") && hasOptionalString(value, "error_uri") && hasOptionalNullableString(value, "error_id") && hasOptionalRecord(value, "extra") && hasOptionalInteger(value, "status_code");
|
|
67
68
|
const hasStatusAndBody = (value, tag) => isRecord(value) && value._tag === tag && typeof value.status === "number" && isPutioErrorEnvelope(value.body);
|
|
68
69
|
const isPutioApiError = (value) => hasStatusAndBody(value, "PutioApiError");
|
|
69
70
|
const isPutioAuthError = (value) => hasStatusAndBody(value, "PutioAuthError");
|
|
@@ -259,4 +260,4 @@ const toCursorSelectionForm = (selection, idsFieldName) => {
|
|
|
259
260
|
//#endregion
|
|
260
261
|
export { definePutioOperationErrorSpec as A, mapTransportError as B, PutioConfigurationError as C, PutioTransportError as D, PutioRateLimitError as E, isPutioOperationError as F, responseRateLimitHeaders as H, isPutioRateLimitError as I, makeResponseError as L, isPutioApiError as M, isPutioAuthError as N, PutioValidationError as O, isPutioErrorEnvelope as P, mapConfigurationError as R, PutioAuthError as S, PutioOperationError as T, withOperationErrors as U, parseErrorBody as V, selectJsonFields as _, PutioSdkConfig as a, DEFAULT_PUTIO_WEB_APP_URL as b, makePutioFetchClient as c, makePutioSdkLayer as d, makePutioSdkLiveLayer as f, selectJsonField as g, requestVoid as h, PutioHttpClient as i, fallbackPutioErrorEnvelope as j, decodePutioErrorEnvelope as k, makePutioFetchLayer as l, requestJson as m, toCursorSelectionForm as n, buildPutioUrl as o, requestArrayBuffer as p, OkResponseSchema as r, encodePathSegment as s, joinCsv as t, makePutioSdkConfig as u, DEFAULT_PUTIO_API_BASE_URL as v, PutioErrorEnvelopeSchema as w, PutioApiError as x, DEFAULT_PUTIO_UPLOAD_BASE_URL as y, mapDecodeErrorToValidationError as z };
|
|
261
262
|
|
|
262
|
-
//# sourceMappingURL=forms-
|
|
263
|
+
//# sourceMappingURL=forms-69GUrpXE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forms-69GUrpXE.js","names":[],"sources":["../src/core/errors.ts","../src/core/defaults.ts","../src/core/http.ts","../src/core/forms.ts"],"sourcesContent":["import { Data, Effect, Schema } from \"effect\";\n\nexport const PutioErrorEnvelopeSchema = Schema.Struct({\n status: Schema.optional(Schema.String),\n error: Schema.optional(Schema.String),\n error_message: Schema.optional(Schema.String),\n error_type: Schema.optional(Schema.String),\n error_uri: Schema.optional(Schema.String),\n error_id: Schema.optional(Schema.NullOr(Schema.String)),\n extra: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),\n status_code: Schema.optional(Schema.Int),\n details: Schema.optional(Schema.Unknown),\n});\n\nexport type PutioErrorEnvelope = Schema.Schema.Type<typeof PutioErrorEnvelopeSchema>;\n\nexport interface PutioKnownErrorContract<\n TType extends string = string,\n TStatus extends number = number,\n TBody extends PutioErrorEnvelope = PutioErrorEnvelope,\n> {\n readonly bodySchema?: Schema.Schema<TBody> | undefined;\n readonly errorType?: TType | undefined;\n readonly statusCode?: TStatus | undefined;\n}\n\ntype ContractErrorType<TContract extends PutioKnownErrorContract> =\n TContract extends PutioKnownErrorContract<infer TType, number> ? TType : never;\n\ntype ContractStatusCode<TContract extends PutioKnownErrorContract> =\n TContract extends PutioKnownErrorContract<string, infer TStatus> ? TStatus : never;\n\ntype ContractBody<TContract extends PutioKnownErrorContract> = TContract extends {\n readonly bodySchema: Schema.Schema<infer TBody extends PutioErrorEnvelope>;\n}\n ? TBody\n : PutioErrorEnvelope;\n\nexport type PutioTypedErrorEnvelope<TContract extends PutioKnownErrorContract> =\n TContract extends PutioKnownErrorContract\n ? Omit<ContractBody<TContract>, \"error_message\" | \"error_type\" | \"status_code\"> & {\n readonly error_message?: string;\n readonly error_type?: [ContractErrorType<TContract>] extends [never]\n ? string\n : ContractErrorType<TContract>;\n readonly status_code?: [ContractStatusCode<TContract>] extends [never]\n ? number\n : ContractStatusCode<TContract>;\n }\n : never;\n\nexport interface PutioOperationErrorSpec<\n TDomain extends string = string,\n TOperation extends string = string,\n TContracts extends ReadonlyArray<PutioKnownErrorContract> =\n ReadonlyArray<PutioKnownErrorContract>,\n> {\n readonly domain: TDomain;\n readonly operation: TOperation;\n readonly knownErrors: TContracts;\n}\n\ntype OperationContractOf<TSpec extends PutioOperationErrorSpec> = Extract<\n TSpec[\"knownErrors\"][number],\n PutioKnownOperationErrorContract\n>;\n\ntype OperationContractOfParts<\n TDomain extends string,\n TOperation extends string,\n TContracts extends ReadonlyArray<PutioKnownErrorContract>,\n> = OperationContractOf<PutioOperationErrorSpec<TDomain, TOperation, TContracts>>;\n\ntype PutioOperationErrorReason<TContract extends PutioKnownErrorContract> = TContract extends {\n readonly errorType: infer TType extends string;\n}\n ? {\n readonly kind: \"error_type\";\n readonly errorType: TType;\n }\n : TContract extends { readonly statusCode: infer TStatus extends number }\n ? {\n readonly kind: \"status_code\";\n readonly statusCode: TStatus;\n }\n : never;\n\nexport type PutioKnownOperationErrorContract =\n | {\n readonly errorType: string;\n readonly statusCode?: number;\n }\n | {\n readonly errorType?: undefined;\n readonly statusCode: number;\n };\n\nconst isKnownContractMatch = <TContract extends PutioKnownErrorContract>(\n contract: TContract,\n error: PutioApiError | PutioAuthError,\n): contract is Extract<TContract, PutioKnownOperationErrorContract> => {\n if (contract.bodySchema !== undefined && !Schema.is(contract.bodySchema)(error.body)) {\n return false;\n }\n\n if (contract.errorType !== undefined) {\n if (error.body.error_type !== contract.errorType) {\n return false;\n }\n\n return contract.statusCode === undefined || error.status === contract.statusCode;\n }\n\n if (contract.statusCode !== undefined) {\n return error.status === contract.statusCode;\n }\n\n return false;\n};\n\nconst isMatchableApiError = (error: PutioSdkError): error is PutioApiError | PutioAuthError =>\n error._tag === \"PutioApiError\" || error._tag === \"PutioAuthError\";\n\nconst isRecord = (value: unknown): value is Readonly<Record<string, unknown>> =>\n typeof value === \"object\" && value !== null;\n\nconst hasOptionalString = (record: Readonly<Record<string, unknown>>, key: string): boolean =>\n !(key in record) || record[key] === undefined || typeof record[key] === \"string\";\n\nconst hasOptionalInteger = (record: Readonly<Record<string, unknown>>, key: string): boolean =>\n !(key in record) ||\n record[key] === undefined ||\n (typeof record[key] === \"number\" && Number.isInteger(record[key]));\n\nconst hasOptionalNullableString = (\n record: Readonly<Record<string, unknown>>,\n key: string,\n): boolean =>\n !(key in record) ||\n record[key] === undefined ||\n record[key] === null ||\n typeof record[key] === \"string\";\n\nconst hasOptionalRecord = (record: Readonly<Record<string, unknown>>, key: string): boolean =>\n !(key in record) ||\n record[key] === undefined ||\n (isRecord(record[key]) && !Array.isArray(record[key]));\n\nconst isKnownOperationErrorContract = (value: unknown): value is PutioKnownOperationErrorContract =>\n isRecord(value) &&\n (typeof value.errorType === \"string\" || typeof value.statusCode === \"number\") &&\n hasOptionalString(value, \"errorType\") &&\n hasOptionalInteger(value, \"statusCode\");\n\nconst isOperationReason = (\n value: unknown,\n): value is PutioOperationErrorReason<PutioKnownOperationErrorContract> => {\n if (!isRecord(value)) {\n return false;\n }\n\n if (value.kind === \"error_type\") {\n return typeof value.errorType === \"string\";\n }\n\n if (value.kind === \"status_code\") {\n return typeof value.statusCode === \"number\";\n }\n\n return false;\n};\n\nfunction toOperationReason<TContract extends { readonly errorType: string }>(\n contract: TContract,\n): PutioOperationErrorReason<TContract>;\nfunction toOperationReason<TContract extends { readonly statusCode: number }>(\n contract: TContract,\n): PutioOperationErrorReason<TContract>;\nfunction toOperationReason(\n contract: PutioKnownOperationErrorContract,\n): PutioOperationErrorReason<PutioKnownOperationErrorContract> {\n if (contract.errorType !== undefined) {\n return {\n kind: \"error_type\",\n errorType: contract.errorType,\n };\n }\n\n return {\n kind: \"status_code\",\n statusCode: contract.statusCode,\n };\n}\n\nexport class PutioTransportError extends Data.TaggedError(\"PutioTransportError\")<{\n readonly cause: unknown;\n}> {}\n\nexport class PutioConfigurationError extends Data.TaggedError(\"PutioConfigurationError\")<{\n readonly cause: unknown;\n}> {}\n\nexport class PutioValidationError extends Data.TaggedError(\"PutioValidationError\")<{\n readonly cause: unknown;\n}> {}\n\nconst PutioResponseErrorFields = {\n status: Schema.Int,\n body: PutioErrorEnvelopeSchema,\n};\n\nexport class PutioApiError extends Schema.TaggedErrorClass<PutioApiError>()(\"PutioApiError\", {\n ...PutioResponseErrorFields,\n}) {}\n\nexport class PutioAuthError extends Schema.TaggedErrorClass<PutioAuthError>()(\"PutioAuthError\", {\n ...PutioResponseErrorFields,\n}) {}\n\nexport class PutioRateLimitError extends Schema.TaggedErrorClass<PutioRateLimitError>()(\n \"PutioRateLimitError\",\n {\n ...PutioResponseErrorFields,\n action: Schema.optional(Schema.String),\n id: Schema.optional(Schema.String),\n limit: Schema.optional(Schema.String),\n remaining: Schema.optional(Schema.String),\n retryAfter: Schema.optional(Schema.String),\n reset: Schema.optional(Schema.String),\n },\n) {}\n\nexport class PutioOperationError<\n TDomain extends string,\n TOperation extends string,\n TContract extends PutioKnownOperationErrorContract,\n> extends Data.TaggedError(\"PutioOperationError\")<{\n readonly body: PutioTypedErrorEnvelope<TContract>;\n readonly contract: TContract;\n readonly domain: TDomain;\n readonly operation: TOperation;\n readonly reason: PutioOperationErrorReason<TContract>;\n readonly status: number;\n}> {}\n\nexport type PutioSdkError =\n | PutioConfigurationError\n | PutioTransportError\n | PutioValidationError\n | PutioApiError\n | PutioAuthError\n | PutioRateLimitError;\n\nexport type PutioUnhandledSdkError =\n | PutioConfigurationError\n | PutioTransportError\n | PutioValidationError\n | PutioApiError\n | PutioAuthError\n | PutioRateLimitError;\n\nexport type PutioOperationErrorFromSpec<TSpec extends PutioOperationErrorSpec> =\n PutioOperationError<TSpec[\"domain\"], TSpec[\"operation\"], OperationContractOf<TSpec>>;\n\nexport type PutioOperationFailure<TSpec extends PutioOperationErrorSpec> =\n | PutioUnhandledSdkError\n | PutioOperationErrorFromSpec<TSpec>;\n\nexport type AnyPutioOperationError = PutioOperationError<\n string,\n string,\n PutioKnownOperationErrorContract\n>;\n\nexport const definePutioOperationErrorSpec = <\n const TDomain extends string,\n const TOperation extends string,\n const TContracts extends ReadonlyArray<PutioKnownErrorContract>,\n>(\n spec: PutioOperationErrorSpec<TDomain, TOperation, TContracts>,\n) => spec;\n\nexport const decodePutioErrorEnvelope = Schema.decodeUnknownEffect(PutioErrorEnvelopeSchema);\n\nexport const isPutioErrorEnvelope = (value: unknown): value is PutioErrorEnvelope =>\n isRecord(value) &&\n hasOptionalString(value, \"status\") &&\n hasOptionalString(value, \"error\") &&\n hasOptionalString(value, \"error_message\") &&\n hasOptionalString(value, \"error_type\") &&\n hasOptionalString(value, \"error_uri\") &&\n hasOptionalNullableString(value, \"error_id\") &&\n hasOptionalRecord(value, \"extra\") &&\n hasOptionalInteger(value, \"status_code\");\n\nconst hasStatusAndBody = <TTag extends string>(\n value: unknown,\n tag: TTag,\n): value is {\n readonly _tag: TTag;\n readonly body: PutioErrorEnvelope;\n readonly status: number;\n} =>\n isRecord(value) &&\n value._tag === tag &&\n typeof value.status === \"number\" &&\n isPutioErrorEnvelope(value.body);\n\nexport const isPutioApiError = (value: unknown): value is PutioApiError =>\n hasStatusAndBody(value, \"PutioApiError\");\n\nexport const isPutioAuthError = (value: unknown): value is PutioAuthError =>\n hasStatusAndBody(value, \"PutioAuthError\");\n\nexport const isPutioRateLimitError = (value: unknown): value is PutioRateLimitError =>\n hasStatusAndBody(value, \"PutioRateLimitError\") &&\n isRecord(value) &&\n hasOptionalString(value, \"action\") &&\n hasOptionalString(value, \"id\") &&\n hasOptionalString(value, \"limit\") &&\n hasOptionalString(value, \"remaining\") &&\n hasOptionalString(value, \"retryAfter\") &&\n hasOptionalString(value, \"reset\");\n\nexport const isPutioOperationError = (value: unknown): value is AnyPutioOperationError =>\n isRecord(value) &&\n value._tag === \"PutioOperationError\" &&\n isPutioErrorEnvelope(value.body) &&\n isKnownOperationErrorContract(value.contract) &&\n typeof value.domain === \"string\" &&\n typeof value.operation === \"string\" &&\n isOperationReason(value.reason) &&\n typeof value.status === \"number\";\n\nexport const fallbackPutioErrorEnvelope = (status: number): PutioErrorEnvelope => ({\n error_message: `put.io API request failed with status ${status}`,\n status_code: status,\n});\n\nconst getHeader = (headers: Headers, name: string): string | undefined =>\n headers.get(name) ?? undefined;\n\nexport const responseRateLimitHeaders = (headers: Headers) => ({\n action: getHeader(headers, \"x-ratelimit-action\"),\n id: getHeader(headers, \"x-ratelimit-id\"),\n limit: getHeader(headers, \"x-ratelimit-limit\"),\n remaining: getHeader(headers, \"x-ratelimit-remaining\"),\n retryAfter: getHeader(headers, \"retry-after\"),\n reset: getHeader(headers, \"x-ratelimit-reset\"),\n});\n\nexport const mapDecodeErrorToValidationError = (cause: unknown) =>\n new PutioValidationError({ cause });\n\nexport const mapConfigurationError = (cause: unknown) => new PutioConfigurationError({ cause });\n\nexport const mapTransportError = (cause: unknown) => new PutioTransportError({ cause });\n\nexport const makeResponseError = (\n status: number,\n headers: Headers,\n body: PutioErrorEnvelope,\n): PutioSdkError => {\n if (status === 429) {\n return new PutioRateLimitError({\n status,\n body,\n ...responseRateLimitHeaders(headers),\n });\n }\n\n if (status === 401 || status === 403) {\n return new PutioAuthError({ status, body });\n }\n\n return new PutioApiError({ status, body });\n};\n\nexport const parseErrorBody = (status: number, json: unknown) =>\n decodePutioErrorEnvelope(json).pipe(\n Effect.orElseSucceed(() => fallbackPutioErrorEnvelope(status)),\n );\n\nexport function withOperationErrors<\n A,\n E extends PutioSdkError,\n R,\n const TDomain extends string,\n const TOperation extends string,\n const TContracts extends ReadonlyArray<PutioKnownErrorContract>,\n>(\n effect: Effect.Effect<A, E, R>,\n spec: PutioOperationErrorSpec<TDomain, TOperation, TContracts>,\n): Effect.Effect<\n A,\n | E\n | PutioOperationError<\n TDomain,\n TOperation,\n OperationContractOfParts<TDomain, TOperation, TContracts>\n >,\n R\n>;\nexport function withOperationErrors<\n const TDomain extends string,\n const TOperation extends string,\n const TContracts extends ReadonlyArray<PutioKnownErrorContract>,\n>(\n spec: PutioOperationErrorSpec<TDomain, TOperation, TContracts>,\n): <A, E extends PutioSdkError, R>(\n effect: Effect.Effect<A, E, R>,\n) => Effect.Effect<\n A,\n | E\n | PutioOperationError<\n TDomain,\n TOperation,\n OperationContractOfParts<TDomain, TOperation, TContracts>\n >,\n R\n>;\nexport function withOperationErrors<\n A,\n E extends PutioSdkError,\n R,\n const TDomain extends string,\n const TOperation extends string,\n const TContracts extends ReadonlyArray<PutioKnownErrorContract>,\n>(\n effectOrSpec: Effect.Effect<A, E, R> | PutioOperationErrorSpec<TDomain, TOperation, TContracts>,\n maybeSpec?: PutioOperationErrorSpec<TDomain, TOperation, TContracts>,\n):\n | Effect.Effect<\n A,\n | E\n | PutioOperationError<\n TDomain,\n TOperation,\n OperationContractOfParts<TDomain, TOperation, TContracts>\n >,\n R\n >\n | (<A2, E2 extends PutioSdkError, R2>(\n effect: Effect.Effect<A2, E2, R2>,\n ) => Effect.Effect<\n A2,\n | E2\n | PutioOperationError<\n TDomain,\n TOperation,\n OperationContractOfParts<TDomain, TOperation, TContracts>\n >,\n R2\n >) {\n if (maybeSpec === undefined) {\n const spec = effectOrSpec as PutioOperationErrorSpec<TDomain, TOperation, TContracts>;\n\n return <A2, E2 extends PutioSdkError, R2>(effect: Effect.Effect<A2, E2, R2>) =>\n withOperationErrors(effect, spec);\n }\n\n const effect = effectOrSpec as Effect.Effect<A, E, R>;\n const spec = maybeSpec;\n\n return effect.pipe(\n Effect.mapError((error) => {\n if (!isMatchableApiError(error)) {\n return error;\n }\n\n const contract = spec.knownErrors.find((candidate) => isKnownContractMatch(candidate, error));\n\n if (!contract) {\n return error;\n }\n\n return new PutioOperationError({\n body: error.body as PutioTypedErrorEnvelope<\n OperationContractOfParts<TDomain, TOperation, TContracts>\n >,\n contract,\n domain: spec.domain,\n operation: spec.operation,\n reason: toOperationReason(contract),\n status: error.status,\n });\n }),\n );\n}\n","export const DEFAULT_PUTIO_API_BASE_URL = \"https://api.put.io\";\nexport const DEFAULT_PUTIO_UPLOAD_BASE_URL = \"https://upload.put.io\";\nexport const DEFAULT_PUTIO_WEB_APP_URL = \"https://app.put.io\";\n","import { Context, Effect, Layer, Schema } from \"effect\";\n\nimport {\n DEFAULT_PUTIO_API_BASE_URL,\n DEFAULT_PUTIO_UPLOAD_BASE_URL,\n DEFAULT_PUTIO_WEB_APP_URL,\n} from \"./defaults.js\";\nimport {\n fallbackPutioErrorEnvelope,\n makeResponseError,\n mapConfigurationError,\n mapDecodeErrorToValidationError,\n mapTransportError,\n parseErrorBody,\n PutioConfigurationError,\n type PutioSdkError,\n} from \"./errors.js\";\n\nexport type PutioQueryValue = string | number | boolean | null | undefined;\n\nexport type PutioQuery = Readonly<Record<string, PutioQueryValue>>;\n\nexport type PutioPathSegment = string | number | boolean;\n\nexport interface PutioSdkConfigShape {\n readonly accessToken?: string;\n readonly baseUrl?: string | URL;\n readonly uploadBaseUrl?: string | URL;\n readonly webAppUrl?: string | URL;\n}\n\nexport class PutioSdkConfig extends Context.Service<PutioSdkConfig, PutioSdkConfigShape>()(\n \"PutioSdkConfig\",\n) {}\n\nexport interface PutioHttpRequest {\n readonly body?: BodyInit;\n readonly headers: Headers;\n readonly method: PutioRequestMethod;\n readonly url: string;\n}\n\nexport interface PutioHttpResponse {\n readonly arrayBuffer: Effect.Effect<ArrayBuffer, PutioSdkError>;\n readonly headers: Headers;\n readonly json: Effect.Effect<unknown, PutioSdkError>;\n readonly status: number;\n}\n\nexport interface PutioHttpClientShape {\n readonly execute: (request: PutioHttpRequest) => Effect.Effect<PutioHttpResponse, PutioSdkError>;\n}\n\nexport class PutioHttpClient extends Context.Service<PutioHttpClient, PutioHttpClientShape>()(\n \"PutioHttpClient\",\n) {}\n\nexport type PutioSdkContext = PutioSdkConfig | PutioHttpClient;\n\nexport const makePutioSdkConfig = (config: PutioSdkConfigShape): PutioSdkConfigShape => ({\n accessToken: config.accessToken,\n baseUrl: config.baseUrl ?? DEFAULT_PUTIO_API_BASE_URL,\n uploadBaseUrl: config.uploadBaseUrl ?? DEFAULT_PUTIO_UPLOAD_BASE_URL,\n webAppUrl: config.webAppUrl ?? DEFAULT_PUTIO_WEB_APP_URL,\n});\n\nexport const makePutioSdkLayer = (config: PutioSdkConfigShape) =>\n Layer.succeed(PutioSdkConfig, makePutioSdkConfig(config));\n\nexport const makePutioSdkLiveLayer = (config: PutioSdkConfigShape) =>\n Layer.mergeAll(makePutioSdkLayer(config), makePutioFetchLayer());\n\nexport const makePutioFetchLayer = (\n fetchImplementation: typeof globalThis.fetch = globalThis.fetch,\n) => Layer.succeed(PutioHttpClient, makePutioFetchClient(fetchImplementation));\n\nexport const makePutioFetchClient = (\n fetchImplementation: typeof globalThis.fetch = globalThis.fetch,\n): PutioHttpClientShape => ({\n execute: (request) =>\n Effect.tryPromise({\n try: async (signal) => {\n const response = await fetchImplementation(request.url, {\n body: request.body,\n headers: request.headers,\n method: request.method,\n signal,\n });\n\n return {\n arrayBuffer: Effect.tryPromise({\n try: () => response.arrayBuffer(),\n catch: mapTransportError,\n }),\n headers: response.headers,\n json: Effect.tryPromise({\n try: () => response.json(),\n catch: mapTransportError,\n }),\n status: response.status,\n };\n },\n catch: mapTransportError,\n }),\n});\n\nexport const encodePathSegment = (value: PutioPathSegment): string =>\n encodeURIComponent(String(value));\n\nconst absoluteUrlPattern = /^(?:[a-z][a-z\\d+.-]*:|\\/\\/)/i;\n\nconst normalizeApiPath = (path: string): string => {\n if (absoluteUrlPattern.test(path)) {\n throw mapConfigurationError(\"SDK API request paths must be relative to the configured baseUrl\");\n }\n\n return path.startsWith(\"/\") ? path : `/${path}`;\n};\n\nexport const buildPutioUrl = (baseUrl: string | URL, path: string, query?: PutioQuery): string => {\n const url = new URL(normalizeApiPath(path), baseUrl);\n\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n return url.toString();\n};\n\nconst mapUrlBuildError = (cause: unknown) =>\n cause instanceof PutioConfigurationError ? cause : mapConfigurationError(cause);\n\nexport const OkResponseSchema = Schema.Struct({\n status: Schema.Literal(\"OK\"),\n});\n\nexport type PutioAuth =\n | { readonly type: \"config-token\" }\n | { readonly type: \"token\"; readonly token: string }\n | { readonly type: \"basic\"; readonly username: string; readonly password: string }\n | { readonly type: \"none\" };\n\ntype PutioRequestMethod = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n\ntype PutioRequestBody =\n | { readonly type: \"none\" }\n | { readonly type: \"json\"; readonly value: unknown }\n | { readonly type: \"form\"; readonly value: Record<string, unknown> }\n | { readonly type: \"form-data\"; readonly value: FormData };\n\ninterface PutioRequestOptions {\n readonly method: PutioRequestMethod;\n readonly path: string;\n readonly baseUrl?: string | URL;\n readonly query?: PutioQuery;\n readonly headers?: HeadersInit;\n readonly auth?: PutioAuth;\n readonly body?: PutioRequestBody;\n}\n\nconst isSuccessStatus = (status: number) => status >= 200 && status < 300;\n\nconst decodeSuccessJson = <S extends Schema.Top>(schema: S, response: PutioHttpResponse) =>\n response.json.pipe(\n Effect.flatMap(Schema.decodeUnknownEffect(schema)),\n Effect.mapError(mapDecodeErrorToValidationError),\n );\n\nconst decodeFailure = (response: PutioHttpResponse, headers: Headers) =>\n response.json.pipe(\n Effect.flatMap((json) => parseErrorBody(response.status, json)),\n Effect.orElseSucceed(() => fallbackPutioErrorEnvelope(response.status)),\n Effect.map((body) => makeResponseError(response.status, headers, body)),\n );\n\nconst toBasicAuthorization = (username: string, password: string) => {\n if (typeof globalThis.btoa === \"function\") {\n return `Basic ${globalThis.btoa(`${username}:${password}`)}`;\n }\n\n throw mapConfigurationError(\n \"This runtime does not provide btoa(), so Basic auth cannot be encoded safely\",\n );\n};\n\nconst resolveAuthorization = (\n config: PutioSdkConfigShape,\n auth: PutioAuth | undefined,\n): Effect.Effect<string | undefined, PutioSdkError> => {\n const resolvedAuth = auth ?? { type: \"config-token\" as const };\n\n switch (resolvedAuth.type) {\n case \"none\":\n return Effect.succeed(undefined);\n case \"token\":\n return Effect.succeed(`Token ${resolvedAuth.token}`);\n case \"basic\":\n return Effect.try({\n try: () => toBasicAuthorization(resolvedAuth.username, resolvedAuth.password),\n catch: mapConfigurationError,\n });\n case \"config-token\":\n if (!config.accessToken) {\n return Effect.fail(\n mapConfigurationError(\n \"This endpoint requires an access token, but PutioSdkConfig.accessToken is missing\",\n ),\n );\n }\n\n return Effect.succeed(`Token ${config.accessToken}`);\n }\n};\n\nconst normalizeFormValue = (value: unknown): string => {\n if (value === null || value === undefined) {\n return \"\";\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n return JSON.stringify(value);\n};\n\nconst withBody = (body: PutioRequestBody): Effect.Effect<BodyInit | undefined, PutioSdkError> => {\n switch (body.type) {\n case \"none\":\n return Effect.succeed(undefined);\n case \"json\":\n return Effect.try({\n try: () => JSON.stringify(body.value),\n catch: mapDecodeErrorToValidationError,\n });\n case \"form\":\n return Effect.succeed(\n new URLSearchParams(\n Object.entries(body.value).flatMap(([key, value]) =>\n value === undefined ? [] : [[key, normalizeFormValue(value)]],\n ),\n ),\n );\n case \"form-data\":\n return Effect.succeed(body.value);\n }\n};\n\nconst makeRequest = (url: string, options: PutioRequestOptions, authorization?: string) =>\n Effect.gen(function* () {\n const headers = new Headers(options.headers);\n\n const body = options.body ?? { type: \"none\" as const };\n headers.set(\"accept\", \"application/json\");\n\n if (authorization) {\n headers.set(\"authorization\", authorization);\n }\n\n if (body.type === \"json\" && !headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\");\n }\n\n return {\n body: yield* withBody(body),\n headers,\n method: options.method,\n url,\n };\n });\n\nconst executeRequest = (options: PutioRequestOptions) =>\n Effect.gen(function* () {\n const config = yield* PutioSdkConfig;\n const httpClient = yield* PutioHttpClient;\n const authorization = yield* resolveAuthorization(config, options.auth);\n const url = yield* Effect.try({\n try: () =>\n buildPutioUrl(\n options.baseUrl ?? config.baseUrl ?? DEFAULT_PUTIO_API_BASE_URL,\n options.path,\n options.query,\n ),\n catch: mapUrlBuildError,\n });\n const request = yield* makeRequest(url, options, authorization);\n\n return yield* httpClient.execute(request);\n });\n\nexport const requestJson = <S extends Schema.Top>(\n schema: S,\n options: PutioRequestOptions,\n): Effect.Effect<S[\"Type\"], PutioSdkError, PutioSdkContext | S[\"DecodingServices\"]> =>\n executeRequest(options).pipe(\n Effect.flatMap((response) =>\n isSuccessStatus(response.status)\n ? decodeSuccessJson(schema, response)\n : decodeFailure(response, response.headers).pipe(Effect.flatMap(Effect.fail)),\n ),\n );\n\nexport const selectJsonField =\n <K extends string>(field: K) =>\n <A extends { readonly [P in K]: unknown }, E, R>(\n effect: Effect.Effect<A, E, R>,\n ): Effect.Effect<A[K], E, R> =>\n effect.pipe(Effect.map((value) => value[field]));\n\nexport const selectJsonFields =\n <const K extends readonly string[]>(...fields: K) =>\n <A extends { readonly [P in K[number]]: unknown }, E, R>(\n effect: Effect.Effect<A, E, R>,\n ): Effect.Effect<Pick<A, K[number]>, E, R> =>\n effect.pipe(\n Effect.map(\n (value) =>\n Object.fromEntries(fields.map((field) => [field, value[field as K[number]]])) as Pick<\n A,\n K[number]\n >,\n ),\n );\n\nexport const requestArrayBuffer = (\n options: PutioRequestOptions,\n): Effect.Effect<Uint8Array, PutioSdkError, PutioSdkContext> =>\n executeRequest(options).pipe(\n Effect.flatMap((response) =>\n isSuccessStatus(response.status)\n ? response.arrayBuffer.pipe(\n Effect.mapError(mapTransportError),\n Effect.map((buffer) => new Uint8Array(buffer)),\n )\n : decodeFailure(response, response.headers).pipe(Effect.flatMap(Effect.fail)),\n ),\n );\n\nexport const requestVoid = (\n options: PutioRequestOptions,\n): Effect.Effect<void, PutioSdkError, PutioSdkContext> =>\n executeRequest(options).pipe(\n Effect.flatMap((response) =>\n isSuccessStatus(response.status)\n ? Effect.void\n : decodeFailure(response, response.headers).pipe(Effect.flatMap(Effect.fail)),\n ),\n );\n","type CsvValue = string | number;\n\nexport interface CursorSelectionInput<TValue extends CsvValue = number> {\n readonly cursor?: string;\n readonly excludeIds?: ReadonlyArray<TValue>;\n readonly ids?: ReadonlyArray<TValue>;\n}\n\nexport const joinCsv = <TValue extends CsvValue>(\n values: ReadonlyArray<TValue> | undefined,\n): string | undefined => (values && values.length > 0 ? values.join(\",\") : undefined);\n\nexport const toCursorSelectionForm = <\n TValue extends CsvValue,\n const TIdsFieldName extends string = \"file_ids\",\n>(\n selection: CursorSelectionInput<TValue>,\n idsFieldName?: TIdsFieldName,\n): {\n readonly cursor?: string;\n readonly exclude_ids?: string;\n} & Record<TIdsFieldName, string | undefined> => {\n const resolvedIdsFieldName = (idsFieldName ?? \"file_ids\") as TIdsFieldName;\n\n return {\n cursor: selection.cursor,\n exclude_ids: joinCsv(selection.excludeIds),\n [resolvedIdsFieldName]: joinCsv(selection.ids),\n } as {\n readonly cursor?: string;\n readonly exclude_ids?: string;\n } & Record<TIdsFieldName, string | undefined>;\n};\n"],"mappings":"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"}
|