@toa.io/origin 1.3.3 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../source/index.ts","../source/Origin.ts","../source/Agent.ts","../source/Resource.ts"],"sourcesContent":["export { connect } from './Origin'\nexport type { GenericError } from './Error'\nexport type { OctetsEntry, WorkflowStep } from './Octets'\n","import mitt from 'mitt'\nimport { Agent } from './Agent'\nimport { Resource } from './Resource'\nimport type { Events } from './Events'\nimport type { Emitter } from 'mitt'\n\n/** Resoruce factory */\nclass Origin {\n public readonly events: Emitter<Events>\n private readonly agent: Agent\n\n constructor(options: Options) {\n this.events = mitt<Events>()\n\n this.agent = new Agent({\n origin: options.origin,\n events: this.events,\n })\n }\n\n public resource<T = unknown>(path: string) {\n return new Resource<T>({\n agent: this.agent,\n path,\n })\n }\n\n public authenticate(challenge: string | null) {\n this.agent.authenticate(challenge)\n }\n\n public use(fetch: Fetch) {\n this.agent.use(fetch)\n }\n}\n\nfunction connect(options: Options) {\n return new Origin(options)\n}\n\ninterface Options {\n origin: string\n}\n\ntype Fetch = typeof fetch\n\nexport { connect }\n","import { Err } from 'error-value'\nimport { meros } from 'meros/browser'\nimport mitt from 'mitt'\nimport type { GenericError } from './Error'\nimport type { Events } from './Events'\nimport type { Faulty, OctetsEntry, WorkflowStep } from './Octets'\nimport type { Emitter } from 'mitt'\n\nclass Agent {\n private readonly origin: string\n private readonly events: Emitter<Events>\n private fetch: Fetch = fetch\n\n private challenge: string | null = null\n\n constructor(options: Options) {\n this.origin = options.origin\n this.events = options.events\n }\n\n public async json<T, E extends GenericError = GenericError>(path: string, init?: Init): Promise<T | E> {\n const options = this.setup(init)\n const response = await this.request(path, options)\n\n const body = response.headers.get('content-type') === 'application/json'\n ? await response.json()\n : await response.text()\n\n if (response.ok)\n return body as T\n else {\n this.events.emit('error', { code: response.status, body })\n\n return new Err(response.status, body) as E\n }\n }\n\n public async multipart<T = unknown>(path: string, init?: Init): Promise<AsyncGenerator<T, void, undefined> | GenericError> {\n const options = this.setup(init)\n const response = await this.request(path, options)\n\n if (!response.ok)\n return new Err(response.status, await response.json())\n\n const generator = await meros(response) as AsyncGenerator<{ body: string }>\n const ack = await generator.next()\n\n if (JSON.parse(ack.value.body) !== 'ACK') throw new Error('No ACK')\n\n return (async function * () {\n for await (const chunk of generator) {\n const value = JSON.parse(chunk.body)\n\n if (value === 'FIN') return\n\n yield value\n }\n })()\n }\n\n public async octets<\n T extends Record<string, unknown> = Record<string, unknown>,\n E extends GenericError = GenericError\n >(path: string, init?: Init): Promise<[OctetsEntry, Emitter<Faulty<T>>] | E> {\n const generator = await this.multipart<OctetsEntry | WorkflowStep>(path, init)\n\n if (generator instanceof Error) return generator as E\n\n const chunk = await generator.next()\n const entry = chunk.value as OctetsEntry\n const emitter = mitt<Faulty<T>>()\n\n void (async () => {\n for await (const part of (generator as AsyncGenerator<WorkflowStep>)) {\n const payload =\n part.status === 'completed'\n ? part.output\n : new Err(part.error?.code ?? 'UNKNOWN', part.error?.message)\n\n emitter.emit(part.step, payload as T[typeof part.step])\n }\n\n emitter.off('*')\n })()\n\n return [entry, emitter]\n }\n\n public authenticate(challenge: string | null) {\n this.challenge = challenge\n }\n\n public use(fetch: Fetch) {\n this.fetch = fetch\n }\n\n private setup(init?: Init): InitWithHeaders {\n init ??= {}\n init.headers ??= {}\n init.headers['accept'] ??= 'application/json'\n\n if (init.credentials === 'include' && init.headers['authorization'] === undefined) {\n if (this.challenge === null)\n throw new Error('Credentials must be set before sending authenticated request')\n\n init.headers['authorization'] = this.challenge\n delete init.credentials // no cookies\n }\n\n if (init.body !== undefined)\n if (init.body instanceof File || init.body instanceof ReadableStream) {\n init.method ??= 'POST'\n init.duplex = 'half'\n init.headers['content-type'] ??= (init.body as File).type ?? 'application/octet-stream'\n } else {\n init.body = JSON.stringify(init.body)\n init.headers['content-type'] ??= 'application/json'\n }\n\n return init as InitWithHeaders\n }\n\n private async request(path: string, init: Init): Promise<Response> {\n const url = new URL(path, this.origin)\n const response = await this.fetch(url.href, init)\n\n const challenge = response.headers.get('authorization')\n\n if (challenge !== null) {\n this.challenge = challenge\n this.events.emit('challenge', challenge)\n }\n\n return response\n }\n}\n\ninterface Options {\n origin: string\n events: Emitter<Events>\n}\n\ninterface Init extends Omit<RequestInit, 'path' | 'headers'> {\n duplex?: 'half'\n body?: any\n headers?: Record<string, string>\n}\n\ninterface InitWithHeaders extends Init {\n headers: Record<string, string>\n}\n\ntype Fetch = typeof fetch\n\nexport { Agent }\nexport type { Init }\n","import type { Agent, Init } from './Agent'\nimport type { GenericError } from './Error'\nimport type { Faulty, OctetsEntry } from './Octets'\nimport type { Emitter } from 'mitt'\n\nclass Resource<T = unknown, E extends GenericError = GenericError> {\n private readonly agent: Agent\n private readonly path: string\n\n public constructor(options: Options) {\n this.agent = options.agent\n this.path = options.path\n }\n\n public async json<R = T, F extends E = E>(rel: string = '', init?: Init): Promise<R | F> {\n const abs = this.abs(rel)\n\n return await this.agent.json<R, F>(abs, init)\n }\n\n public async octets<T extends Record<string, unknown> = Record<string, unknown>, F extends E = E>(rel: string = '', init?: Init): Promise<[OctetsEntry, Emitter<Faulty<T>>] | F> {\n const abs = this.abs(rel)\n\n return await this.agent.octets<T, F>(abs, init)\n }\n\n private abs(rel: string): string {\n const base = new URL(this.path, 'uri://void')\n const url = new URL(rel, base)\n\n if (!url.pathname.endsWith('/'))\n url.pathname += '/'\n\n return url.pathname + url.search\n }\n}\n\ninterface Options {\n agent: Agent\n path: string\n}\n\nexport { Resource }\n"],"mappings":"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","names":["import_mitt","mitt","fetch","mitt","fetch"]}
1
+ {"version":3,"sources":["../source/index.ts","../source/Origin.ts","../source/Agent.ts","../source/Resource.ts"],"sourcesContent":["export { connect } from './Origin'\nexport type { GenericError } from './Error'\nexport type { OctetsEntry, WorkflowStep } from './Octets'\nexport type { RequestOptions } from './Agent'\n","import mitt from 'mitt'\nimport { Agent } from './Agent'\nimport { Resource } from './Resource'\nimport type { Events } from './Events'\nimport type { Emitter } from 'mitt'\n\n/** Resoruce factory */\nclass Origin {\n public readonly events: Emitter<Events>\n private readonly agent: Agent\n\n constructor(options: Options) {\n this.events = mitt<Events>()\n\n this.agent = new Agent({\n origin: options.origin,\n events: this.events,\n })\n }\n\n public resource<T = unknown>(path: string) {\n return new Resource<T>({\n agent: this.agent,\n path,\n })\n }\n\n public authenticate(challenge: string | null) {\n this.agent.authenticate(challenge)\n }\n\n public use(fetch: Fetch) {\n this.agent.use(fetch)\n }\n}\n\nfunction connect(options: Options) {\n return new Origin(options)\n}\n\ninterface Options {\n origin: string\n}\n\ntype Fetch = typeof fetch\n\nexport { connect }\n","import { Err } from 'error-value'\nimport { meros } from 'meros/browser'\nimport mitt from 'mitt'\nimport type { GenericError } from './Error'\nimport type { Events } from './Events'\nimport type { Faulty, OctetsEntry, WorkflowStep } from './Octets'\nimport type { Emitter } from 'mitt'\n\nclass Agent {\n private readonly origin: string\n private readonly events: Emitter<Events>\n private fetch: Fetch = fetch\n\n private challenge: string | null = null\n\n constructor(options: Options) {\n this.origin = options.origin\n this.events = options.events\n }\n\n public async json<T, E extends GenericError = GenericError>(path: string, init?: RequestOptions): Promise<T | E> {\n const options = this.setup(init)\n const response = await this.request(path, options)\n\n const body = response.headers.get('content-type') === 'application/json'\n ? await response.json()\n : await response.text()\n\n if (response.ok)\n return body as T\n else {\n this.events.emit('error', { code: response.status, body })\n\n return new Err(response.status, body) as E\n }\n }\n\n public async multipart<T = unknown>(path: string, init?: RequestOptions): Promise<AsyncGenerator<T, void, undefined> | GenericError> {\n const options = this.setup(init)\n const response = await this.request(path, options)\n\n if (!response.ok)\n return new Err(response.status, await response.json())\n\n const generator = await meros(response) as AsyncGenerator<{ body: string }>\n const ack = await generator.next()\n\n if (JSON.parse(ack.value.body) !== 'ACK') throw new Error('No ACK')\n\n return (async function * () {\n for await (const chunk of generator) {\n const value = JSON.parse(chunk.body)\n\n if (value === 'FIN') return\n\n yield value\n }\n })()\n }\n\n public async octets<\n T extends Record<string, unknown> = Record<string, unknown>,\n E extends GenericError = GenericError\n >(path: string, init?: RequestOptions): Promise<[OctetsEntry, Emitter<Faulty<T>>] | E> {\n const generator = await this.multipart<OctetsEntry | WorkflowStep>(path, init)\n\n if (generator instanceof Error) return generator as E\n\n const chunk = await generator.next()\n const entry = chunk.value as OctetsEntry\n const emitter = mitt<Faulty<T>>()\n\n void (async () => {\n for await (const part of (generator as AsyncGenerator<WorkflowStep>)) {\n const payload =\n part.status === 'completed'\n ? part.output\n : new Err(part.error?.code ?? 'UNKNOWN', part.error?.message)\n\n emitter.emit(part.step, payload as T[typeof part.step])\n }\n\n emitter.off('*')\n })()\n\n return [entry, emitter]\n }\n\n public authenticate(challenge: string | null) {\n this.challenge = challenge\n }\n\n public use(fetch: Fetch) {\n this.fetch = fetch\n }\n\n private setup(init?: RequestOptions): InitWithHeaders {\n init ??= {}\n init.headers ??= {}\n init.headers['accept'] ??= 'application/json'\n\n if (init.credentials === 'include' && init.headers['authorization'] === undefined) {\n if (this.challenge === null)\n throw new Error('Credentials must be set before sending authenticated request')\n\n init.headers['authorization'] = this.challenge\n delete init.credentials // no cookies\n }\n\n if (init.body !== undefined)\n if (init.body instanceof File || init.body instanceof ReadableStream) {\n init.method ??= 'POST'\n init.duplex = 'half'\n init.headers['content-type'] ??= (init.body as File).type ?? 'application/octet-stream'\n } else {\n init.body = JSON.stringify(init.body)\n init.headers['content-type'] ??= 'application/json'\n }\n\n return init as InitWithHeaders\n }\n\n private async request(path: string, init: RequestOptions): Promise<Response> {\n const url = new URL(path, this.origin)\n const response = await this.fetch(url.href, init)\n\n const challenge = response.headers.get('authorization')\n\n if (challenge !== null) {\n this.challenge = challenge\n this.events.emit('challenge', challenge)\n }\n\n return response\n }\n}\n\ninterface Options {\n origin: string\n events: Emitter<Events>\n}\n\ninterface RequestOptions extends Omit<RequestInit, 'path' | 'headers'> {\n duplex?: 'half'\n body?: any\n headers?: Record<string, string>\n}\n\ninterface InitWithHeaders extends RequestOptions {\n headers: Record<string, string>\n}\n\ntype Fetch = typeof fetch\n\nexport { Agent }\nexport type { RequestOptions }\n","import type { Agent, RequestOptions } from './Agent'\nimport type { GenericError } from './Error'\nimport type { Faulty, OctetsEntry } from './Octets'\nimport type { Emitter } from 'mitt'\n\nclass Resource<T = unknown, E extends GenericError = GenericError> {\n private readonly agent: Agent\n private readonly path: string\n\n public constructor(options: Options) {\n this.agent = options.agent\n this.path = options.path\n }\n\n public async json<R = T, F extends E = E>(rel: string = '', init?: RequestOptions): Promise<R | F> {\n const abs = this.abs(rel)\n\n return await this.agent.json<R, F>(abs, init)\n }\n\n public async octets<T extends Record<string, unknown> = Record<string, unknown>, F extends E = E>(rel: string = '', init?: RequestOptions): Promise<[OctetsEntry, Emitter<Faulty<T>>] | F> {\n const abs = this.abs(rel)\n\n return await this.agent.octets<T, F>(abs, init)\n }\n\n private abs(rel: string): string {\n const base = new URL(this.path, 'uri://void')\n const url = new URL(rel, base)\n\n if (!url.pathname.endsWith('/'))\n url.pathname += '/'\n\n return url.pathname + url.search\n }\n}\n\ninterface Options {\n agent: Agent\n path: string\n}\n\nexport { Resource }\n"],"mappings":"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","names":["import_mitt","mitt","fetch","mitt","fetch"]}
package/dist/index.d.cts CHANGED
@@ -28,9 +28,9 @@ declare class Agent {
28
28
  private fetch;
29
29
  private challenge;
30
30
  constructor(options: Options$2);
31
- json<T, E extends GenericError = GenericError>(path: string, init?: Init): Promise<T | E>;
32
- multipart<T = unknown>(path: string, init?: Init): Promise<AsyncGenerator<T, void, undefined> | GenericError>;
33
- octets<T extends Record<string, unknown> = Record<string, unknown>, E extends GenericError = GenericError>(path: string, init?: Init): Promise<[OctetsEntry, Emitter<Faulty<T>>] | E>;
31
+ json<T, E extends GenericError = GenericError>(path: string, init?: RequestOptions): Promise<T | E>;
32
+ multipart<T = unknown>(path: string, init?: RequestOptions): Promise<AsyncGenerator<T, void, undefined> | GenericError>;
33
+ octets<T extends Record<string, unknown> = Record<string, unknown>, E extends GenericError = GenericError>(path: string, init?: RequestOptions): Promise<[OctetsEntry, Emitter<Faulty<T>>] | E>;
34
34
  authenticate(challenge: string | null): void;
35
35
  use(fetch: Fetch$1): void;
36
36
  private setup;
@@ -40,7 +40,7 @@ interface Options$2 {
40
40
  origin: string;
41
41
  events: Emitter<Events>;
42
42
  }
43
- interface Init extends Omit<RequestInit, 'path' | 'headers'> {
43
+ interface RequestOptions extends Omit<RequestInit, 'path' | 'headers'> {
44
44
  duplex?: 'half';
45
45
  body?: any;
46
46
  headers?: Record<string, string>;
@@ -51,8 +51,8 @@ declare class Resource<T = unknown, E extends GenericError = GenericError> {
51
51
  private readonly agent;
52
52
  private readonly path;
53
53
  constructor(options: Options$1);
54
- json<R = T, F extends E = E>(rel?: string, init?: Init): Promise<R | F>;
55
- octets<T extends Record<string, unknown> = Record<string, unknown>, F extends E = E>(rel?: string, init?: Init): Promise<[OctetsEntry, Emitter<Faulty<T>>] | F>;
54
+ json<R = T, F extends E = E>(rel?: string, init?: RequestOptions): Promise<R | F>;
55
+ octets<T extends Record<string, unknown> = Record<string, unknown>, F extends E = E>(rel?: string, init?: RequestOptions): Promise<[OctetsEntry, Emitter<Faulty<T>>] | F>;
56
56
  private abs;
57
57
  }
58
58
  interface Options$1 {
@@ -75,4 +75,4 @@ interface Options {
75
75
  }
76
76
  type Fetch = typeof fetch;
77
77
 
78
- export { type GenericError, type OctetsEntry, type WorkflowStep, connect };
78
+ export { type GenericError, type OctetsEntry, type RequestOptions, type WorkflowStep, connect };
package/dist/index.d.ts CHANGED
@@ -28,9 +28,9 @@ declare class Agent {
28
28
  private fetch;
29
29
  private challenge;
30
30
  constructor(options: Options$2);
31
- json<T, E extends GenericError = GenericError>(path: string, init?: Init): Promise<T | E>;
32
- multipart<T = unknown>(path: string, init?: Init): Promise<AsyncGenerator<T, void, undefined> | GenericError>;
33
- octets<T extends Record<string, unknown> = Record<string, unknown>, E extends GenericError = GenericError>(path: string, init?: Init): Promise<[OctetsEntry, Emitter<Faulty<T>>] | E>;
31
+ json<T, E extends GenericError = GenericError>(path: string, init?: RequestOptions): Promise<T | E>;
32
+ multipart<T = unknown>(path: string, init?: RequestOptions): Promise<AsyncGenerator<T, void, undefined> | GenericError>;
33
+ octets<T extends Record<string, unknown> = Record<string, unknown>, E extends GenericError = GenericError>(path: string, init?: RequestOptions): Promise<[OctetsEntry, Emitter<Faulty<T>>] | E>;
34
34
  authenticate(challenge: string | null): void;
35
35
  use(fetch: Fetch$1): void;
36
36
  private setup;
@@ -40,7 +40,7 @@ interface Options$2 {
40
40
  origin: string;
41
41
  events: Emitter<Events>;
42
42
  }
43
- interface Init extends Omit<RequestInit, 'path' | 'headers'> {
43
+ interface RequestOptions extends Omit<RequestInit, 'path' | 'headers'> {
44
44
  duplex?: 'half';
45
45
  body?: any;
46
46
  headers?: Record<string, string>;
@@ -51,8 +51,8 @@ declare class Resource<T = unknown, E extends GenericError = GenericError> {
51
51
  private readonly agent;
52
52
  private readonly path;
53
53
  constructor(options: Options$1);
54
- json<R = T, F extends E = E>(rel?: string, init?: Init): Promise<R | F>;
55
- octets<T extends Record<string, unknown> = Record<string, unknown>, F extends E = E>(rel?: string, init?: Init): Promise<[OctetsEntry, Emitter<Faulty<T>>] | F>;
54
+ json<R = T, F extends E = E>(rel?: string, init?: RequestOptions): Promise<R | F>;
55
+ octets<T extends Record<string, unknown> = Record<string, unknown>, F extends E = E>(rel?: string, init?: RequestOptions): Promise<[OctetsEntry, Emitter<Faulty<T>>] | F>;
56
56
  private abs;
57
57
  }
58
58
  interface Options$1 {
@@ -75,4 +75,4 @@ interface Options {
75
75
  }
76
76
  type Fetch = typeof fetch;
77
77
 
78
- export { type GenericError, type OctetsEntry, type WorkflowStep, connect };
78
+ export { type GenericError, type OctetsEntry, type RequestOptions, type WorkflowStep, connect };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../source/Origin.ts","../source/Agent.ts","../source/Resource.ts"],"sourcesContent":["import mitt from 'mitt'\nimport { Agent } from './Agent'\nimport { Resource } from './Resource'\nimport type { Events } from './Events'\nimport type { Emitter } from 'mitt'\n\n/** Resoruce factory */\nclass Origin {\n public readonly events: Emitter<Events>\n private readonly agent: Agent\n\n constructor(options: Options) {\n this.events = mitt<Events>()\n\n this.agent = new Agent({\n origin: options.origin,\n events: this.events,\n })\n }\n\n public resource<T = unknown>(path: string) {\n return new Resource<T>({\n agent: this.agent,\n path,\n })\n }\n\n public authenticate(challenge: string | null) {\n this.agent.authenticate(challenge)\n }\n\n public use(fetch: Fetch) {\n this.agent.use(fetch)\n }\n}\n\nfunction connect(options: Options) {\n return new Origin(options)\n}\n\ninterface Options {\n origin: string\n}\n\ntype Fetch = typeof fetch\n\nexport { connect }\n","import { Err } from 'error-value'\nimport { meros } from 'meros/browser'\nimport mitt from 'mitt'\nimport type { GenericError } from './Error'\nimport type { Events } from './Events'\nimport type { Faulty, OctetsEntry, WorkflowStep } from './Octets'\nimport type { Emitter } from 'mitt'\n\nclass Agent {\n private readonly origin: string\n private readonly events: Emitter<Events>\n private fetch: Fetch = fetch\n\n private challenge: string | null = null\n\n constructor(options: Options) {\n this.origin = options.origin\n this.events = options.events\n }\n\n public async json<T, E extends GenericError = GenericError>(path: string, init?: Init): Promise<T | E> {\n const options = this.setup(init)\n const response = await this.request(path, options)\n\n const body = response.headers.get('content-type') === 'application/json'\n ? await response.json()\n : await response.text()\n\n if (response.ok)\n return body as T\n else {\n this.events.emit('error', { code: response.status, body })\n\n return new Err(response.status, body) as E\n }\n }\n\n public async multipart<T = unknown>(path: string, init?: Init): Promise<AsyncGenerator<T, void, undefined> | GenericError> {\n const options = this.setup(init)\n const response = await this.request(path, options)\n\n if (!response.ok)\n return new Err(response.status, await response.json())\n\n const generator = await meros(response) as AsyncGenerator<{ body: string }>\n const ack = await generator.next()\n\n if (JSON.parse(ack.value.body) !== 'ACK') throw new Error('No ACK')\n\n return (async function * () {\n for await (const chunk of generator) {\n const value = JSON.parse(chunk.body)\n\n if (value === 'FIN') return\n\n yield value\n }\n })()\n }\n\n public async octets<\n T extends Record<string, unknown> = Record<string, unknown>,\n E extends GenericError = GenericError\n >(path: string, init?: Init): Promise<[OctetsEntry, Emitter<Faulty<T>>] | E> {\n const generator = await this.multipart<OctetsEntry | WorkflowStep>(path, init)\n\n if (generator instanceof Error) return generator as E\n\n const chunk = await generator.next()\n const entry = chunk.value as OctetsEntry\n const emitter = mitt<Faulty<T>>()\n\n void (async () => {\n for await (const part of (generator as AsyncGenerator<WorkflowStep>)) {\n const payload =\n part.status === 'completed'\n ? part.output\n : new Err(part.error?.code ?? 'UNKNOWN', part.error?.message)\n\n emitter.emit(part.step, payload as T[typeof part.step])\n }\n\n emitter.off('*')\n })()\n\n return [entry, emitter]\n }\n\n public authenticate(challenge: string | null) {\n this.challenge = challenge\n }\n\n public use(fetch: Fetch) {\n this.fetch = fetch\n }\n\n private setup(init?: Init): InitWithHeaders {\n init ??= {}\n init.headers ??= {}\n init.headers['accept'] ??= 'application/json'\n\n if (init.credentials === 'include' && init.headers['authorization'] === undefined) {\n if (this.challenge === null)\n throw new Error('Credentials must be set before sending authenticated request')\n\n init.headers['authorization'] = this.challenge\n delete init.credentials // no cookies\n }\n\n if (init.body !== undefined)\n if (init.body instanceof File || init.body instanceof ReadableStream) {\n init.method ??= 'POST'\n init.duplex = 'half'\n init.headers['content-type'] ??= (init.body as File).type ?? 'application/octet-stream'\n } else {\n init.body = JSON.stringify(init.body)\n init.headers['content-type'] ??= 'application/json'\n }\n\n return init as InitWithHeaders\n }\n\n private async request(path: string, init: Init): Promise<Response> {\n const url = new URL(path, this.origin)\n const response = await this.fetch(url.href, init)\n\n const challenge = response.headers.get('authorization')\n\n if (challenge !== null) {\n this.challenge = challenge\n this.events.emit('challenge', challenge)\n }\n\n return response\n }\n}\n\ninterface Options {\n origin: string\n events: Emitter<Events>\n}\n\ninterface Init extends Omit<RequestInit, 'path' | 'headers'> {\n duplex?: 'half'\n body?: any\n headers?: Record<string, string>\n}\n\ninterface InitWithHeaders extends Init {\n headers: Record<string, string>\n}\n\ntype Fetch = typeof fetch\n\nexport { Agent }\nexport type { Init }\n","import type { Agent, Init } from './Agent'\nimport type { GenericError } from './Error'\nimport type { Faulty, OctetsEntry } from './Octets'\nimport type { Emitter } from 'mitt'\n\nclass Resource<T = unknown, E extends GenericError = GenericError> {\n private readonly agent: Agent\n private readonly path: string\n\n public constructor(options: Options) {\n this.agent = options.agent\n this.path = options.path\n }\n\n public async json<R = T, F extends E = E>(rel: string = '', init?: Init): Promise<R | F> {\n const abs = this.abs(rel)\n\n return await this.agent.json<R, F>(abs, init)\n }\n\n public async octets<T extends Record<string, unknown> = Record<string, unknown>, F extends E = E>(rel: string = '', init?: Init): Promise<[OctetsEntry, Emitter<Faulty<T>>] | F> {\n const abs = this.abs(rel)\n\n return await this.agent.octets<T, F>(abs, init)\n }\n\n private abs(rel: string): string {\n const base = new URL(this.path, 'uri://void')\n const url = new URL(rel, base)\n\n if (!url.pathname.endsWith('/'))\n url.pathname += '/'\n\n return url.pathname + url.search\n }\n}\n\ninterface Options {\n agent: Agent\n path: string\n}\n\nexport { Resource }\n"],"mappings":"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","names":["mitt","fetch","mitt","fetch"]}
1
+ {"version":3,"sources":["../source/Origin.ts","../source/Agent.ts","../source/Resource.ts"],"sourcesContent":["import mitt from 'mitt'\nimport { Agent } from './Agent'\nimport { Resource } from './Resource'\nimport type { Events } from './Events'\nimport type { Emitter } from 'mitt'\n\n/** Resoruce factory */\nclass Origin {\n public readonly events: Emitter<Events>\n private readonly agent: Agent\n\n constructor(options: Options) {\n this.events = mitt<Events>()\n\n this.agent = new Agent({\n origin: options.origin,\n events: this.events,\n })\n }\n\n public resource<T = unknown>(path: string) {\n return new Resource<T>({\n agent: this.agent,\n path,\n })\n }\n\n public authenticate(challenge: string | null) {\n this.agent.authenticate(challenge)\n }\n\n public use(fetch: Fetch) {\n this.agent.use(fetch)\n }\n}\n\nfunction connect(options: Options) {\n return new Origin(options)\n}\n\ninterface Options {\n origin: string\n}\n\ntype Fetch = typeof fetch\n\nexport { connect }\n","import { Err } from 'error-value'\nimport { meros } from 'meros/browser'\nimport mitt from 'mitt'\nimport type { GenericError } from './Error'\nimport type { Events } from './Events'\nimport type { Faulty, OctetsEntry, WorkflowStep } from './Octets'\nimport type { Emitter } from 'mitt'\n\nclass Agent {\n private readonly origin: string\n private readonly events: Emitter<Events>\n private fetch: Fetch = fetch\n\n private challenge: string | null = null\n\n constructor(options: Options) {\n this.origin = options.origin\n this.events = options.events\n }\n\n public async json<T, E extends GenericError = GenericError>(path: string, init?: RequestOptions): Promise<T | E> {\n const options = this.setup(init)\n const response = await this.request(path, options)\n\n const body = response.headers.get('content-type') === 'application/json'\n ? await response.json()\n : await response.text()\n\n if (response.ok)\n return body as T\n else {\n this.events.emit('error', { code: response.status, body })\n\n return new Err(response.status, body) as E\n }\n }\n\n public async multipart<T = unknown>(path: string, init?: RequestOptions): Promise<AsyncGenerator<T, void, undefined> | GenericError> {\n const options = this.setup(init)\n const response = await this.request(path, options)\n\n if (!response.ok)\n return new Err(response.status, await response.json())\n\n const generator = await meros(response) as AsyncGenerator<{ body: string }>\n const ack = await generator.next()\n\n if (JSON.parse(ack.value.body) !== 'ACK') throw new Error('No ACK')\n\n return (async function * () {\n for await (const chunk of generator) {\n const value = JSON.parse(chunk.body)\n\n if (value === 'FIN') return\n\n yield value\n }\n })()\n }\n\n public async octets<\n T extends Record<string, unknown> = Record<string, unknown>,\n E extends GenericError = GenericError\n >(path: string, init?: RequestOptions): Promise<[OctetsEntry, Emitter<Faulty<T>>] | E> {\n const generator = await this.multipart<OctetsEntry | WorkflowStep>(path, init)\n\n if (generator instanceof Error) return generator as E\n\n const chunk = await generator.next()\n const entry = chunk.value as OctetsEntry\n const emitter = mitt<Faulty<T>>()\n\n void (async () => {\n for await (const part of (generator as AsyncGenerator<WorkflowStep>)) {\n const payload =\n part.status === 'completed'\n ? part.output\n : new Err(part.error?.code ?? 'UNKNOWN', part.error?.message)\n\n emitter.emit(part.step, payload as T[typeof part.step])\n }\n\n emitter.off('*')\n })()\n\n return [entry, emitter]\n }\n\n public authenticate(challenge: string | null) {\n this.challenge = challenge\n }\n\n public use(fetch: Fetch) {\n this.fetch = fetch\n }\n\n private setup(init?: RequestOptions): InitWithHeaders {\n init ??= {}\n init.headers ??= {}\n init.headers['accept'] ??= 'application/json'\n\n if (init.credentials === 'include' && init.headers['authorization'] === undefined) {\n if (this.challenge === null)\n throw new Error('Credentials must be set before sending authenticated request')\n\n init.headers['authorization'] = this.challenge\n delete init.credentials // no cookies\n }\n\n if (init.body !== undefined)\n if (init.body instanceof File || init.body instanceof ReadableStream) {\n init.method ??= 'POST'\n init.duplex = 'half'\n init.headers['content-type'] ??= (init.body as File).type ?? 'application/octet-stream'\n } else {\n init.body = JSON.stringify(init.body)\n init.headers['content-type'] ??= 'application/json'\n }\n\n return init as InitWithHeaders\n }\n\n private async request(path: string, init: RequestOptions): Promise<Response> {\n const url = new URL(path, this.origin)\n const response = await this.fetch(url.href, init)\n\n const challenge = response.headers.get('authorization')\n\n if (challenge !== null) {\n this.challenge = challenge\n this.events.emit('challenge', challenge)\n }\n\n return response\n }\n}\n\ninterface Options {\n origin: string\n events: Emitter<Events>\n}\n\ninterface RequestOptions extends Omit<RequestInit, 'path' | 'headers'> {\n duplex?: 'half'\n body?: any\n headers?: Record<string, string>\n}\n\ninterface InitWithHeaders extends RequestOptions {\n headers: Record<string, string>\n}\n\ntype Fetch = typeof fetch\n\nexport { Agent }\nexport type { RequestOptions }\n","import type { Agent, RequestOptions } from './Agent'\nimport type { GenericError } from './Error'\nimport type { Faulty, OctetsEntry } from './Octets'\nimport type { Emitter } from 'mitt'\n\nclass Resource<T = unknown, E extends GenericError = GenericError> {\n private readonly agent: Agent\n private readonly path: string\n\n public constructor(options: Options) {\n this.agent = options.agent\n this.path = options.path\n }\n\n public async json<R = T, F extends E = E>(rel: string = '', init?: RequestOptions): Promise<R | F> {\n const abs = this.abs(rel)\n\n return await this.agent.json<R, F>(abs, init)\n }\n\n public async octets<T extends Record<string, unknown> = Record<string, unknown>, F extends E = E>(rel: string = '', init?: RequestOptions): Promise<[OctetsEntry, Emitter<Faulty<T>>] | F> {\n const abs = this.abs(rel)\n\n return await this.agent.octets<T, F>(abs, init)\n }\n\n private abs(rel: string): string {\n const base = new URL(this.path, 'uri://void')\n const url = new URL(rel, base)\n\n if (!url.pathname.endsWith('/'))\n url.pathname += '/'\n\n return url.pathname + url.search\n }\n}\n\ninterface Options {\n agent: Agent\n path: string\n}\n\nexport { Resource }\n"],"mappings":"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","names":["mitt","fetch","mitt","fetch"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@toa.io/origin",
3
- "version": "1.3.3",
3
+ "version": "1.4.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -12,15 +12,20 @@
12
12
  "homepage": "https://github.com/toa-io/origin#readme",
13
13
  "type": "module",
14
14
  "main": "dist/index.cjs",
15
- "module": "dist/index.mjs",
15
+ "module": "dist/index.js",
16
16
  "types": "dist/index.d.ts",
17
17
  "exports": {
18
18
  ".": {
19
- "import": "./dist/index.mjs",
19
+ "import": "./dist/index.js",
20
20
  "require": "./dist/index.cjs",
21
- "default": "./dist/index.mjs"
21
+ "default": "./dist/index.js"
22
22
  }
23
23
  },
24
+ "files": [
25
+ "dist",
26
+ "source",
27
+ "README.md"
28
+ ],
24
29
  "peerDependencies": {
25
30
  "typescript": "^5.8.3"
26
31
  },
package/source/Agent.ts CHANGED
@@ -18,7 +18,7 @@ class Agent {
18
18
  this.events = options.events
19
19
  }
20
20
 
21
- public async json<T, E extends GenericError = GenericError>(path: string, init?: Init): Promise<T | E> {
21
+ public async json<T, E extends GenericError = GenericError>(path: string, init?: RequestOptions): Promise<T | E> {
22
22
  const options = this.setup(init)
23
23
  const response = await this.request(path, options)
24
24
 
@@ -35,7 +35,7 @@ class Agent {
35
35
  }
36
36
  }
37
37
 
38
- public async multipart<T = unknown>(path: string, init?: Init): Promise<AsyncGenerator<T, void, undefined> | GenericError> {
38
+ public async multipart<T = unknown>(path: string, init?: RequestOptions): Promise<AsyncGenerator<T, void, undefined> | GenericError> {
39
39
  const options = this.setup(init)
40
40
  const response = await this.request(path, options)
41
41
 
@@ -61,7 +61,7 @@ class Agent {
61
61
  public async octets<
62
62
  T extends Record<string, unknown> = Record<string, unknown>,
63
63
  E extends GenericError = GenericError
64
- >(path: string, init?: Init): Promise<[OctetsEntry, Emitter<Faulty<T>>] | E> {
64
+ >(path: string, init?: RequestOptions): Promise<[OctetsEntry, Emitter<Faulty<T>>] | E> {
65
65
  const generator = await this.multipart<OctetsEntry | WorkflowStep>(path, init)
66
66
 
67
67
  if (generator instanceof Error) return generator as E
@@ -94,7 +94,7 @@ class Agent {
94
94
  this.fetch = fetch
95
95
  }
96
96
 
97
- private setup(init?: Init): InitWithHeaders {
97
+ private setup(init?: RequestOptions): InitWithHeaders {
98
98
  init ??= {}
99
99
  init.headers ??= {}
100
100
  init.headers['accept'] ??= 'application/json'
@@ -120,7 +120,7 @@ class Agent {
120
120
  return init as InitWithHeaders
121
121
  }
122
122
 
123
- private async request(path: string, init: Init): Promise<Response> {
123
+ private async request(path: string, init: RequestOptions): Promise<Response> {
124
124
  const url = new URL(path, this.origin)
125
125
  const response = await this.fetch(url.href, init)
126
126
 
@@ -140,17 +140,17 @@ interface Options {
140
140
  events: Emitter<Events>
141
141
  }
142
142
 
143
- interface Init extends Omit<RequestInit, 'path' | 'headers'> {
143
+ interface RequestOptions extends Omit<RequestInit, 'path' | 'headers'> {
144
144
  duplex?: 'half'
145
145
  body?: any
146
146
  headers?: Record<string, string>
147
147
  }
148
148
 
149
- interface InitWithHeaders extends Init {
149
+ interface InitWithHeaders extends RequestOptions {
150
150
  headers: Record<string, string>
151
151
  }
152
152
 
153
153
  type Fetch = typeof fetch
154
154
 
155
155
  export { Agent }
156
- export type { Init }
156
+ export type { RequestOptions }
@@ -1,4 +1,4 @@
1
- import type { Agent, Init } from './Agent'
1
+ import type { Agent, RequestOptions } from './Agent'
2
2
  import type { GenericError } from './Error'
3
3
  import type { Faulty, OctetsEntry } from './Octets'
4
4
  import type { Emitter } from 'mitt'
@@ -12,13 +12,13 @@ class Resource<T = unknown, E extends GenericError = GenericError> {
12
12
  this.path = options.path
13
13
  }
14
14
 
15
- public async json<R = T, F extends E = E>(rel: string = '', init?: Init): Promise<R | F> {
15
+ public async json<R = T, F extends E = E>(rel: string = '', init?: RequestOptions): Promise<R | F> {
16
16
  const abs = this.abs(rel)
17
17
 
18
18
  return await this.agent.json<R, F>(abs, init)
19
19
  }
20
20
 
21
- public async octets<T extends Record<string, unknown> = Record<string, unknown>, F extends E = E>(rel: string = '', init?: Init): Promise<[OctetsEntry, Emitter<Faulty<T>>] | F> {
21
+ public async octets<T extends Record<string, unknown> = Record<string, unknown>, F extends E = E>(rel: string = '', init?: RequestOptions): Promise<[OctetsEntry, Emitter<Faulty<T>>] | F> {
22
22
  const abs = this.abs(rel)
23
23
 
24
24
  return await this.agent.octets<T, F>(abs, init)
package/source/index.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export { connect } from './Origin'
2
2
  export type { GenericError } from './Error'
3
3
  export type { OctetsEntry, WorkflowStep } from './Octets'
4
+ export type { RequestOptions } from './Agent'
@@ -1,36 +0,0 @@
1
- name: Release
2
-
3
- on:
4
- push:
5
- branches:
6
- - dev
7
-
8
- permissions:
9
- contents: write
10
- issues: write
11
- pull-requests: write
12
-
13
- jobs:
14
- release:
15
- runs-on: ubuntu-latest
16
-
17
- steps:
18
- - name: Checkout
19
- uses: actions/checkout@v4
20
- with:
21
- fetch-depth: 0
22
- persist-credentials: false
23
-
24
- - name: Setup Node
25
- uses: actions/setup-node@v4
26
- with:
27
- node-version: "22"
28
-
29
- - name: Install dependencies
30
- run: npm ci
31
-
32
- - name: Semantic release
33
- env:
34
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
35
- NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
36
- run: npx semantic-release
package/.husky/pre-commit DELETED
@@ -1 +0,0 @@
1
- npm test
package/.releaserc DELETED
@@ -1,17 +0,0 @@
1
- {
2
- "branches": ["dev"],
3
- "plugins": [
4
- "@semantic-release/commit-analyzer",
5
- "@semantic-release/release-notes-generator",
6
-
7
- ["@semantic-release/changelog", { "changelogFile": "CHANGELOG.md" }],
8
- ["@semantic-release/npm"],
9
-
10
- ["@semantic-release/git", {
11
- "assets": ["package.json", "package-lock.json", "CHANGELOG.md"],
12
- "message": "chore(release): ${nextRelease.version}\n\n${nextRelease.notes}"
13
- }],
14
-
15
- "@semantic-release/github"
16
- ]
17
- }
@@ -1,10 +0,0 @@
1
- {
2
- "eslint.validate": [
3
- "javascript",
4
- "typescript",
5
- ],
6
- "editor.formatOnSave": false,
7
- "editor.codeActionsOnSave": {
8
- "source.fixAll.eslint": "explicit"
9
- }
10
- }
package/CHANGELOG.md DELETED
@@ -1,70 +0,0 @@
1
- ## [1.3.3](https://github.com/toa-io/origin/compare/v1.3.2...v1.3.3) (2025-10-06)
2
-
3
-
4
- ### Bug Fixes
5
-
6
- * add `tsup` arguments ([bf15eca](https://github.com/toa-io/origin/commit/bf15eca888b53cc33f41ea19d05f424e2b1ab1fa))
7
-
8
- ## [1.3.2](https://github.com/toa-io/origin/compare/v1.3.1...v1.3.2) (2025-10-06)
9
-
10
-
11
- ### Bug Fixes
12
-
13
- * add `tsup` ([313239a](https://github.com/toa-io/origin/commit/313239ac40799a450c304d4e2e72959baf7aaf05))
14
-
15
- ## [1.3.1](https://github.com/toa-io/origin/compare/v1.3.0...v1.3.1) (2025-10-06)
16
-
17
-
18
- ### Bug Fixes
19
-
20
- * rebuild package-lock ([3b3b253](https://github.com/toa-io/origin/commit/3b3b2537ee92d51f4d9e2d9804882d3ac78ebe3a))
21
-
22
- # [1.3.0](https://github.com/toa-io/origin/compare/v1.2.2...v1.3.0) (2025-10-06)
23
-
24
-
25
- ### Features
26
-
27
- * add type `module` ([ac98595](https://github.com/toa-io/origin/commit/ac985959aeb940a4a316e526625ab4b5e984608d))
28
-
29
- ## [1.2.2](https://github.com/toa-io/origin/compare/v1.2.1...v1.2.2) (2025-10-06)
30
-
31
-
32
- ### Bug Fixes
33
-
34
- * rename file ([de63ef8](https://github.com/toa-io/origin/commit/de63ef889d9ca247f36ddbb52453d46f0f7655ab))
35
-
36
- ## [1.2.1](https://github.com/toa-io/origin/compare/v1.2.0...v1.2.1) (2025-10-06)
37
-
38
-
39
- ### Bug Fixes
40
-
41
- * update tsconfig ([3a69b4a](https://github.com/toa-io/origin/commit/3a69b4a873675a1214d01b1c119df624a6978fd5))
42
-
43
- # [1.2.0](https://github.com/toa-io/origin/compare/v1.1.0...v1.2.0) (2025-10-06)
44
-
45
-
46
- ### Features
47
-
48
- * change type to `module` ([5b70fd5](https://github.com/toa-io/origin/commit/5b70fd5cb7cfacefcb05ea4d0b8fa7f0c5b58d9e))
49
-
50
- # [1.1.0](https://github.com/toa-io/origin/compare/v1.0.0...v1.1.0) (2025-10-06)
51
-
52
-
53
- ### Features
54
-
55
- * remove singleton ([df8e18a](https://github.com/toa-io/origin/commit/df8e18a4e9a5c065e9ea33e20e6437374c3bebb3))
56
-
57
- # 1.0.0 (2025-10-05)
58
-
59
-
60
- ### Bug Fixes
61
-
62
- * actually use `settings.delay` ([350af9c](https://github.com/toa-io/origin/commit/350af9c1db7874dafcbf6699f255c9fa7a4a021b))
63
- * assert origin ([e1c6dd1](https://github.com/toa-io/origin/commit/e1c6dd15ec31b2b9bb6b8fa2d16a193c6d2600ce))
64
-
65
-
66
- ### Features
67
-
68
- * import implementation ([b5b769f](https://github.com/toa-io/origin/commit/b5b769fc78c9b0e1a2886c0564066992501a5655))
69
- * set file type as content-type ([58e24f2](https://github.com/toa-io/origin/commit/58e24f246c07f753fe897f9828212a0d7a745e00))
70
- * update tsconfig ([7d583c1](https://github.com/toa-io/origin/commit/7d583c1c8fe7df2aca3cd2150cd3cb4628b6b1d4))
package/eslint.config.js DELETED
@@ -1,78 +0,0 @@
1
- import importPlugin from 'eslint-plugin-import'
2
- import neostandard from 'neostandard'
3
-
4
- export default [
5
- ...neostandard({
6
- ts: true,
7
- ignores: [
8
- ...neostandard.resolveIgnoresFromGitignore(),
9
- 'dist',
10
- ],
11
- }),
12
- {
13
- plugins: {
14
- import: importPlugin
15
- }
16
- },
17
- {
18
- rules: {
19
- 'no-void': ['error', { allowAsStatement: true }],
20
- curly: ['error', 'multi'],
21
- '@stylistic/space-before-function-paren': ['error', {
22
- asyncArrow: 'always',
23
- named: 'never',
24
- anonymous: 'never'
25
- }],
26
- '@stylistic/padding-line-between-statements': [
27
- 'error',
28
- {
29
- blankLine: 'always',
30
- prev: ['block-like', 'if', 'multiline-expression'],
31
- next: '*'
32
- },
33
- {
34
- blankLine: 'always',
35
- prev: '*',
36
- next: ['block-like', 'if', 'multiline-expression']
37
- },
38
- {
39
- blankLine: 'always',
40
- prev: ['const', 'let'],
41
- next: ['expression', 'for']
42
- },
43
- {
44
- blankLine: 'always',
45
- prev: 'expression',
46
- next: ['const', 'let']
47
- },
48
- {
49
- blankLine: 'always',
50
- prev: ['multiline-const', 'multiline-let'],
51
- next: '*'
52
- },
53
- {
54
- blankLine: 'always',
55
- prev: '*',
56
- next: ['multiline-const', 'multiline-let']
57
- },
58
- {
59
- blankLine: 'always',
60
- prev: '*',
61
- next: 'return'
62
- }
63
- ],
64
- 'import/order': ['error', {
65
- groups: ['builtin', 'external', 'internal', 'unknown', 'parent', 'sibling', 'index', 'type'],
66
- alphabetize: {
67
- order: 'asc'
68
- }
69
- }],
70
- },
71
- },
72
- {
73
- files: ['**/*.ts'],
74
- rules: {
75
- '@typescript-eslint/consistent-type-imports': 'error'
76
- }
77
- },
78
- ]
package/tsconfig.json DELETED
@@ -1,18 +0,0 @@
1
- {
2
- "$schema": "https://json.schemastore.org/tsconfig",
3
- "compilerOptions": {
4
- "strict": true,
5
- "esModuleInterop": true,
6
- "skipLibCheck": true,
7
- "forceConsistentCasingInFileNames": true,
8
- "target": "ES2022",
9
- "module": "ESNext",
10
- "moduleResolution": "Node",
11
- "declaration": true,
12
- "declarationDir": "./dist",
13
- "outDir": "./dist"
14
- },
15
- "include": [
16
- "source/**/*"
17
- ]
18
- }