@toa.io/origin 0.1.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.
- package/.github/workflows/release.yaml +36 -0
- package/.releaserc +17 -0
- package/.vscode/settings.json +8 -1
- package/CHANGELOG.md +42 -0
- package/README.md +8 -30
- package/eslint.config.js +3 -5
- package/package.json +12 -4
- package/source/Agent.ts +156 -0
- package/source/Error.ts +3 -0
- package/source/Evt.ts +3 -0
- package/source/Octets.ts +5 -6
- package/source/Origin.ts +47 -0
- package/source/Resource.ts +41 -16
- package/source/index.ts +3 -6
- package/transpiled/Agent.d.ts +30 -0
- package/transpiled/Agent.js +102 -0
- package/transpiled/Agent.js.map +1 -0
- package/transpiled/Error.d.ts +2 -0
- package/transpiled/Error.js +2 -0
- package/transpiled/Error.js.map +1 -0
- package/transpiled/Evt.d.ts +8 -0
- package/transpiled/Evt.js +2 -0
- package/transpiled/Evt.js.map +1 -0
- package/transpiled/Octets.d.ts +4 -7
- package/transpiled/Octets.js +1 -2
- package/transpiled/Origin.d.ts +18 -0
- package/transpiled/Origin.js +32 -0
- package/transpiled/Origin.js.map +1 -0
- package/transpiled/Resource.d.ts +16 -9
- package/transpiled/Resource.js +21 -16
- package/transpiled/Resource.js.map +1 -1
- package/transpiled/index.d.ts +3 -6
- package/transpiled/index.js +1 -16
- package/transpiled/index.js.map +1 -1
- package/tsconfig.json +4 -5
- package/source/Failure.ts +0 -3
- package/source/Method.ts +0 -99
- package/source/events.ts +0 -20
- package/source/fail.ts +0 -13
- package/source/ok.ts +0 -15
- package/source/request.ts +0 -84
- package/transpiled/Failure.d.ts +0 -3
- package/transpiled/Failure.js +0 -8
- package/transpiled/Failure.js.map +0 -1
- package/transpiled/Method.d.ts +0 -15
- package/transpiled/Method.js +0 -78
- package/transpiled/Method.js.map +0 -1
- package/transpiled/events.d.ts +0 -15
- package/transpiled/events.js +0 -9
- package/transpiled/events.js.map +0 -1
- package/transpiled/fail.d.ts +0 -2
- package/transpiled/fail.js +0 -13
- package/transpiled/fail.js.map +0 -1
- package/transpiled/ok.d.ts +0 -1
- package/transpiled/ok.js +0 -20
- package/transpiled/ok.js.map +0 -1
- package/transpiled/request.d.ts +0 -15
- package/transpiled/request.js +0 -58
- package/transpiled/request.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Error.js","sourceRoot":"","sources":["../source/Error.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Evt.js","sourceRoot":"","sources":["../source/Evt.ts"],"names":[],"mappings":""}
|
package/transpiled/Octets.d.ts
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
|
+
import type { Err } from 'error-value';
|
|
1
2
|
export interface OctetsEntry {
|
|
2
3
|
id: string;
|
|
3
4
|
}
|
|
4
|
-
export interface WorkflowStep<K = string, T = unknown> {
|
|
5
|
+
export interface WorkflowStep<K extends string = string, T = unknown, E extends Err = Err> {
|
|
5
6
|
step: K;
|
|
6
7
|
status: 'completed' | 'exception';
|
|
7
8
|
output?: T;
|
|
8
|
-
error:
|
|
9
|
+
error: E;
|
|
9
10
|
}
|
|
10
|
-
|
|
11
|
-
code: string;
|
|
12
|
-
message?: string;
|
|
13
|
-
}
|
|
14
|
-
export {};
|
|
11
|
+
export type Faulty<T extends Record<string, unknown>> = Record<keyof T, T[keyof T] | Err>;
|
package/transpiled/Octets.js
CHANGED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Resource } from './Resource';
|
|
2
|
+
import type { Events } from './Evt';
|
|
3
|
+
import type { Emitter } from 'mitt';
|
|
4
|
+
/** Resoruce factory */
|
|
5
|
+
declare class Origin {
|
|
6
|
+
readonly events: Emitter<Events>;
|
|
7
|
+
private readonly agent;
|
|
8
|
+
constructor(options: Options);
|
|
9
|
+
resource<T = unknown>(path: string): Resource<T, import("./Error").GenericError>;
|
|
10
|
+
authenticate(challenge: string | null): void;
|
|
11
|
+
use(fetch: Fetch): void;
|
|
12
|
+
}
|
|
13
|
+
declare function connect(options: Options): Origin;
|
|
14
|
+
interface Options {
|
|
15
|
+
origin: string;
|
|
16
|
+
}
|
|
17
|
+
type Fetch = typeof fetch;
|
|
18
|
+
export { connect };
|
|
@@ -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"}
|
package/transpiled/Resource.d.ts
CHANGED
|
@@ -1,10 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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 };
|
package/transpiled/Resource.js
CHANGED
|
@@ -1,20 +1,25 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Resource = void 0;
|
|
4
|
-
const Method_1 = require("./Method");
|
|
5
1
|
class Resource {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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;
|
|
17
22
|
}
|
|
18
23
|
}
|
|
19
|
-
|
|
24
|
+
export { Resource };
|
|
20
25
|
//# sourceMappingURL=Resource.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Resource.js","sourceRoot":"","sources":["../source/Resource.ts"],"names":[],"mappings":"
|
|
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"}
|
package/transpiled/index.d.ts
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
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';
|
package/transpiled/index.js
CHANGED
|
@@ -1,17 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.events = exports.connect = exports.use = exports.request = exports.authenticate = exports.Failure = exports.Method = exports.Resource = void 0;
|
|
4
|
-
var Resource_1 = require("./Resource");
|
|
5
|
-
Object.defineProperty(exports, "Resource", { enumerable: true, get: function () { return Resource_1.Resource; } });
|
|
6
|
-
var Method_1 = require("./Method");
|
|
7
|
-
Object.defineProperty(exports, "Method", { enumerable: true, get: function () { return Method_1.Method; } });
|
|
8
|
-
var Failure_1 = require("./Failure");
|
|
9
|
-
Object.defineProperty(exports, "Failure", { enumerable: true, get: function () { return Failure_1.Failure; } });
|
|
10
|
-
var request_1 = require("./request");
|
|
11
|
-
Object.defineProperty(exports, "authenticate", { enumerable: true, get: function () { return request_1.authenticate; } });
|
|
12
|
-
Object.defineProperty(exports, "request", { enumerable: true, get: function () { return request_1.request; } });
|
|
13
|
-
Object.defineProperty(exports, "use", { enumerable: true, get: function () { return request_1.use; } });
|
|
14
|
-
Object.defineProperty(exports, "connect", { enumerable: true, get: function () { return request_1.connect; } });
|
|
15
|
-
var events_1 = require("./events");
|
|
16
|
-
Object.defineProperty(exports, "events", { enumerable: true, get: function () { return events_1.events; } });
|
|
1
|
+
export { connect } from './Origin';
|
|
17
2
|
//# sourceMappingURL=index.js.map
|
package/transpiled/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../source/index.ts"],"names":[],"mappings":"
|
|
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
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
{
|
|
2
|
+
"$schema": "https://json.schemastore.org/tsconfig",
|
|
2
3
|
"compilerOptions": {
|
|
3
4
|
"outDir": "./transpiled",
|
|
4
5
|
"rootDir": "./source",
|
|
5
|
-
"module": "commonjs",
|
|
6
|
-
"moduleResolution": "node",
|
|
7
|
-
"target": "ESNext",
|
|
8
6
|
"sourceMap": true,
|
|
9
7
|
"declaration": true,
|
|
10
8
|
"esModuleInterop": true,
|
|
11
9
|
"skipLibCheck": true,
|
|
12
10
|
"incremental": true,
|
|
13
11
|
"strict": true,
|
|
14
|
-
"experimentalDecorators": true,
|
|
15
12
|
"noImplicitOverride": true,
|
|
16
13
|
"allowJs": true,
|
|
17
|
-
"
|
|
14
|
+
"module": "ESNext",
|
|
15
|
+
"target": "ES2022",
|
|
16
|
+
"moduleResolution": "node"
|
|
18
17
|
},
|
|
19
18
|
"include": [
|
|
20
19
|
"source/**/*"
|
package/source/Failure.ts
DELETED
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
|
-
}
|
package/transpiled/Failure.d.ts
DELETED
package/transpiled/Failure.js
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Failure = void 0;
|
|
4
|
-
const error_value_1 = require("error-value");
|
|
5
|
-
class Failure extends error_value_1.Err {
|
|
6
|
-
}
|
|
7
|
-
exports.Failure = Failure;
|
|
8
|
-
//# sourceMappingURL=Failure.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Failure.js","sourceRoot":"","sources":["../source/Failure.ts"],"names":[],"mappings":";;;AAAA,6CAAiC;AAEjC,MAAa,OAAQ,SAAQ,iBAAW;CAAG;AAA3C,0BAA2C"}
|
package/transpiled/Method.d.ts
DELETED
|
@@ -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
|
-
}
|
package/transpiled/Method.js
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.Method = void 0;
|
|
7
|
-
const error_value_1 = require("error-value");
|
|
8
|
-
const mitt_1 = __importDefault(require("mitt"));
|
|
9
|
-
const request_1 = require("./request");
|
|
10
|
-
class Method {
|
|
11
|
-
base;
|
|
12
|
-
options;
|
|
13
|
-
constructor(base, options) {
|
|
14
|
-
this.base = base;
|
|
15
|
-
this.options = options;
|
|
16
|
-
}
|
|
17
|
-
async none(segments, options) {
|
|
18
|
-
return await this.request(segments, options);
|
|
19
|
-
}
|
|
20
|
-
async value(segments, options) {
|
|
21
|
-
return await this.request(segments, options);
|
|
22
|
-
}
|
|
23
|
-
async array(segments, options) {
|
|
24
|
-
return await this.request(segments, options);
|
|
25
|
-
}
|
|
26
|
-
async multipart(segments, options) {
|
|
27
|
-
const generator = await this.request(segments, options);
|
|
28
|
-
if (generator instanceof Error)
|
|
29
|
-
return generator;
|
|
30
|
-
const ack = await generator.next();
|
|
31
|
-
if (JSON.parse(ack.value.body) !== 'ACK')
|
|
32
|
-
throw new Error('No ACK');
|
|
33
|
-
return (async function* () {
|
|
34
|
-
for await (const chunk of generator) {
|
|
35
|
-
const value = JSON.parse(chunk.body);
|
|
36
|
-
if (value === 'FIN')
|
|
37
|
-
return;
|
|
38
|
-
yield value;
|
|
39
|
-
}
|
|
40
|
-
})();
|
|
41
|
-
}
|
|
42
|
-
async octets(segments, options) {
|
|
43
|
-
const generator = await this.multipart(segments, options);
|
|
44
|
-
if (generator instanceof Error)
|
|
45
|
-
return generator;
|
|
46
|
-
const chunk = await generator.next();
|
|
47
|
-
const entry = chunk.value;
|
|
48
|
-
const emitter = (0, mitt_1.default)();
|
|
49
|
-
void (async () => {
|
|
50
|
-
for await (const part of generator) {
|
|
51
|
-
const workflow = part;
|
|
52
|
-
console.debug('octets chunk:', workflow);
|
|
53
|
-
const payload = workflow.error === undefined
|
|
54
|
-
? workflow.output
|
|
55
|
-
: new error_value_1.Err(workflow.error.code, workflow.error.message);
|
|
56
|
-
emitter.emit(workflow.step, payload);
|
|
57
|
-
}
|
|
58
|
-
emitter.off('*');
|
|
59
|
-
})();
|
|
60
|
-
return [entry, emitter];
|
|
61
|
-
}
|
|
62
|
-
async request(segments, options) {
|
|
63
|
-
const path = toPath(segments);
|
|
64
|
-
return await (0, request_1.request)(`${this.base}${path}`, {
|
|
65
|
-
...this.options,
|
|
66
|
-
...options
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
exports.Method = Method;
|
|
71
|
-
function toPath(segments) {
|
|
72
|
-
if (segments === undefined)
|
|
73
|
-
return '';
|
|
74
|
-
if (typeof segments === 'string')
|
|
75
|
-
return segments;
|
|
76
|
-
return segments.filter((s) => s !== undefined).join('/') + '/';
|
|
77
|
-
}
|
|
78
|
-
//# sourceMappingURL=Method.js.map
|
package/transpiled/Method.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Method.js","sourceRoot":"","sources":["../source/Method.ts"],"names":[],"mappings":"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"}
|
package/transpiled/events.d.ts
DELETED
|
@@ -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
|
-
}
|
package/transpiled/events.js
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.events = void 0;
|
|
7
|
-
const mitt_1 = __importDefault(require("mitt"));
|
|
8
|
-
exports.events = (0, mitt_1.default)();
|
|
9
|
-
//# sourceMappingURL=events.js.map
|
package/transpiled/events.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../source/events.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAuB;AAGV,QAAA,MAAM,GAAG,IAAA,cAAI,GAAU,CAAA"}
|
package/transpiled/fail.d.ts
DELETED