@toa.io/origin 1.0.0 → 1.2.2

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.
Files changed (56) hide show
  1. package/.vscode/settings.json +8 -1
  2. package/CHANGELOG.md +28 -0
  3. package/README.md +8 -30
  4. package/eslint.config.js +3 -5
  5. package/package.json +1 -1
  6. package/source/Agent.ts +156 -0
  7. package/source/Error.ts +3 -0
  8. package/source/Evt.ts +3 -0
  9. package/source/Octets.ts +5 -6
  10. package/source/Origin.ts +47 -0
  11. package/source/Resource.ts +41 -16
  12. package/source/index.ts +3 -6
  13. package/transpiled/Agent.d.ts +30 -0
  14. package/transpiled/Agent.js +102 -0
  15. package/transpiled/Agent.js.map +1 -0
  16. package/transpiled/Error.d.ts +2 -0
  17. package/transpiled/Error.js +2 -0
  18. package/transpiled/Error.js.map +1 -0
  19. package/transpiled/Evt.d.ts +8 -0
  20. package/transpiled/Evt.js +2 -0
  21. package/transpiled/Evt.js.map +1 -0
  22. package/transpiled/Octets.d.ts +4 -7
  23. package/transpiled/Origin.d.ts +18 -0
  24. package/transpiled/Origin.js +32 -0
  25. package/transpiled/Origin.js.map +1 -0
  26. package/transpiled/Resource.d.ts +16 -9
  27. package/transpiled/Resource.js +22 -13
  28. package/transpiled/Resource.js.map +1 -1
  29. package/transpiled/index.d.ts +3 -6
  30. package/transpiled/index.js +1 -5
  31. package/transpiled/index.js.map +1 -1
  32. package/tsconfig.json +3 -5
  33. package/source/Failure.ts +0 -3
  34. package/source/Method.ts +0 -99
  35. package/source/events.ts +0 -20
  36. package/source/fail.ts +0 -13
  37. package/source/ok.ts +0 -15
  38. package/source/request.ts +0 -84
  39. package/transpiled/Failure.d.ts +0 -3
  40. package/transpiled/Failure.js +0 -4
  41. package/transpiled/Failure.js.map +0 -1
  42. package/transpiled/Method.d.ts +0 -15
  43. package/transpiled/Method.js +0 -71
  44. package/transpiled/Method.js.map +0 -1
  45. package/transpiled/events.d.ts +0 -15
  46. package/transpiled/events.js +0 -3
  47. package/transpiled/events.js.map +0 -1
  48. package/transpiled/fail.d.ts +0 -2
  49. package/transpiled/fail.js +0 -10
  50. package/transpiled/fail.js.map +0 -1
  51. package/transpiled/ok.d.ts +0 -1
  52. package/transpiled/ok.js +0 -17
  53. package/transpiled/ok.js.map +0 -1
  54. package/transpiled/request.d.ts +0 -15
  55. package/transpiled/request.js +0 -52
  56. package/transpiled/request.js.map +0 -1
