@nxtedition/couch
Advanced tools
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} |
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} |
| import stream from 'node:stream'; | ||
| import type { Dispatcher, LoggerLike, RequestOptions, URLObject } from '@nxtedition/nxt-undici'; | ||
| import type { Priority } from './utils.ts'; | ||
| export interface CouchResponse<T = unknown> { | ||
| rows: T[]; | ||
| total_rows?: number; | ||
| offset?: number | null; | ||
| update_seq?: string; | ||
| } | ||
| export interface CouchRequestOptions<Stream extends boolean = boolean> { | ||
| id?: string; | ||
| url?: string | URL | URLObject; | ||
| pathname?: string; | ||
| path?: string; | ||
| origin?: string; | ||
| headers?: Record<string, string | string[] | null | undefined> | null; | ||
| method?: string; | ||
| body?: unknown; | ||
| query?: Record<string, unknown> | null; | ||
| headersTimeout?: number | null; | ||
| bodyTimeout?: number | null; | ||
| dispatcher?: Dispatcher | null; | ||
| priority?: Priority | null; | ||
| blocking?: boolean | null; | ||
| idempotent?: boolean | null; | ||
| retry?: RequestOptions['retry']; | ||
| dns?: RequestOptions['dns']; | ||
| cache?: RequestOptions['cache']; | ||
| signal?: AbortSignal | null; | ||
| logger?: LoggerLike | null; | ||
| highWaterMark?: number; | ||
| stream?: Stream; | ||
| } | ||
| export declare function request<T = unknown, Stream extends boolean = false>(url: string | URL | URLObject, opts?: CouchRequestOptions<Stream> | null): Stream extends true ? stream.Readable : Promise<T>; | ||
| export declare function request<T = unknown, Stream extends boolean = false>(opts: CouchRequestOptions<Stream>): Stream extends true ? stream.Readable : Promise<T>; | ||
| //# sourceMappingURL=request.d.ts.map |
| {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"AAEA,OAAO,MAAM,MAAM,aAAa,CAAA;AAGhC,OAAO,KAAK,EAGV,UAAU,EACV,UAAU,EACV,cAAc,EACd,SAAS,EACV,MAAM,wBAAwB,CAAA;AAE/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAmN1C,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACxC,IAAI,EAAE,CAAC,EAAE,CAAA;IACT,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,mBAAmB,CAAC,MAAM,SAAS,OAAO,GAAG,OAAO;IACnE,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,GAAG,SAAS,CAAA;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,IAAI,CAAA;IACrE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IACtC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;IAC9B,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;IAC1B,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;IACzB,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;IAC3B,KAAK,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAA;IAC/B,GAAG,CAAC,EAAE,cAAc,CAAC,KAAK,CAAC,CAAA;IAC3B,KAAK,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAA;IAC/B,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;IAC3B,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAQD,wBAAgB,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,SAAS,OAAO,GAAG,KAAK,EACjE,GAAG,EAAE,MAAM,GAAG,GAAG,GAAG,SAAS,EAC7B,IAAI,CAAC,EAAE,mBAAmB,CAAC,MAAM,CAAC,GAAG,IAAI,GACxC,MAAM,SAAS,IAAI,GAAG,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;AACrD,wBAAgB,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,SAAS,OAAO,GAAG,KAAK,EACjE,IAAI,EAAE,mBAAmB,CAAC,MAAM,CAAC,GAChC,MAAM,SAAS,IAAI,GAAG,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA"} |
+283
| import assert from 'node:assert'; | ||
| import net from 'node:net'; | ||
| import stream from 'node:stream'; | ||
| import { dispatch, Agent } from '@nxtedition/nxt-undici'; | ||
| import { AbortError } from '@nxtedition/error'; | ||
| class StreamOutput extends stream.Readable { | ||
| #str = ''; | ||
| #resume; | ||
| #abort; | ||
| #state; | ||
| #decoder; | ||
| #headers; | ||
| constructor({ signal, highWaterMark = 256, }) { | ||
| super({ objectMode: true, highWaterMark, signal: signal ?? undefined }); | ||
| } | ||
| get headers() { | ||
| return this.#headers; | ||
| } | ||
| _read() { | ||
| this.#resume?.(); | ||
| } | ||
| _destroy(err, callback) { | ||
| this.#abort?.(err ?? undefined); | ||
| callback(err); | ||
| } | ||
| onConnect(abort) { | ||
| if (this.destroyed) { | ||
| abort(this.errored ?? undefined); | ||
| } | ||
| else if (this.#state) { | ||
| throw new Error('unusable'); | ||
| } | ||
| else { | ||
| this.#state = 0; | ||
| this.#str = ''; | ||
| this.#abort = abort; | ||
| this.#decoder = new TextDecoder(); | ||
| } | ||
| } | ||
| onHeaders(statusCode, headers, resume) { | ||
| if (statusCode >= 300 || statusCode < 200) { | ||
| throw Object.assign(new Error('invalid status code: ' + statusCode), { statusCode, headers }); | ||
| } | ||
| this.#headers = headers; | ||
| this.#resume = resume; | ||
| } | ||
| onData(data) { | ||
| const lines = this.#decoder.decode(data, { stream: true }).split(/\r?\n+/); | ||
| lines[0] = this.#str + lines[0]; | ||
| this.#str = lines.pop() ?? ''; | ||
| try { | ||
| let ret = true; | ||
| for (const line of lines) { | ||
| if (!line) { | ||
| continue; | ||
| } | ||
| if (this.#state === 0) { | ||
| if (/\[\s*$/.test(line)) { | ||
| this.#state = 1; | ||
| } | ||
| else { | ||
| throw new Error('expected [ at end of line'); | ||
| } | ||
| } | ||
| else if (this.#state === 1) { | ||
| if (/^\s*\]/.test(line)) { | ||
| this.#state = 2; | ||
| } | ||
| else { | ||
| const row = JSON.parse(line.slice(0, line.lastIndexOf('}') + 1)); | ||
| if (!this.push(row)) { | ||
| ret = false; | ||
| } | ||
| } | ||
| } | ||
| } | ||
| return ret; | ||
| } | ||
| catch (err) { | ||
| throw Object.assign(new Error('invalid data'), { | ||
| data: lines.join('\n') + this.#str, | ||
| cause: err, | ||
| }); | ||
| } | ||
| } | ||
| onComplete() { | ||
| // A thrown assert here would be swallowed: nxt-undici treats the dispatch | ||
| // as settled once onComplete is entered, so the stream would neither end | ||
| // nor error — a permanent hang for the consumer. Destroy with a parse | ||
| // error instead when the body ended before the rows trailer. | ||
| const tail = this.#str + (this.#decoder ? this.#decoder.decode() : ''); | ||
| if (this.#state === 1 && /^\s*\]/.test(tail)) { | ||
| this.#state = 2; | ||
| } | ||
| if (this.#state !== 2) { | ||
| this.destroy(Object.assign(new Error('invalid data'), { data: tail })); | ||
| return; | ||
| } | ||
| this.push(null); | ||
| } | ||
| onError(err) { | ||
| this.destroy(err); | ||
| } | ||
| } | ||
| class PromiseOutput { | ||
| #resolve; | ||
| #reject; | ||
| #str = ''; | ||
| #decoder; | ||
| #signal; | ||
| #abort; | ||
| constructor({ resolve, reject, signal, }) { | ||
| this.#resolve = resolve; | ||
| this.#reject = reject; | ||
| this.#signal = signal; | ||
| } | ||
| onConnect(abort) { | ||
| this.#decoder = new TextDecoder(); | ||
| this.#str = ''; | ||
| const signal = this.#signal; | ||
| if (signal?.aborted) { | ||
| abort(signal.reason ?? new AbortError()); | ||
| } | ||
| else if (signal) { | ||
| if (this.#abort) { | ||
| // A retried request calls onConnect again; drop the stale listener so | ||
| // it does not accumulate for every attempt. | ||
| signal.removeEventListener('abort', this.#abort); | ||
| } | ||
| // Wrap the undici abort callback: registering it directly would invoke | ||
| // it with the 'abort' Event object, which then propagates as the | ||
| // rejection "error". | ||
| this.#abort = () => { | ||
| abort(signal.reason ?? new AbortError()); | ||
| }; | ||
| signal.addEventListener('abort', this.#abort); | ||
| } | ||
| } | ||
| onHeaders(statusCode, rawHeaders, resume) { | ||
| if (statusCode >= 300 || statusCode < 200) { | ||
| throw Object.assign(new Error('invalid status code: ' + statusCode), { | ||
| statusCode, | ||
| headers: rawHeaders, | ||
| }); | ||
| } | ||
| } | ||
| onData(data) { | ||
| this.#str += this.#decoder.decode(data, { stream: true }); | ||
| } | ||
| onComplete() { | ||
| this.#str += this.#decoder.decode(undefined, { stream: false }); | ||
| try { | ||
| this.#onDone(null, JSON.parse(this.#str)); | ||
| } | ||
| catch (err) { | ||
| this.#onDone(Object.assign(new Error('invalid json'), { data: this.#str, cause: err })); | ||
| } | ||
| } | ||
| onError(err) { | ||
| this.#onDone(err); | ||
| } | ||
| #onDone(err, val) { | ||
| if (err) { | ||
| this.#reject(err); | ||
| } | ||
| else { | ||
| this.#resolve(val); | ||
| } | ||
| if (this.#abort) { | ||
| this.#signal?.removeEventListener('abort', this.#abort); | ||
| } | ||
| } | ||
| } | ||
| const defaultDispatcher = new Agent({ | ||
| // pipelining: 4, | ||
| connections: 8 * 4, | ||
| connectTimeout: 2e3, | ||
| }); | ||
| const blockingDispatcher = new Agent({ | ||
| pipelining: 1, | ||
| connections: 1024, | ||
| connectTimeout: 2e3, | ||
| }); | ||
| export function request(url, opts) { | ||
| let urlLike; | ||
| if (typeof url === 'string') { | ||
| opts = { url: new URL(url), ...opts }; | ||
| } | ||
| else if (url instanceof URL) { | ||
| opts = { url, ...opts }; | ||
| } | ||
| else if (url != null && | ||
| typeof (url.path ?? url.pathname) === 'string' && | ||
| (typeof url.origin === 'string' || | ||
| url.host != null || | ||
| url.hostname != null)) { | ||
| // A bare URL-like object ({ origin, path | pathname }); it may also carry | ||
| // request options when used in the opts-only calling convention. | ||
| urlLike = url; | ||
| opts = opts | ||
| ? { ...url, ...opts } | ||
| : url; | ||
| } | ||
| if (opts == null && typeof url === 'object' && url != null) { | ||
| opts = url; | ||
| } | ||
| assert(opts != null, 'invalid arguments'); | ||
| urlLike = opts.url ?? urlLike; | ||
| if (typeof urlLike === 'string') { | ||
| urlLike = new URL(urlLike); | ||
| } | ||
| assert(urlLike != null, 'invalid url'); | ||
| let origin = urlLike.origin; | ||
| if (!origin) { | ||
| const protocol = urlLike.protocol ?? 'http:'; | ||
| const rawHostname = urlLike.hostname; | ||
| // IPv6 literals must be bracketed in the authority or URL parsing fails. | ||
| const hostname = rawHostname != null && net.isIPv6(rawHostname) ? `[${rawHostname}]` : rawHostname; | ||
| const host = urlLike.host ?? | ||
| `${hostname}:${urlLike.port ?? (protocol === 'https:' ? 443 : 80)}`; | ||
| origin = `${protocol}//${host}`; | ||
| } | ||
| let path = urlLike.path; | ||
| if (!path) { | ||
| const { pathname, search } = urlLike; | ||
| path = search ? `${pathname}${search}` : pathname; | ||
| } | ||
| // Only plain JSON values are serialized — Buffers, TypedArrays, | ||
| // ArrayBuffers and streams must pass through untouched or binary uploads | ||
| // would be corrupted into their JSON object representation. | ||
| const isJsonBody = opts.body != null && | ||
| typeof opts.body === 'object' && | ||
| !Buffer.isBuffer(opts.body) && | ||
| !ArrayBuffer.isView(opts.body) && | ||
| !(opts.body instanceof ArrayBuffer) && | ||
| typeof opts.body.pipe !== 'function'; | ||
| const ureq = { | ||
| ...opts, | ||
| dns: opts.dns !== false && opts.dns !== null | ||
| ? { | ||
| balance: 'hash', | ||
| ...(typeof opts.dns === 'object' ? opts.dns : null), | ||
| } | ||
| : opts.dns, | ||
| origin, | ||
| path, | ||
| // Presence, not truthiness: a valid falsy body ('', 0, false, empty | ||
| // Buffer) must still default to POST rather than GET-with-a-body. | ||
| method: opts.method ?? (opts.body != null ? 'POST' : 'GET'), | ||
| blocking: opts.blocking ?? Boolean(opts.stream), | ||
| headers: { | ||
| 'content-type': isJsonBody ? 'application/json' : 'text/plain', | ||
| accept: 'application/json', | ||
| // Lowercase caller header names so they override the defaults above — | ||
| // a spread of e.g. 'Content-Type' would otherwise ride along as a | ||
| // second, differently-cased content-type header on the wire. | ||
| ...(opts.headers | ||
| ? Object.fromEntries(Object.entries(opts.headers).map(([k, v]) => [k.toLowerCase(), v])) | ||
| : null), | ||
| }, | ||
| cache: opts.cache ?? false, | ||
| body: isJsonBody ? JSON.stringify(opts.body) : opts.body, | ||
| }; | ||
| const dispatcher = opts.dispatcher ?? (ureq.blocking ? blockingDispatcher : defaultDispatcher); | ||
| const signal = opts.signal; | ||
| if (opts.stream) { | ||
| const handler = new StreamOutput({ signal, highWaterMark: opts.highWaterMark }); | ||
| void dispatch(dispatcher, ureq, handler); | ||
| return handler; | ||
| } | ||
| else { | ||
| return new Promise((resolve, reject) => { | ||
| const handler = new PromiseOutput({ resolve, reject, signal }); | ||
| void dispatch(dispatcher, ureq, handler); | ||
| }); | ||
| } | ||
| } | ||
| ; | ||
| globalThis.__nxt_lib_couch = { | ||
| request, | ||
| defaultDispatcher, | ||
| }; | ||
| //# sourceMappingURL=request.js.map |
| {"version":3,"file":"request.js","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"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"} |
| import type { DispatchOptions } from '@nxtedition/nxt-undici'; | ||
| export type Priority = NonNullable<DispatchOptions['priority']>; | ||
| export interface AbortSignalLike { | ||
| aborted?: boolean; | ||
| reason?: unknown; | ||
| on?(event: 'abort', listener: () => void): void; | ||
| off?(event: 'abort', listener: () => void): void; | ||
| addEventListener?(event: 'abort', listener: () => void): void; | ||
| removeEventListener?(event: 'abort', listener: () => void): void; | ||
| addListener?(event: 'abort', listener: () => void): void; | ||
| removeListener?(event: 'abort', listener: () => void): void; | ||
| } | ||
| export declare function addAbortListener(signal: AbortSignalLike, listener: () => void): void; | ||
| export declare function removeAbortListener(signal: AbortSignalLike, listener: () => void): void; | ||
| //# sourceMappingURL=utils.d.ts.map |
| {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAI7D,MAAM,MAAM,QAAQ,GAAG,WAAW,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAA;AAK/D,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;IAC/C,GAAG,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;IAChD,gBAAgB,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;IAC7D,mBAAmB,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;IAChE,WAAW,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;IACxD,cAAc,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;CAC5D;AAKD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAQpF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAQvF"} |
+26
| // Registration/removal for AbortSignalLike. The probe orders mirror each | ||
| // other so a listener is always removed through the same style it was added | ||
| // with (EventEmitters alias on/addListener and off/removeListener). | ||
| export function addAbortListener(signal, listener) { | ||
| if (signal.addEventListener) { | ||
| signal.addEventListener('abort', listener); | ||
| } | ||
| else if (signal.on) { | ||
| signal.on('abort', listener); | ||
| } | ||
| else if (signal.addListener) { | ||
| signal.addListener('abort', listener); | ||
| } | ||
| } | ||
| export function removeAbortListener(signal, listener) { | ||
| if (signal.removeEventListener) { | ||
| signal.removeEventListener('abort', listener); | ||
| } | ||
| else if (signal.off) { | ||
| signal.off('abort', listener); | ||
| } | ||
| else if (signal.removeListener) { | ||
| signal.removeListener('abort', listener); | ||
| } | ||
| } | ||
| //# sourceMappingURL=utils.js.map |
| {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAoBA,yEAAyE;AACzE,4EAA4E;AAC5E,oEAAoE;AACpE,MAAM,UAAU,gBAAgB,CAAC,MAAuB,EAAE,QAAoB;IAC5E,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC5B,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IAC5C,CAAC;SAAM,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACrB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IAC9B,CAAC;SAAM,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QAC9B,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IACvC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAuB,EAAE,QAAoB;IAC/E,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAC;QAC/B,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IAC/C,CAAC;SAAM,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IAC/B,CAAC;SAAM,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QACjC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IAC1C,CAAC;AACH,CAAC"} |
+153
-129
@@ -1,139 +0,163 @@ | ||
| import type { Logger } from '@nxtedition/logger' | ||
| import type { Readable } from 'node:stream' | ||
| import type { Dispatcher } from 'undici' | ||
| import type { Priority } from '@nxtedition/scheduler' | ||
| export interface CouchOptions { | ||
| url?: string | ||
| import type { Dispatcher, LoggerLike } from '@nxtedition/nxt-undici'; | ||
| import { type AbortSignalLike, type Priority } from './utils.ts'; | ||
| export type { AbortSignalLike } from './utils.ts'; | ||
| export { request } from './request.ts'; | ||
| export type { CouchResponse, CouchRequestOptions } from './request.ts'; | ||
| export interface CouchConfig { | ||
| url?: string | string[]; | ||
| name?: string; | ||
| userAgent?: string; | ||
| getClient?: (pathname: string) => Dispatcher; | ||
| couchdb?: CouchOptions; | ||
| couch?: CouchOptions; | ||
| config?: CouchConfig; | ||
| } | ||
| export function makeCouch(opts: string | CouchOptions): CouchClient | ||
| export interface CouchRequestOptions<Stream extends boolean = false> { | ||
| id?: string | ||
| url?: URL | ||
| pathname?: string | ||
| path?: string | ||
| headers?: Record<string, string> | ||
| method?: string | ||
| body?: unknown | ||
| headersTimeout?: number | ||
| bodyTimeout?: number | ||
| dispatcher?: Dispatcher | ||
| priority?: Priority | ||
| query?: { | ||
| key?: string | ||
| startkey?: string | ||
| endkey?: string | ||
| update?: boolean | ||
| seq?: string | ||
| } | ||
| blocking?: boolean | ||
| seq?: string | ||
| signal?: AbortSignal | ||
| logger?: Logger | ||
| stream?: Stream | ||
| // TODO add more or extend undicii type? | ||
| export type CouchOptions = string | string[] | CouchConfig; | ||
| export interface CouchCallOptions { | ||
| client?: Dispatcher; | ||
| signal?: AbortSignalLike | null; | ||
| idempotent?: boolean; | ||
| headers?: Record<string, string> | string[] | null; | ||
| } | ||
| export interface CouchResponse<T> { | ||
| rows: T[] | ||
| export interface CouchClientRequestOptions extends CouchCallOptions { | ||
| params?: Record<string, unknown> | null; | ||
| body?: unknown; | ||
| method?: string; | ||
| } | ||
| export function request<T, Stream extends boolean = false>( | ||
| url: string | URL | { origin: string; path?: string; pathname?: string }, | ||
| opts?: CouchRequestOptions<Stream> | null, | ||
| ): Stream extends true ? Readable : Promise<CouchResponse<T>> | ||
| interface ChangesOptions { | ||
| signal?: AbortSignal | null | ||
| descending?: boolean | ||
| include_docs?: boolean | ||
| seq_interval?: number | null | ||
| live?: boolean | ||
| heartbeat?: number | ||
| retry?: ( | ||
| err: unknown, | ||
| retryCount: number, | ||
| params: { | ||
| since?: string | 0 | null | ||
| }, | ||
| ac: { signal: AbortSignal }, | ||
| next: () => void, | ||
| ) => void | null | Promise<void> | ||
| since?: string | 0 | null | ||
| selector?: object | null | ||
| highWaterMark?: number | ||
| priority?: Priority | ||
| export interface CouchRequestResult<T = unknown> { | ||
| data: T; | ||
| status: number; | ||
| headers: Record<string, string | string[]>; | ||
| } | ||
| interface ChangeItem { | ||
| id: string | ||
| seq?: string | ||
| doc?: object | ||
| deleted?: boolean | ||
| changes: Array<{ rev: string }> | ||
| export interface ChangeItem { | ||
| id: string; | ||
| seq?: string | null; | ||
| doc?: Record<string, unknown> | null; | ||
| deleted?: boolean; | ||
| changes: Array<{ | ||
| rev: string; | ||
| }>; | ||
| } | ||
| export interface AllDocsOptions { | ||
| client?: unknown | ||
| signal?: AbortSignal | ||
| idempotent?: boolean | ||
| conflicts?: boolean | ||
| update_seq?: boolean | ||
| descending?: boolean | ||
| include_docs?: boolean | ||
| sorted?: boolean | ||
| key?: string | ||
| keys?: string[] | ||
| startkey?: string | ||
| start_key?: string | ||
| startkey_docid?: string | ||
| endkey?: string | ||
| end_key?: string | ||
| endkey_docid?: string | ||
| inclusive_end?: boolean | ||
| limit?: number | ||
| skip?: number | ||
| stale?: string | ||
| reduce?: boolean | ||
| stable?: boolean | ||
| update?: boolean | ||
| group?: boolean | ||
| group_level?: number | ||
| export type ChangeBatch = ChangeItem[] & { | ||
| lastSeq?: string | 0 | null; | ||
| }; | ||
| export interface ChangesRetryState { | ||
| since: string | 0 | null | undefined; | ||
| time: number; | ||
| count: number; | ||
| } | ||
| // A _all_docs row is either a found row (id/value/doc present) or, in `keys` | ||
| // mode, an error row for a key that does not exist (`{ key, error }`, no doc). | ||
| // With include_docs a deleted doc has `doc: null`. | ||
| export interface AllDocsRow<Doc = Record<string, unknown>> { | ||
| id?: string | ||
| key: string | ||
| value?: { rev: string; deleted?: boolean } | ||
| doc?: Doc | null | ||
| error?: string | ||
| export type ChangesRetryFn = (err: unknown, retryCount: number, state: ChangesRetryState, ctx: { | ||
| signal: AbortSignal; | ||
| logger?: LoggerLike | null; | ||
| }, next: () => boolean | Promise<boolean>) => unknown; | ||
| export interface ChangesOptions { | ||
| client?: Dispatcher; | ||
| signal?: AbortSignalLike | null; | ||
| logger?: LoggerLike | null; | ||
| conflicts?: boolean; | ||
| descending?: boolean; | ||
| include_docs?: boolean; | ||
| seq_interval?: number | null; | ||
| /** Start sequence. Mutated retry state is reported per batch via `lastSeq`. */ | ||
| since?: string | 0 | null; | ||
| until?: string | null; | ||
| style?: string; | ||
| view?: string; | ||
| filter?: string; | ||
| /** Continuous-feed heartbeat interval in milliseconds. Defaults to 60000. */ | ||
| heartbeat?: number; | ||
| timeout?: number; | ||
| limit?: number; | ||
| doc_ids?: string[]; | ||
| selector?: object | null; | ||
| /** Defaults to `true` (continuous feed) when omitted. */ | ||
| live?: boolean; | ||
| retry?: ChangesRetryFn | null; | ||
| highWaterMark?: number; | ||
| priority?: Priority | null; | ||
| } | ||
| export interface AllDocsResponse<Doc = Record<string, unknown>> { | ||
| total_rows?: number | ||
| offset?: number | null | ||
| update_seq?: string | ||
| rows: Array<AllDocsRow<Doc>> | ||
| export interface AllDocsOptions extends Omit<CouchCallOptions, 'headers'> { | ||
| conflicts?: boolean; | ||
| update_seq?: boolean; | ||
| descending?: boolean; | ||
| include_docs?: boolean; | ||
| sorted?: boolean; | ||
| key?: unknown; | ||
| keys?: unknown[]; | ||
| startkey?: unknown; | ||
| start_key?: unknown; | ||
| startkey_docid?: string; | ||
| endkey?: unknown; | ||
| end_key?: unknown; | ||
| endkey_docid?: string; | ||
| inclusive_end?: boolean; | ||
| limit?: number; | ||
| skip?: number; | ||
| stale?: string; | ||
| reduce?: boolean; | ||
| stable?: boolean; | ||
| update?: boolean | string; | ||
| group?: boolean; | ||
| group_level?: number; | ||
| } | ||
| export interface AllDocsRow<Doc = Record<string, unknown>, Value = { | ||
| rev: string; | ||
| deleted?: boolean; | ||
| }> { | ||
| id?: string; | ||
| key: unknown; | ||
| value?: Value; | ||
| doc?: Doc | null; | ||
| error?: string; | ||
| } | ||
| export interface AllDocsResponse<Doc = Record<string, unknown>, Value = { | ||
| rev: string; | ||
| deleted?: boolean; | ||
| }> { | ||
| total_rows?: number; | ||
| offset?: number | null; | ||
| update_seq?: string; | ||
| rows: Array<AllDocsRow<Doc, Value>>; | ||
| } | ||
| export interface BulkDocsResultItem { | ||
| ok?: boolean; | ||
| id: string; | ||
| rev?: string; | ||
| error?: string; | ||
| reason?: string; | ||
| } | ||
| export interface UpsertResult<Doc = Record<string, unknown>> { | ||
| updated: boolean; | ||
| id?: string; | ||
| rev?: string; | ||
| ok?: boolean; | ||
| doc: Doc; | ||
| } | ||
| export interface CouchClient { | ||
| changes: ( | ||
| options?: ChangesOptions & { client?: unknown; logger?: Logger }, | ||
| ) => AsyncGenerator<ChangeItem[] & { lastSeq?: string | 0 | null }, void, unknown> | ||
| allDocs: <Doc = Record<string, unknown>>(options: AllDocsOptions) => Promise<AllDocsResponse<Doc>> | ||
| allDocs: <Doc = Record<string, unknown>>( | ||
| pathname: string, | ||
| options?: AllDocsOptions, | ||
| ) => Promise<AllDocsResponse<Doc>> | ||
| allDocs: <Doc = Record<string, unknown>>( | ||
| pathnameOrOptions?: string | AllDocsOptions, | ||
| options?: AllDocsOptions, | ||
| ) => Promise<AllDocsResponse<Doc>> | ||
| up: (opts?: { client?: unknown; signal?: AbortSignal }) => Promise<unknown> | ||
| close: () => Promise<void> | ||
| url: URL; | ||
| request<T = unknown>(url: string | null, opts: CouchClientRequestOptions): Promise<CouchRequestResult<T>>; | ||
| bulkDocs<T = unknown>(body: { | ||
| docs: T[]; | ||
| new_edits?: boolean; | ||
| }, opts?: CouchCallOptions): Promise<BulkDocsResultItem[]>; | ||
| allDocs<Doc = Record<string, unknown>>(options?: AllDocsOptions): Promise<AllDocsResponse<Doc>>; | ||
| allDocs<Doc = Record<string, unknown>>(pathname: string | null, options?: AllDocsOptions): Promise<AllDocsResponse<Doc>>; | ||
| put<T = unknown>(pathname: string | null, params?: Record<string, unknown> | null, body?: unknown, opts?: CouchCallOptions): Promise<T>; | ||
| post<T = unknown>(pathname: string | null, params?: Record<string, unknown> | null, body?: unknown, opts?: CouchCallOptions): Promise<T>; | ||
| get<T = unknown>(pathname: string | null, params?: Record<string, unknown> | null, body?: unknown, opts?: CouchCallOptions): Promise<T>; | ||
| delete<T = unknown>(pathname: string | null, params?: Record<string, unknown> | null, body?: unknown, opts?: CouchCallOptions): Promise<T>; | ||
| info<T = Record<string, unknown>>(params?: Record<string, unknown> | null, body?: unknown, opts?: CouchCallOptions): Promise<T>; | ||
| upsert<Doc = Record<string, unknown>>(pathname: string, diffFun: (doc: Doc) => Doc | null | undefined | false, opts?: { | ||
| client?: Dispatcher; | ||
| signal?: AbortSignalLike | null; | ||
| }): Promise<UpsertResult<Doc>>; | ||
| changes(options?: ChangesOptions): AsyncGenerator<ChangeBatch, void, unknown>; | ||
| up(opts?: { | ||
| client?: Dispatcher; | ||
| signal?: AbortSignal | null; | ||
| }): Promise<unknown>; | ||
| close(): Promise<void>; | ||
| } | ||
| export declare const CHANGES_RETRYABLE_ERROR_CODES: readonly string[]; | ||
| export declare function makeCouch(opts: CouchOptions): CouchClient; | ||
| //# sourceMappingURL=index.d.ts.map |
+827
-1183
@@ -1,1238 +0,882 @@ | ||
| import assert from 'node:assert' | ||
| import stream from 'node:stream' | ||
| import querystring from 'node:querystring' | ||
| import tp from 'node:timers/promises' | ||
| import createError from 'http-errors' | ||
| import urljoin from 'url-join' | ||
| import urlJoin from 'url-join' | ||
| import { dispatch, Agent, Pool, request as undiciRequest } from '@nxtedition/nxt-undici' | ||
| import { makeWeakCache } from '@nxtedition/weak-cache' | ||
| import { AbortError } from '@nxtedition/error' | ||
| /** | ||
| * @typedef {import('@nxtedition/scheduler').Priority} Priority | ||
| */ | ||
| import assert from 'node:assert'; | ||
| import querystring from 'node:querystring'; | ||
| import tp from 'node:timers/promises'; | ||
| import createError from 'http-errors'; | ||
| import urlJoin from 'url-join'; | ||
| import { dispatch, Pool, request as undiciRequest } from '@nxtedition/nxt-undici'; | ||
| import { makeWeakCache } from '@nxtedition/weak-cache'; | ||
| import { AbortError } from '@nxtedition/error'; | ||
| import { addAbortListener, removeAbortListener, } from "./utils.js"; | ||
| export { request } from "./request.js"; | ||
| // Transport-level error codes the default changes() retry treats as | ||
| // reconnectable. Exported so custom retry callbacks can reuse the list. | ||
| export const CHANGES_RETRYABLE_ERROR_CODES = Object.freeze([ | ||
| 'ECONNRESET', | ||
| 'ECONNREFUSED', | ||
| 'ENOTFOUND', | ||
| 'ENETDOWN', | ||
| 'ENETUNREACH', | ||
| 'EHOSTDOWN', | ||
| 'EHOSTUNREACH', | ||
| 'EPIPE', | ||
| 'EAI_AGAIN', | ||
| 'ENODATA', | ||
| 'UND_ERR_CONNECT_TIMEOUT', | ||
| 'UND_ERR_SOCKET', | ||
| // The whole point of bodyTimeout = 2 * heartbeat (and the fixed 2-minute | ||
| // headersTimeout) is to detect a silently dead connection (no FIN/RST); | ||
| // reconnecting from params.since is the loop's normal recovery path, and the | ||
| // 2-minute give-up still bounds persistent failure. | ||
| 'UND_ERR_BODY_TIMEOUT', | ||
| 'UND_ERR_HEADERS_TIMEOUT', | ||
| ]); | ||
| export function makeCouch(opts) { | ||
| let config | ||
| if (typeof opts === 'string') { | ||
| config = opts | ||
| } else if (Array.isArray(opts)) { | ||
| config = opts | ||
| } else if (opts?.url) { | ||
| config = opts | ||
| } else if (opts?.couchdb || opts?.couch) { | ||
| config = opts.couchdb || opts.couch | ||
| } else if (opts?.config) { | ||
| config = opts.config.couchdb || opts.config.couch || opts.config | ||
| } else { | ||
| throw new Error('invalid options') | ||
| } | ||
| if (typeof config === 'string') { | ||
| config = { url: config } | ||
| } | ||
| if (!config.url && config.name) { | ||
| config = { ...config, url: config.name } | ||
| } | ||
| const { origin: dbOrigin, pathname: dbPathname } = new URL( | ||
| Array.isArray(config.url) ? config.url[0] : config.url, | ||
| ) | ||
| const defaultClientOpts = { | ||
| connectTimeout: 2e3, | ||
| } | ||
| const userAgent = config.userAgent || globalThis.userAgent | ||
| const defaultClient = new Pool(dbOrigin, defaultClientOpts) | ||
| const getClient = | ||
| config.getClient ?? | ||
| makeWeakCache( | ||
| () => | ||
| new Pool(dbOrigin, { | ||
| ...defaultClientOpts, | ||
| connections: 4, // TODO (fix): Global limit? | ||
| pipelining: 2, | ||
| }), | ||
| ) | ||
| function makeError(req, res) { | ||
| let path | ||
| if (req.path) { | ||
| path = req.path | ||
| } else { | ||
| path = dbPathname | ||
| if (req.pathname) { | ||
| path = urljoin(path, req.pathname) | ||
| } | ||
| if (req.params) { | ||
| path += `?${querystring.stringify(req.params)}` | ||
| } | ||
| let config; | ||
| if (typeof opts === 'string' || Array.isArray(opts)) { | ||
| config = opts; | ||
| } | ||
| let reason | ||
| let error | ||
| try { | ||
| const json = typeof res.data === 'string' ? JSON.parse(res.data) : res.data | ||
| reason = json.reason | ||
| error = json.error | ||
| } catch { | ||
| // Do nothing... | ||
| else if (opts?.url) { | ||
| config = opts; | ||
| } | ||
| return createError(res.status, { | ||
| reason, | ||
| error, | ||
| data: { | ||
| req: { | ||
| origin: dbOrigin, | ||
| path, | ||
| method: req.method, | ||
| headers: req.headers, | ||
| body: req.body ? JSON.stringify(req.body).slice(0, 4096) : null, | ||
| }, | ||
| res: { | ||
| status: res.status, | ||
| headers: res.headers, | ||
| body: res.data, | ||
| }, | ||
| }, | ||
| }) | ||
| } | ||
| /** | ||
| * @param {Object} [options={}] | ||
| * @param {AbortSignal} [options.signal] | ||
| * @param {boolean} [options.descending=false] | ||
| * @param {boolean} [options.include_docs=false] | ||
| * @param {number} [options.seq_interval=null] | ||
| * @param {boolean} [options.live=false] | ||
| * @param {number} [options.heartbeat=60000] | ||
| * @param {function} [options.retry=null] | ||
| * @param {0|string|null} [options.since=null] | ||
| * @param {object} [options.selector=null] | ||
| * @param {number} [options.highWaterMark=128 * 1024] | ||
| * @param {Priority} [options.priority=null] | ||
| * @param {import('pino').Logger} [options.logger=null] | ||
| * @return {AsyncGenerator<Array<{ id: string, seq?: string, doc?: Object, deleted?: boolean, changes: Array<{ rev: string }>}> & { lastSeq: string | null | 0 }} | ||
| */ | ||
| async function* changes({ client = defaultClient, signal, logger, ...options } = {}) { | ||
| const params = {} | ||
| let body | ||
| let method = 'GET' | ||
| if (options.conflicts) { | ||
| params.conflicts = true | ||
| else if (opts?.couchdb || opts?.couch) { | ||
| config = (opts.couchdb || opts.couch); | ||
| } | ||
| if (options.descending) { | ||
| params.descending = true | ||
| else if (opts?.config) { | ||
| config = opts.config.couchdb || opts.config.couch || opts.config; | ||
| } | ||
| if (options.include_docs) { | ||
| params.include_docs = true | ||
| else { | ||
| throw new Error('invalid options'); | ||
| } | ||
| if (options.seq_interval != null) { | ||
| params.seq_interval = options.seq_interval | ||
| if (typeof config === 'string' || Array.isArray(config)) { | ||
| config = { url: config }; | ||
| } | ||
| if (options.since != null) { | ||
| params.since = options.since | ||
| if (!config.url && config.name) { | ||
| config = { ...config, url: config.name }; | ||
| } | ||
| if (options.until != null) { | ||
| params.until = options.until | ||
| // Validate before constructing: an empty url array (or empty string) would | ||
| // otherwise surface as a low-signal 'Invalid URL' TypeError. | ||
| const dbUrl = Array.isArray(config.url) ? config.url[0] : config.url; | ||
| if (!dbUrl) { | ||
| throw new Error('invalid options'); | ||
| } | ||
| if (options.style != null) { | ||
| params.style = options.style | ||
| const { origin: dbOrigin, pathname: dbPathname } = new URL(dbUrl); | ||
| const defaultClientOpts = { | ||
| connectTimeout: 2e3, | ||
| }; | ||
| const userAgent = config.userAgent || globalThis.userAgent; | ||
| const defaultClient = new Pool(dbOrigin, defaultClientOpts); | ||
| const getClient = config.getClient ?? | ||
| makeWeakCache((_pathname) => new Pool(dbOrigin, { | ||
| ...defaultClientOpts, | ||
| connections: 4, // TODO (fix): Global limit? | ||
| pipelining: 2, | ||
| })); | ||
| function makeError(req, res) { | ||
| let path; | ||
| if (req.path) { | ||
| path = req.path; | ||
| } | ||
| else { | ||
| path = dbPathname; | ||
| if (req.pathname) { | ||
| path = urlJoin(path, req.pathname); | ||
| } | ||
| if (req.params) { | ||
| path += `?${querystring.stringify(req.params)}`; | ||
| } | ||
| } | ||
| let reason; | ||
| let error; | ||
| try { | ||
| const json = (typeof res.data === 'string' ? JSON.parse(res.data) : res.data); | ||
| reason = json.reason; | ||
| error = json.error; | ||
| } | ||
| catch { | ||
| // Do nothing... | ||
| } | ||
| return createError(res.status, { | ||
| reason, | ||
| error, | ||
| data: { | ||
| req: { | ||
| origin: dbOrigin, | ||
| path, | ||
| method: req.method, | ||
| headers: req.headers, | ||
| // req.body is usually already a serialized JSON string; stringifying | ||
| // again would quote/escape it and make log payloads harder to read. | ||
| body: req.body != null | ||
| ? (typeof req.body === 'string' ? req.body : JSON.stringify(req.body)).slice(0, 4096) | ||
| : null, | ||
| }, | ||
| res: { | ||
| status: res.status, | ||
| headers: res.headers, | ||
| body: res.data, | ||
| }, | ||
| }, | ||
| }); | ||
| } | ||
| if (options.view != null) { | ||
| params.view = options.view | ||
| } | ||
| if (options.filter != null) { | ||
| params.filter = options.filter | ||
| } | ||
| if (options.heartbeat != null) { | ||
| params.heartbeat = Number(options.heartbeat) | ||
| } else { | ||
| params.heartbeat = 60e3 | ||
| } | ||
| if (options.timeout != null) { | ||
| params.timeout = options.timeout | ||
| } | ||
| if (options.limit != null) { | ||
| params.limit = options.limit | ||
| } | ||
| if (options.doc_ids != null) { | ||
| method = 'POST' | ||
| body = { ...body, doc_ids: options.doc_ids } | ||
| params.filter = '_doc_ids' | ||
| } | ||
| if (options.selector != null) { | ||
| method = 'POST' | ||
| body = { ...body, selector: options.selector } | ||
| params.filter = '_selector' | ||
| } | ||
| if (dbPathname === '/') { | ||
| throw new Error('invalid pathname') | ||
| } | ||
| const ac = new AbortController() | ||
| const onAbort = () => { | ||
| ac.abort() | ||
| } | ||
| if (signal) { | ||
| if (signal.aborted) { | ||
| throw signal.reason ?? new AbortError() | ||
| } | ||
| if (signal.on) { | ||
| signal.on('abort', onAbort) | ||
| } else if (signal.addEventListener) { | ||
| signal.addEventListener('abort', onAbort) | ||
| } | ||
| } | ||
| const highWaterMark = options.highWaterMark || 128 * 1024 | ||
| const live = options.live == null || !!options.live | ||
| const retry = | ||
| options.retry ?? | ||
| (async (err, retryCount, params, { signal, logger }, next) => { | ||
| logger?.error({ err, retryCount, params }, 'changes error') | ||
| return next() | ||
| }) | ||
| const priority = options.priority ?? null | ||
| try { | ||
| yield* _changes({ | ||
| method, | ||
| live, | ||
| retry, | ||
| highWaterMark, | ||
| params, | ||
| body, | ||
| signal: ac.signal, | ||
| client, | ||
| logger, | ||
| priority, | ||
| }) | ||
| } finally { | ||
| ac.abort() | ||
| if (signal) { | ||
| if (signal.off) { | ||
| signal.off('abort', onAbort) | ||
| } else if (signal.removeEventListener) { | ||
| signal.removeEventListener('abort', onAbort) | ||
| async function* changes({ client = defaultClient, signal, logger, ...options } = {}) { | ||
| const params = {}; | ||
| let body; | ||
| let method = 'GET'; | ||
| if (options.conflicts) { | ||
| params.conflicts = true; | ||
| } | ||
| } | ||
| if (options.descending) { | ||
| params.descending = true; | ||
| } | ||
| if (options.include_docs) { | ||
| params.include_docs = true; | ||
| } | ||
| if (options.seq_interval != null) { | ||
| params.seq_interval = options.seq_interval; | ||
| } | ||
| if (options.since != null) { | ||
| params.since = options.since; | ||
| } | ||
| if (options.until != null) { | ||
| params.until = options.until; | ||
| } | ||
| if (options.style != null) { | ||
| params.style = options.style; | ||
| } | ||
| if (options.view != null) { | ||
| params.view = options.view; | ||
| } | ||
| if (options.filter != null) { | ||
| params.filter = options.filter; | ||
| } | ||
| // CouchDB only applies the `view` param when filter=_view is set; without | ||
| // it the feed is silently unfiltered. | ||
| if (params.view != null) { | ||
| params.filter ??= '_view'; | ||
| } | ||
| if (options.heartbeat != null) { | ||
| params.heartbeat = Number(options.heartbeat); | ||
| } | ||
| else { | ||
| params.heartbeat = 60e3; | ||
| } | ||
| if (options.timeout != null) { | ||
| params.timeout = options.timeout; | ||
| } | ||
| if (options.limit != null) { | ||
| params.limit = options.limit; | ||
| } | ||
| if (options.doc_ids != null) { | ||
| method = 'POST'; | ||
| body = { ...body, doc_ids: options.doc_ids }; | ||
| params.filter = '_doc_ids'; | ||
| } | ||
| if (options.selector != null) { | ||
| method = 'POST'; | ||
| body = { ...body, selector: options.selector }; | ||
| params.filter = '_selector'; | ||
| } | ||
| if (dbPathname === '/') { | ||
| throw new Error('invalid pathname'); | ||
| } | ||
| const ac = new AbortController(); | ||
| const onAbort = () => { | ||
| // Forward the caller's abort reason so downstream rejections match it | ||
| // (undefined falls back to the default AbortError). | ||
| ac.abort(signal?.reason); | ||
| }; | ||
| if (signal) { | ||
| if (signal.aborted) { | ||
| throw signal.reason ?? new AbortError(); | ||
| } | ||
| addAbortListener(signal, onAbort); | ||
| } | ||
| const highWaterMark = options.highWaterMark || 128 * 1024; | ||
| const live = options.live == null || !!options.live; | ||
| const retry = options.retry ?? | ||
| (async (err, retryCount, params, { logger }, next) => { | ||
| logger?.error({ err, retryCount, params }, 'changes error'); | ||
| return next(); | ||
| }); | ||
| const priority = options.priority ?? null; | ||
| try { | ||
| yield* _changes({ | ||
| method, | ||
| live, | ||
| retry, | ||
| highWaterMark, | ||
| params, | ||
| body, | ||
| signal: ac.signal, | ||
| client, | ||
| logger, | ||
| priority, | ||
| }); | ||
| } | ||
| finally { | ||
| ac.abort(); | ||
| if (signal) { | ||
| removeAbortListener(signal, onAbort); | ||
| } | ||
| } | ||
| } | ||
| } | ||
| async function* _changes({ | ||
| live, | ||
| retry, | ||
| params, | ||
| method, | ||
| body, | ||
| signal, | ||
| client, | ||
| logger, | ||
| highWaterMark = 128 * 1024, | ||
| blocking = live || !params.limit || params.limit > 256, | ||
| priority, | ||
| }) { | ||
| const startSeq = params.since || null | ||
| // NOTE: Pass the URL as the first argument and the dispatcher in the options | ||
| // object so nxt-undici uses the configured `client` instead of the ambient | ||
| // global dispatcher (which may be Node's built-in undici, whose handler | ||
| // interface is incompatible). See `up()` for the same pattern. | ||
| const { update_seq: updateSeq } = await undiciRequest(new URL(dbPathname, dbOrigin), { | ||
| signal, | ||
| dispatcher: client, | ||
| }).then((res) => res.body.json()) | ||
| let retryCount = 0 | ||
| let retryTime = 0 | ||
| while (true) { | ||
| let src | ||
| try { | ||
| const query = { ...params, feed: live ? 'continuous' : 'normal' } | ||
| // NOTE: URL as the first argument, everything else (including the | ||
| // dispatcher) in the options object — see the update_seq probe above. | ||
| const ures = await undiciRequest(new URL(urlJoin(dbPathname, '/_changes'), dbOrigin), { | ||
| query, | ||
| headers: body | ||
| ? { | ||
| 'content-type': 'application/json', | ||
| } | ||
| : null, | ||
| blocking, | ||
| method, | ||
| body: JSON.stringify(body), | ||
| retry: false, | ||
| idempotent: false, | ||
| signal, | ||
| headersTimeout: 2 * 60e3, | ||
| bodyTimeout: 2 * (params.heartbeat || 60e3), | ||
| highWaterMark, | ||
| dispatcher: client, | ||
| logger, | ||
| priority, | ||
| }) | ||
| retryCount = 0 | ||
| retryTime = 0 | ||
| src = ures.body | ||
| const changes = [] | ||
| let resume = null | ||
| let error = null | ||
| let ended = false | ||
| let state = 0 | ||
| let since = params.since || null | ||
| function maybeResume() { | ||
| if (resume) { | ||
| resume() | ||
| resume = null | ||
| } | ||
| } | ||
| src | ||
| .on('readable', maybeResume) | ||
| .on('error', (err) => { | ||
| error = err | ||
| maybeResume() | ||
| }) | ||
| .on('end', () => { | ||
| ended = true | ||
| maybeResume() | ||
| }) | ||
| .on('close', maybeResume) | ||
| const decoder = new TextDecoder('utf-8') | ||
| let str = '' | ||
| async function* _changes({ live, retry, params, method, body, signal, client, logger, highWaterMark = 128 * 1024, blocking = live || !params.limit || params.limit > 256, priority, }) { | ||
| const startSeq = params.since || null; | ||
| // Fetched lazily inside the retry loop (undefined = not yet fetched, | ||
| // null = fetched but absent) so a failing probe at feed start goes | ||
| // through the same retry contract as the _changes request itself. | ||
| let updateSeq; | ||
| let retryCount = 0; | ||
| let retryTime = 0; | ||
| while (true) { | ||
| const chunk = src.read() | ||
| let text = null | ||
| if (chunk != null) { | ||
| text = decoder.decode(chunk, { stream: true }) | ||
| } else if (ended) { | ||
| text = decoder.decode() || null | ||
| } | ||
| if (text != null) { | ||
| const lines = (str + text).split(/\r?\n/) | ||
| str = lines.pop() ?? '' | ||
| for (const line of lines) { | ||
| if (line === '') { | ||
| // Do nothing. Empty lines due to e.g. heartbeat. | ||
| } else if (line === ',') { | ||
| // Do nothing. Couch sometimes insert new line between json body and comma. | ||
| } else if (live) { | ||
| const data = JSON.parse(line) | ||
| if (data.last_seq) { | ||
| since = data.last_seq | ||
| } else { | ||
| since = data.seq || since | ||
| changes.push(data) | ||
| let src; | ||
| try { | ||
| if (updateSeq === undefined) { | ||
| // NOTE: Pass the URL as the first argument and the dispatcher in the | ||
| // options object so nxt-undici uses the configured `client` instead | ||
| // of the ambient global dispatcher (which may be Node's built-in | ||
| // undici, whose handler interface is incompatible). retry: false so | ||
| // error classification is owned by this loop's catch, like _changes. | ||
| const info = (await undiciRequest(new URL(dbPathname, dbOrigin), { | ||
| signal, | ||
| dispatcher: client, | ||
| retry: false, | ||
| }).then((res) => res.body.json())); | ||
| updateSeq = info.update_seq ?? null; | ||
| } | ||
| } else { | ||
| // NOTE: This makes some assumptions about the format of the JSON. | ||
| if (state === 0) { | ||
| if (line.endsWith('[')) { | ||
| state = 1 | ||
| } else { | ||
| assert(false, 'invalid head: ' + line) | ||
| } | ||
| } else if (state === 1) { | ||
| if (line.startsWith(']')) { | ||
| state = 2 | ||
| } else { | ||
| const idx = line.lastIndexOf('}') + 1 | ||
| const query = { ...params, feed: live ? 'continuous' : 'normal' }; | ||
| // NOTE: URL as the first argument, everything else (including the | ||
| // dispatcher) in the options object — see the update_seq probe above. | ||
| const ures = await undiciRequest(new URL(urlJoin(dbPathname, '/_changes'), dbOrigin), { | ||
| query, | ||
| headers: body | ||
| ? { | ||
| 'content-type': 'application/json', | ||
| } | ||
| : null, | ||
| blocking, | ||
| method, | ||
| body: JSON.stringify(body), | ||
| retry: false, | ||
| idempotent: false, | ||
| signal, | ||
| headersTimeout: 2 * 60e3, | ||
| bodyTimeout: 2 * (params.heartbeat || 60e3), | ||
| highWaterMark, | ||
| dispatcher: client, | ||
| logger, | ||
| priority, | ||
| }); | ||
| retryCount = 0; | ||
| retryTime = 0; | ||
| src = ures.body; | ||
| const changes = []; | ||
| let resume = null; | ||
| let error = null; | ||
| let ended = false; | ||
| let state = 0; | ||
| let since = params.since || null; | ||
| function maybeResume() { | ||
| if (resume) { | ||
| resume(); | ||
| resume = null; | ||
| } | ||
| } | ||
| src | ||
| .on('readable', maybeResume) | ||
| .on('error', (err) => { | ||
| error = err; | ||
| maybeResume(); | ||
| }) | ||
| .on('end', () => { | ||
| ended = true; | ||
| maybeResume(); | ||
| }) | ||
| .on('close', maybeResume); | ||
| const decoder = new TextDecoder('utf-8'); | ||
| let str = ''; | ||
| while (true) { | ||
| const chunk = src.read(); | ||
| let text = null; | ||
| if (chunk != null) { | ||
| text = decoder.decode(chunk, { stream: true }); | ||
| } | ||
| else if (ended) { | ||
| text = decoder.decode() || null; | ||
| } | ||
| if (text != null) { | ||
| const lines = (str + text).split(/\r?\n/); | ||
| str = lines.pop() ?? ''; | ||
| for (const line of lines) { | ||
| if (line === '') { | ||
| // Do nothing. Empty lines due to e.g. heartbeat. | ||
| } | ||
| else if (line === ',') { | ||
| // Do nothing. Couch sometimes insert new line between json body and comma. | ||
| } | ||
| else if (live) { | ||
| const data = JSON.parse(line); | ||
| if (data.last_seq) { | ||
| since = data.last_seq; | ||
| } | ||
| else { | ||
| since = data.seq || since; | ||
| changes.push(data); | ||
| } | ||
| } | ||
| else { | ||
| // NOTE: This makes some assumptions about the format of the JSON. | ||
| if (state === 0) { | ||
| if (line.endsWith('[')) { | ||
| state = 1; | ||
| } | ||
| else { | ||
| assert(false, 'invalid head: ' + line); | ||
| } | ||
| } | ||
| else if (state === 1) { | ||
| if (line.startsWith(']')) { | ||
| state = 2; | ||
| } | ||
| else { | ||
| const idx = line.lastIndexOf('}') + 1; | ||
| try { | ||
| assert(idx > 0, 'invalid row: ' + idx + ' ' + line); | ||
| const change = JSON.parse(line.slice(0, idx)); | ||
| since = change.seq || since; | ||
| changes.push(change); | ||
| } | ||
| catch (err) { | ||
| throw Object.assign(err, { data: line }); | ||
| } | ||
| } | ||
| } | ||
| else if (state === 2) { | ||
| state = 3; | ||
| since = JSON.parse('{' + line).last_seq; | ||
| assert(since, 'invalid trailer: ' + line); | ||
| } | ||
| } | ||
| } | ||
| } | ||
| else if (changes.length) { | ||
| const ret = changes.splice(0); | ||
| ret.lastSeq = params.since = since; | ||
| yield ret; | ||
| // Shrink the remaining cap so a reconnect only ever asks for the | ||
| // remainder — re-sending the original limit after a mid-feed retry | ||
| // would deliver more rows than the caller requested. | ||
| if (params.limit != null) { | ||
| params.limit -= ret.length; | ||
| if (params.limit <= 0) { | ||
| return; | ||
| } | ||
| } | ||
| } | ||
| else if (error) { | ||
| // Cast: `error` is assigned from a stream callback, so the linter | ||
| // cannot narrow Error | null through the truthiness guard above. | ||
| throw error; | ||
| } | ||
| else if (!ended) { | ||
| await new Promise((resolve) => { | ||
| resume = resolve; | ||
| }); | ||
| } | ||
| else { | ||
| if (since === startSeq && params.limit == null) { | ||
| since = params.until || updateSeq || null; | ||
| } | ||
| const ret = changes.splice(0); | ||
| ret.lastSeq = params.since = since; | ||
| yield ret; | ||
| return; | ||
| } | ||
| } | ||
| } | ||
| catch (err) { | ||
| // signal.aborted covers caller-provided abort reasons whose name is | ||
| // not 'AbortError' — those must terminate the feed, not enter retry. | ||
| if (signal.aborted || err?.name === 'AbortError' || !retry) { | ||
| throw err; | ||
| } | ||
| else { | ||
| logger?.error({ err }, 'changes error'); | ||
| retryTime ||= Date.now(); | ||
| const retryState = { since: params.since, time: retryTime, count: retryCount }; | ||
| try { | ||
| assert(idx > 0, 'invalid row: ' + idx + ' ' + line) | ||
| const change = JSON.parse(line.slice(0, idx)) | ||
| since = change.seq || since | ||
| changes.push(change) | ||
| } catch (err) { | ||
| throw Object.assign(err, { data: line }) | ||
| await retry(err, retryCount++, retryState, { signal, logger }, () => { | ||
| const { statusCode, code, message, headers, res } = err; | ||
| if (retryTime && Date.now() - retryTime > 2 * 60e3) { | ||
| throw err; | ||
| } | ||
| if (statusCode != null && [420, 429, 502, 503, 504].includes(statusCode)) { | ||
| // nxt-undici decorates response errors with the headers on | ||
| // err.res.headers, not err.headers. | ||
| const retryAfterRaw = headers?.['retry-after'] ?? res?.headers?.['retry-after']; | ||
| const retryAfter = retryAfterRaw ? Number(retryAfterRaw) * 1e3 : null; | ||
| // Clamp the server-controlled delay (same bound as nxt-undici's | ||
| // response-retry): a hostile/huge value would overflow the | ||
| // 32-bit timer and fire after ~1ms — a hot reconnect loop — and | ||
| // even a valid large value must not exceed the 2-minute give-up. | ||
| const delay = retryAfter != null && Number.isFinite(retryAfter) | ||
| ? Math.min(retryAfter, 60e3) | ||
| : Math.min(10e3, retryCount * 1e3); | ||
| return tp.setTimeout(delay, true, { signal }); | ||
| } | ||
| if (code != null && CHANGES_RETRYABLE_ERROR_CODES.includes(code)) { | ||
| return tp.setTimeout(Math.min(10e3, retryCount * 1e3), true, { | ||
| signal, | ||
| }); | ||
| } | ||
| if (message != null && ['other side closed'].includes(message)) { | ||
| return tp.setTimeout(Math.min(10e3, retryCount * 1e3), true, { | ||
| signal, | ||
| }); | ||
| } | ||
| throw err; | ||
| }); | ||
| } | ||
| } | ||
| } else if (state === 2) { | ||
| state = 3 | ||
| since = JSON.parse('{' + line).last_seq | ||
| assert(since, 'invalid trailer: ' + line) | ||
| catch (retryErr) { | ||
| // Aborting during the retry sleep rejects tp.setTimeout with a | ||
| // generic AbortError; surface the caller's abort reason instead, | ||
| // matching the in-flight abort path above. | ||
| if (signal.aborted) { | ||
| throw signal.reason ?? retryErr; | ||
| } | ||
| throw retryErr; | ||
| } | ||
| params.since = retryState.since ?? 0; | ||
| } | ||
| } | ||
| } | ||
| } else if (changes.length) { | ||
| const ret = changes.splice(0) | ||
| ret.lastSeq = params.since = since | ||
| yield ret | ||
| } else if (error) { | ||
| throw error | ||
| } else if (!ended) { | ||
| await new Promise((resolve) => { | ||
| resume = resolve | ||
| }) | ||
| } else { | ||
| if (since === startSeq && params.limit == null) { | ||
| since = params.until || updateSeq | ||
| finally { | ||
| src?.on('error', () => { }).destroy(); | ||
| } | ||
| const ret = changes.splice(0) | ||
| ret.lastSeq = params.since = since | ||
| yield ret | ||
| return | ||
| } | ||
| } | ||
| } catch (err) { | ||
| if (err.name === 'AbortError' || !retry) { | ||
| throw err | ||
| } else { | ||
| logger?.error({ err }, 'changes error') | ||
| retryTime ||= Date.now() | ||
| const retryState = { since: params.since, time: retryTime, count: retryCount } | ||
| await retry(err, retryCount++, retryState, { signal, logger }, () => { | ||
| const { statusCode, code, message, headers } = err | ||
| if (retryTime && Date.now() - retryTime > 2 * 60e3) { | ||
| throw err | ||
| } | ||
| const ACCEPT_HEADERS = ['Accept', 'application/json']; | ||
| const ACCEPT_CONTENT_TYPE_HEADERS = [...ACCEPT_HEADERS, 'Content-Type', 'application/json']; | ||
| function request(url, { params, client = defaultClient, idempotent, body, method, headers, signal, }) { | ||
| let headerList; | ||
| if (Array.isArray(headers)) { | ||
| headerList = headers; | ||
| } | ||
| else if (headers) { | ||
| headerList = []; | ||
| for (const [key, val] of Object.entries(headers)) { | ||
| headerList.push(key, val); | ||
| } | ||
| if (statusCode && [420, 429, 502, 503, 504].includes(statusCode)) { | ||
| const retryAfter = headers?.['retry-after'] | ||
| ? Number(headers['retry-after']) * 1e3 | ||
| : null | ||
| const delay = | ||
| retryAfter != null && Number.isFinite(retryAfter) | ||
| ? retryAfter | ||
| : Math.min(10e3, retryCount * 1e3) | ||
| return tp.setTimeout(delay, true, { signal }) | ||
| } | ||
| if ( | ||
| [ | ||
| 'ECONNRESET', | ||
| 'ECONNREFUSED', | ||
| 'ENOTFOUND', | ||
| 'ENETDOWN', | ||
| 'ENETUNREACH', | ||
| 'EHOSTDOWN', | ||
| 'EHOSTUNREACH', | ||
| 'EPIPE', | ||
| 'EAI_AGAIN', | ||
| 'ENODATA', | ||
| 'UND_ERR_CONNECT_TIMEOUT', | ||
| 'UND_ERR_SOCKET', | ||
| ].includes(code) | ||
| ) { | ||
| return tp.setTimeout(Math.min(10e3, retryCount * 1e3), true, { | ||
| } | ||
| else { | ||
| // Copy the shared default array: the user-agent append below mutates | ||
| // `headerList` in place, which must not leak into the module-level constant. | ||
| headerList = [...(body != null ? ACCEPT_CONTENT_TYPE_HEADERS : ACCEPT_HEADERS)]; | ||
| } | ||
| if (userAgent && | ||
| !headerList.some((element, index) => index % 2 === 0 && /user-agent/i.test(element))) { | ||
| headerList.push('user-agent', userAgent); | ||
| } | ||
| let path = dbPathname; | ||
| if (url) { | ||
| path = urlJoin(path, url | ||
| .split('/') | ||
| .map((part) => encodeURIComponent(part)) | ||
| .join('/')); | ||
| } | ||
| if (params) { | ||
| path += `?${querystring.stringify(params)}`; | ||
| } | ||
| const req = { | ||
| path, | ||
| origin: dbOrigin, | ||
| idempotent, | ||
| method, | ||
| body: body != null && | ||
| typeof body === 'object' && | ||
| !Buffer.isBuffer(body) && | ||
| !ArrayBuffer.isView(body) && | ||
| !(body instanceof ArrayBuffer) && | ||
| typeof body.pipe !== 'function' | ||
| ? JSON.stringify(body) | ||
| : body, | ||
| headers: headerList, | ||
| }; | ||
| return new Promise((resolve, reject) => { | ||
| const handler = { | ||
| resolve, | ||
| reject, | ||
| signal, | ||
| }) | ||
| } | ||
| if (['other side closed'].includes(message)) { | ||
| return tp.setTimeout(Math.min(10e3, retryCount * 1e3), true, { | ||
| signal, | ||
| }) | ||
| } | ||
| throw err | ||
| }) | ||
| params.since = retryState.since ?? 0 | ||
| status: null, | ||
| headers: null, | ||
| abort: null, | ||
| data: '', | ||
| decoder: new TextDecoder(), | ||
| onConnect(abort) { | ||
| const signal = this.signal; | ||
| if (!signal) { | ||
| return; | ||
| } | ||
| if (signal.aborted) { | ||
| abort(signal.reason ?? new AbortError()); | ||
| return; | ||
| } | ||
| // Wrap the undici abort callback: registering it directly as an | ||
| // EventTarget listener would invoke it with the 'abort' Event object, | ||
| // which then propagates as the rejection "error". | ||
| const onAbort = () => { | ||
| abort(signal.reason ?? new AbortError()); | ||
| }; | ||
| this.abort = onAbort; | ||
| addAbortListener(signal, onAbort); | ||
| }, | ||
| onHeaders(statusCode, headers) { | ||
| this.status = statusCode; | ||
| this.headers = headers; | ||
| }, | ||
| onData(chunk) { | ||
| this.data += this.decoder.decode(chunk, { stream: true }); | ||
| }, | ||
| onComplete() { | ||
| if (this.signal && this.abort) { | ||
| removeAbortListener(this.signal, this.abort); | ||
| } | ||
| this.data += this.decoder.decode(); | ||
| const status = this.status ?? 0; | ||
| const resHeaders = this.headers ?? {}; | ||
| // Match the media type only, ignoring any parameters such as | ||
| // `charset` (e.g. `application/json; charset=utf-8`). The JSON.parse | ||
| // below is not guarded, so we must not broaden this to subtypes like | ||
| // `application/json-seq`. | ||
| const rawContentType = resHeaders['content-type']; | ||
| const contentType = (typeof rawContentType === 'string' ? rawContentType : '') | ||
| .split(';', 1)[0] | ||
| .trim() | ||
| .toLowerCase(); | ||
| // Check the status *before* parsing. An error response can carry a | ||
| // body that is not valid JSON despite an `application/json` | ||
| // content-type (e.g. a truncated body or an HTML error page injected | ||
| // by a reverse proxy on a 5xx). Parsing first would throw a raw | ||
| // SyntaxError and the caller would never receive the intended HTTP | ||
| // error (with `status`/`data`) that `makeError` builds from the raw | ||
| // body. | ||
| if (status < 200 || status >= 300) { | ||
| this.reject(makeError(req, { | ||
| status, | ||
| headers: resHeaders, | ||
| data: this.data, | ||
| })); | ||
| return; | ||
| } | ||
| let data = this.data; | ||
| if (contentType === 'application/json') { | ||
| try { | ||
| data = JSON.parse(this.data); | ||
| } | ||
| catch (err) { | ||
| // Reject instead of throwing out of onComplete — nxt-undici | ||
| // treats the dispatch as settled at this point, so an exception | ||
| // here would leave the promise pending forever. | ||
| this.reject(Object.assign(new Error('invalid json'), { data: this.data, cause: err })); | ||
| return; | ||
| } | ||
| } | ||
| this.resolve({ | ||
| data: data, | ||
| status, | ||
| headers: resHeaders, | ||
| }); | ||
| }, | ||
| onError(err) { | ||
| if (this.signal && this.abort) { | ||
| removeAbortListener(this.signal, this.abort); | ||
| } | ||
| this.reject(err); | ||
| }, | ||
| }; | ||
| void dispatch(client, req, handler); | ||
| }); | ||
| } | ||
| async function bulkDocs(body, opts = {}) { | ||
| const { client = getClient('_bulk_docs'), signal, idempotent = true } = opts; | ||
| const req = { | ||
| pathname: '_bulk_docs', | ||
| client, | ||
| idempotent, | ||
| body, | ||
| method: 'POST', | ||
| signal, | ||
| }; | ||
| const res = await request(req.pathname, req); | ||
| // 202 Accepted is a successful write on a degraded cluster (quorum not | ||
| // met, but the docs were durably committed to the reachable nodes). | ||
| if (res.status !== 201 && res.status !== 202) { | ||
| throw makeError(req, res); | ||
| } | ||
| } finally { | ||
| src?.on('error', () => {}).destroy() | ||
| } | ||
| return res.data; | ||
| } | ||
| } | ||
| const ACCEPT_HEADERS = ['Accept', 'application/json'] | ||
| const ACCEPT_CONTENT_TYPE_HEADERS = [...ACCEPT_HEADERS, 'Content-Type', 'application/json'] | ||
| function request( | ||
| url, | ||
| { params, client = defaultClient, idempotent, body, method, headers, signal }, | ||
| ) { | ||
| if (Array.isArray(headers)) { | ||
| // Do nothing... | ||
| } else if (headers) { | ||
| const entries = Object.entries(headers) | ||
| headers = [] | ||
| for (const [key, val] of entries) { | ||
| headers.push(key, val) | ||
| } | ||
| } else { | ||
| // Copy the shared default array: the user-agent append below mutates | ||
| // `headers` in place, which must not leak into the module-level constant. | ||
| headers = [...(body ? ACCEPT_CONTENT_TYPE_HEADERS : ACCEPT_HEADERS)] | ||
| async function allDocs(pathname, opts = {}) { | ||
| if (pathname && typeof pathname === 'object') { | ||
| opts = pathname; | ||
| pathname = null; | ||
| } | ||
| pathname = pathname || '_all_docs'; | ||
| const { client = getClient(pathname), signal, idempotent = true, ...options } = opts; | ||
| const { params, method, headers, body } = _normalizeAllDocsOptions(options); | ||
| const req = { | ||
| pathname, | ||
| params, | ||
| client, | ||
| idempotent, | ||
| body, | ||
| method, | ||
| headers, | ||
| signal, | ||
| }; | ||
| const res = await request(req.pathname, req); | ||
| if (res.status !== 200) { | ||
| throw makeError(req, res); | ||
| } | ||
| return res.data; | ||
| } | ||
| if ( | ||
| userAgent && | ||
| !headers.some((element, index) => index % 2 === 0 && /user-agent/i.test(element)) | ||
| ) { | ||
| headers.push('user-agent', userAgent) | ||
| async function put(pathname, params, body, { client = defaultClient, signal, idempotent = true, headers = null } = {}) { | ||
| const req = { | ||
| pathname, | ||
| params, | ||
| client, | ||
| idempotent, | ||
| body, | ||
| method: 'PUT', | ||
| headers, | ||
| signal, | ||
| }; | ||
| const res = await request(req.pathname, req); | ||
| if (res.status < 200 || res.status >= 300) { | ||
| throw makeError(req, res); | ||
| } | ||
| return res.data; | ||
| } | ||
| let path = dbPathname | ||
| if (url) { | ||
| path = urljoin( | ||
| path, | ||
| url | ||
| .split('/') | ||
| .map((part) => encodeURIComponent(part)) | ||
| .join('/'), | ||
| ) | ||
| async function post(pathname, params, body, opts = {}) { | ||
| const { client, signal, idempotent = true, headers } = opts; | ||
| const req = { | ||
| pathname, | ||
| params, | ||
| client, | ||
| idempotent, | ||
| body, | ||
| method: 'POST', | ||
| headers, | ||
| signal, | ||
| }; | ||
| const res = await request(req.pathname, req); | ||
| if (res.status < 200 || res.status >= 300) { | ||
| throw makeError(req, res); | ||
| } | ||
| return res.data; | ||
| } | ||
| if (params) { | ||
| path += `?${querystring.stringify(params)}` | ||
| async function get(pathname, params, body, { client = getClient('_all_docs'), signal, idempotent = true, headers = null, } = {}) { | ||
| const req = { | ||
| pathname, | ||
| params, | ||
| client, | ||
| idempotent, | ||
| body, | ||
| method: 'GET', | ||
| headers, | ||
| signal, | ||
| }; | ||
| const res = await request(req.pathname, req); | ||
| if (res.status < 200 || res.status >= 300) { | ||
| throw makeError(req, res); | ||
| } | ||
| return res.data; | ||
| } | ||
| const req = { | ||
| path, | ||
| origin: dbOrigin, | ||
| idempotent, | ||
| method, | ||
| body: typeof body === 'object' && body ? JSON.stringify(body) : body, | ||
| headers, | ||
| async function _delete(pathname, params, body, { client = defaultClient, signal, idempotent = true, headers = null } = {}) { | ||
| const req = { | ||
| pathname, | ||
| params, | ||
| client, | ||
| idempotent, | ||
| body, | ||
| method: 'DELETE', | ||
| headers, | ||
| signal, | ||
| }; | ||
| const res = await request(req.pathname, req); | ||
| if (res.status < 200 || res.status >= 300) { | ||
| throw makeError(req, res); | ||
| } | ||
| return res.data; | ||
| } | ||
| return new Promise((resolve, reject) => | ||
| dispatch(client, req, { | ||
| resolve, | ||
| reject, | ||
| signal, | ||
| status: null, | ||
| headers: null, | ||
| abort: null, | ||
| data: '', | ||
| decoder: new TextDecoder(), | ||
| onConnect(abort) { | ||
| if (!this.signal) { | ||
| return | ||
| } | ||
| if (this.signal.aborted) { | ||
| abort() | ||
| return | ||
| } | ||
| this.abort = abort | ||
| if ('addEventListener' in this.signal) { | ||
| this.signal.addEventListener('abort', abort) | ||
| } else { | ||
| this.signal.addListener('abort', abort) | ||
| } | ||
| }, | ||
| onHeaders(statusCode, headers) { | ||
| this.status = statusCode | ||
| this.headers = headers | ||
| }, | ||
| onData(chunk) { | ||
| this.data += this.decoder.decode(chunk, { stream: true }) | ||
| }, | ||
| onComplete() { | ||
| if (this.signal) { | ||
| if ('removeEventListener' in this.signal) { | ||
| this.signal.removeEventListener('abort', this.abort) | ||
| } else { | ||
| this.signal.removeListener('abort', this.abort) | ||
| async function info(params, body, { client = defaultClient, signal, idempotent = true, headers = null } = {}) { | ||
| const req = { | ||
| pathname: null, | ||
| params, | ||
| client, | ||
| idempotent, | ||
| body, | ||
| method: 'GET', | ||
| headers, | ||
| signal, | ||
| }; | ||
| const res = await request(req.pathname, req); | ||
| if (res.status < 200 || res.status >= 300) { | ||
| throw makeError(req, res); | ||
| } | ||
| return res.data; | ||
| } | ||
| async function up({ client = defaultClient, signal, } = {}) { | ||
| const res = await undiciRequest(new URL('/_up', dbOrigin), { | ||
| signal, | ||
| dispatcher: client, | ||
| }); | ||
| return await res.body.json(); | ||
| } | ||
| async function upsert(pathname, | ||
| // `any` doc so the concrete function satisfies the generic | ||
| // CouchClient.upsert<Doc> signature (unknown is not assignable to Doc). | ||
| // oxlint-disable-next-line typescript/no-explicit-any | ||
| diffFun, { client = defaultClient, signal, } = {}) { | ||
| while (true) { | ||
| let doc; | ||
| try { | ||
| doc = (await get(pathname, null, null, { client, signal })); | ||
| } | ||
| } | ||
| this.data += this.decoder.decode() | ||
| // Match the media type only, ignoring any parameters such as | ||
| // `charset` (e.g. `application/json; charset=utf-8`). The JSON.parse | ||
| // below is not guarded, so we must not broaden this to subtypes like | ||
| // `application/json-seq`. | ||
| const contentType = (this.headers['content-type'] ?? '') | ||
| .split(';', 1)[0] | ||
| .trim() | ||
| .toLowerCase() | ||
| // Check the status *before* parsing. An error response can carry a | ||
| // body that is not valid JSON despite an `application/json` | ||
| // content-type (e.g. a truncated body or an HTML error page injected | ||
| // by a reverse proxy on a 5xx). Parsing first would throw a raw | ||
| // SyntaxError and the caller would never receive the intended HTTP | ||
| // error (with `status`/`data`) that `makeError` builds from the raw | ||
| // body. | ||
| if (this.status < 200 || this.status >= 300) { | ||
| this.reject( | ||
| makeError(req, { | ||
| status: this.status, | ||
| headers: this.headers, | ||
| data: this.data, | ||
| }), | ||
| ) | ||
| return | ||
| } | ||
| let data = this.data | ||
| if (contentType === 'application/json') { | ||
| data = JSON.parse(this.data) | ||
| } | ||
| this.resolve({ | ||
| data, | ||
| status: this.status, | ||
| headers: this.headers, | ||
| }) | ||
| }, | ||
| onError(err) { | ||
| if (this.signal) { | ||
| if ('removeEventListener' in this.signal) { | ||
| this.signal.removeEventListener('abort', this.abort) | ||
| } else { | ||
| this.signal.removeListener('abort', this.abort) | ||
| catch (err) { | ||
| if (err.status !== 404) { | ||
| throw err; | ||
| } | ||
| // Use the full pathname, not just the trailing segment — a design doc | ||
| // upsert('_design/foo') must create _id '_design/foo', not 'foo'. | ||
| doc = { | ||
| _id: pathname, | ||
| }; | ||
| } | ||
| } | ||
| this.reject(err) | ||
| }, | ||
| }), | ||
| ) | ||
| } | ||
| async function bulkDocs(body, opts = {}) { | ||
| const { client = getClient('_bulk_docs'), signal, idempotent = true } = opts | ||
| const req = { | ||
| pathname: '_bulk_docs', | ||
| client, | ||
| idempotent, | ||
| body, | ||
| method: 'POST', | ||
| signal, | ||
| const docId = doc._id; | ||
| const docRev = doc._rev; | ||
| const newDoc = diffFun(doc); | ||
| if (!newDoc || (!docRev && newDoc._deleted)) { | ||
| return { updated: false, rev: docRev, id: docId, doc }; | ||
| } | ||
| newDoc._id = docId; | ||
| newDoc._rev = docRev; | ||
| try { | ||
| return { | ||
| ...(await put(pathname, null, newDoc, { client, signal })), | ||
| doc: newDoc, | ||
| updated: true, | ||
| }; | ||
| } | ||
| catch (err) { | ||
| if (err.status !== 409) { | ||
| throw err; | ||
| } | ||
| } | ||
| } | ||
| } | ||
| const res = await request(req.pathname, req) | ||
| if (res.status !== 201) { | ||
| throw makeError(req, res) | ||
| async function close() { | ||
| await defaultClient.close(); | ||
| // TODO (fix): Close other clients. | ||
| } | ||
| return res.data | ||
| } | ||
| async function allDocs(pathname, opts = {}) { | ||
| if (pathname && typeof pathname === 'object') { | ||
| opts = pathname | ||
| pathname = null | ||
| // `satisfies` keeps the implementation compile-checked against the exported | ||
| // interface (a plain cast would let the two drift apart silently). | ||
| return Object.freeze({ | ||
| url: new URL(dbUrl), | ||
| request, | ||
| bulkDocs, | ||
| allDocs, | ||
| put, | ||
| post, | ||
| get, | ||
| upsert, | ||
| delete: _delete, | ||
| info, | ||
| changes, | ||
| close, | ||
| up, | ||
| }); | ||
| } | ||
| function _normalizeAllDocsOptions({ conflicts, update_seq, descending, include_docs, sorted, key, startkey, start_key, startkey_docid, endkey, end_key, endkey_docid, inclusive_end, limit, skip, stale, reduce, stable, update, keys, group, group_level, ...rest }) { | ||
| if (Object.keys(rest).length > 0) { | ||
| throw new Error('invalid options: ' + JSON.stringify(rest)); | ||
| } | ||
| pathname = pathname || '_all_docs' | ||
| const { client = getClient(pathname), signal, idempotent = true, ...options } = opts | ||
| const { params, method, headers, body } = _normalizeAllDocsOptions(options) | ||
| const req = { | ||
| pathname: pathname || '_all_docs', | ||
| params, | ||
| client, | ||
| idempotent, | ||
| body, | ||
| method, | ||
| headers, | ||
| signal, | ||
| const params = {}; | ||
| const headers = { | ||
| Accept: 'application/json', | ||
| }; | ||
| let method = 'GET'; | ||
| let body; | ||
| if (conflicts) { | ||
| params.conflicts = true; | ||
| } | ||
| const res = await request(req.pathname, req) | ||
| if (res.status !== 200) { | ||
| throw makeError(req, res) | ||
| if (update_seq) { | ||
| params.update_seq = true; | ||
| } | ||
| return res.data | ||
| } | ||
| async function put( | ||
| pathname, | ||
| params, | ||
| body, | ||
| { client = defaultClient, signal, idempotent = true, headers = null } = {}, | ||
| ) { | ||
| const req = { | ||
| pathname, | ||
| params, | ||
| client, | ||
| idempotent, | ||
| body, | ||
| method: 'PUT', | ||
| headers, | ||
| signal, | ||
| if (descending) { | ||
| params.descending = true; | ||
| } | ||
| const res = await request(req.pathname, req) | ||
| if (res.status < 200 || res.status >= 300) { | ||
| throw makeError(req, res) | ||
| if (include_docs) { | ||
| params.include_docs = true; | ||
| } | ||
| return res.data | ||
| } | ||
| async function post(pathname, params, body, opts = {}) { | ||
| const { client, signal, idempotent = true, headers } = opts | ||
| const req = { | ||
| pathname, | ||
| params, | ||
| client, | ||
| idempotent, | ||
| body, | ||
| method: 'POST', | ||
| headers, | ||
| signal, | ||
| // sorted defaults to true server-side, so false is the only value that does | ||
| // anything — it must not be dropped by a truthiness check. | ||
| if (sorted != null) { | ||
| params.sorted = !!sorted; | ||
| } | ||
| const res = await request(req.pathname, req) | ||
| if (res.status < 200 || res.status >= 300) { | ||
| throw makeError(req, res) | ||
| if (key != null) { | ||
| params.key = JSON.stringify(key); | ||
| } | ||
| return res.data | ||
| } | ||
| async function get( | ||
| pathname, | ||
| params, | ||
| body, | ||
| { client = getClient('_all_docs'), signal, idempotent = true, headers = null } = {}, | ||
| ) { | ||
| const req = { | ||
| pathname, | ||
| params, | ||
| client, | ||
| idempotent, | ||
| body, | ||
| method: 'GET', | ||
| headers, | ||
| signal, | ||
| if (startkey != null || start_key != null) { | ||
| params.startkey = JSON.stringify(startkey ?? start_key); | ||
| } | ||
| const res = await request(req.pathname, req) | ||
| if (res.status < 200 || res.status >= 300) { | ||
| throw makeError(req, res) | ||
| // startkey_docid/endkey_docid are plain document-id strings in CouchDB, NOT | ||
| // JSON values (unlike key/startkey/endkey). JSON.stringify would send a quoted | ||
| // value (e.g. `%22mydoc%22`) that never matches a real _id. | ||
| if (startkey_docid != null) { | ||
| params.startkey_docid = startkey_docid; | ||
| } | ||
| return res.data | ||
| } | ||
| async function _delete( | ||
| pathname, | ||
| params, | ||
| body, | ||
| { client = defaultClient, signal, idempotent = true, headers = null } = {}, | ||
| ) { | ||
| const req = { | ||
| pathname, | ||
| params, | ||
| client, | ||
| idempotent, | ||
| body, | ||
| method: 'DELETE', | ||
| headers, | ||
| signal, | ||
| if (endkey != null || end_key != null) { | ||
| params.endkey = JSON.stringify(endkey ?? end_key); | ||
| } | ||
| const res = await request(req.pathname, req) | ||
| if (res.status < 200 || res.status >= 300) { | ||
| throw makeError(req, res) | ||
| if (endkey_docid != null) { | ||
| params.endkey_docid = endkey_docid; | ||
| } | ||
| return res.data | ||
| } | ||
| async function info( | ||
| params, | ||
| body, | ||
| { client = defaultClient, signal, idempotent = true, headers = null } = {}, | ||
| ) { | ||
| const req = { | ||
| pathname: null, | ||
| params, | ||
| client, | ||
| idempotent, | ||
| body, | ||
| method: 'GET', | ||
| headers, | ||
| signal, | ||
| if (inclusive_end != null) { | ||
| params.inclusive_end = !!inclusive_end; | ||
| } | ||
| const res = await request(req.pathname, req) | ||
| if (res.status < 200 || res.status >= 300) { | ||
| throw makeError(req, res) | ||
| if (limit != null) { | ||
| params.limit = limit; | ||
| } | ||
| return res.data | ||
| } | ||
| async function up({ client = defaultClient, signal } = {}) { | ||
| const res = await undiciRequest(new URL('/_up', dbOrigin), { | ||
| signal, | ||
| dispatcher: client, | ||
| }) | ||
| return await res.body.json() | ||
| } | ||
| async function upsert(pathname, diffFun, { client = defaultClient, signal } = {}) { | ||
| while (true) { | ||
| let doc | ||
| try { | ||
| doc = await get(pathname, null, null, { client, signal }) | ||
| } catch (err) { | ||
| if (err.status !== 404) { | ||
| throw err | ||
| } | ||
| doc = { | ||
| _id: pathname.split('/').pop(), | ||
| } | ||
| } | ||
| const docId = doc._id | ||
| const docRev = doc._rev | ||
| const newDoc = diffFun(doc) | ||
| if (!newDoc || (!docRev && newDoc._deleted)) { | ||
| return { updated: false, rev: docRev, id: docId, doc } | ||
| } | ||
| newDoc._id = docId | ||
| newDoc._rev = docRev | ||
| try { | ||
| return { | ||
| ...(await put(pathname, null, newDoc, { client, signal })), | ||
| doc: newDoc, | ||
| updated: true, | ||
| } | ||
| } catch (err) { | ||
| if (err.status !== 409) { | ||
| throw err | ||
| } | ||
| } | ||
| if (skip != null) { | ||
| params.skip = skip; | ||
| } | ||
| } | ||
| async function close() { | ||
| await defaultClient.close() | ||
| // TODO (fix): Close other clients. | ||
| } | ||
| return Object.freeze({ | ||
| url: new URL(config.url), | ||
| request, | ||
| bulkDocs, | ||
| allDocs, | ||
| put, | ||
| post, | ||
| get, | ||
| upsert, | ||
| delete: _delete, | ||
| info, | ||
| changes, | ||
| close, | ||
| up, | ||
| }) | ||
| } | ||
| function _normalizeAllDocsOptions({ | ||
| conflicts, | ||
| update_seq, | ||
| descending, | ||
| include_docs, | ||
| sorted, | ||
| key, | ||
| startkey, | ||
| start_key, | ||
| startkey_docid, | ||
| endkey, | ||
| end_key, | ||
| endkey_docid, | ||
| inclusive_end, | ||
| limit, | ||
| skip, | ||
| stale, | ||
| reduce, | ||
| stable, | ||
| update, | ||
| keys, | ||
| group, | ||
| group_level, | ||
| ...rest | ||
| }) { | ||
| if (Object.keys(rest).length > 0) { | ||
| throw new Error('invalid options: ' + JSON.stringify(rest)) | ||
| } | ||
| const params = {} | ||
| const headers = { | ||
| Accept: 'application/json', | ||
| } | ||
| let method = 'GET' | ||
| let body | ||
| if (conflicts) { | ||
| params.conflicts = true | ||
| } | ||
| if (update_seq) { | ||
| params.update_seq = true | ||
| } | ||
| if (descending) { | ||
| params.descending = true | ||
| } | ||
| if (include_docs) { | ||
| params.include_docs = true | ||
| } | ||
| if (sorted) { | ||
| params.sorted = true | ||
| } | ||
| if (key != null) { | ||
| params.key = JSON.stringify(key) | ||
| } | ||
| if (startkey != null || start_key != null) { | ||
| params.startkey = JSON.stringify(startkey ?? start_key) | ||
| } | ||
| // startkey_docid/endkey_docid are plain document-id strings in CouchDB, NOT | ||
| // JSON values (unlike key/startkey/endkey). JSON.stringify would send a quoted | ||
| // value (e.g. `%22mydoc%22`) that never matches a real _id. | ||
| if (startkey_docid != null) { | ||
| params.startkey_docid = startkey_docid | ||
| } | ||
| if (endkey != null || end_key != null) { | ||
| params.endkey = JSON.stringify(endkey ?? end_key) | ||
| } | ||
| if (endkey_docid != null) { | ||
| params.endkey_docid = endkey_docid | ||
| } | ||
| if (inclusive_end != null) { | ||
| params.inclusive_end = !!inclusive_end | ||
| } | ||
| if (limit != null) { | ||
| params.limit = limit | ||
| } | ||
| if (skip != null) { | ||
| params.skip = skip | ||
| } | ||
| if (stale != null) { | ||
| params.stale = stale | ||
| } | ||
| if (reduce != null) { | ||
| params.reduce = reduce | ||
| } | ||
| if (group != null) { | ||
| params.group = group | ||
| } | ||
| if (group_level != null) { | ||
| params.group_level = group_level | ||
| } | ||
| if (update != null) { | ||
| params.update = update | ||
| } | ||
| if (stable != null) { | ||
| params.stable = stable | ||
| } | ||
| if (keys != null) { | ||
| method = 'POST' | ||
| body = JSON.stringify({ keys }) | ||
| headers['Content-Type'] = 'application/json' | ||
| } | ||
| return { | ||
| method, | ||
| params, | ||
| headers, | ||
| body, | ||
| } | ||
| } | ||
| class StreamOutput extends stream.Readable { | ||
| #str | ||
| #resume | ||
| #abort | ||
| #state | ||
| #decoder | ||
| #headers | ||
| constructor({ signal, highWaterMark = 256 }) { | ||
| super({ objectMode: true, highWaterMark, signal }) | ||
| } | ||
| get headers() { | ||
| return this.#headers | ||
| } | ||
| _read() { | ||
| this.#resume?.() | ||
| } | ||
| _destroy(err, callback) { | ||
| this.#abort?.(err) | ||
| callback(err) | ||
| } | ||
| onConnect(abort) { | ||
| if (this.destroyed) { | ||
| abort(this.errored) | ||
| } else if (this.#state) { | ||
| throw new Error('unusable') | ||
| } else { | ||
| this.#state = 0 | ||
| this.#str = '' | ||
| this.#abort = abort | ||
| this.#decoder = new TextDecoder() | ||
| if (stale != null) { | ||
| params.stale = stale; | ||
| } | ||
| } | ||
| onHeaders(statusCode, headers, resume) { | ||
| if (statusCode >= 300 || statusCode < 200) { | ||
| throw new Error('invalid status code: ' + statusCode) | ||
| if (reduce != null) { | ||
| params.reduce = reduce; | ||
| } | ||
| this.#headers = headers | ||
| this.#resume = resume | ||
| } | ||
| onData(data) { | ||
| const lines = this.#decoder.decode(data, { stream: true }).split(/\r?\n+/) | ||
| lines[0] = this.#str + lines[0] | ||
| this.#str = lines.pop() ?? '' | ||
| try { | ||
| let ret = true | ||
| for (const line of lines) { | ||
| if (!line) { | ||
| continue | ||
| } | ||
| if (this.#state === 0) { | ||
| if (/\[\s*$/.test(line)) { | ||
| this.#state = 1 | ||
| } else { | ||
| throw new Error('expected [ at end of line') | ||
| } | ||
| } else if (this.#state === 1) { | ||
| if (/^\s*\]/.test(line)) { | ||
| this.#state = 2 | ||
| } else { | ||
| const row = JSON.parse(line.slice(0, line.lastIndexOf('}') + 1)) | ||
| if (!this.push(row)) { | ||
| ret = false | ||
| } | ||
| } | ||
| } | ||
| } | ||
| return ret | ||
| } catch (err) { | ||
| throw Object.assign(new Error('invalid data'), { | ||
| data: lines.join('\n') + this.#str, | ||
| cause: err, | ||
| }) | ||
| if (group != null) { | ||
| params.group = group; | ||
| } | ||
| } | ||
| onComplete() { | ||
| assert(this.#state === 2) | ||
| this.push(null) | ||
| } | ||
| onError(err) { | ||
| this.destroy(err) | ||
| } | ||
| } | ||
| class PromiseOutput { | ||
| #resolve | ||
| #reject | ||
| #str | ||
| #decoder | ||
| #signal | ||
| #abort | ||
| constructor({ resolve, reject, signal }) { | ||
| this.#resolve = resolve | ||
| this.#reject = reject | ||
| this.#signal = signal | ||
| } | ||
| onConnect(abort) { | ||
| this.#decoder = new TextDecoder() | ||
| this.#str = '' | ||
| if (this.#signal?.aborted) { | ||
| abort() | ||
| } else { | ||
| this.#abort = abort | ||
| this.#signal?.addEventListener('abort', this.#abort) | ||
| if (group_level != null) { | ||
| params.group_level = group_level; | ||
| } | ||
| } | ||
| onHeaders(statusCode, rawHeaders, resume, statusText) { | ||
| if (statusCode >= 300 || statusCode < 200) { | ||
| throw new Error('invalid status code: ' + statusCode) | ||
| if (update != null) { | ||
| params.update = update; | ||
| } | ||
| } | ||
| onData(data) { | ||
| this.#str += this.#decoder.decode(data, { stream: true }) | ||
| } | ||
| onComplete() { | ||
| this.#str += this.#decoder.decode(undefined, { stream: false }) | ||
| try { | ||
| this.#onDone(null, JSON.parse(this.#str)) | ||
| } catch (err) { | ||
| this.#onDone(Object.assign(new Error('invalid json'), { data: this.#str, cause: err })) | ||
| if (stable != null) { | ||
| params.stable = stable; | ||
| } | ||
| } | ||
| onError(err) { | ||
| this.#onDone(err) | ||
| } | ||
| #onDone(err, val) { | ||
| if (err) { | ||
| this.#reject(err) | ||
| } else { | ||
| this.#resolve(val) | ||
| if (keys != null) { | ||
| method = 'POST'; | ||
| body = JSON.stringify({ keys }); | ||
| headers['Content-Type'] = 'application/json'; | ||
| } | ||
| if (this.#abort) { | ||
| this.#signal?.removeEventListener('abort', this.#abort) | ||
| } | ||
| } | ||
| return { | ||
| method, | ||
| params, | ||
| headers, | ||
| body, | ||
| }; | ||
| } | ||
| const defaultDispatcher = new Agent({ | ||
| // pipelining: 4, | ||
| connections: 8 * 4, | ||
| connectTimeout: 2e3, | ||
| }) | ||
| const blockingDispatcher = new Agent({ | ||
| pipelining: 1, | ||
| connections: 1024, | ||
| connectTimeout: 2e3, | ||
| }) | ||
| export function request(url, opts) { | ||
| if (typeof url === 'string') { | ||
| opts = { url: new URL(url), ...opts } | ||
| } else if (url instanceof URL) { | ||
| opts = { url, ...opts } | ||
| } else if (typeof url.origin === 'string' && typeof (url.path ?? url.pathname) === 'string') { | ||
| opts = opts ? { ...url, ...opts } : url | ||
| } | ||
| if (opts == null && typeof url === 'object' && url != null) { | ||
| opts = url | ||
| } | ||
| url = opts.url | ||
| if (typeof url === 'string') { | ||
| url = new URL(url) | ||
| } | ||
| let origin = url.origin | ||
| if (!origin) { | ||
| const protocol = url.protocol ?? 'http:' | ||
| const host = url.host ?? `${url.hostname}:${url.port ?? (protocol === 'https:' ? 443 : 80)}` | ||
| origin = `${protocol}//${host}` | ||
| } | ||
| let path = url.path | ||
| if (!path) { | ||
| path = url.search ? `${url.pathname}${url.search}` : url.pathname | ||
| } | ||
| const ureq = { | ||
| ...opts, | ||
| dns: | ||
| opts.dns !== false && opts.dns !== null | ||
| ? { | ||
| balance: 'hash', | ||
| ...opts.dns, | ||
| } | ||
| : opts.dns, | ||
| origin, | ||
| path, | ||
| method: opts.method ?? (opts.body ? 'POST' : 'GET'), | ||
| blocking: opts.blocking ?? Boolean(opts.stream), | ||
| headers: { | ||
| 'content-type': | ||
| opts.body != null && typeof opts.body === 'object' ? 'application/json' : 'text/plain', | ||
| accept: 'application/json', | ||
| ...opts.headers, | ||
| }, | ||
| cache: false, | ||
| body: | ||
| opts.body != null && typeof opts.body === 'object' ? JSON.stringify(opts.body) : opts.body, | ||
| } | ||
| const dispatcher = opts.dispatcher ?? (ureq.blocking ? blockingDispatcher : defaultDispatcher) | ||
| const signal = opts.signal | ||
| if (opts.stream) { | ||
| const handler = new StreamOutput({ signal, highWaterMark: stream.highWaterMark }) | ||
| dispatch(dispatcher, ureq, handler) | ||
| return handler | ||
| } else { | ||
| return new Promise((resolve, reject) => { | ||
| const handler = new PromiseOutput({ resolve, reject, signal }) | ||
| dispatch(dispatcher, ureq, handler) | ||
| }) | ||
| } | ||
| } | ||
| globalThis.__nxt_lib_couch = { | ||
| request, | ||
| defaultDispatcher, | ||
| } | ||
| //# sourceMappingURL=index.js.map |
+16
-11
| { | ||
| "name": "@nxtedition/couch", | ||
| "version": "1.1.51", | ||
| "version": "2.0.0", | ||
| "type": "module", | ||
@@ -8,3 +8,7 @@ "main": "lib/index.js", | ||
| "exports": { | ||
| ".": "./lib/index.js" | ||
| ".": { | ||
| "types": "./lib/index.d.ts", | ||
| "source": "./src/index.ts", | ||
| "default": "./lib/index.js" | ||
| } | ||
| }, | ||
@@ -16,9 +20,10 @@ "files": [ | ||
| "scripts": { | ||
| "build": "rimraf lib && mkdir -p lib && cp src/index.js lib/index.js && cp src/index.d.ts lib/index.d.ts", | ||
| "build": "rimraf lib && tsc -p tsconfig.build.json", | ||
| "typecheck": "tsc --noEmit", | ||
| "test": "node --test", | ||
| "test:ci": "node --test" | ||
| "test": "node --conditions=source --test", | ||
| "test:types": "tsd", | ||
| "test:ci": "node --conditions=source --test && tsd" | ||
| }, | ||
| "dependencies": { | ||
| "@nxtedition/error": "^1.1.39", | ||
| "@nxtedition/error": "^1.1.40", | ||
| "@nxtedition/nxt-undici": "^7.3.27", | ||
@@ -30,9 +35,9 @@ "@nxtedition/weak-cache": "^1.0.12", | ||
| "devDependencies": { | ||
| "@nxtedition/logger": "^2.1.34", | ||
| "@nxtedition/scheduler": "^4.1.18", | ||
| "@types/http-errors": "^2.0.5", | ||
| "@types/node": "^25.9.4", | ||
| "rimraf": "^6.1.3", | ||
| "typescript": "^5.9.3", | ||
| "undici": "^7.28.0" | ||
| "tsd": "^0.33.0", | ||
| "typescript": "^5.9.3" | ||
| }, | ||
| "gitHead": "44032308de159c06fc694c901a12c35a8bd628ea" | ||
| "gitHead": "67d19205b4876ee6dc1c6c75742dbd64361cf70d" | ||
| } |
Explicitly Unlicensed Item
LicenseSomething was found which is explicitly marked as unlicensed.
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Explicitly Unlicensed Item
LicenseSomething was found which is explicitly marked as unlicensed.
101034
194.98%13
333.33%1399
16.39%2
100%Updated