@atproto/lex-client 0.0.3 → 0.0.5
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 +36 -0
- package/dist/agent.d.ts +9 -8
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js.map +1 -1
- package/dist/client.d.ts +32 -96
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +31 -31
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +1 -1
- package/dist/lexicons/com/atproto/repo/createRecord.defs.d.ts +7 -7
- package/dist/lexicons/com/atproto/repo/createRecord.defs.d.ts.map +1 -1
- package/dist/lexicons/com/atproto/repo/createRecord.defs.js +3 -5
- package/dist/lexicons/com/atproto/repo/createRecord.defs.js.map +1 -1
- package/dist/lexicons/com/atproto/repo/deleteRecord.defs.d.ts +7 -7
- package/dist/lexicons/com/atproto/repo/deleteRecord.defs.d.ts.map +1 -1
- package/dist/lexicons/com/atproto/repo/deleteRecord.defs.js +3 -5
- package/dist/lexicons/com/atproto/repo/deleteRecord.defs.js.map +1 -1
- package/dist/lexicons/com/atproto/repo/getRecord.defs.d.ts +5 -6
- package/dist/lexicons/com/atproto/repo/getRecord.defs.d.ts.map +1 -1
- package/dist/lexicons/com/atproto/repo/getRecord.defs.js +3 -5
- package/dist/lexicons/com/atproto/repo/getRecord.defs.js.map +1 -1
- package/dist/lexicons/com/atproto/repo/listRecords.defs.d.ts +5 -6
- package/dist/lexicons/com/atproto/repo/listRecords.defs.d.ts.map +1 -1
- package/dist/lexicons/com/atproto/repo/listRecords.defs.js +3 -5
- package/dist/lexicons/com/atproto/repo/listRecords.defs.js.map +1 -1
- package/dist/lexicons/com/atproto/repo/putRecord.defs.d.ts +7 -7
- package/dist/lexicons/com/atproto/repo/putRecord.defs.d.ts.map +1 -1
- package/dist/lexicons/com/atproto/repo/putRecord.defs.js +3 -5
- package/dist/lexicons/com/atproto/repo/putRecord.defs.js.map +1 -1
- package/dist/lexicons/com/atproto/repo/uploadBlob.defs.d.ts +7 -7
- package/dist/lexicons/com/atproto/repo/uploadBlob.defs.d.ts.map +1 -1
- package/dist/lexicons/com/atproto/repo/uploadBlob.defs.js +3 -5
- package/dist/lexicons/com/atproto/repo/uploadBlob.defs.js.map +1 -1
- package/dist/lexicons/com/atproto/sync/getBlob.d.ts +3 -0
- package/dist/lexicons/com/atproto/sync/getBlob.d.ts.map +1 -0
- package/dist/lexicons/com/atproto/sync/getBlob.defs.d.ts +25 -0
- package/dist/lexicons/com/atproto/sync/getBlob.defs.d.ts.map +1 -0
- package/dist/lexicons/com/atproto/sync/getBlob.defs.js +27 -0
- package/dist/lexicons/com/atproto/sync/getBlob.defs.js.map +1 -0
- package/dist/lexicons/com/atproto/sync/getBlob.js +10 -0
- package/dist/lexicons/com/atproto/sync/getBlob.js.map +1 -0
- package/dist/lexicons/com/atproto/sync.d.ts +2 -0
- package/dist/lexicons/com/atproto/sync.d.ts.map +1 -0
- package/dist/lexicons/com/atproto/sync.js +9 -0
- package/dist/lexicons/com/atproto/sync.js.map +1 -0
- package/dist/lexicons/com/atproto.d.ts +1 -0
- package/dist/lexicons/com/atproto.d.ts.map +1 -1
- package/dist/lexicons/com/atproto.js +2 -1
- package/dist/lexicons/com/atproto.js.map +1 -1
- package/dist/lexicons.d.ts +2 -0
- package/dist/lexicons.d.ts.map +1 -0
- package/dist/lexicons.js +6 -0
- package/dist/lexicons.js.map +1 -0
- package/dist/types.d.ts +18 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/util.d.ts +14 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +65 -0
- package/dist/util.js.map +1 -0
- package/dist/xrpc-error.d.ts +87 -0
- package/dist/xrpc-error.d.ts.map +1 -0
- package/dist/xrpc-error.js +127 -0
- package/dist/xrpc-error.js.map +1 -0
- package/dist/xrpc-response.d.ts +35 -0
- package/dist/xrpc-response.d.ts.map +1 -0
- package/dist/xrpc-response.js +140 -0
- package/dist/xrpc-response.js.map +1 -0
- package/dist/xrpc.d.ts +29 -32
- package/dist/xrpc.d.ts.map +1 -1
- package/dist/xrpc.js +119 -125
- package/dist/xrpc.js.map +1 -1
- package/package.json +6 -6
- package/src/agent.ts +12 -12
- package/src/client.ts +92 -77
- package/src/index.ts +0 -2
- package/src/lexicons/com/atproto/repo/createRecord.defs.ts +9 -8
- package/src/lexicons/com/atproto/repo/deleteRecord.defs.ts +9 -8
- package/src/lexicons/com/atproto/repo/getRecord.defs.ts +7 -7
- package/src/lexicons/com/atproto/repo/listRecords.defs.ts +7 -6
- package/src/lexicons/com/atproto/repo/putRecord.defs.ts +9 -8
- package/src/lexicons/com/atproto/repo/uploadBlob.defs.ts +9 -8
- package/src/lexicons/com/atproto/sync/getBlob.defs.ts +37 -0
- package/src/lexicons/com/atproto/sync/getBlob.ts +6 -0
- package/src/lexicons/com/atproto/sync.ts +5 -0
- package/src/lexicons/com/atproto.ts +1 -0
- package/src/lexicons.ts +1 -0
- package/src/types.ts +27 -0
- package/src/util.ts +84 -0
- package/src/xrpc-error.ts +195 -0
- package/src/xrpc-response.ts +213 -0
- package/src/xrpc.ts +209 -220
- package/dist/error.d.ts +0 -66
- package/dist/error.d.ts.map +0 -1
- package/dist/error.js +0 -100
- package/dist/error.js.map +0 -1
- package/dist/response.d.ts +0 -21
- package/dist/response.d.ts.map +0 -1
- package/dist/response.js +0 -31
- package/dist/response.js.map +0 -1
- package/src/error.ts +0 -145
- package/src/response.ts +0 -42
package/dist/xrpc.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xrpc.js","sourceRoot":"","sources":["../src/xrpc.ts"],"names":[],"mappings":"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","sourcesContent":["import { LexValue } from '@atproto/lex-data'\nimport { lexParse, lexStringify } from '@atproto/lex-json'\nimport {\n DidString,\n InferParamsSchema,\n InferPayloadBody,\n Params,\n ParamsSchema,\n Procedure,\n Query,\n Restricted,\n Subscription,\n} from '@atproto/lex-schema'\nimport { Agent } from './agent.js'\nimport {\n KnownError,\n XrpcResponseError,\n XrpcServiceError,\n xrpcErrorBodySchema,\n} from './error.js'\nimport { XrpcResponse, XrpcResponseBody } from './response.js'\nimport { CallOptions, Namespace, Service, getMain } from './types.js'\n\nexport type XrpcOptions<M extends Procedure | Query = Procedure | Query> =\n CallOptions & XrpcRequestUrlOptions<M> & XrpcRequestInitOptions<M>\n\nexport async function xrpc<const M extends Query | Procedure>(\n agent: Agent,\n ns: NonNullable<unknown> extends XrpcOptions<M>\n ? Namespace<M>\n : Restricted<'This XRPC method requires an \"options\" argument'>,\n): Promise<XrpcResponse<M>>\nexport async function xrpc<const M extends Query | Procedure>(\n agent: Agent,\n ns: Namespace<M>,\n options: XrpcOptions<M>,\n): Promise<XrpcResponse<M>>\nexport async function xrpc<const M extends Query | Procedure>(\n agent: Agent,\n ns: Namespace<M>,\n options: XrpcOptions<M> = {} as XrpcOptions<M>,\n): Promise<XrpcResponse<M>> {\n options.signal?.throwIfAborted()\n const method = getMain(ns)\n const url = xrpcRequestUrl(method, options)\n const request = xrpcRequestInit(method, options)\n const response = await agent.fetchHandler(url, request)\n return xrpcResponseHandler<M>(response, method, options)\n}\n\nexport type XrpcRequestUrlOptions<M extends Query | Procedure | Subscription> =\n CallOptions &\n (undefined extends InferParamsSchema<M['parameters']>\n ? { params?: InferParamsSchema<M['parameters']> }\n : { params: InferParamsSchema<M['parameters']> })\n\nexport function xrpcRequestUrl<M extends Procedure | Query | Subscription>(\n method: M,\n options: XrpcRequestUrlOptions<M>,\n) {\n const path = `/xrpc/${method.nsid}`\n\n const queryString = options.params\n ? xrpcRequestParams(method.parameters, options.params, options)\n : undefined\n\n return queryString ? `${path}?${queryString}` : path\n}\n\nexport function xrpcRequestParams(\n schema: ParamsSchema | undefined,\n params: Params | undefined,\n options: CallOptions,\n): undefined | string {\n const urlSearchParams = schema?.toURLSearchParams(\n options.validateRequest ? schema.parse(params) : (params as any),\n )\n return urlSearchParams?.size ? urlSearchParams.toString() : undefined\n}\n\nexport type XrpcRequestInitOptions<T extends Query | Procedure> = CallOptions &\n (T extends Procedure\n ? never extends InferPayloadBody<T['input']>\n ? { body?: InferPayloadBody<T['input']> }\n : { body: InferPayloadBody<T['input']> }\n : { body?: never })\n\nexport function xrpcRequestInit<T extends Procedure | Query>(\n schema: T,\n options: XrpcRequestInitOptions<T>,\n): RequestInit & { duplex?: 'half' } {\n const headers = xrpcRequestHeaders(options)\n\n // Requests with body\n if ('input' in schema && schema.input?.encoding) {\n if (\n options.validateRequest &&\n schema.input == null &&\n options.body !== undefined\n ) {\n throw new TypeError(\n `XRPC method ${schema.nsid} does not accept a request body`,\n )\n }\n\n headers.set('content-type', schema.input.encoding)\n return {\n duplex: 'half',\n redirect: 'follow',\n referrerPolicy: 'strict-origin-when-cross-origin', // (default)\n mode: 'cors', // (default)\n signal: options.signal,\n method: 'POST',\n headers,\n body: xrpcRequestBody(\n schema.input?.encoding,\n options.validateRequest\n ? schema.input?.body.parse(options.body)\n : options.body,\n ),\n }\n }\n\n // Requests without body\n return {\n duplex: 'half',\n redirect: 'follow',\n referrerPolicy: 'strict-origin-when-cross-origin', // (default)\n mode: 'cors', // (default)\n signal: options.signal,\n method: schema instanceof Query ? 'GET' : 'POST',\n headers,\n }\n}\n\nexport function xrpcRequestHeaders(options: {\n headers?: HeadersInit\n service?: Service\n labelers?: Iterable<DidString>\n}): Headers {\n const headers = new Headers(options.headers)\n\n if (options.service && !headers.has('atproto-proxy')) {\n headers.set('atproto-proxy', options.service)\n }\n\n if (options.labelers) {\n headers.set(\n 'atproto-accept-labelers',\n [...options.labelers, headers.get('atproto-accept-labelers')?.trim()]\n .filter(Boolean)\n .join(', '),\n )\n }\n\n return headers\n}\n\nfunction xrpcRequestBody(\n encoding: string | undefined,\n body: LexValue | undefined,\n): BodyInit | null {\n if (encoding === undefined) {\n return null\n }\n\n if (encoding === 'application/json') {\n if (body !== undefined) return lexStringify(body)\n } else if (encoding.startsWith('text/')) {\n if (typeof body === 'string') return body\n } else {\n if (ArrayBuffer.isView(body) || body instanceof ArrayBuffer) return body\n }\n\n throw new TypeError(`Invalid ${typeof body} body for ${encoding} encoding`)\n}\n\nexport async function xrpcResponseHandler<M extends Procedure | Query>(\n response: Response,\n schema: M,\n options?: { validateResponse?: boolean },\n): Promise<XrpcResponse<M>> {\n // @NOTE The body MUST either be read or canceled to avoid resource leaks.\n // Since nothing should cause an exception before \"readXrpcResponseBody\" is\n // called, we can safely not use a try/finally here.\n\n const encoding = extractEncoding(response.headers)\n\n const body = await readResponseBody(response, encoding).catch((cause) => {\n throw new XrpcServiceError(\n KnownError.InvalidResponse,\n response.status,\n response.headers,\n undefined,\n 'Failed to read XRPC response',\n { cause },\n )\n })\n\n // @NOTE redirect is set to 'follow', so we shouldn't get 3xx responses here\n if (response.status < 200 || response.status >= 300) {\n // All unsuccessful responses should follow a standard error response\n // schema. The Content-Type should be application/json, and the payload\n // should be a JSON object with the following fields:\n // - error (string, required): type name of the error (generic ASCII\n // constant, no whitespace)\n // - message (string, optional): description of the error, appropriate for\n // display to humans\n if (\n body != null &&\n encoding === 'application/json' &&\n xrpcErrorBodySchema.matches(body)\n ) {\n throw new XrpcResponseError(\n response.status,\n response.headers,\n encoding,\n body,\n )\n }\n\n throw new XrpcServiceError(\n response.status >= 500\n ? KnownError.InternalServerError\n : KnownError.InvalidResponse,\n response.status,\n response.headers,\n body,\n )\n }\n\n // Check response encoding\n if (schema.output.encoding !== encoding) {\n throw new XrpcServiceError(\n KnownError.InvalidResponse,\n response.status,\n response.headers,\n body,\n `Expected response with content-type ${schema.output.encoding}, got ${encoding}`,\n )\n }\n\n if (schema.output.encoding == null) {\n if (body !== undefined) {\n throw new XrpcServiceError(\n KnownError.InvalidResponse,\n response.status,\n response.headers,\n body,\n `Expected empty response body`,\n )\n }\n\n return new XrpcResponse<M>(\n schema,\n response.status,\n response.headers,\n undefined as XrpcResponseBody<M>,\n )\n } else {\n // @NOTE this should already be enforced by readXrpcResponseBody\n if (body === undefined) {\n throw new XrpcServiceError(\n KnownError.InvalidResponse,\n response.status,\n response.headers,\n body,\n `Expected non-empty response body`,\n )\n }\n\n return new XrpcResponse<M>(\n schema,\n response.status,\n response.headers,\n schema.output.schema == null || options?.validateResponse === false\n ? (body as XrpcResponseBody<M>)\n : (schema.output.schema.parse(body) as XrpcResponseBody<M>),\n )\n }\n}\n\nexport function extractEncoding(headers: Headers): string | undefined {\n const contentType = headers.get('content-type')\n if (!contentType) return undefined\n return contentType.split(';')[0].trim()\n}\n\nexport async function readResponseBody(\n response: Response,\n encoding: string,\n): Promise<LexValue>\nexport async function readResponseBody(\n response: Response,\n encoding: string | undefined,\n): Promise<LexValue | undefined>\nexport async function readResponseBody(\n response: Response,\n encoding: string | undefined,\n): Promise<LexValue | undefined> {\n // When encoding is undefined or empty, we expect no body\n if (encoding == null) {\n if (response.body == null) return undefined\n\n // Let's make sure the body is empty (while avoiding reading it all).\n if (!('getReader' in response.body)) {\n // Some environments may not support body.getReader(), fall back to\n // reading the whole body.\n const buffer = await response.arrayBuffer()\n if (buffer.byteLength === 0) return undefined\n } else {\n const reader = response.body.getReader()\n const next = await reader.read()\n if (next.done) return undefined\n await reader.cancel() // Drain the rest of the (non-empty) body stream\n }\n\n throw new SyntaxError('Content-type is undefined but body is not empty')\n }\n\n if (encoding === 'application/json') {\n // @NOTE Using `lexParse(text)` (instead of `jsonToLex(json)`) here as using\n // a reviver function during JSON.parse should be faster than parsing to\n // JSON then converting to Lex (?)\n\n // @TODO verify statement above\n return lexParse(await response.text())\n }\n\n if (encoding.startsWith('text/')) {\n return response.text()\n }\n\n return new Uint8Array(await response.arrayBuffer())\n}\n"]}
|
|
1
|
+
{"version":3,"file":"xrpc.js","sourceRoot":"","sources":["../src/xrpc.ts"],"names":[],"mappings":"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","sourcesContent":["import { LexValue, isLexScalar, isPlainObject } from '@atproto/lex-data'\nimport { lexStringify } from '@atproto/lex-json'\nimport {\n InferMethodInput,\n InferMethodParams,\n Params,\n ParamsSchema,\n Payload as LexPayload,\n Procedure,\n Query,\n Restricted,\n Subscription,\n} from '@atproto/lex-schema'\nimport { Agent } from './agent.js'\nimport { BinaryBodyInit, CallOptions, Namespace, getMain } from './types.js'\nimport {\n Payload,\n buildAtprotoHeaders,\n isAsyncIterable,\n isBlobLike,\n toReadableStream,\n} from './util.js'\nimport {\n XrpcInvalidResponseError,\n XrpcResponseError,\n XrpcUnexpectedError,\n} from './xrpc-error.js'\nimport { XrpcResponse } from './xrpc-response.js'\n\nexport * from './xrpc-error.js'\nexport * from './xrpc-response.js'\n\n// If all params are optional, allow omitting the params object\ntype XrpcParamsOptions<P extends Params> =\n NonNullable<unknown> extends P ? { params?: P } : { params: P }\n\ntype XrpcRequestPayload<M extends Procedure | Query> = InferMethodInput<\n M,\n BinaryBodyInit\n>\n\ntype XrpcInputOptions<In> = In extends { body: infer B; encoding: infer E }\n ? // encoding will be inferred from the schema at runtime if not provided\n { body: B; encoding?: E }\n : { body?: undefined; encoding?: undefined }\n\nexport type XrpcOptions<M extends Procedure | Query = Procedure | Query> =\n CallOptions &\n XrpcInputOptions<XrpcRequestPayload<M>> &\n XrpcParamsOptions<InferMethodParams<M>>\n\nexport type XrpcFailure<M extends Procedure | Query> =\n // The server returned a valid XRPC error response\n | XrpcResponseError<M>\n // The response was not a valid XRPC response, or it does not match the schema\n | XrpcInvalidResponseError\n // Something went wrong (network error, etc.)\n | XrpcUnexpectedError\n\nexport type XrpcResult<M extends Procedure | Query> =\n | XrpcResponse<M>\n | XrpcFailure<M>\n\n/**\n * Utility method to type cast the error thrown by {@link xrpc} to an\n * {@link XrpcFailure} matching the provided method. Only use this function\n * inside a catch block right after calling {@link xrpc}, and use the same\n * method type parameter as used in the {@link xrpc} call.\n */\nfunction asXrpcFailure<M extends Procedure | Query>(\n err: unknown,\n): XrpcFailure<M> {\n if (err instanceof XrpcResponseError) return err\n if (err instanceof XrpcInvalidResponseError) return err\n return XrpcUnexpectedError.from(err)\n}\n\n/**\n * @throws XrpcFailure<M>\n */\nexport async function xrpc<const M extends Query | Procedure>(\n agent: Agent,\n ns: NonNullable<unknown> extends XrpcOptions<M>\n ? Namespace<M>\n : Restricted<'This XRPC method requires an \"options\" argument'>,\n): Promise<XrpcResponse<M>>\nexport async function xrpc<const M extends Query | Procedure>(\n agent: Agent,\n ns: Namespace<M>,\n options: XrpcOptions<M>,\n): Promise<XrpcResponse<M>>\nexport async function xrpc<const M extends Query | Procedure>(\n agent: Agent,\n ns: Namespace<M>,\n options: XrpcOptions<M> = {} as XrpcOptions<M>,\n): Promise<XrpcResponse<M>> {\n try {\n return await xrpcRequest<M>(agent, ns, options)\n } catch (err) {\n throw asXrpcFailure<M>(err)\n }\n}\n\nexport async function xrpcSafe<const M extends Query | Procedure>(\n agent: Agent,\n ns: NonNullable<unknown> extends XrpcOptions<M>\n ? Namespace<M>\n : Restricted<'This XRPC method requires an \"options\" argument'>,\n): Promise<XrpcResult<M>>\nexport async function xrpcSafe<const M extends Query | Procedure>(\n agent: Agent,\n ns: Namespace<M>,\n options: XrpcOptions<M>,\n): Promise<XrpcResult<M>>\nexport async function xrpcSafe<const M extends Query | Procedure>(\n agent: Agent,\n ns: Namespace<M>,\n options: XrpcOptions<M> = {} as XrpcOptions<M>,\n): Promise<XrpcResult<M>> {\n return xrpcRequest<M>(agent, ns, options).catch(asXrpcFailure<M>)\n}\n\nasync function xrpcRequest<const M extends Query | Procedure>(\n agent: Agent,\n ns: Namespace<M>,\n options: XrpcOptions<M> = {} as XrpcOptions<M>,\n): Promise<XrpcResponse<M>> {\n const method = getMain(ns)\n options.signal?.throwIfAborted()\n const url = xrpcRequestUrl(method, options)\n const request = xrpcRequestInit(method, options)\n const response = await agent.fetchHandler(url, request)\n return XrpcResponse.fromFetchResponse<M>(method, response, options)\n}\n\nfunction xrpcRequestUrl<M extends Procedure | Query | Subscription>(\n method: M,\n options: CallOptions & { params?: Params },\n) {\n const path = `/xrpc/${method.nsid}`\n\n const queryString = options.params\n ? xrpcRequestParams(method.parameters, options.params, options)\n : undefined\n\n return queryString ? `${path}?${queryString}` : path\n}\n\nfunction xrpcRequestParams(\n schema: ParamsSchema | undefined,\n params: Params | undefined,\n options: CallOptions,\n): undefined | string {\n const urlSearchParams = schema?.toURLSearchParams(\n options.validateRequest ? schema.parse(params) : (params as any),\n )\n return urlSearchParams?.size ? urlSearchParams.toString() : undefined\n}\n\nfunction xrpcRequestInit<T extends Procedure | Query>(\n schema: T,\n options: CallOptions & {\n body?: LexValue | BinaryBodyInit\n encoding?: string\n },\n): RequestInit & { duplex?: 'half' } {\n const headers = buildAtprotoHeaders(options)\n\n // Tell the server what type of response we're expecting\n if (schema.output.encoding) {\n headers.set('accept', schema.output.encoding)\n }\n\n // Caller should not set content-type header\n if (headers.has('content-type')) {\n const contentType = headers.get('content-type')\n throw new TypeError(`Unexpected content-type header (${contentType})`)\n }\n\n // Requests with body\n if ('input' in schema) {\n const encodingHint = options.encoding\n const input = xrpcProcedureInput(schema, options, encodingHint)\n\n if (input) {\n headers.set('content-type', input.encoding)\n } else if (encodingHint != null) {\n throw new TypeError(`Unexpected encoding hint (${encodingHint})`)\n }\n\n return {\n duplex: 'half',\n redirect: 'follow',\n referrerPolicy: 'strict-origin-when-cross-origin', // (default)\n mode: 'cors', // (default)\n signal: options.signal,\n method: 'POST',\n headers,\n body: input?.body,\n }\n }\n\n // Requests without body\n return {\n duplex: 'half',\n redirect: 'follow',\n referrerPolicy: 'strict-origin-when-cross-origin', // (default)\n mode: 'cors', // (default)\n signal: options.signal,\n method: 'GET',\n headers,\n }\n}\n\nfunction xrpcProcedureInput(\n method: Procedure,\n options: CallOptions & { body?: LexValue | BinaryBodyInit },\n encodingHint?: string,\n): null | Payload<BodyInit> {\n const { input } = method\n const { body } = options\n\n if (options.validateRequest) {\n input.schema?.check(body)\n }\n\n // Special handling for endpoints expecting application/json input\n if (input.encoding === 'application/json') {\n // @NOTE **NOT** using isLexValue here to avoid deep checks in order to\n // distinguish between LexValue and BinaryBodyInit.\n if (!isLexScalar(body) && !isPlainObject(body) && !Array.isArray(body)) {\n throw new TypeError(`Expected LexValue body, got ${typeof body}`)\n }\n\n return buildPayload(input, lexStringify(body), encodingHint)\n }\n\n // Other encodings will be sent unaltered (ie. as binary data)\n switch (typeof body) {\n case 'undefined':\n case 'string':\n return buildPayload(input, body, encodingHint)\n case 'object': {\n if (body === null) break\n if (\n ArrayBuffer.isView(body) ||\n body instanceof ArrayBuffer ||\n body instanceof ReadableStream\n ) {\n return buildPayload(input, body, encodingHint)\n } else if (isAsyncIterable(body)) {\n return buildPayload(input, toReadableStream(body), encodingHint)\n } else if (isBlobLike(body)) {\n return buildPayload(input, body, encodingHint || body.type)\n }\n }\n }\n\n throw new TypeError(\n `Invalid ${typeof body} body for ${input.encoding} encoding`,\n )\n}\n\nfunction buildPayload(\n schema: LexPayload,\n body: undefined | BodyInit,\n encodingHint?: string,\n): null | Payload<BodyInit> {\n if (schema.encoding === undefined) {\n if (body !== undefined) {\n throw new TypeError(\n `Cannot send a ${typeof body} body with undefined encoding`,\n )\n }\n\n return null\n }\n\n if (body === undefined) {\n // This error would be returned by the server, but we can catch it earlier\n // to avoid un-necessary requests. Note that a content-length of 0 does not\n // necessary mean that the body is \"empty\" (e.g. an empty txt file).\n throw new TypeError(`A request body is expected but none was provided`)\n }\n\n const encoding = buildEncoding(schema, encodingHint)\n return { encoding, body }\n}\n\nfunction buildEncoding(schema: LexPayload, encodingHint?: string): string {\n // Should never happen (required for type safety)\n if (!schema.encoding) {\n throw new TypeError('Unexpected payload')\n }\n\n if (encodingHint?.length) {\n if (!schema.matchesEncoding(encodingHint)) {\n throw new TypeError(\n `Cannot send a body with content-type \"${encodingHint}\" for \"${schema.encoding}\" encoding`,\n )\n }\n return encodingHint\n }\n\n // Fallback\n\n if (schema.encoding === '*/*') {\n return 'application/octet-stream'\n }\n\n if (schema.encoding.startsWith('text/')) {\n return schema.encoding.includes('*')\n ? 'text/plain; charset=utf-8'\n : `${schema.encoding}; charset=utf-8`\n }\n\n if (!schema.encoding.includes('*')) {\n return schema.encoding\n }\n\n throw new TypeError(\n `Unable to determine payload encoding. Please provide a 'content-type' header matching ${schema.encoding}.`,\n )\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atproto/lex-client",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.5",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "HTTP client for interacting with Lexicon based APIs",
|
|
6
6
|
"keywords": [
|
|
@@ -37,14 +37,14 @@
|
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"tslib": "^2.8.1",
|
|
40
|
-
"@atproto/lex-data": "0.0.
|
|
41
|
-
"@atproto/lex-json": "0.0.
|
|
42
|
-
"@atproto/lex-schema": "0.0.
|
|
40
|
+
"@atproto/lex-data": "0.0.4",
|
|
41
|
+
"@atproto/lex-json": "0.0.4",
|
|
42
|
+
"@atproto/lex-schema": "0.0.5"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"jest": "^28.1.2",
|
|
46
|
-
"@atproto/lex-cbor": "0.0.
|
|
47
|
-
"@atproto/lex-builder": "0.0.
|
|
46
|
+
"@atproto/lex-cbor": "0.0.4",
|
|
47
|
+
"@atproto/lex-builder": "0.0.7"
|
|
48
48
|
},
|
|
49
49
|
"scripts": {
|
|
50
50
|
"prebuild": "node ./scripts/lex-build.mjs",
|
package/src/agent.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { DidString } from '@atproto/lex-schema'
|
|
2
2
|
|
|
3
|
-
export
|
|
4
|
-
|
|
3
|
+
export type FetchHandler = (
|
|
4
|
+
/**
|
|
5
|
+
* The URL (pathname + query parameters) to make the request to, without the
|
|
6
|
+
* origin. The origin (protocol, hostname, and port) must be added by this
|
|
7
|
+
* {@link FetchHandler}, typically based on authentication or other factors.
|
|
8
|
+
*/
|
|
9
|
+
path: string,
|
|
10
|
+
init: RequestInit,
|
|
11
|
+
) => Promise<Response>
|
|
5
12
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
* The URL (pathname + query parameters) to make the request to, without the
|
|
10
|
-
* origin. The origin (protocol, hostname, and port) must be added by this
|
|
11
|
-
* {@link FetchHandler}, typically based on authentication or other factors.
|
|
12
|
-
*/
|
|
13
|
-
path: string,
|
|
14
|
-
init: RequestInit,
|
|
15
|
-
) => Promise<Response>
|
|
13
|
+
export interface Agent {
|
|
14
|
+
readonly did?: DidString
|
|
15
|
+
fetchHandler: FetchHandler
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
export type AgentConfig = {
|
package/src/client.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { LexMap, LexValue } from '@atproto/lex-data'
|
|
2
2
|
import {
|
|
3
3
|
AtIdentifierString,
|
|
4
|
+
CidString,
|
|
4
5
|
DidString,
|
|
5
6
|
Infer,
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
InferQueryParameters,
|
|
7
|
+
InferMethodInputBody,
|
|
8
|
+
InferMethodOutputBody,
|
|
9
|
+
InferMethodParams,
|
|
10
10
|
InferRecordKey,
|
|
11
11
|
LexiconRecordKey,
|
|
12
12
|
NsidString,
|
|
@@ -18,16 +18,24 @@ import {
|
|
|
18
18
|
Schema,
|
|
19
19
|
} from '@atproto/lex-schema'
|
|
20
20
|
import { Agent, AgentOptions, buildAgent } from './agent.js'
|
|
21
|
+
import { com } from './lexicons.js'
|
|
21
22
|
import {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
23
|
+
BinaryBodyInit,
|
|
24
|
+
CallOptions,
|
|
25
|
+
Namespace,
|
|
26
|
+
Service,
|
|
27
|
+
getMain,
|
|
28
|
+
} from './types.js'
|
|
29
|
+
import { buildAtprotoHeaders } from './util.js'
|
|
30
|
+
import { XrpcError } from './xrpc-error.js'
|
|
31
|
+
import {
|
|
32
|
+
XrpcFailure,
|
|
33
|
+
XrpcOptions,
|
|
34
|
+
XrpcResponse,
|
|
35
|
+
XrpcResponseBody,
|
|
36
|
+
xrpc,
|
|
37
|
+
xrpcSafe,
|
|
38
|
+
} from './xrpc.js'
|
|
31
39
|
|
|
32
40
|
export type ClientOptions = {
|
|
33
41
|
labelers?: Iterable<DidString>
|
|
@@ -84,29 +92,35 @@ export type RecordKeyOptions<
|
|
|
84
92
|
|
|
85
93
|
export type CreateOptions<T extends RecordSchema> = CreateRecordOptions &
|
|
86
94
|
RecordKeyOptions<T, 'tid'>
|
|
87
|
-
export type CreateOutput =
|
|
88
|
-
typeof com.atproto.repo.createRecord.main
|
|
95
|
+
export type CreateOutput = InferMethodOutputBody<
|
|
96
|
+
typeof com.atproto.repo.createRecord.main,
|
|
97
|
+
Uint8Array
|
|
89
98
|
>
|
|
90
99
|
|
|
91
100
|
export type DeleteOptions<T extends RecordSchema> = DeleteRecordOptions &
|
|
92
101
|
RecordKeyOptions<T>
|
|
93
|
-
export type DeleteOutput =
|
|
94
|
-
typeof com.atproto.repo.deleteRecord.main
|
|
102
|
+
export type DeleteOutput = InferMethodOutputBody<
|
|
103
|
+
typeof com.atproto.repo.deleteRecord.main,
|
|
104
|
+
Uint8Array
|
|
95
105
|
>
|
|
96
106
|
export type GetOptions<T extends RecordSchema> = GetRecordOptions &
|
|
97
107
|
RecordKeyOptions<T>
|
|
98
108
|
export type GetOutput<T extends RecordSchema> = Omit<
|
|
99
|
-
|
|
109
|
+
InferMethodOutputBody<typeof com.atproto.repo.getRecord.main, Uint8Array>,
|
|
100
110
|
'value'
|
|
101
111
|
> & { value: Infer<T> }
|
|
102
112
|
|
|
103
113
|
export type PutOptions<T extends RecordSchema> = PutRecordOptions &
|
|
104
114
|
RecordKeyOptions<T>
|
|
105
|
-
export type PutOutput =
|
|
115
|
+
export type PutOutput = InferMethodOutputBody<
|
|
116
|
+
typeof com.atproto.repo.putRecord.main,
|
|
117
|
+
Uint8Array
|
|
118
|
+
>
|
|
106
119
|
|
|
107
120
|
export type ListOptions = ListRecordsOptions
|
|
108
|
-
export type ListOutput<T extends RecordSchema> =
|
|
109
|
-
typeof com.atproto.repo.listRecords.main
|
|
121
|
+
export type ListOutput<T extends RecordSchema> = InferMethodOutputBody<
|
|
122
|
+
typeof com.atproto.repo.listRecords.main,
|
|
123
|
+
Uint8Array
|
|
110
124
|
> & {
|
|
111
125
|
records: ListRecord<T>[]
|
|
112
126
|
// @NOTE Because the schema uses "type": "unknown" instead of an open union,
|
|
@@ -153,7 +167,7 @@ export class Client implements Agent {
|
|
|
153
167
|
}
|
|
154
168
|
|
|
155
169
|
public assertAuthenticated(): asserts this is { did: DidString } {
|
|
156
|
-
if (!this.did) throw new XrpcError(
|
|
170
|
+
if (!this.did) throw new XrpcError('AuthenticationRequired')
|
|
157
171
|
}
|
|
158
172
|
|
|
159
173
|
public setLabelers(labelers: Iterable<DidString> = []) {
|
|
@@ -170,7 +184,7 @@ export class Client implements Agent {
|
|
|
170
184
|
}
|
|
171
185
|
|
|
172
186
|
public fetchHandler(path: string, init: RequestInit): Promise<Response> {
|
|
173
|
-
const headers =
|
|
187
|
+
const headers = buildAtprotoHeaders({
|
|
174
188
|
headers: init.headers,
|
|
175
189
|
service: this.service,
|
|
176
190
|
labelers: [
|
|
@@ -186,9 +200,13 @@ export class Client implements Agent {
|
|
|
186
200
|
if (!headers.has(key)) headers.set(key, value)
|
|
187
201
|
}
|
|
188
202
|
|
|
203
|
+
// @NOTE The agent here could be another Client instance.
|
|
189
204
|
return this.agent.fetchHandler(path, { ...init, headers })
|
|
190
205
|
}
|
|
191
206
|
|
|
207
|
+
/**
|
|
208
|
+
* @throws {XrpcFailure<M>} when the request fails or the response is an error
|
|
209
|
+
*/
|
|
192
210
|
async xrpc<const M extends Query | Procedure>(
|
|
193
211
|
ns: NonNullable<unknown> extends XrpcOptions<M>
|
|
194
212
|
? Namespace<M>
|
|
@@ -209,17 +227,16 @@ export class Client implements Agent {
|
|
|
209
227
|
ns: NonNullable<unknown> extends XrpcOptions<M>
|
|
210
228
|
? Namespace<M>
|
|
211
229
|
: Restricted<'This XRPC method requires an "options" argument'>,
|
|
212
|
-
): Promise<XrpcResponse<M> |
|
|
230
|
+
): Promise<XrpcResponse<M> | XrpcFailure<M>>
|
|
213
231
|
async xrpcSafe<const M extends Query | Procedure>(
|
|
214
232
|
ns: Namespace<M>,
|
|
215
233
|
options: XrpcOptions<M>,
|
|
216
|
-
): Promise<XrpcResponse<M> |
|
|
234
|
+
): Promise<XrpcResponse<M> | XrpcFailure<M>>
|
|
217
235
|
async xrpcSafe<const M extends Query | Procedure>(
|
|
218
236
|
ns: Namespace<M>,
|
|
219
237
|
options: XrpcOptions<M> = {} as XrpcOptions<M>,
|
|
220
|
-
): Promise<
|
|
221
|
-
|
|
222
|
-
return this.xrpc(schema, options).catch(asXrpcRequestFailureFor(schema))
|
|
238
|
+
): Promise<XrpcResponse<M> | XrpcFailure<M>> {
|
|
239
|
+
return xrpcSafe(this, ns, options)
|
|
223
240
|
}
|
|
224
241
|
|
|
225
242
|
/**
|
|
@@ -243,12 +260,6 @@ export class Client implements Agent {
|
|
|
243
260
|
})
|
|
244
261
|
}
|
|
245
262
|
|
|
246
|
-
async createRecordsSafe(...args: Parameters<Client['createRecord']>) {
|
|
247
|
-
return this.createRecord(...args).catch(
|
|
248
|
-
asXrpcRequestFailureFor(com.atproto.repo.createRecord.main),
|
|
249
|
-
)
|
|
250
|
-
}
|
|
251
|
-
|
|
252
263
|
async deleteRecord(
|
|
253
264
|
collection: NsidString,
|
|
254
265
|
rkey: string,
|
|
@@ -266,12 +277,6 @@ export class Client implements Agent {
|
|
|
266
277
|
})
|
|
267
278
|
}
|
|
268
279
|
|
|
269
|
-
async deleteRecordsSafe(...args: Parameters<Client['deleteRecord']>) {
|
|
270
|
-
return this.deleteRecord(...args).catch(
|
|
271
|
-
asXrpcRequestFailureFor(com.atproto.repo.deleteRecord.main),
|
|
272
|
-
)
|
|
273
|
-
}
|
|
274
|
-
|
|
275
280
|
public async getRecord(
|
|
276
281
|
collection: NsidString,
|
|
277
282
|
rkey: string,
|
|
@@ -287,12 +292,6 @@ export class Client implements Agent {
|
|
|
287
292
|
})
|
|
288
293
|
}
|
|
289
294
|
|
|
290
|
-
async getRecordsSafe(...args: Parameters<Client['getRecord']>) {
|
|
291
|
-
return this.getRecord(...args).catch(
|
|
292
|
-
asXrpcRequestFailureFor(com.atproto.repo.getRecord.main),
|
|
293
|
-
)
|
|
294
|
-
}
|
|
295
|
-
|
|
296
295
|
async putRecord(
|
|
297
296
|
record: { $type: NsidString } & LexMap,
|
|
298
297
|
rkey: string,
|
|
@@ -312,12 +311,6 @@ export class Client implements Agent {
|
|
|
312
311
|
})
|
|
313
312
|
}
|
|
314
313
|
|
|
315
|
-
async putRecordsSafe(...args: Parameters<Client['putRecord']>) {
|
|
316
|
-
return this.putRecord(...args).catch(
|
|
317
|
-
asXrpcRequestFailureFor(com.atproto.repo.putRecord.main),
|
|
318
|
-
)
|
|
319
|
-
}
|
|
320
|
-
|
|
321
314
|
async listRecords(nsid: NsidString, options?: ListRecordsOptions) {
|
|
322
315
|
return this.xrpc(com.atproto.repo.listRecords.main, {
|
|
323
316
|
...options,
|
|
@@ -331,28 +324,52 @@ export class Client implements Agent {
|
|
|
331
324
|
})
|
|
332
325
|
}
|
|
333
326
|
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
327
|
+
async uploadBlob(
|
|
328
|
+
body: BinaryBodyInit,
|
|
329
|
+
options?: CallOptions & { encoding?: `${string}/${string}` },
|
|
330
|
+
) {
|
|
331
|
+
return this.xrpc(com.atproto.repo.uploadBlob.main, {
|
|
332
|
+
...options,
|
|
333
|
+
body,
|
|
334
|
+
})
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
async getBlob(did: DidString, cid: CidString, options?: CallOptions) {
|
|
338
|
+
return this.xrpc(com.atproto.sync.getBlob.main, {
|
|
339
|
+
...options,
|
|
340
|
+
params: { did, cid },
|
|
341
|
+
})
|
|
342
|
+
}
|
|
343
|
+
|
|
344
344
|
public async call<const T extends Query>(
|
|
345
|
-
ns: NonNullable<unknown> extends
|
|
345
|
+
ns: NonNullable<unknown> extends InferMethodParams<T>
|
|
346
346
|
? Namespace<T>
|
|
347
347
|
: Restricted<'This query type requires a "params" argument'>,
|
|
348
|
-
): Promise<
|
|
349
|
-
public async call<const T extends
|
|
348
|
+
): Promise<XrpcResponseBody<T>>
|
|
349
|
+
public async call<const T extends Action>(
|
|
350
|
+
ns: void extends InferActionInput<T>
|
|
351
|
+
? Namespace<T>
|
|
352
|
+
: Restricted<'This action type requires an "input" argument'>,
|
|
353
|
+
): Promise<InferActionOutput<T>>
|
|
354
|
+
public async call<const T extends Action | Procedure | Query>(
|
|
350
355
|
ns: Namespace<T>,
|
|
351
|
-
|
|
352
|
-
?
|
|
353
|
-
:
|
|
356
|
+
arg: T extends Action
|
|
357
|
+
? InferActionInput<T>
|
|
358
|
+
: T extends Procedure
|
|
359
|
+
? InferMethodInputBody<T, Uint8Array>
|
|
360
|
+
: T extends Query
|
|
361
|
+
? InferMethodParams<T>
|
|
362
|
+
: never,
|
|
354
363
|
options?: CallOptions,
|
|
355
|
-
): Promise<
|
|
364
|
+
): Promise<
|
|
365
|
+
T extends Action
|
|
366
|
+
? InferActionOutput<T>
|
|
367
|
+
: T extends Procedure
|
|
368
|
+
? XrpcResponseBody<T>
|
|
369
|
+
: T extends Query
|
|
370
|
+
? XrpcResponseBody<T>
|
|
371
|
+
: never
|
|
372
|
+
>
|
|
356
373
|
public async call(
|
|
357
374
|
ns: Namespace<Action> | Namespace<Procedure> | Namespace<Query>,
|
|
358
375
|
arg?: LexValue | Params,
|
|
@@ -365,12 +382,10 @@ export class Client implements Agent {
|
|
|
365
382
|
}
|
|
366
383
|
|
|
367
384
|
if (method instanceof Procedure) {
|
|
368
|
-
const
|
|
369
|
-
const result = await this.xrpc(method, { ...options, body })
|
|
385
|
+
const result = await this.xrpc(method, { ...options, body: arg as any })
|
|
370
386
|
return result.body
|
|
371
387
|
} else if (method instanceof Query) {
|
|
372
|
-
const
|
|
373
|
-
const result = await this.xrpc(method, { ...options, params })
|
|
388
|
+
const result = await this.xrpc(method, { ...options, params: arg as any })
|
|
374
389
|
return result.body
|
|
375
390
|
} else {
|
|
376
391
|
throw new TypeError('Invalid lexicon')
|
|
@@ -394,9 +409,8 @@ export class Client implements Agent {
|
|
|
394
409
|
options: CreateOptions<T> = {} as CreateOptions<T>,
|
|
395
410
|
): Promise<CreateOutput> {
|
|
396
411
|
const schema: T = getMain(ns)
|
|
397
|
-
const record =
|
|
398
|
-
|
|
399
|
-
: schema.build(input)
|
|
412
|
+
const record = schema.build(input)
|
|
413
|
+
if (options.validateRequest) schema.assert(record)
|
|
400
414
|
const rkey = options.rkey ?? getDefaultRecordKey(schema)
|
|
401
415
|
if (rkey !== undefined) schema.keySchema.assert(rkey)
|
|
402
416
|
const response = await this.createRecord(record, rkey, options)
|
|
@@ -462,8 +476,9 @@ export class Client implements Agent {
|
|
|
462
476
|
input: Omit<Infer<T>, '$type'>,
|
|
463
477
|
options: PutOptions<T> = {} as PutOptions<T>,
|
|
464
478
|
): Promise<PutOutput> {
|
|
465
|
-
const schema = getMain(ns)
|
|
479
|
+
const schema: T = getMain(ns)
|
|
466
480
|
const record = schema.build(input)
|
|
481
|
+
if (options.validateRequest) schema.assert(record)
|
|
467
482
|
const rkey = options.rkey ?? getLiteralRecordKey(schema)
|
|
468
483
|
const response = await this.putRecord(record, rkey, options)
|
|
469
484
|
return response.body
|
package/src/index.ts
CHANGED
|
@@ -9,9 +9,7 @@ const $nsid = 'com.atproto.repo.createRecord'
|
|
|
9
9
|
|
|
10
10
|
export { $nsid }
|
|
11
11
|
|
|
12
|
-
/**
|
|
13
|
-
* Create a single new repository record. Requires auth, implemented by PDS.
|
|
14
|
-
*/
|
|
12
|
+
/** Create a single new repository record. Requires auth, implemented by PDS. */
|
|
15
13
|
const main =
|
|
16
14
|
/*#__PURE__*/
|
|
17
15
|
l.procedure(
|
|
@@ -49,10 +47,13 @@ const main =
|
|
|
49
47
|
)
|
|
50
48
|
export { main }
|
|
51
49
|
|
|
52
|
-
export
|
|
50
|
+
export type Params = l.InferMethodParams<typeof main>
|
|
51
|
+
export type Input = l.InferMethodInput<typeof main>
|
|
52
|
+
export type InputBody = l.InferMethodInputBody<typeof main>
|
|
53
|
+
export type Output = l.InferMethodOutput<typeof main>
|
|
54
|
+
export type OutputBody = l.InferMethodOutputBody<typeof main>
|
|
55
|
+
|
|
56
|
+
export const $lxm = /*#__PURE__*/ main.nsid,
|
|
57
|
+
$params = /*#__PURE__*/ main.parameters,
|
|
53
58
|
$input = /*#__PURE__*/ main.input,
|
|
54
59
|
$output = /*#__PURE__*/ main.output
|
|
55
|
-
|
|
56
|
-
export type Params = l.InferProcedureParameters<typeof main>
|
|
57
|
-
export type Input = l.InferProcedureInputBody<typeof main>
|
|
58
|
-
export type Output = l.InferProcedureOutputBody<typeof main>
|
|
@@ -9,9 +9,7 @@ const $nsid = 'com.atproto.repo.deleteRecord'
|
|
|
9
9
|
|
|
10
10
|
export { $nsid }
|
|
11
11
|
|
|
12
|
-
/**
|
|
13
|
-
* Delete a repository record, or ensure it doesn't exist. Requires auth, implemented by PDS.
|
|
14
|
-
*/
|
|
12
|
+
/** Delete a repository record, or ensure it doesn't exist. Requires auth, implemented by PDS. */
|
|
15
13
|
const main =
|
|
16
14
|
/*#__PURE__*/
|
|
17
15
|
l.procedure(
|
|
@@ -45,10 +43,13 @@ const main =
|
|
|
45
43
|
)
|
|
46
44
|
export { main }
|
|
47
45
|
|
|
48
|
-
export
|
|
46
|
+
export type Params = l.InferMethodParams<typeof main>
|
|
47
|
+
export type Input = l.InferMethodInput<typeof main>
|
|
48
|
+
export type InputBody = l.InferMethodInputBody<typeof main>
|
|
49
|
+
export type Output = l.InferMethodOutput<typeof main>
|
|
50
|
+
export type OutputBody = l.InferMethodOutputBody<typeof main>
|
|
51
|
+
|
|
52
|
+
export const $lxm = /*#__PURE__*/ main.nsid,
|
|
53
|
+
$params = /*#__PURE__*/ main.parameters,
|
|
49
54
|
$input = /*#__PURE__*/ main.input,
|
|
50
55
|
$output = /*#__PURE__*/ main.output
|
|
51
|
-
|
|
52
|
-
export type Params = l.InferProcedureParameters<typeof main>
|
|
53
|
-
export type Input = l.InferProcedureInputBody<typeof main>
|
|
54
|
-
export type Output = l.InferProcedureOutputBody<typeof main>
|
|
@@ -8,9 +8,7 @@ const $nsid = 'com.atproto.repo.getRecord'
|
|
|
8
8
|
|
|
9
9
|
export { $nsid }
|
|
10
10
|
|
|
11
|
-
/**
|
|
12
|
-
* Get a single record from a repository. Does not require auth.
|
|
13
|
-
*/
|
|
11
|
+
/** Get a single record from a repository. Does not require auth. */
|
|
14
12
|
const main =
|
|
15
13
|
/*#__PURE__*/
|
|
16
14
|
l.query(
|
|
@@ -35,8 +33,10 @@ const main =
|
|
|
35
33
|
)
|
|
36
34
|
export { main }
|
|
37
35
|
|
|
38
|
-
export
|
|
39
|
-
|
|
36
|
+
export type Params = l.InferMethodParams<typeof main>
|
|
37
|
+
export type Output = l.InferMethodOutput<typeof main>
|
|
38
|
+
export type OutputBody = l.InferMethodOutputBody<typeof main>
|
|
40
39
|
|
|
41
|
-
export
|
|
42
|
-
|
|
40
|
+
export const $lxm = /*#__PURE__*/ main.nsid,
|
|
41
|
+
$params = main.parameters,
|
|
42
|
+
$output = main.output
|
|
@@ -8,9 +8,7 @@ const $nsid = 'com.atproto.repo.listRecords'
|
|
|
8
8
|
|
|
9
9
|
export { $nsid }
|
|
10
10
|
|
|
11
|
-
/**
|
|
12
|
-
* List a range of records in a repository, matching a specific collection. Does not require auth.
|
|
13
|
-
*/
|
|
11
|
+
/** List a range of records in a repository, matching a specific collection. Does not require auth. */
|
|
14
12
|
const main =
|
|
15
13
|
/*#__PURE__*/
|
|
16
14
|
l.query(
|
|
@@ -36,11 +34,14 @@ const main =
|
|
|
36
34
|
)
|
|
37
35
|
export { main }
|
|
38
36
|
|
|
39
|
-
export
|
|
37
|
+
export type Params = l.InferMethodParams<typeof main>
|
|
38
|
+
export type Output = l.InferMethodOutput<typeof main>
|
|
39
|
+
export type OutputBody = l.InferMethodOutputBody<typeof main>
|
|
40
|
+
|
|
41
|
+
export const $lxm = /*#__PURE__*/ main.nsid,
|
|
42
|
+
$params = main.parameters,
|
|
40
43
|
$output = main.output
|
|
41
44
|
|
|
42
|
-
export type Params = l.InferQueryParameters<typeof main>
|
|
43
|
-
export type Output = l.InferQueryOutputBody<typeof main>
|
|
44
45
|
type Def$0 = {
|
|
45
46
|
$type?: 'com.atproto.repo.listRecords#record'
|
|
46
47
|
uri: l.AtUriString
|
|
@@ -9,9 +9,7 @@ const $nsid = 'com.atproto.repo.putRecord'
|
|
|
9
9
|
|
|
10
10
|
export { $nsid }
|
|
11
11
|
|
|
12
|
-
/**
|
|
13
|
-
* Write a repository record, creating or updating it as needed. Requires auth, implemented by PDS.
|
|
14
|
-
*/
|
|
12
|
+
/** Write a repository record, creating or updating it as needed. Requires auth, implemented by PDS. */
|
|
15
13
|
const main =
|
|
16
14
|
/*#__PURE__*/
|
|
17
15
|
l.procedure(
|
|
@@ -50,10 +48,13 @@ const main =
|
|
|
50
48
|
)
|
|
51
49
|
export { main }
|
|
52
50
|
|
|
53
|
-
export
|
|
51
|
+
export type Params = l.InferMethodParams<typeof main>
|
|
52
|
+
export type Input = l.InferMethodInput<typeof main>
|
|
53
|
+
export type InputBody = l.InferMethodInputBody<typeof main>
|
|
54
|
+
export type Output = l.InferMethodOutput<typeof main>
|
|
55
|
+
export type OutputBody = l.InferMethodOutputBody<typeof main>
|
|
56
|
+
|
|
57
|
+
export const $lxm = /*#__PURE__*/ main.nsid,
|
|
58
|
+
$params = /*#__PURE__*/ main.parameters,
|
|
54
59
|
$input = /*#__PURE__*/ main.input,
|
|
55
60
|
$output = /*#__PURE__*/ main.output
|
|
56
|
-
|
|
57
|
-
export type Params = l.InferProcedureParameters<typeof main>
|
|
58
|
-
export type Input = l.InferProcedureInputBody<typeof main>
|
|
59
|
-
export type Output = l.InferProcedureOutputBody<typeof main>
|
|
@@ -8,9 +8,7 @@ const $nsid = 'com.atproto.repo.uploadBlob'
|
|
|
8
8
|
|
|
9
9
|
export { $nsid }
|
|
10
10
|
|
|
11
|
-
/**
|
|
12
|
-
* Upload a new blob, to be referenced from a repository record. The blob will be deleted if it is not referenced within a time window (eg, minutes). Blob restrictions (mimetype, size, etc) are enforced when the reference is created. Requires auth, implemented by PDS.
|
|
13
|
-
*/
|
|
11
|
+
/** Upload a new blob, to be referenced from a repository record. The blob will be deleted if it is not referenced within a time window (eg, minutes). Blob restrictions (mimetype, size, etc) are enforced when the reference is created. Requires auth, implemented by PDS. */
|
|
14
12
|
const main =
|
|
15
13
|
/*#__PURE__*/
|
|
16
14
|
l.procedure(
|
|
@@ -26,10 +24,13 @@ const main =
|
|
|
26
24
|
)
|
|
27
25
|
export { main }
|
|
28
26
|
|
|
29
|
-
export
|
|
27
|
+
export type Params = l.InferMethodParams<typeof main>
|
|
28
|
+
export type Input = l.InferMethodInput<typeof main>
|
|
29
|
+
export type InputBody = l.InferMethodInputBody<typeof main>
|
|
30
|
+
export type Output = l.InferMethodOutput<typeof main>
|
|
31
|
+
export type OutputBody = l.InferMethodOutputBody<typeof main>
|
|
32
|
+
|
|
33
|
+
export const $lxm = /*#__PURE__*/ main.nsid,
|
|
34
|
+
$params = /*#__PURE__*/ main.parameters,
|
|
30
35
|
$input = /*#__PURE__*/ main.input,
|
|
31
36
|
$output = /*#__PURE__*/ main.output
|
|
32
|
-
|
|
33
|
-
export type Params = l.InferProcedureParameters<typeof main>
|
|
34
|
-
export type Input = l.InferProcedureInputBody<typeof main>
|
|
35
|
-
export type Output = l.InferProcedureOutputBody<typeof main>
|