@@ -0,0 +1,32 @@
1
+ import mitt from 'mitt';
2
+ import { Agent } from './Agent';
3
+ import { Resource } from './Resource';
4
+ /** Resoruce factory */
5
+ class Origin {
6
+ events;
7
+ agent;
8
+ constructor(options) {
9
+ this.events = mitt();
10
+ this.agent = new Agent({
11
+ origin: options.origin,
12
+ events: this.events,
13
+ });
14
+ }
15
+ resource(path) {
16
+ return new Resource({
17
+ agent: this.agent,
18
+ path,
19
+ });
20
+ }
21
+ authenticate(challenge) {
22
+ this.agent.authenticate(challenge);
23
+ }
24
+ use(fetch) {
25
+ this.agent.use(fetch);
26
+ }
27
+ }
28
+ function connect(options) {
29
+ return new Origin(options);
30
+ }
31
+ export { connect };
32
+ //# sourceMappingURL=Origin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Origin.js","sourceRoot":"","sources":["../source/Origin.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAIrC,uBAAuB;AACvB,MAAM,MAAM;IACM,MAAM,CAAiB;IACtB,KAAK,CAAO;IAE7B,YAAY,OAAgB;QAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,EAAU,CAAA;QAE5B,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC;YACrB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAA;IACJ,CAAC;IAEM,QAAQ,CAAc,IAAY;QACvC,OAAO,IAAI,QAAQ,CAAI;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI;SACL,CAAC,CAAA;IACJ,CAAC;IAEM,YAAY,CAAC,SAAwB;QAC1C,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;IACpC,CAAC;IAEM,GAAG,CAAC,KAAY;QACrB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACvB,CAAC;CACF;AAED,SAAS,OAAO,CAAC,OAAgB;IAC/B,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,CAAA;AAC5B,CAAC;AAQD,OAAO,EAAE,OAAO,EAAE,CAAA"}
@@ -1,10 +1,17 @@
1
- import { Method } from './Method';
2
- import type { Options } from './request';
3
- export declare class Resource<T> {
4
- get: Method<T>;
5
- post: Method<T>;
6
- patch: Method<T>;
7
- put: Method<T>;
8
- delete: Method<never>;
9
- constructor(base: string, options?: Omit<Options, 'method'>);
1
+ import type { Agent, Init } from './Agent';
2
+ import type { GenericError } from './Error';
3
+ import type { Faulty, OctetsEntry } from './Octets';
4
+ import type { Emitter } from 'mitt';
5
+ declare class Resource<T = unknown, E extends GenericError = GenericError> {
6
+ private readonly agent;
7
+ private readonly path;
8
+ constructor(options: Options);
9
+ json<R = T, F extends E = E>(rel?: string, init?: Init): Promise<R | F>;
10
+ octets<T extends Record<string, unknown> = Record<string, unknown>, F extends E = E>(rel?: string, init?: Init): Promise<[OctetsEntry, Emitter<Faulty<T>>] | F>;
11
+ private abs;
10
12
  }
13
+ interface Options {
14
+ agent: Agent;
15
+ path: string;
16
+ }
17
+ export { Resource };
@@ -1,16 +1,25 @@
1
- import { Method } from './Method';
2
- export class Resource {
3
- get;
4
- post;
5
- patch;
6
- put;
7
- delete;
8
- constructor(base, options) {
9
- this.get = new Method(base, { method: 'GET', ...options });
10
- this.post = new Method(base, { method: 'POST', ...options });
11
- this.patch = new Method(base, { method: 'PATCH', ...options });
12
- this.put = new Method(base, { method: 'PUT', ...options });
13
- this.delete = new Method(base, { method: 'DELETE', ...options });
1
+ class Resource {
2
+ agent;
3
+ path;
4
+ constructor(options) {
5
+ this.agent = options.agent;
6
+ this.path = options.path;
7
+ }
8
+ async json(rel = '', init) {
9
+ const abs = this.abs(rel);
10
+ return await this.agent.json(abs, init);
11
+ }
12
+ async octets(rel = '', init) {
13
+ const abs = this.abs(rel);
14
+ return await this.agent.octets(abs, init);
15
+ }
16
+ abs(rel) {
17
+ const base = new URL(this.path, 'uri://void');
18
+ const url = new URL(rel, base);
19
+ if (!url.pathname.endsWith('/'))
20
+ url.pathname += '/';
21
+ return url.pathname + url.search;
14
22
  }
15
23
  }
24
+ export { Resource };
16
25
  //# sourceMappingURL=Resource.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Resource.js","sourceRoot":"","sources":["../source/Resource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAGjC,MAAM,OAAO,QAAQ;IACZ,GAAG,CAAW;IACd,IAAI,CAAW;IACf,KAAK,CAAW;IAChB,GAAG,CAAW;IACd,MAAM,CAAe;IAE5B,YAAmB,IAAY,EAAE,OAAiC;QAChE,IAAI,CAAC,GAAG,GAAG,IAAI,MAAM,CAAI,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;QAC7D,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM,CAAI,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;QAC/D,IAAI,CAAC,KAAK,GAAG,IAAI,MAAM,CAAI,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;QACjE,IAAI,CAAC,GAAG,GAAG,IAAI,MAAM,CAAI,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;QAC7D,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;IAClE,CAAC;CACF"}
1
+ {"version":3,"file":"Resource.js","sourceRoot":"","sources":["../source/Resource.ts"],"names":[],"mappings":"AAKA,MAAM,QAAQ;IACK,KAAK,CAAO;IACZ,IAAI,CAAQ;IAE7B,YAAmB,OAAgB;QACjC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;QAC1B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;IAC1B,CAAC;IAEM,KAAK,CAAC,IAAI,CAAyB,MAAc,EAAE,EAAE,IAAW;QACrE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAEzB,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAO,GAAG,EAAE,IAAI,CAAC,CAAA;IAC/C,CAAC;IAEM,KAAK,CAAC,MAAM,CAA+E,MAAc,EAAE,EAAE,IAAW;QAC7H,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAEzB,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAO,GAAG,EAAE,IAAI,CAAC,CAAA;IACjD,CAAC;IAEO,GAAG,CAAC,GAAW;QACrB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;QAC7C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QAE9B,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;YAC7B,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAA;QAErB,OAAO,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAA;IAClC,CAAC;CACF;AAOD,OAAO,EAAE,QAAQ,EAAE,CAAA"}
@@ -1,6 +1,3 @@
1
- export { Resource } from './Resource';
2
- export { Method } from './Method';
3
- export { Failure } from './Failure';
4
- export { authenticate, request, use, connect, type Options } from './request';
5
- export { events } from './events';
6
- export type * from './Octets';
1
+ export { connect } from './Origin';
2
+ export type { GenericError } from './Error';
3
+ export type { OctetsEntry, WorkflowStep } from './Octets';
@@ -1,6 +1,2 @@
1
- export { Resource } from './Resource';
2
- export { Method } from './Method';
3
- export { Failure } from './Failure';
4
- export { authenticate, request, use, connect } from './request';
5
- export { events } from './events';
1
+ export { connect } from './Origin';
6
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../source/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAgB,MAAM,WAAW,CAAA;AAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../source/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA"}
package/tsconfig.json CHANGED
@@ -3,19 +3,17 @@
3
3
  "compilerOptions": {
4
4
  "outDir": "./transpiled",
5
5
  "rootDir": "./source",
6
- "moduleResolution": "bundler",
7
- "module": "esnext",
8
- "target": "esnext",
9
6
  "sourceMap": true,
10
7
  "declaration": true,
11
8
  "esModuleInterop": true,
12
9
  "skipLibCheck": true,
13
10
  "incremental": true,
14
11
  "strict": true,
15
- "experimentalDecorators": true,
16
12
  "noImplicitOverride": true,
17
13
  "allowJs": true,
18
- "forceConsistentCasingInFileNames": true
14
+ "module": "ESNext",
15
+ "target": "ES2022",
16
+ "moduleResolution": "node"
19
17
  },
20
18
  "include": [
21
19
  "source/**/*"
package/source/Failure.ts DELETED
@@ -1,3 +0,0 @@
1
- import { Err } from 'error-value'
2
-
3
- export class Failure extends Err<number> {}
package/source/Method.ts DELETED
@@ -1,99 +0,0 @@
1
- import { Err } from 'error-value'
2
- import mitt, { type Emitter } from 'mitt'
3
- import { request, type Options } from './request'
4
- import type { Failure } from './Failure'
5
- import type { OctetsEntry, WorkflowStep } from './Octets'
6
-
7
- export class Method<Entity = never> {
8
- private readonly base: string
9
- private readonly options?: Options
10
-
11
- constructor(base: string, options?: Options) {
12
- this.base = base
13
- this.options = options
14
- }
15
-
16
- public async none(segments?: string[] | string, options?: Options): Promise<void | Failure> {
17
- return await this.request(segments, options)
18
- }
19
-
20
- public async value<T = Entity>(segments?: string[] | string, options?: Options): Promise<T | Failure> {
21
- return await this.request<T>(segments, options)
22
- }
23
-
24
- public async array<T = Entity[]>(segments?: string[] | string, options?: Options): Promise<T[] | Failure> {
25
- return await this.request<T[]>(segments, options)
26
- }
27
-
28
- public async multipart<T = Entity>(
29
- segments?: string[] | string,
30
- options?: Options
31
- ): Promise<AsyncGenerator<T, void, undefined> | Failure> {
32
- const generator = await this.request<AsyncGenerator<{ body: string }>>(segments, options)
33
-
34
- if (generator instanceof Error) return generator
35
-
36
- const ack = await generator.next()
37
-
38
- if (JSON.parse(ack.value.body) !== 'ACK') throw new Error('No ACK')
39
-
40
- return (async function * () {
41
- for await (const chunk of generator) {
42
- const value = JSON.parse(chunk.body)
43
-
44
- if (value === 'FIN') return
45
-
46
- yield value
47
- }
48
- })()
49
- }
50
-
51
- public async octets<Events extends Record<string, unknown>>(
52
- segments?: string[],
53
- options?: Options
54
- ): Promise<[OctetsEntry, Emitter<Events>] | Failure> {
55
- const generator = await this.multipart(segments, options)
56
-
57
- if (generator instanceof Error) return generator
58
-
59
- const chunk = await generator.next()
60
- const entry = chunk.value as OctetsEntry
61
- const emitter = mitt<Events>()
62
-
63
- void (async () => {
64
- for await (const part of generator) {
65
- const workflow = part as WorkflowStep
66
-
67
- console.debug('octets chunk:', workflow)
68
-
69
- const payload =
70
- workflow.error === undefined
71
- ? workflow.output
72
- : new Err(workflow.error.code, workflow.error.message)
73
-
74
- emitter.emit(workflow.step, payload as Events[typeof workflow.step])
75
- }
76
-
77
- emitter.off('*')
78
- })()
79
-
80
- return [entry, emitter]
81
- }
82
-
83
- private async request<T>(segments?: string | string[], options?: Options): Promise<T | Failure> {
84
- const path = toPath(segments)
85
-
86
- return await request<T>(`${this.base}${path}`, {
87
- ...this.options,
88
- ...options
89
- })
90
- }
91
- }
92
-
93
- function toPath(segments: string | string[] | undefined): string {
94
- if (segments === undefined) return ''
95
-
96
- if (typeof segments === 'string') return segments
97
-
98
- return segments.filter((s) => s !== undefined).join('/') + '/'
99
- }
package/source/events.ts DELETED
@@ -1,20 +0,0 @@
1
- import mitt from 'mitt'
2
- import type { Options } from './request'
3
-
4
- export const events = mitt<Events>()
5
-
6
- export interface Events extends Record<string | symbol, unknown> {
7
- challenge: string
8
-
9
- request: {
10
- id: string
11
- path: string
12
- options: Options
13
- }
14
-
15
- response: {
16
- id: string
17
- response: Response
18
- duration: number
19
- }
20
- }
package/source/fail.ts DELETED
@@ -1,13 +0,0 @@
1
- import { Failure } from './Failure'
2
- import { events } from './events'
3
-
4
- export async function fail(response: Response): Promise<Failure> {
5
- const payload =
6
- response.headers.get('content-type') === 'application/json'
7
- ? await response.json()
8
- : await response.text()
9
-
10
- events.emit(response.status, payload)
11
-
12
- return new Failure(response.status)
13
- }
package/source/ok.ts DELETED
@@ -1,15 +0,0 @@
1
- import { meros } from 'meros/browser'
2
- import { events } from './events'
3
-
4
- export async function ok<T>(response: Response): Promise<T> {
5
- const challenge = response.headers.get('authorization')
6
-
7
- if (challenge !== null) events.emit('challenge', challenge)
8
-
9
- const type = response.headers.get('content-type')
10
-
11
- if (type?.startsWith('multipart/')) return (await meros(response)) as T
12
- else if (type === 'application/json') return (await response.json()) as T
13
- else if (type?.startsWith('text/')) return (await response.text()) as T
14
- else return (await response.blob()) as T
15
- }
package/source/request.ts DELETED
@@ -1,84 +0,0 @@
1
- import { events } from './events'
2
- import { fail } from './fail'
3
- import { ok } from './ok'
4
- import type { Failure } from './Failure'
5
-
6
- let challenge: string | null = null
7
-
8
- export function authenticate(value: string | null) {
9
- challenge = value
10
- }
11
-
12
- let _fetch = fetch
13
-
14
- export function use(fetcher: typeof fetch) {
15
- _fetch = fetcher
16
- }
17
-
18
- interface Settings {
19
- origin: string
20
- delay?: number
21
- }
22
-
23
- const settings: Partial<Settings> = {} as const
24
-
25
- export function connect(values: Settings) {
26
- Object.assign(settings, values)
27
- }
28
-
29
- export async function request<T = unknown>(
30
- path: string,
31
- options: Options = {}
32
- ): Promise<T | Failure> {
33
- if (settings.origin === undefined)
34
- throw new Error('Origin not connected')
35
-
36
- options.headers ??= {}
37
- options.headers['accept'] ??= 'application/json'
38
-
39
- if (settings.delay)
40
- options.headers['sleep'] = Math.round((Math.random() * settings.delay) / 2 + settings.delay / 2).toString()
41
-
42
- const authentication = options.credentials === 'include'
43
-
44
- if (options.body !== undefined)
45
- if (options.body instanceof File || options.body instanceof ReadableStream) {
46
- options.method ??= 'POST'
47
- options.duplex = 'half'
48
- options.headers['content-type'] ??= (options.body as File).type ?? 'application/octet-stream'
49
- } else {
50
- options.body = JSON.stringify(options.body)
51
- options.headers['content-type'] ??= 'application/json'
52
- }
53
-
54
- if (authentication && options.headers['authorization'] === undefined) {
55
- if (challenge === null)
56
- throw new Error(`Credentials must be set before sending authenticated request ${options.method ?? 'GET'} ${path}`)
57
-
58
- options.headers['authorization'] = challenge
59
- delete options.credentials // no cookies
60
- }
61
-
62
- const start = performance.now()
63
-
64
- const id =
65
- typeof window !== 'undefined' && (window.crypto.randomUUID?.() ?? Math.random().toString())
66
-
67
- if (id)
68
- events.emit('request', { id, path, options })
69
-
70
- const response = await _fetch(settings.origin + path, options)
71
-
72
- if (id)
73
- events.emit('response', { id, response, duration: performance.now() - start })
74
-
75
- if (!response.ok) return await fail(response)
76
- else return await ok<T>(response)
77
- }
78
-
79
- export interface Options extends Omit<RequestInit, 'headers'> {
80
- duplex?: 'half'
81
-
82
- body?: any
83
- headers?: Record<string, string>
84
- }
@@ -1,3 +0,0 @@
1
- import { Err } from 'error-value';
2
- export declare class Failure extends Err<number> {
3
- }
@@ -1,4 +0,0 @@
1
- import { Err } from 'error-value';
2
- export class Failure extends Err {
3
- }
4
- //# sourceMappingURL=Failure.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Failure.js","sourceRoot":"","sources":["../source/Failure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAEjC,MAAM,OAAO,OAAQ,SAAQ,GAAW;CAAG"}
@@ -1,15 +0,0 @@
1
- import { type Emitter } from 'mitt';
2
- import { type Options } from './request';
3
- import type { Failure } from './Failure';
4
- import type { OctetsEntry } from './Octets';
5
- export declare class Method<Entity = never> {
6
- private readonly base;
7
- private readonly options?;
8
- constructor(base: string, options?: Options);
9
- none(segments?: string[] | string, options?: Options): Promise<void | Failure>;
10
- value<T = Entity>(segments?: string[] | string, options?: Options): Promise<T | Failure>;
11
- array<T = Entity[]>(segments?: string[] | string, options?: Options): Promise<T[] | Failure>;
12
- multipart<T = Entity>(segments?: string[] | string, options?: Options): Promise<AsyncGenerator<T, void, undefined> | Failure>;
13
- octets<Events extends Record<string, unknown>>(segments?: string[], options?: Options): Promise<[OctetsEntry, Emitter<Events>] | Failure>;
14
- private request;
15
- }
@@ -1,71 +0,0 @@
1
- import { Err } from 'error-value';
2
- import mitt from 'mitt';
3
- import { request } from './request';
4
- export class Method {
5
- base;
6
- options;
7
- constructor(base, options) {
8
- this.base = base;
9
- this.options = options;
10
- }
11
- async none(segments, options) {
12
- return await this.request(segments, options);
13
- }
14
- async value(segments, options) {
15
- return await this.request(segments, options);
16
- }
17
- async array(segments, options) {
18
- return await this.request(segments, options);
19
- }
20
- async multipart(segments, options) {
21
- const generator = await this.request(segments, options);
22
- if (generator instanceof Error)
23
- return generator;
24
- const ack = await generator.next();
25
- if (JSON.parse(ack.value.body) !== 'ACK')
26
- throw new Error('No ACK');
27
- return (async function* () {
28
- for await (const chunk of generator) {
29
- const value = JSON.parse(chunk.body);
30
- if (value === 'FIN')
31
- return;
32
- yield value;
33
- }
34
- })();
35
- }
36
- async octets(segments, options) {
37
- const generator = await this.multipart(segments, options);
38
- if (generator instanceof Error)
39
- return generator;
40
- const chunk = await generator.next();
41
- const entry = chunk.value;
42
- const emitter = mitt();
43
- void (async () => {
44
- for await (const part of generator) {
45
- const workflow = part;
46
- console.debug('octets chunk:', workflow);
47
- const payload = workflow.error === undefined
48
- ? workflow.output
49
- : new Err(workflow.error.code, workflow.error.message);
50
- emitter.emit(workflow.step, payload);
51
- }
52
- emitter.off('*');
53
- })();
54
- return [entry, emitter];
55
- }
56
- async request(segments, options) {
57
- const path = toPath(segments);
58
- return await request(`${this.base}${path}`, {
59
- ...this.options,
60
- ...options
61
- });
62
- }
63
- }
64
- function toPath(segments) {
65
- if (segments === undefined)
66
- return '';
67
- if (typeof segments === 'string')
68
- return segments;
69
- return segments.filter((s) => s !== undefined).join('/') + '/';
70
- }
71
- //# sourceMappingURL=Method.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Method.js","sourceRoot":"","sources":["../source/Method.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- import type { Options } from './request';
2
- export declare const events: import("mitt").Emitter<Events>;
3
- export interface Events extends Record<string | symbol, unknown> {
4
- challenge: string;
5
- request: {
6
- id: string;
7
- path: string;
8
- options: Options;
9
- };
10
- response: {
11
- id: string;
12
- response: Response;
13
- duration: number;
14
- };
15
- }
@@ -1,3 +0,0 @@
1
- import mitt from 'mitt';
2
- export const events = mitt();
3
- //# sourceMappingURL=events.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../source/events.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AAGvB,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,EAAU,CAAA"}
@@ -1,2 +0,0 @@
1
- import { Failure } from './Failure';
2
- export declare function fail(response: Response): Promise<Failure>;
@@ -1,10 +0,0 @@
1
- import { Failure } from './Failure';
2
- import { events } from './events';
3
- export async function fail(response) {
4
- const payload = response.headers.get('content-type') === 'application/json'
5
- ? await response.json()
6
- : await response.text();
7
- events.emit(response.status, payload);
8
- return new Failure(response.status);
9
- }
10
- //# sourceMappingURL=fail.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fail.js","sourceRoot":"","sources":["../source/fail.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjC,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,QAAkB;IAC3C,MAAM,OAAO,GACX,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,kBAAkB;QACzD,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE;QACvB,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAE3B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAErC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;AACrC,CAAC"}
@@ -1 +0,0 @@
1
- export declare function ok<T>(response: Response): Promise<T>;
package/transpiled/ok.js DELETED
@@ -1,17 +0,0 @@
1
- import { meros } from 'meros/browser';
2
- import { events } from './events';
3
- export async function ok(response) {
4
- const challenge = response.headers.get('authorization');
5
- if (challenge !== null)
6
- events.emit('challenge', challenge);
7
- const type = response.headers.get('content-type');
8
- if (type?.startsWith('multipart/'))
9
- return (await meros(response));
10
- else if (type === 'application/json')
11
- return (await response.json());
12
- else if (type?.startsWith('text/'))
13
- return (await response.text());
14
- else
15
- return (await response.blob());
16
- }
17
- //# sourceMappingURL=ok.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ok.js","sourceRoot":"","sources":["../source/ok.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjC,MAAM,CAAC,KAAK,UAAU,EAAE,CAAI,QAAkB;IAC5C,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;IAEvD,IAAI,SAAS,KAAK,IAAI;QAAE,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;IAE3D,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;IAEjD,IAAI,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,CAAC,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAM,CAAA;SAClE,IAAI,IAAI,KAAK,kBAAkB;QAAE,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAA;SACpE,IAAI,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAA;;QAClE,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAA;AAC1C,CAAC"}
@@ -1,15 +0,0 @@
1
- import type { Failure } from './Failure';
2
- export declare function authenticate(value: string | null): void;
3
- export declare function use(fetcher: typeof fetch): void;
4
- interface Settings {
5
- origin: string;
6
- delay?: number;
7
- }
8
- export declare function connect(values: Settings): void;
9
- export declare function request<T = unknown>(path: string, options?: Options): Promise<T | Failure>;
10
- export interface Options extends Omit<RequestInit, 'headers'> {
11
- duplex?: 'half';
12
- body?: any;
13
- headers?: Record<string, string>;
14
- }
15
- export {};