@atcute/client 4.0.5 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -3
- package/dist/client.d.ts +36 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +61 -0
- package/dist/client.js.map +1 -1
- package/lib/client.ts +113 -0
- package/package.json +7 -7
package/README.md
CHANGED
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
lightweight and cute API client for AT Protocol.
|
|
4
4
|
|
|
5
|
-
- **small**, the bare minimum is ~1 kB gzipped with
|
|
6
|
-
- **
|
|
7
|
-
be trusted in returning valid responses
|
|
5
|
+
- **small**, the bare minimum is ~1.1 kB gzipped, with validation at ~3 kB gzipped.
|
|
6
|
+
- **optional runtime validation**, by default there's no runtime validation as the server is assumed
|
|
7
|
+
to be trusted in returning valid responses, but you can opt-in to validation using the `call()`
|
|
8
|
+
method with lexicon schemas. validation code is automatically tree-shaken when not used.
|
|
8
9
|
|
|
9
10
|
```ts
|
|
10
11
|
import { Client, CredentialManager, ok, simpleFetchHandler } from '@atcute/client';
|
|
@@ -63,6 +64,25 @@ import type {} from '@atcute/bluesky';
|
|
|
63
64
|
}
|
|
64
65
|
}
|
|
65
66
|
|
|
67
|
+
// with runtime validation
|
|
68
|
+
import { AppBskyActorGetProfile } from '@atcute/bluesky';
|
|
69
|
+
|
|
70
|
+
{
|
|
71
|
+
const handler = simpleFetchHandler({ service: 'https://public.api.bsky.app' });
|
|
72
|
+
const rpc = new Client({ handler });
|
|
73
|
+
|
|
74
|
+
const { ok, data } = await rpc.call(AppBskyActorGetProfile, {
|
|
75
|
+
params: {
|
|
76
|
+
actor: 'bsky.app',
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
if (ok) {
|
|
81
|
+
console.log(data.displayName);
|
|
82
|
+
// -> "Bluesky"
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
66
86
|
// performing authenticated requests
|
|
67
87
|
{
|
|
68
88
|
const manager = new CredentialManager({ service: 'https://bsky.social' });
|
|
@@ -93,6 +113,10 @@ installing one of these definition packages.
|
|
|
93
113
|
- [`@atcute/bluemoji`](../../definitions/bluemoji): `blue.moji.*` schema definitions
|
|
94
114
|
- [`@atcute/bluesky`](../../definitions/bluesky): `app.bsky.*` and `chat.bsky.*` schema definitions
|
|
95
115
|
- [`@atcute/frontpage`](../../definitions/frontpage): `fyi.unravel.frontpage.*` schema definitions
|
|
116
|
+
- [`@atcute/lexicon-community`](../../definitions/lexicon-community): `community.lexicon.\*` schema
|
|
117
|
+
definitions
|
|
118
|
+
- [`@atcute/microcosm`](../../definitions/microcosm): `blue.microcosm.*` and `com.bad-example.*`
|
|
119
|
+
schema definitions
|
|
96
120
|
- [`@atcute/ozone`](../../definitions/ozone): `tools.ozone.*` schema definitions
|
|
97
121
|
- [`@atcute/tangled`](../../definitions/tangled): `sh.tangled.*` schema definitions
|
|
98
122
|
- [`@atcute/whitewind`](../../definitions/whitewind): `com.whtwnd.*` schema definitions
|
package/dist/client.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Did } from '@atcute/lexicons';
|
|
2
2
|
import type { XRPCProcedures, XRPCQueries } from '@atcute/lexicons/ambient';
|
|
3
|
+
import * as v from '@atcute/lexicons/validations';
|
|
3
4
|
import type { InferInput, InferOutput, ObjectSchema, XRPCBlobBodyParam, XRPCLexBodyParam, XRPCProcedureMetadata, XRPCQueryMetadata } from '@atcute/lexicons/validations';
|
|
4
5
|
import { type FetchHandler, type FetchHandlerObject } from './fetch-handler.js';
|
|
5
6
|
type RequiredKeysOf<TType extends object> = TType extends any ? Exclude<{
|
|
@@ -48,6 +49,24 @@ export type ProcedureRequestOptions<TDef> = BaseRequestOptions & (TDef extends X
|
|
|
48
49
|
input?: Record<string, unknown> | Blob | ArrayBuffer | ArrayBufferView | ReadableStream;
|
|
49
50
|
params?: Record<string, unknown>;
|
|
50
51
|
});
|
|
52
|
+
export type CallRequestOptions<TMeta> = BaseRequestOptions & {
|
|
53
|
+
as?: ResponseFormat | null;
|
|
54
|
+
} & (TMeta extends XRPCQueryMetadata<infer Params, any, any> ? Params extends ObjectSchema ? {
|
|
55
|
+
params: InferInput<Params>;
|
|
56
|
+
} : {
|
|
57
|
+
params?: Record<string, unknown>;
|
|
58
|
+
} : TMeta extends XRPCProcedureMetadata<infer Params, infer Input, any, any> ? // procedure
|
|
59
|
+
(Params extends ObjectSchema ? {
|
|
60
|
+
params: InferInput<Params>;
|
|
61
|
+
} : {
|
|
62
|
+
params?: Record<string, unknown>;
|
|
63
|
+
}) & (Input extends XRPCLexBodyParam ? {
|
|
64
|
+
input: InferInput<Input['schema']>;
|
|
65
|
+
} : Input extends XRPCBlobBodyParam ? {
|
|
66
|
+
input: Blob | ArrayBuffer | ArrayBufferView | ReadableStream;
|
|
67
|
+
} : {
|
|
68
|
+
input?: Record<string, unknown> | Blob | ArrayBuffer | ArrayBufferView | ReadableStream;
|
|
69
|
+
}) : never);
|
|
51
70
|
/** standard XRPC error payload structure */
|
|
52
71
|
export type XRPCErrorPayload = {
|
|
53
72
|
/** error name */
|
|
@@ -87,6 +106,9 @@ type UnknownClientResponse = {
|
|
|
87
106
|
ok: false;
|
|
88
107
|
data: XRPCErrorPayload;
|
|
89
108
|
});
|
|
109
|
+
type Namespaced<T> = {
|
|
110
|
+
mainSchema: T;
|
|
111
|
+
};
|
|
90
112
|
/** options for configuring service proxying */
|
|
91
113
|
export type ServiceProxyOptions = {
|
|
92
114
|
/** DID identifier that the upstream service should look up */
|
|
@@ -135,6 +157,12 @@ export declare class Client<TQueries = XRPCQueries, TProcedures = XRPCProcedures
|
|
|
135
157
|
* @param options procedure options
|
|
136
158
|
*/
|
|
137
159
|
post<TName extends keyof TProcedures, TInit extends ProcedureRequestOptions<TProcedures[TName]>>(name: TName, ...options: HasRequiredKeys<TInit> extends true ? [init: TInit] : [init?: TInit]): Promise<ClientResponse<TProcedures[TName], TInit>>;
|
|
160
|
+
/**
|
|
161
|
+
* performs an XRPC call with schema validation
|
|
162
|
+
* @param schema the lexicon schema for the endpoint, or a namespace containing mainSchema
|
|
163
|
+
* @param options call options
|
|
164
|
+
*/
|
|
165
|
+
call<TMeta extends XRPCQueryMetadata | XRPCProcedureMetadata, TInit extends CallRequestOptions<TMeta>>(schema: TMeta | Namespaced<TMeta>, ...options: HasRequiredKeys<TInit> extends true ? [init: TInit] : [init?: TInit]): Promise<ClientResponse<TMeta, TInit>>;
|
|
138
166
|
}
|
|
139
167
|
export declare const isXRPCErrorPayload: (input: any) => input is XRPCErrorPayload;
|
|
140
168
|
type ExtractSuccessData<R> = R extends {
|
|
@@ -173,5 +201,13 @@ export declare class ClientResponseError extends Error {
|
|
|
173
201
|
readonly headers: Headers;
|
|
174
202
|
constructor({ status, headers, data }: ClientResponseErrorOptions);
|
|
175
203
|
}
|
|
204
|
+
/** represents a validation error during typed calls */
|
|
205
|
+
export declare class ClientValidationError extends Error {
|
|
206
|
+
/** validation target (params, input, or output) */
|
|
207
|
+
readonly target: 'params' | 'input' | 'output';
|
|
208
|
+
/** validation result */
|
|
209
|
+
readonly result: v.Err;
|
|
210
|
+
constructor(target: 'params' | 'input' | 'output', result: v.Err);
|
|
211
|
+
}
|
|
176
212
|
export {};
|
|
177
213
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../lib/client.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../lib/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as v from '@atcute/lexicons/validations';
|
|
1
2
|
import { buildFetchHandler } from './fetch-handler.js';
|
|
2
3
|
const JSON_CONTENT_TYPE_RE = /\bapplication\/json\b/;
|
|
3
4
|
/** XRPC API client */
|
|
@@ -20,6 +21,57 @@ export class Client {
|
|
|
20
21
|
post(name, options = {}) {
|
|
21
22
|
return this.#perform('post', name, options);
|
|
22
23
|
}
|
|
24
|
+
async call(schema, options = {}) {
|
|
25
|
+
// early bailout for tree-shaking when schemas aren't used
|
|
26
|
+
if (!v.xrpcSchemaGenerated) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
// extract mainSchema if namespace was passed
|
|
30
|
+
if ('mainSchema' in schema) {
|
|
31
|
+
schema = schema.mainSchema;
|
|
32
|
+
}
|
|
33
|
+
if (schema.params !== null) {
|
|
34
|
+
const paramsResult = v.safeParse(schema.params, options.params);
|
|
35
|
+
if (!paramsResult.ok) {
|
|
36
|
+
throw new ClientValidationError('params', paramsResult);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (schema.type === 'xrpc_procedure' && schema.input?.type === 'lex') {
|
|
40
|
+
const inputResult = v.safeParse(schema.input.schema, options.input);
|
|
41
|
+
if (!inputResult.ok) {
|
|
42
|
+
throw new ClientValidationError('input', inputResult);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const isQuery = schema.type === 'xrpc_query';
|
|
46
|
+
const method = isQuery ? 'get' : 'post';
|
|
47
|
+
const format = options.as !== undefined
|
|
48
|
+
? options.as
|
|
49
|
+
: schema.output?.type === 'lex'
|
|
50
|
+
? 'json'
|
|
51
|
+
: schema.output?.type === 'blob'
|
|
52
|
+
? 'blob'
|
|
53
|
+
: null;
|
|
54
|
+
const response = await this.#perform(method, schema.nsid, {
|
|
55
|
+
params: options.params,
|
|
56
|
+
input: isQuery ? undefined : options.input,
|
|
57
|
+
as: format,
|
|
58
|
+
signal: options.signal,
|
|
59
|
+
headers: options.headers,
|
|
60
|
+
});
|
|
61
|
+
if (format === 'json' && response.ok && schema.output?.type === 'lex') {
|
|
62
|
+
const outputResult = v.safeParse(schema.output.schema, response.data);
|
|
63
|
+
if (!outputResult.ok) {
|
|
64
|
+
throw new ClientValidationError('output', outputResult);
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
ok: true,
|
|
68
|
+
status: response.status,
|
|
69
|
+
headers: response.headers,
|
|
70
|
+
data: outputResult.value,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
return response;
|
|
74
|
+
}
|
|
23
75
|
async #perform(method, name, { signal, as: format = 'json', headers, input, params }) {
|
|
24
76
|
const isWebInput = input &&
|
|
25
77
|
(input instanceof Blob ||
|
|
@@ -185,5 +237,14 @@ export class ClientResponseError extends Error {
|
|
|
185
237
|
this.headers = headers;
|
|
186
238
|
}
|
|
187
239
|
}
|
|
240
|
+
/** represents a validation error during typed calls */
|
|
241
|
+
export class ClientValidationError extends Error {
|
|
242
|
+
constructor(target, result) {
|
|
243
|
+
super(`validation failed for ${target}: ${result.message}`);
|
|
244
|
+
this.name = 'ClientValidationError';
|
|
245
|
+
this.target = target;
|
|
246
|
+
this.result = result;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
188
249
|
// #endregion
|
|
189
250
|
//# sourceMappingURL=client.js.map
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../lib/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../lib/client.ts"],"names":[],"mappings":"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"}
|
package/lib/client.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Did } from '@atcute/lexicons';
|
|
2
2
|
import type { XRPCProcedures, XRPCQueries } from '@atcute/lexicons/ambient';
|
|
3
|
+
import * as v from '@atcute/lexicons/validations';
|
|
3
4
|
import type {
|
|
4
5
|
InferInput,
|
|
5
6
|
InferOutput,
|
|
@@ -90,6 +91,25 @@ export type ProcedureRequestOptions<TDef> = BaseRequestOptions &
|
|
|
90
91
|
params?: Record<string, unknown>;
|
|
91
92
|
});
|
|
92
93
|
|
|
94
|
+
export type CallRequestOptions<TMeta> = BaseRequestOptions & {
|
|
95
|
+
as?: ResponseFormat | null;
|
|
96
|
+
} & (TMeta extends XRPCQueryMetadata<infer Params, any, any>
|
|
97
|
+
? // query
|
|
98
|
+
Params extends ObjectSchema
|
|
99
|
+
? { params: InferInput<Params> }
|
|
100
|
+
: { params?: Record<string, unknown> }
|
|
101
|
+
: TMeta extends XRPCProcedureMetadata<infer Params, infer Input, any, any>
|
|
102
|
+
? // procedure
|
|
103
|
+
(Params extends ObjectSchema
|
|
104
|
+
? { params: InferInput<Params> }
|
|
105
|
+
: { params?: Record<string, unknown> }) &
|
|
106
|
+
(Input extends XRPCLexBodyParam
|
|
107
|
+
? { input: InferInput<Input['schema']> }
|
|
108
|
+
: Input extends XRPCBlobBodyParam
|
|
109
|
+
? { input: Blob | ArrayBuffer | ArrayBufferView | ReadableStream }
|
|
110
|
+
: { input?: Record<string, unknown> | Blob | ArrayBuffer | ArrayBufferView | ReadableStream })
|
|
111
|
+
: never);
|
|
112
|
+
|
|
93
113
|
type InternalRequestOptions = BaseRequestOptions & {
|
|
94
114
|
as?: ResponseFormat | null;
|
|
95
115
|
params?: Record<string, unknown>;
|
|
@@ -148,6 +168,11 @@ type UnknownClientResponse = { status: number; headers: Headers } & (
|
|
|
148
168
|
|
|
149
169
|
// #endregion
|
|
150
170
|
|
|
171
|
+
// #region Type definitions for call method
|
|
172
|
+
type Namespaced<T> = { mainSchema: T };
|
|
173
|
+
|
|
174
|
+
// #endregion
|
|
175
|
+
|
|
151
176
|
// #region Client
|
|
152
177
|
/** options for configuring service proxying */
|
|
153
178
|
export type ServiceProxyOptions = {
|
|
@@ -227,6 +252,78 @@ export class Client<TQueries = XRPCQueries, TProcedures = XRPCProcedures> {
|
|
|
227
252
|
return this.#perform('post', name, options);
|
|
228
253
|
}
|
|
229
254
|
|
|
255
|
+
/**
|
|
256
|
+
* performs an XRPC call with schema validation
|
|
257
|
+
* @param schema the lexicon schema for the endpoint, or a namespace containing mainSchema
|
|
258
|
+
* @param options call options
|
|
259
|
+
*/
|
|
260
|
+
call<TMeta extends XRPCQueryMetadata | XRPCProcedureMetadata, TInit extends CallRequestOptions<TMeta>>(
|
|
261
|
+
schema: TMeta | Namespaced<TMeta>,
|
|
262
|
+
...options: HasRequiredKeys<TInit> extends true ? [init: TInit] : [init?: TInit]
|
|
263
|
+
): Promise<ClientResponse<TMeta, TInit>>;
|
|
264
|
+
|
|
265
|
+
async call(schema: any, options: any = {}): Promise<any> {
|
|
266
|
+
// early bailout for tree-shaking when schemas aren't used
|
|
267
|
+
if (!v.xrpcSchemaGenerated) {
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// extract mainSchema if namespace was passed
|
|
272
|
+
if ('mainSchema' in schema) {
|
|
273
|
+
schema = schema.mainSchema;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
if (schema.params !== null) {
|
|
277
|
+
const paramsResult = v.safeParse(schema.params, options.params);
|
|
278
|
+
if (!paramsResult.ok) {
|
|
279
|
+
throw new ClientValidationError('params', paramsResult);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
if (schema.type === 'xrpc_procedure' && schema.input?.type === 'lex') {
|
|
284
|
+
const inputResult = v.safeParse(schema.input.schema, options.input);
|
|
285
|
+
if (!inputResult.ok) {
|
|
286
|
+
throw new ClientValidationError('input', inputResult);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
const isQuery = schema.type === 'xrpc_query';
|
|
291
|
+
const method = isQuery ? 'get' : 'post';
|
|
292
|
+
|
|
293
|
+
const format =
|
|
294
|
+
options.as !== undefined
|
|
295
|
+
? options.as
|
|
296
|
+
: schema.output?.type === 'lex'
|
|
297
|
+
? 'json'
|
|
298
|
+
: schema.output?.type === 'blob'
|
|
299
|
+
? 'blob'
|
|
300
|
+
: null;
|
|
301
|
+
|
|
302
|
+
const response = await this.#perform(method, schema.nsid, {
|
|
303
|
+
params: options.params,
|
|
304
|
+
input: isQuery ? undefined : options.input,
|
|
305
|
+
as: format,
|
|
306
|
+
signal: options.signal,
|
|
307
|
+
headers: options.headers,
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
if (format === 'json' && response.ok && schema.output?.type === 'lex') {
|
|
311
|
+
const outputResult = v.safeParse(schema.output.schema, response.data);
|
|
312
|
+
if (!outputResult.ok) {
|
|
313
|
+
throw new ClientValidationError('output', outputResult);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
return {
|
|
317
|
+
ok: true,
|
|
318
|
+
status: response.status,
|
|
319
|
+
headers: response.headers,
|
|
320
|
+
data: outputResult.value,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
return response;
|
|
325
|
+
}
|
|
326
|
+
|
|
230
327
|
async #perform(
|
|
231
328
|
method: 'get' | 'post',
|
|
232
329
|
name: string,
|
|
@@ -459,4 +556,20 @@ export class ClientResponseError extends Error {
|
|
|
459
556
|
}
|
|
460
557
|
}
|
|
461
558
|
|
|
559
|
+
/** represents a validation error during typed calls */
|
|
560
|
+
export class ClientValidationError extends Error {
|
|
561
|
+
/** validation target (params, input, or output) */
|
|
562
|
+
readonly target: 'params' | 'input' | 'output';
|
|
563
|
+
/** validation result */
|
|
564
|
+
readonly result: v.Err;
|
|
565
|
+
|
|
566
|
+
constructor(target: 'params' | 'input' | 'output', result: v.Err) {
|
|
567
|
+
super(`validation failed for ${target}: ${result.message}`);
|
|
568
|
+
|
|
569
|
+
this.name = 'ClientValidationError';
|
|
570
|
+
this.target = target;
|
|
571
|
+
this.result = result;
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
|
|
462
575
|
// #endregion
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@atcute/client",
|
|
4
|
-
"version": "4.0
|
|
4
|
+
"version": "4.1.0",
|
|
5
5
|
"description": "lightweight and cute API client for AT Protocol",
|
|
6
6
|
"license": "0BSD",
|
|
7
7
|
"repository": {
|
|
@@ -18,14 +18,14 @@
|
|
|
18
18
|
".": "./dist/index.js"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@atcute/identity": "^1.1.
|
|
22
|
-
"@atcute/lexicons": "^1.2.
|
|
21
|
+
"@atcute/identity": "^1.1.3",
|
|
22
|
+
"@atcute/lexicons": "^1.2.5"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
|
-
"@vitest/coverage-v8": "^
|
|
26
|
-
"vitest": "^
|
|
27
|
-
"@atcute/
|
|
28
|
-
"@atcute/
|
|
25
|
+
"@vitest/coverage-v8": "^4.0.7",
|
|
26
|
+
"vitest": "^4.0.7",
|
|
27
|
+
"@atcute/bluesky": "^3.2.11",
|
|
28
|
+
"@atcute/atproto": "^3.1.9",
|
|
29
29
|
"@atcute/internal-dev-env": "^1.0.2"
|
|
30
30
|
},
|
|
31
31
|
"scripts": {
|