@actdim/dynstruct 0.9.0 → 0.9.3
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/dist/appDomain/navigation.es.js.map +1 -1
- package/dist/appDomain/security/securityContracts.es.js.map +1 -1
- package/dist/appDomain/security/securityProvider.es.js +47 -56
- package/dist/appDomain/security/securityProvider.es.js.map +1 -1
- package/dist/componentModel/componentModel.es.js +130 -145
- package/dist/componentModel/componentModel.es.js.map +1 -1
- package/dist/componentModel/scope.es.js +52 -58
- package/dist/componentModel/scope.es.js.map +1 -1
- package/dist/net/apiError.es.js +22 -26
- package/dist/net/apiError.es.js.map +1 -1
- package/dist/net/client.es.js +65 -69
- package/dist/net/client.es.js.map +1 -1
- package/dist/net/request.es.js +3 -3
- package/dist/net/request.es.js.map +1 -1
- package/dist/reactHooks.es.js.map +1 -1
- package/package.json +49 -28
|
@@ -1,32 +1,29 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
var
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
for (var r = void 0, t = n.length - 1, o; t >= 0; t--)
|
|
8
|
-
(o = n[t]) && (r = o(e, s, r) || r);
|
|
9
|
-
return r && z(e, s, r), r;
|
|
1
|
+
import { observable as f, autorun as c, observe as h, reaction as u, transaction as l } from "mobx";
|
|
2
|
+
import { deepObserve as d } from "mobx-utils";
|
|
3
|
+
var p = Object.defineProperty, y = (o, e, r, i) => {
|
|
4
|
+
for (var s = void 0, t = o.length - 1, a; t >= 0; t--)
|
|
5
|
+
(a = o[t]) && (s = a(e, r, s) || s);
|
|
6
|
+
return s && p(e, r, s), s;
|
|
10
7
|
};
|
|
11
|
-
class
|
|
8
|
+
class v {
|
|
9
|
+
// finalizers
|
|
10
|
+
finalizers;
|
|
11
|
+
isDisposed;
|
|
12
|
+
handlers;
|
|
12
13
|
constructor() {
|
|
13
|
-
// finalizers
|
|
14
|
-
l(this, "finalizers");
|
|
15
|
-
l(this, "isDisposed");
|
|
16
|
-
l(this, "handlers");
|
|
17
14
|
this.isDisposed = !1, this.finalizers = [], this.handlers = /* @__PURE__ */ new Set();
|
|
18
15
|
}
|
|
19
|
-
deepObserve(e,
|
|
20
|
-
const i =
|
|
16
|
+
deepObserve(e, r) {
|
|
17
|
+
const i = d(e, r);
|
|
21
18
|
return this.registerFinalizers(i), i;
|
|
22
19
|
}
|
|
23
|
-
autorun(e,
|
|
24
|
-
const i =
|
|
20
|
+
autorun(e, r) {
|
|
21
|
+
const i = c(e, r);
|
|
25
22
|
return this.registerFinalizers(i), i;
|
|
26
23
|
}
|
|
27
|
-
observe(e,
|
|
28
|
-
const
|
|
29
|
-
return i && this.registerFinalizers(
|
|
24
|
+
observe(e, r, i = !0) {
|
|
25
|
+
const s = h(e, r);
|
|
26
|
+
return i && this.registerFinalizers(s), s;
|
|
30
27
|
}
|
|
31
28
|
async allHandlersAsync() {
|
|
32
29
|
await Promise.all(this.handlers);
|
|
@@ -35,38 +32,38 @@ class g {
|
|
|
35
32
|
if (this.isDisposed)
|
|
36
33
|
throw new Error("Cannot access a disposed object");
|
|
37
34
|
}
|
|
38
|
-
observeAsync(e,
|
|
35
|
+
observeAsync(e, r, i = !0, s = this.handlers) {
|
|
39
36
|
this.validateState();
|
|
40
|
-
const t =
|
|
41
|
-
let
|
|
42
|
-
|
|
43
|
-
await
|
|
44
|
-
})(),
|
|
37
|
+
const t = h(e, (a) => {
|
|
38
|
+
let n = null;
|
|
39
|
+
n = (async () => {
|
|
40
|
+
await r(a), s.delete(n);
|
|
41
|
+
})(), s.add(n);
|
|
45
42
|
});
|
|
46
43
|
return i && this.registerFinalizers(t), t;
|
|
47
44
|
}
|
|
48
|
-
multiObserve(e,
|
|
45
|
+
multiObserve(e, r, i, s = (t) => {
|
|
49
46
|
this.registerFinalizer(t);
|
|
50
47
|
}) {
|
|
51
48
|
const t = [];
|
|
52
|
-
for (const
|
|
53
|
-
const
|
|
54
|
-
t.push(
|
|
49
|
+
for (const a of e) {
|
|
50
|
+
const n = h(a, r, i);
|
|
51
|
+
t.push(n), s && s(n);
|
|
55
52
|
}
|
|
56
53
|
return t;
|
|
57
54
|
}
|
|
58
|
-
reaction(e,
|
|
59
|
-
const
|
|
60
|
-
return this.registerFinalizers(
|
|
55
|
+
reaction(e, r, i) {
|
|
56
|
+
const s = u(e, r, i);
|
|
57
|
+
return this.registerFinalizers(s), s;
|
|
61
58
|
}
|
|
62
|
-
multiReaction(e,
|
|
59
|
+
multiReaction(e, r, i = void 0, s = (t) => {
|
|
63
60
|
this.registerFinalizer(t);
|
|
64
61
|
}) {
|
|
65
62
|
const t = [];
|
|
66
63
|
i || (i = void 0);
|
|
67
|
-
for (const
|
|
68
|
-
const
|
|
69
|
-
t.push(
|
|
64
|
+
for (const a of e) {
|
|
65
|
+
const n = u(a, r, i);
|
|
66
|
+
t.push(n), s && s(n);
|
|
70
67
|
}
|
|
71
68
|
return t;
|
|
72
69
|
}
|
|
@@ -86,39 +83,36 @@ class g {
|
|
|
86
83
|
for (const e of this.finalizers)
|
|
87
84
|
try {
|
|
88
85
|
e && e();
|
|
89
|
-
} catch (
|
|
90
|
-
throw
|
|
86
|
+
} catch (r) {
|
|
87
|
+
throw r;
|
|
91
88
|
}
|
|
92
89
|
this.finalizers.length = 0, this.isDisposed = !0;
|
|
93
90
|
}
|
|
94
91
|
}
|
|
95
92
|
}
|
|
96
|
-
class
|
|
97
|
-
|
|
98
|
-
super(...arguments);
|
|
99
|
-
l(this, "isBusy", !0);
|
|
100
|
-
}
|
|
93
|
+
class z extends v {
|
|
94
|
+
isBusy = !0;
|
|
101
95
|
// isLoading
|
|
102
|
-
async withBusyAsync(
|
|
103
|
-
|
|
96
|
+
async withBusyAsync(e) {
|
|
97
|
+
l(() => {
|
|
104
98
|
this.isBusy = !0;
|
|
105
99
|
});
|
|
106
100
|
try {
|
|
107
|
-
return await
|
|
101
|
+
return await e();
|
|
108
102
|
} finally {
|
|
109
|
-
|
|
103
|
+
l(() => {
|
|
110
104
|
this.isBusy = !1;
|
|
111
105
|
});
|
|
112
106
|
}
|
|
113
107
|
}
|
|
114
|
-
withBusy(
|
|
115
|
-
|
|
108
|
+
withBusy(e) {
|
|
109
|
+
l(() => {
|
|
116
110
|
this.isBusy = !0;
|
|
117
111
|
});
|
|
118
112
|
try {
|
|
119
|
-
return
|
|
113
|
+
return e();
|
|
120
114
|
} finally {
|
|
121
|
-
|
|
115
|
+
l(() => {
|
|
122
116
|
this.isBusy = !1;
|
|
123
117
|
});
|
|
124
118
|
}
|
|
@@ -129,11 +123,11 @@ class F extends g {
|
|
|
129
123
|
// return vm;
|
|
130
124
|
// };
|
|
131
125
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
],
|
|
126
|
+
y([
|
|
127
|
+
f.ref
|
|
128
|
+
], z.prototype, "isBusy");
|
|
135
129
|
export {
|
|
136
|
-
|
|
137
|
-
|
|
130
|
+
v as DisposableComponent,
|
|
131
|
+
z as DisposableModel
|
|
138
132
|
};
|
|
139
133
|
//# sourceMappingURL=scope.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope.es.js","sources":["../../src/componentModel/scope.ts"],"sourcesContent":["// import { createViewModel } from \"@/componentModel\";\r\nimport {\r\n reaction,\r\n observe,\r\n Lambda,\r\n IReactionPublic,\r\n IReactionOptions,\r\n IReactionDisposer,\r\n IObjectDidChange,\r\n // IArrayChange,\r\n IArraySplice,\r\n IMapDidChange,\r\n autorun,\r\n IAutorunOptions\r\n} from \"mobx\";\r\nimport { deepObserve, IDisposer } from \"mobx-utils\";\r\nimport { observable, transaction } from \"mobx\";\r\n\r\nexport type IObjectChange<T> = IObjectDidChange & {\r\n name: keyof T;\r\n object: T;\r\n};\r\n\r\nexport interface IDisposable {\r\n dispose: () => void;\r\n}\r\n\r\nexport class DisposableComponent implements IDisposable {\r\n // finalizers\r\n protected readonly finalizers: IDisposer[];\r\n\r\n protected isDisposed: boolean;\r\n\r\n public handlers: Set<Promise<any>>;\r\n\r\n constructor() {\r\n this.isDisposed = false;\r\n this.finalizers = [];\r\n this.handlers = new Set<Promise<any>>();\r\n }\r\n\r\n protected deepObserve<T = any>(\r\n target: T,\r\n // | IArrayChange\r\n listener: (change: IObjectDidChange | IArraySplice | IMapDidChange, path: string, root: T) => void\r\n ): IDisposer {\r\n const releaser = deepObserve(target, listener);\r\n this.registerFinalizers(releaser);\r\n return releaser;\r\n }\r\n\r\n protected autorun(view: (r: IReactionPublic) => any, opts?: IAutorunOptions): IReactionDisposer {\r\n const releaser = autorun(view, opts);\r\n this.registerFinalizers(releaser);\r\n return releaser;\r\n }\r\n\r\n protected observe<T = Object>(object: T, listener: (change: IObjectChange<T>) => void, registerDisposer = true): Lambda {\r\n const releaser = observe(object, listener);\r\n if (registerDisposer) {\r\n this.registerFinalizers(releaser);\r\n }\r\n return releaser;\r\n }\r\n\r\n public async allHandlersAsync(): Promise<void> {\r\n await Promise.all(this.handlers);\r\n }\r\n\r\n protected validateState() {\r\n if (this.isDisposed) {\r\n throw new Error(\"Cannot access a disposed object\");\r\n }\r\n }\r\n \r\n protected observeAsync<T = Object>(\r\n object: T,\r\n listener: (change: IObjectChange<T>) => Promise<any>,\r\n registerDisposer = true,\r\n handlers = this.handlers\r\n ): Lambda {\r\n this.validateState(); \r\n const releaser = observe(object, (change) => {\r\n let task: Promise<any> = null;\r\n task = (async () => {\r\n await listener(change as IObjectChange<T>);\r\n handlers.delete(task);\r\n })();\r\n handlers.add(task);\r\n });\r\n if (registerDisposer) {\r\n this.registerFinalizers(releaser);\r\n }\r\n return releaser;\r\n }\r\n\r\n protected multiObserve(\r\n objects: Object[],\r\n listener: (change: IObjectDidChange) => void,\r\n fireImmediately?: boolean,\r\n registerDisposer = (d: () => void) => {\r\n this.registerFinalizer(d);\r\n }\r\n ): Lambda[] {\r\n const releasers: Lambda[] = [];\r\n for (const object of objects) {\r\n const releaser = observe(object, listener, fireImmediately);\r\n releasers.push(releaser);\r\n if (registerDisposer) {\r\n registerDisposer(releaser);\r\n }\r\n }\r\n return releasers;\r\n }\r\n\r\n protected reaction<T>(\r\n expression: (r: IReactionPublic) => T,\r\n effect: (arg: T, prev: T, r: IReactionPublic) => void,\r\n opts?: IReactionOptions<T, boolean>\r\n ): IReactionDisposer {\r\n const releaser = reaction(expression, effect, opts);\r\n this.registerFinalizers(releaser);\r\n return releaser;\r\n }\r\n\r\n protected multiReaction<T>(\r\n expressions: ((r: IReactionPublic) => T)[],\r\n effect: (arg: T, prev: T, r: IReactionPublic) => void,\r\n opts: IReactionOptions<T, boolean> = undefined,\r\n registerDisposer = (d: () => void) => {\r\n this.registerFinalizer(d);\r\n }\r\n ): IReactionDisposer[] {\r\n const releasers: IReactionDisposer[] = [];\r\n if (!opts) {\r\n opts = undefined;\r\n }\r\n for (const expression of expressions) {\r\n const releaser = reaction(expression, effect, opts);\r\n releasers.push(releaser);\r\n if (registerDisposer) {\r\n registerDisposer(releaser);\r\n }\r\n }\r\n\r\n return releasers;\r\n }\r\n\r\n // registerDisposers\r\n protected registerFinalizers(...actions: (() => void)[]) {\r\n this.finalizers.push(...actions);\r\n }\r\n\r\n // registerDisposer\r\n protected registerFinalizer(action: () => void) {\r\n this.registerFinalizers(action);\r\n return action;\r\n }\r\n\r\n protected registerDisposable(disposable: IDisposable) {\r\n return this.registerFinalizer(disposable.dispose.bind(disposable));\r\n }\r\n\r\n public dispose() {\r\n if (this === undefined) {\r\n console.error('undefined \"this\"');\r\n }\r\n if (!this.isDisposed) {\r\n for (const d of this.finalizers) {\r\n try {\r\n d && d();\r\n } catch (err) {\r\n throw err; // for debug\r\n }\r\n }\r\n this.finalizers.length = 0;\r\n // while (this.finalizers.length) {\r\n // const d = this.finalizers.pop();\r\n // d && d();\r\n // }\r\n this.isDisposed = true;\r\n }\r\n }\r\n}\r\n\r\nexport class DisposableModel extends DisposableComponent {\r\n @observable.ref\r\n public isBusy: boolean = true; // isLoading\r\n\r\n protected async withBusyAsync<T>(asyncAction: () => Promise<T>) {\r\n transaction(() => {\r\n this.isBusy = true;\r\n });\r\n try {\r\n return await asyncAction();\r\n } finally {\r\n transaction(() => {\r\n this.isBusy = false;\r\n });\r\n }\r\n }\r\n\r\n protected withBusy<T>(action: () => T) {\r\n transaction(() => {\r\n this.isBusy = true;\r\n });\r\n try {\r\n return action();\r\n } finally {\r\n transaction(() => {\r\n this.isBusy = false;\r\n });\r\n }\r\n }\r\n\r\n // createViewModel = <T = any>(model: T, options?: IViewModelOptions<T>): T & IRootViewModel<T> => {\r\n // const vm = createViewModel(model, options);\r\n // this.registerFinalizer(vm.$().dispose);\r\n // return vm;\r\n // };\r\n}\r\n"],"names":["DisposableComponent","__publicField","target","listener","releaser","deepObserve","view","opts","autorun","object","registerDisposer","observe","handlers","change","task","objects","fireImmediately","d","releasers","expression","effect","reaction","expressions","actions","action","disposable","err","DisposableModel","asyncAction","transaction","__decorateClass","observable"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scope.es.js","sources":["../../src/componentModel/scope.ts"],"sourcesContent":["// import { createViewModel } from \"@/componentModel\";\r\nimport {\r\n reaction,\r\n observe,\r\n Lambda,\r\n IReactionPublic,\r\n IReactionOptions,\r\n IReactionDisposer,\r\n IObjectDidChange,\r\n // IArrayChange,\r\n IArraySplice,\r\n IMapDidChange,\r\n autorun,\r\n IAutorunOptions\r\n} from \"mobx\";\r\nimport { deepObserve, IDisposer } from \"mobx-utils\";\r\nimport { observable, transaction } from \"mobx\";\r\n\r\nexport type IObjectChange<T> = IObjectDidChange & {\r\n name: keyof T;\r\n object: T;\r\n};\r\n\r\nexport interface IDisposable {\r\n dispose: () => void;\r\n}\r\n\r\nexport class DisposableComponent implements IDisposable {\r\n // finalizers\r\n protected readonly finalizers: IDisposer[];\r\n\r\n protected isDisposed: boolean;\r\n\r\n public handlers: Set<Promise<any>>;\r\n\r\n constructor() {\r\n this.isDisposed = false;\r\n this.finalizers = [];\r\n this.handlers = new Set<Promise<any>>();\r\n }\r\n\r\n protected deepObserve<T = any>(\r\n target: T,\r\n // | IArrayChange\r\n listener: (change: IObjectDidChange | IArraySplice | IMapDidChange, path: string, root: T) => void\r\n ): IDisposer {\r\n const releaser = deepObserve(target, listener);\r\n this.registerFinalizers(releaser);\r\n return releaser;\r\n }\r\n\r\n protected autorun(view: (r: IReactionPublic) => any, opts?: IAutorunOptions): IReactionDisposer {\r\n const releaser = autorun(view, opts);\r\n this.registerFinalizers(releaser);\r\n return releaser;\r\n }\r\n\r\n protected observe<T = Object>(object: T, listener: (change: IObjectChange<T>) => void, registerDisposer = true): Lambda {\r\n const releaser = observe(object, listener);\r\n if (registerDisposer) {\r\n this.registerFinalizers(releaser);\r\n }\r\n return releaser;\r\n }\r\n\r\n public async allHandlersAsync(): Promise<void> {\r\n await Promise.all(this.handlers);\r\n }\r\n\r\n protected validateState() {\r\n if (this.isDisposed) {\r\n throw new Error(\"Cannot access a disposed object\");\r\n }\r\n }\r\n \r\n protected observeAsync<T = Object>(\r\n object: T,\r\n listener: (change: IObjectChange<T>) => Promise<any>,\r\n registerDisposer = true,\r\n handlers = this.handlers\r\n ): Lambda {\r\n this.validateState(); \r\n const releaser = observe(object, (change) => {\r\n let task: Promise<any> = null;\r\n task = (async () => {\r\n await listener(change as IObjectChange<T>);\r\n handlers.delete(task);\r\n })();\r\n handlers.add(task);\r\n });\r\n if (registerDisposer) {\r\n this.registerFinalizers(releaser);\r\n }\r\n return releaser;\r\n }\r\n\r\n protected multiObserve(\r\n objects: Object[],\r\n listener: (change: IObjectDidChange) => void,\r\n fireImmediately?: boolean,\r\n registerDisposer = (d: () => void) => {\r\n this.registerFinalizer(d);\r\n }\r\n ): Lambda[] {\r\n const releasers: Lambda[] = [];\r\n for (const object of objects) {\r\n const releaser = observe(object, listener, fireImmediately);\r\n releasers.push(releaser);\r\n if (registerDisposer) {\r\n registerDisposer(releaser);\r\n }\r\n }\r\n return releasers;\r\n }\r\n\r\n protected reaction<T>(\r\n expression: (r: IReactionPublic) => T,\r\n effect: (arg: T, prev: T, r: IReactionPublic) => void,\r\n opts?: IReactionOptions<T, boolean>\r\n ): IReactionDisposer {\r\n const releaser = reaction(expression, effect, opts);\r\n this.registerFinalizers(releaser);\r\n return releaser;\r\n }\r\n\r\n protected multiReaction<T>(\r\n expressions: ((r: IReactionPublic) => T)[],\r\n effect: (arg: T, prev: T, r: IReactionPublic) => void,\r\n opts: IReactionOptions<T, boolean> = undefined,\r\n registerDisposer = (d: () => void) => {\r\n this.registerFinalizer(d);\r\n }\r\n ): IReactionDisposer[] {\r\n const releasers: IReactionDisposer[] = [];\r\n if (!opts) {\r\n opts = undefined;\r\n }\r\n for (const expression of expressions) {\r\n const releaser = reaction(expression, effect, opts);\r\n releasers.push(releaser);\r\n if (registerDisposer) {\r\n registerDisposer(releaser);\r\n }\r\n }\r\n\r\n return releasers;\r\n }\r\n\r\n // registerDisposers\r\n protected registerFinalizers(...actions: (() => void)[]) {\r\n this.finalizers.push(...actions);\r\n }\r\n\r\n // registerDisposer\r\n protected registerFinalizer(action: () => void) {\r\n this.registerFinalizers(action);\r\n return action;\r\n }\r\n\r\n protected registerDisposable(disposable: IDisposable) {\r\n return this.registerFinalizer(disposable.dispose.bind(disposable));\r\n }\r\n\r\n public dispose() {\r\n if (this === undefined) {\r\n console.error('undefined \"this\"');\r\n }\r\n if (!this.isDisposed) {\r\n for (const d of this.finalizers) {\r\n try {\r\n d && d();\r\n } catch (err) {\r\n throw err; // for debug\r\n }\r\n }\r\n this.finalizers.length = 0;\r\n // while (this.finalizers.length) {\r\n // const d = this.finalizers.pop();\r\n // d && d();\r\n // }\r\n this.isDisposed = true;\r\n }\r\n }\r\n}\r\n\r\nexport class DisposableModel extends DisposableComponent {\r\n @observable.ref\r\n public isBusy: boolean = true; // isLoading\r\n\r\n protected async withBusyAsync<T>(asyncAction: () => Promise<T>) {\r\n transaction(() => {\r\n this.isBusy = true;\r\n });\r\n try {\r\n return await asyncAction();\r\n } finally {\r\n transaction(() => {\r\n this.isBusy = false;\r\n });\r\n }\r\n }\r\n\r\n protected withBusy<T>(action: () => T) {\r\n transaction(() => {\r\n this.isBusy = true;\r\n });\r\n try {\r\n return action();\r\n } finally {\r\n transaction(() => {\r\n this.isBusy = false;\r\n });\r\n }\r\n }\r\n\r\n // createViewModel = <T = any>(model: T, options?: IViewModelOptions<T>): T & IRootViewModel<T> => {\r\n // const vm = createViewModel(model, options);\r\n // this.registerFinalizer(vm.$().dispose);\r\n // return vm;\r\n // };\r\n}\r\n"],"names":["DisposableComponent","target","listener","releaser","deepObserve","view","opts","autorun","object","registerDisposer","observe","handlers","change","task","objects","fireImmediately","d","releasers","expression","effect","reaction","expressions","actions","action","disposable","err","DisposableModel","asyncAction","transaction","__decorateClass","observable"],"mappings":"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"}
|
package/dist/net/apiError.es.js
CHANGED
|
@@ -1,47 +1,43 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import a from "http-status";
|
|
2
|
+
const c = "API_ERROR_INTERNAL_ERROR";
|
|
3
|
+
class r extends Error {
|
|
4
|
+
isApiError = !0;
|
|
5
|
+
name;
|
|
6
|
+
message;
|
|
7
|
+
request;
|
|
8
|
+
response;
|
|
9
|
+
status;
|
|
7
10
|
// code/type
|
|
8
11
|
constructor(t, s) {
|
|
9
|
-
super(t);
|
|
10
|
-
a(this, "isApiError", !0);
|
|
11
|
-
a(this, "name");
|
|
12
|
-
a(this, "message");
|
|
13
|
-
a(this, "request");
|
|
14
|
-
a(this, "response");
|
|
15
|
-
a(this, "status");
|
|
16
|
-
this.status = s.status, this.message = t || s.name, this.request = s.request, this.response = s.response, this.name = s.name || E, Object.setPrototypeOf(this, u.prototype);
|
|
12
|
+
super(t), this.status = s.status, this.message = t || s.name, this.request = s.request, this.response = s.response, this.name = s.name || c, Object.setPrototypeOf(this, r.prototype);
|
|
17
13
|
}
|
|
18
14
|
static create(t, s) {
|
|
19
15
|
if (!t)
|
|
20
|
-
return new
|
|
16
|
+
return new r("Invalid request", {
|
|
21
17
|
request: s
|
|
22
18
|
});
|
|
23
|
-
const
|
|
24
|
-
if (
|
|
19
|
+
const e = t.status;
|
|
20
|
+
if (e === a.OK)
|
|
25
21
|
return null;
|
|
26
|
-
const
|
|
27
|
-
return new
|
|
28
|
-
status:
|
|
22
|
+
const n = a[`${e}_MESSAGE`], u = `HTTP_STATUS_${e}`;
|
|
23
|
+
return new r(n, {
|
|
24
|
+
status: e,
|
|
29
25
|
request: s,
|
|
30
26
|
response: t,
|
|
31
|
-
name:
|
|
27
|
+
name: u
|
|
32
28
|
});
|
|
33
29
|
}
|
|
34
30
|
static async assert(t, s) {
|
|
35
|
-
const
|
|
36
|
-
if (
|
|
37
|
-
throw
|
|
31
|
+
const e = await r.create(t, s);
|
|
32
|
+
if (e)
|
|
33
|
+
throw e;
|
|
38
34
|
}
|
|
39
35
|
static isApiError(t) {
|
|
40
36
|
return t.isApiError === !0;
|
|
41
37
|
}
|
|
42
38
|
}
|
|
43
39
|
export {
|
|
44
|
-
|
|
45
|
-
|
|
40
|
+
c as API_ERROR_INTERNAL_ERROR,
|
|
41
|
+
r as ApiError
|
|
46
42
|
};
|
|
47
43
|
//# sourceMappingURL=apiError.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiError.es.js","sources":["../../src/net/apiError.ts"],"sourcesContent":["import { IRequestState, IResponseState, getResponseResult } from \"@/net/request\";\r\nimport
|
|
1
|
+
{"version":3,"file":"apiError.es.js","sources":["../../src/net/apiError.ts"],"sourcesContent":["import { IRequestState, IResponseState, getResponseResult } from \"@/net/request\";\r\nimport HttpStatus from \"http-status\";\r\n\r\n// UNKNOWN/UNRECOGNIZED\r\nexport const API_ERROR_INTERNAL_ERROR = \"API_ERROR_INTERNAL_ERROR\";\r\n\r\n// \"notmodified\", \"nocontent\", \"error\", \"timeout\", \"abort\", or \"parsererror\"\r\n\r\n// TODO: use http-problem-details or error-http-response (application/problem+json)\r\n\r\nexport interface IApiErrorOptions<TDetails = any> extends ErrorOptions {\r\n cause?: TDetails;\r\n // type/code\r\n name?: string;\r\n status?: number;\r\n request: IRequestState;\r\n response?: Partial<IResponseState>;\r\n}\r\n\r\n// RequestError\r\nexport class ApiError<TDetails = any> extends Error {\r\n public isApiError = true;\r\n\r\n readonly name: string;\r\n\r\n readonly message: string;\r\n\r\n readonly request: IRequestState;\r\n\r\n readonly response: Partial<IResponseState>;\r\n\r\n readonly status: number; // code/type\r\n\r\n public constructor(message: string, options?: IApiErrorOptions<TDetails>) {\r\n // status: number, request: IRequestState, response?: Partial<IResponseState>, name?: string\r\n super(message);\r\n this.status = options.status;\r\n this.message = message || options.name; // message ?? options.name\r\n this.request = options.request;\r\n this.response = options.response;\r\n this.name = options.name || API_ERROR_INTERNAL_ERROR;\r\n Object.setPrototypeOf(this, ApiError.prototype);\r\n }\r\n\r\n static create(response: Partial<IResponseState>, request?: IRequestState) {\r\n if (!response) {\r\n return new ApiError(\"Invalid request\", {\r\n request\r\n });\r\n }\r\n\r\n const status = response.status;\r\n\r\n if (status === HttpStatus.OK) {\r\n return null;\r\n }\r\n\r\n // const statusClass = HttpStatus[`${status}_CLASS`] as HttpStatus.HttpStatusClasses;\r\n // const statusClassName = HttpStatus.classes[String(statusClass)]; // HttpStatus.classes[`${statusClass}_NAME`]\r\n // const statusClassMsg = HttpStatus.classes[`${statusClass}_MESSAGE`];\r\n const msg = HttpStatus[`${status}_MESSAGE`] as string; // || \"An unexpected server error occurred.\"\r\n const name = `HTTP_STATUS_${status}`;\r\n // response.resolved\r\n const error = new ApiError(msg, {\r\n status,\r\n request,\r\n response,\r\n name\r\n });\r\n return error;\r\n }\r\n\r\n static async assert(response: IResponseState, request: IRequestState) {\r\n const err = await ApiError.create(response, request);\r\n if (err) {\r\n throw err;\r\n }\r\n }\r\n\r\n static isApiError(obj: any): obj is ApiError {\r\n return obj.isApiError === true;\r\n }\r\n}\r\n"],"names":["API_ERROR_INTERNAL_ERROR","ApiError","message","options","response","request","status","HttpStatus","msg","name","err","obj"],"mappings":";AAIO,MAAMA,IAA2B;AAgBjC,MAAMC,UAAiC,MAAM;AAAA,EACzC,aAAa;AAAA,EAEX;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA;AAAA,EAEF,YAAYC,GAAiBC,GAAsC;AAEtE,UAAMD,CAAO,GACb,KAAK,SAASC,EAAQ,QACtB,KAAK,UAAUD,KAAWC,EAAQ,MAClC,KAAK,UAAUA,EAAQ,SACvB,KAAK,WAAWA,EAAQ,UACxB,KAAK,OAAOA,EAAQ,QAAQH,GAC5B,OAAO,eAAe,MAAMC,EAAS,SAAS;AAAA,EAClD;AAAA,EAEA,OAAO,OAAOG,GAAmCC,GAAyB;AACtE,QAAI,CAACD;AACD,aAAO,IAAIH,EAAS,mBAAmB;AAAA,QACnC,SAAAI;AAAA,MAAA,CACH;AAGL,UAAMC,IAASF,EAAS;AAExB,QAAIE,MAAWC,EAAW;AACtB,aAAO;AAMX,UAAMC,IAAMD,EAAW,GAAGD,CAAM,UAAU,GACpCG,IAAO,eAAeH,CAAM;AAQlC,WANc,IAAIL,EAASO,GAAK;AAAA,MAC5B,QAAAF;AAAA,MACA,SAAAD;AAAA,MACA,UAAAD;AAAA,MACA,MAAAK;AAAA,IAAA,CACH;AAAA,EAEL;AAAA,EAEA,aAAa,OAAOL,GAA0BC,GAAwB;AAClE,UAAMK,IAAM,MAAMT,EAAS,OAAOG,GAAUC,CAAO;AACnD,QAAIK;AACA,YAAMA;AAAA,EAEd;AAAA,EAEA,OAAO,WAAWC,GAA2B;AACzC,WAAOA,EAAI,eAAe;AAAA,EAC9B;AACJ;"}
|
package/dist/net/client.es.js
CHANGED
|
@@ -1,41 +1,38 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
import { getResponseResult as y } from "./request.es.js";
|
|
7
|
-
import { ApiError as l } from "./apiError.es.js";
|
|
8
|
-
function A(c, e) {
|
|
1
|
+
import { v4 as d } from "uuid";
|
|
2
|
+
import o from "http-status";
|
|
3
|
+
import { getResponseResult as p } from "./request.es.js";
|
|
4
|
+
import { ApiError as r } from "./apiError.es.js";
|
|
5
|
+
function u(c, e) {
|
|
9
6
|
if (!c)
|
|
10
7
|
return c;
|
|
11
|
-
const
|
|
12
|
-
let
|
|
13
|
-
return
|
|
8
|
+
const t = e.map((i) => i.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|"), n = new RegExp(`(_?(${t}))+?$`, "i");
|
|
9
|
+
let a = c.replace(n, "");
|
|
10
|
+
return a = a.trim(), a.length > 0 ? a : c;
|
|
14
11
|
}
|
|
15
|
-
const
|
|
16
|
-
class
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
this.fetcher =
|
|
12
|
+
const f = ["api", "controller", "client", "fetcher"];
|
|
13
|
+
class R {
|
|
14
|
+
baseUrl;
|
|
15
|
+
name;
|
|
16
|
+
// private requestStates
|
|
17
|
+
requestStateMap;
|
|
18
|
+
fetcher;
|
|
19
|
+
msgBus;
|
|
20
|
+
accessToken;
|
|
21
|
+
init;
|
|
22
|
+
constructor(e, s) {
|
|
23
|
+
this.fetcher = s || window, this.requestStateMap = /* @__PURE__ */ new Map(), this.msgBus = e.msgBus, this.msgBus.on({
|
|
27
24
|
channel: "APP-SECURITY-AUTH-SIGNIN",
|
|
28
25
|
group: "out",
|
|
29
|
-
callback: (
|
|
30
|
-
this.accessToken =
|
|
26
|
+
callback: (t) => {
|
|
27
|
+
this.accessToken = t.payload.accessToken;
|
|
31
28
|
}
|
|
32
29
|
}), this.init = Promise.all([this.getBaseUrlAsync(), this.updateSecurityAsync()]);
|
|
33
30
|
}
|
|
34
31
|
async getBaseUrlAsync() {
|
|
35
|
-
const
|
|
32
|
+
const s = (await this.msgBus.dispatchAsync({
|
|
36
33
|
channel: "APP-CONFIG-GET"
|
|
37
|
-
})).payload,
|
|
38
|
-
this.baseUrl =
|
|
34
|
+
})).payload, t = u(this.name, f), n = Object.entries(s.apis).find((a) => a[0].toLowerCase() === t?.toLowerCase());
|
|
35
|
+
this.baseUrl = n?.[1].url || s.baseUrl;
|
|
39
36
|
}
|
|
40
37
|
async updateSecurityAsync() {
|
|
41
38
|
if (!this.accessToken) {
|
|
@@ -47,64 +44,63 @@ class S {
|
|
|
47
44
|
return this.accessToken;
|
|
48
45
|
}
|
|
49
46
|
async addAuthorizationAsync(e) {
|
|
50
|
-
const
|
|
51
|
-
if (!
|
|
52
|
-
throw
|
|
53
|
-
status:
|
|
47
|
+
const s = await this.updateSecurityAsync();
|
|
48
|
+
if (!s)
|
|
49
|
+
throw r.create({
|
|
50
|
+
status: o.UNAUTHORIZED
|
|
54
51
|
});
|
|
55
|
-
const
|
|
56
|
-
if (
|
|
57
|
-
|
|
52
|
+
const t = "Authorization", n = e.headers, a = `Bearer ${s}`;
|
|
53
|
+
if (n instanceof Headers)
|
|
54
|
+
n.set(t, a);
|
|
58
55
|
else
|
|
59
56
|
throw new Error("Unsupported headers");
|
|
60
57
|
}
|
|
61
58
|
async executeRequestInternalAsync(e) {
|
|
62
59
|
try {
|
|
63
|
-
let
|
|
64
|
-
const
|
|
65
|
-
if (
|
|
66
|
-
const
|
|
60
|
+
let s = !0;
|
|
61
|
+
const t = e.callbacks && e.callbacks.onBeforeSendRequest;
|
|
62
|
+
if (t) {
|
|
63
|
+
const n = {
|
|
67
64
|
request: e,
|
|
68
65
|
cancel: !1,
|
|
69
66
|
handled: !1
|
|
70
67
|
};
|
|
71
|
-
if (await
|
|
72
|
-
if (
|
|
73
|
-
e.result =
|
|
68
|
+
if (await t(n), n.cancel)
|
|
69
|
+
if (s = !1, e.status = "canceled", n.handled)
|
|
70
|
+
e.result = n.result;
|
|
74
71
|
else
|
|
75
72
|
throw new Error("The request was aborted");
|
|
76
73
|
}
|
|
77
|
-
if (
|
|
74
|
+
if (s) {
|
|
78
75
|
e.status = "executing";
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
let
|
|
82
|
-
|
|
83
|
-
const
|
|
84
|
-
|
|
76
|
+
const n = await this.fetcher.fetch(e.url, e);
|
|
77
|
+
r.assert(n, e);
|
|
78
|
+
let a = e.callbacks && e.callbacks.onResponseRead;
|
|
79
|
+
a || (a = async (l) => {
|
|
80
|
+
const h = await p(n, e);
|
|
81
|
+
l.result = h;
|
|
85
82
|
});
|
|
86
|
-
const
|
|
87
|
-
response:
|
|
83
|
+
const i = {
|
|
84
|
+
response: n
|
|
88
85
|
};
|
|
89
|
-
await
|
|
86
|
+
await a(i), e.result = i.result, e.status = "succeeded";
|
|
90
87
|
}
|
|
91
|
-
} catch (
|
|
92
|
-
throw e.status = "failed",
|
|
88
|
+
} catch (s) {
|
|
89
|
+
throw e.status = "failed", s;
|
|
93
90
|
}
|
|
94
91
|
return e;
|
|
95
92
|
}
|
|
96
93
|
async executeRequestAsync(e) {
|
|
97
|
-
|
|
98
|
-
let t = 0;
|
|
94
|
+
let s = 0;
|
|
99
95
|
do
|
|
100
96
|
try {
|
|
101
97
|
return e.useAuth && await this.addAuthorizationAsync(e), this.executeRequestInternalAsync(e);
|
|
102
|
-
} catch (
|
|
103
|
-
if (
|
|
104
|
-
if (
|
|
105
|
-
throw
|
|
106
|
-
if (
|
|
107
|
-
|
|
98
|
+
} catch (t) {
|
|
99
|
+
if (t instanceof r) {
|
|
100
|
+
if (s > 0 || t.status === o.UPGRADE_REQUIRED)
|
|
101
|
+
throw t;
|
|
102
|
+
if (t.status === o.UNAUTHORIZED) {
|
|
103
|
+
t.response?.headers?.get("token-expired") ? await this.msgBus.dispatchAsync({
|
|
108
104
|
channel: "APP-SECURITY-AUTH-REFRESH"
|
|
109
105
|
}) : await this.msgBus.dispatchAsync({
|
|
110
106
|
channel: "APP-SECURITY-REQUEST-AUTH"
|
|
@@ -113,9 +109,9 @@ class S {
|
|
|
113
109
|
}
|
|
114
110
|
continue;
|
|
115
111
|
}
|
|
116
|
-
throw
|
|
112
|
+
throw t;
|
|
117
113
|
} finally {
|
|
118
|
-
|
|
114
|
+
s++;
|
|
119
115
|
}
|
|
120
116
|
while (!0);
|
|
121
117
|
}
|
|
@@ -129,18 +125,18 @@ class S {
|
|
|
129
125
|
cache: "default",
|
|
130
126
|
credentials: "same-origin",
|
|
131
127
|
mode: "cors"
|
|
132
|
-
}, ...e }, e.id || (e.id =
|
|
133
|
-
let
|
|
128
|
+
}, ...e }, e.id || (e.id = d());
|
|
129
|
+
let t = {
|
|
134
130
|
...e,
|
|
135
131
|
status: "queued",
|
|
136
132
|
response: void 0,
|
|
137
133
|
result: void 0
|
|
138
134
|
};
|
|
139
|
-
return this.requestStateMap.set(e.id,
|
|
135
|
+
return this.requestStateMap.set(e.id, t), e.headers instanceof Headers || (e.headers = new Headers(e.headers)), e.headers.append("Content-Type", e.contentType), e.method === "POST" && (e.body || (e.body = "")), await this.executeRequestAsync(t), t.result;
|
|
140
136
|
}
|
|
141
137
|
}
|
|
142
138
|
export {
|
|
143
|
-
|
|
144
|
-
|
|
139
|
+
R as ClientBase,
|
|
140
|
+
u as extractApiName
|
|
145
141
|
};
|
|
146
142
|
//# sourceMappingURL=client.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.es.js","sources":["../../src/net/client.ts"],"sourcesContent":["import { v4 as uuid } from \"uuid\";\r\nimport httpStatus from \"http-status\";\r\nimport { getResponseResult, IFetcher, IRequestCallbacks, IRequestParams, IRequestState } from \"./request\";\r\nimport { ApiError } from \"./apiError\";\r\nimport { BaseAppBusStruct, BaseAppContext } from \"@/appDomain/appContracts\";\r\nimport { MsgBus } from \"@actdim/msgmesh/msgBusCore\";\r\n\r\n// MLWEB-2172\r\n\r\n// TODO: support request cancellation\r\n// https://stackoverflow.com/questions/31061838/how-do-i-cancel-an-http-fetch-request\r\n// https://mukeshprajapati0251.medium.com/cancel-rest-api-pending-request-1af65e70366d\r\n\r\nexport function extractApiName(name: string, suffixes: string[]): string | null {\r\n if (!name) {\r\n return name;\r\n }\r\n const escaped = suffixes.map((s) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"));\r\n const group = escaped.join(\"|\");\r\n const pattern = new RegExp(`(_?(${group}))+?$`, \"i\");\r\n\r\n let result = name.replace(pattern, \"\");\r\n\r\n result = result.trim();\r\n return result.length > 0 ? result : name;\r\n}\r\n\r\nconst API_SUFFIXES = [\"api\", \"controller\", \"client\", \"fetcher\"];\r\n// App(Api)ClientBase\r\nexport class ClientBase {\r\n protected baseUrl: string;\r\n protected name: string;\r\n // private requestStates\r\n private requestStateMap: Map<string, IRequestState>;\r\n\r\n private fetcher: IFetcher;\r\n\r\n private msgBus: MsgBus<BaseAppBusStruct>;\r\n\r\n private accessToken: string;\r\n\r\n private init: Promise<any>;\r\n\r\n constructor(context: BaseAppContext, fetcher?: IFetcher) {\r\n this.fetcher = fetcher || window;\r\n this.requestStateMap = new Map<string, IRequestState>();\r\n this.msgBus = context.msgBus;\r\n // TODO: unsubscribe\r\n this.msgBus.on({\r\n channel: \"APP-SECURITY-AUTH-SIGNIN\",\r\n group: \"out\",\r\n callback: (msg) => {\r\n this.accessToken = msg.payload.accessToken;\r\n }\r\n });\r\n this.init = Promise.all([this.getBaseUrlAsync(), this.updateSecurityAsync()]);\r\n }\r\n\r\n protected async getBaseUrlAsync() {\r\n const msg = await this.msgBus.dispatchAsync({\r\n channel: \"APP-CONFIG-GET\"\r\n });\r\n const config = msg.payload;\r\n const apiName = extractApiName(this.name, API_SUFFIXES);\r\n const apiEntry = Object.entries(config.apis).find((entry) => entry[0].toLowerCase() === apiName?.toLowerCase());\r\n this.baseUrl = apiEntry?.[1].url || config.baseUrl;\r\n }\r\n\r\n private async updateSecurityAsync() {\r\n if (!this.accessToken) {\r\n const msg = await this.msgBus.dispatchAsync({\r\n channel: \"APP-SECURITY-GET-CONTEXT\"\r\n });\r\n this.accessToken = msg.payload.accessToken;\r\n }\r\n return this.accessToken;\r\n }\r\n\r\n private async addAuthorizationAsync(request: IRequestParams) {\r\n const accessToken = await this.updateSecurityAsync();\r\n if (!accessToken) {\r\n throw ApiError.create({\r\n status: httpStatus.UNAUTHORIZED\r\n });\r\n }\r\n const authorizationHeader = \"Authorization\";\r\n const headers = request.headers;\r\n const headerValue = `Bearer ${accessToken}`;\r\n if (headers instanceof Headers) {\r\n // if (headers.has(authorizationHeader)) {\r\n // headers.delete(authorizationHeader)\r\n // }\r\n // headers.append(authorizationHeader, headerValue);\r\n headers.set(authorizationHeader, headerValue);\r\n } else {\r\n throw new Error(\"Unsupported headers\"); // object type\r\n }\r\n }\r\n\r\n private async executeRequestInternalAsync(request: IRequestState) {\r\n try {\r\n let proceed = true;\r\n const onBeforeSendRequest = request.callbacks && request.callbacks.onBeforeSendRequest;\r\n if (onBeforeSendRequest) {\r\n const event = {\r\n request: request,\r\n cancel: false,\r\n handled: false\r\n } as Parameters<IRequestCallbacks[\"onBeforeSendRequest\"]>[0];\r\n await onBeforeSendRequest(event);\r\n if (event.cancel) {\r\n // interrupt\r\n proceed = false;\r\n request.status = \"canceled\";\r\n if (event.handled) {\r\n request.result = event.result;\r\n } else {\r\n // ApiError?\r\n throw new Error(\"The request was aborted\"); // has been? canceled?\r\n }\r\n }\r\n }\r\n if (proceed) {\r\n request.status = \"executing\";\r\n const response = await this.fetcher.fetch(request.url, request);\r\n ApiError.assert(response, request);\r\n let onResponseRead = request.callbacks && request.callbacks.onResponseRead;\r\n if (!onResponseRead) {\r\n onResponseRead = async (event) => {\r\n const result = await getResponseResult(response, request);\r\n event.result = result;\r\n };\r\n }\r\n const event = {\r\n response: response\r\n } as Parameters<IRequestCallbacks[\"onResponseRead\"]>[0];\r\n\r\n await onResponseRead(event);\r\n request.result = event.result;\r\n request.status = \"succeeded\";\r\n }\r\n } catch (err) {\r\n request.status = \"failed\";\r\n // throw ApiError.create(undefined, request);\r\n throw err;\r\n }\r\n return request;\r\n }\r\n\r\n private async executeRequestAsync(request: IRequestState): Promise<IRequestState> {\r\n let attempt = 0;\r\n do {\r\n try {\r\n if (request.useAuth) {\r\n await this.addAuthorizationAsync(request);\r\n }\r\n return this.executeRequestInternalAsync(request);\r\n } catch (err) {\r\n if (err instanceof ApiError) {\r\n if (attempt > 0) {\r\n throw err;\r\n }\r\n if (err.status === httpStatus.UPGRADE_REQUIRED) {\r\n // await this.context.msgBus.dispatchAsync({\r\n // channel: \"APP_RELOAD\" // APP_REQUEST_UPDGRADE\r\n // });\r\n throw err;\r\n } else if (err.status === httpStatus.UNAUTHORIZED) {\r\n if (err.response?.headers?.get(\"token-expired\")) {\r\n // token expired or invalid\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-SECURITY-AUTH-REFRESH\"\r\n });\r\n } else {\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-SECURITY-REQUEST-AUTH\"\r\n });\r\n }\r\n // codes:\r\n // TOKEN_EXPIRED\r\n // TOKEN_INVALID\r\n // TOKEN_MISSING\r\n // AUTH_REQUIRED\r\n // header: WWW-Authenticate\r\n continue;\r\n }\r\n continue;\r\n }\r\n throw err;\r\n } finally {\r\n attempt++;\r\n }\r\n } while (true);\r\n }\r\n\r\n // T extends IApiResponse\r\n public async fetchAsync<T>(requestParams: IRequestParams): Promise<T> {\r\n await this.init;\r\n\r\n const defaultParams: Partial<IRequestParams> = {\r\n contentType: \"application/json\",\r\n method: \"POST\",\r\n body: null,\r\n headers: {},\r\n cache: \"default\",\r\n credentials: \"same-origin\",\r\n mode: \"cors\"\r\n };\r\n\r\n requestParams = { ...defaultParams, ...requestParams };\r\n if (!requestParams.id) {\r\n requestParams.id = uuid();\r\n }\r\n\r\n let request = {\r\n ...requestParams,\r\n status: \"queued\",\r\n response: undefined,\r\n result: undefined\r\n } as IRequestState;\r\n\r\n this.requestStateMap.set(requestParams.id, request);\r\n\r\n if (!(requestParams.headers instanceof Headers)) {\r\n requestParams.headers = new Headers(requestParams.headers);\r\n }\r\n\r\n requestParams.headers.append(\"Content-Type\", requestParams.contentType);\r\n // \"api-version\"\r\n\r\n if (requestParams.method === \"POST\") {\r\n if (!requestParams.body) {\r\n requestParams.body = \"\";\r\n }\r\n }\r\n\r\n await this.executeRequestAsync(request);\r\n return request.result;\r\n }\r\n}\r\n/* \r\nif (status === 404) {\r\n return response.text().then((_responseText) => {\r\n let result404: any = null;\r\n result404 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as __API__ProblemDetails;\r\n return throwException(\"Not Found\", status, _responseText, _headers, result404);\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n\r\nBLOB\r\nlet reader = new FileReader();\r\n reader.onload = event => resolve((event.target as any).result);\r\n reader.readAsText(blob);\r\n*/\r\n"],"names":["extractApiName","name","suffixes","group","s","pattern","result","API_SUFFIXES","ClientBase","context","fetcher","__publicField","msg","config","apiName","apiEntry","entry","request","accessToken","ApiError","httpStatus","authorizationHeader","headers","headerValue","proceed","onBeforeSendRequest","event","response","onResponseRead","getResponseResult","err","attempt","_b","_a","requestParams","uuid"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.es.js","sources":["../../src/net/client.ts"],"sourcesContent":["import { v4 as uuid } from \"uuid\";\r\nimport httpStatus from \"http-status\";\r\nimport { getResponseResult, IFetcher, IRequestCallbacks, IRequestParams, IRequestState } from \"./request\";\r\nimport { ApiError } from \"./apiError\";\r\nimport { BaseAppBusStruct, BaseAppContext } from \"@/appDomain/appContracts\";\r\nimport { MsgBus } from \"@actdim/msgmesh/msgBusCore\";\r\n\r\n// MLWEB-2172\r\n\r\n// TODO: support request cancellation\r\n// https://stackoverflow.com/questions/31061838/how-do-i-cancel-an-http-fetch-request\r\n// https://mukeshprajapati0251.medium.com/cancel-rest-api-pending-request-1af65e70366d\r\n\r\nexport function extractApiName(name: string, suffixes: string[]): string | null {\r\n if (!name) {\r\n return name;\r\n }\r\n const escaped = suffixes.map((s) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"));\r\n const group = escaped.join(\"|\");\r\n const pattern = new RegExp(`(_?(${group}))+?$`, \"i\");\r\n\r\n let result = name.replace(pattern, \"\");\r\n\r\n result = result.trim();\r\n return result.length > 0 ? result : name;\r\n}\r\n\r\nconst API_SUFFIXES = [\"api\", \"controller\", \"client\", \"fetcher\"];\r\n// App(Api)ClientBase\r\nexport class ClientBase {\r\n protected baseUrl: string;\r\n protected name: string;\r\n // private requestStates\r\n private requestStateMap: Map<string, IRequestState>;\r\n\r\n private fetcher: IFetcher;\r\n\r\n private msgBus: MsgBus<BaseAppBusStruct>;\r\n\r\n private accessToken: string;\r\n\r\n private init: Promise<any>;\r\n\r\n constructor(context: BaseAppContext, fetcher?: IFetcher) {\r\n this.fetcher = fetcher || window;\r\n this.requestStateMap = new Map<string, IRequestState>();\r\n this.msgBus = context.msgBus;\r\n // TODO: unsubscribe\r\n this.msgBus.on({\r\n channel: \"APP-SECURITY-AUTH-SIGNIN\",\r\n group: \"out\",\r\n callback: (msg) => {\r\n this.accessToken = msg.payload.accessToken;\r\n }\r\n });\r\n this.init = Promise.all([this.getBaseUrlAsync(), this.updateSecurityAsync()]);\r\n }\r\n\r\n protected async getBaseUrlAsync() {\r\n const msg = await this.msgBus.dispatchAsync({\r\n channel: \"APP-CONFIG-GET\"\r\n });\r\n const config = msg.payload;\r\n const apiName = extractApiName(this.name, API_SUFFIXES);\r\n const apiEntry = Object.entries(config.apis).find((entry) => entry[0].toLowerCase() === apiName?.toLowerCase());\r\n this.baseUrl = apiEntry?.[1].url || config.baseUrl;\r\n }\r\n\r\n private async updateSecurityAsync() {\r\n if (!this.accessToken) {\r\n const msg = await this.msgBus.dispatchAsync({\r\n channel: \"APP-SECURITY-GET-CONTEXT\"\r\n });\r\n this.accessToken = msg.payload.accessToken;\r\n }\r\n return this.accessToken;\r\n }\r\n\r\n private async addAuthorizationAsync(request: IRequestParams) {\r\n const accessToken = await this.updateSecurityAsync();\r\n if (!accessToken) {\r\n throw ApiError.create({\r\n status: httpStatus.UNAUTHORIZED\r\n });\r\n }\r\n const authorizationHeader = \"Authorization\";\r\n const headers = request.headers;\r\n const headerValue = `Bearer ${accessToken}`;\r\n if (headers instanceof Headers) {\r\n // if (headers.has(authorizationHeader)) {\r\n // headers.delete(authorizationHeader)\r\n // }\r\n // headers.append(authorizationHeader, headerValue);\r\n headers.set(authorizationHeader, headerValue);\r\n } else {\r\n throw new Error(\"Unsupported headers\"); // object type\r\n }\r\n }\r\n\r\n private async executeRequestInternalAsync(request: IRequestState) {\r\n try {\r\n let proceed = true;\r\n const onBeforeSendRequest = request.callbacks && request.callbacks.onBeforeSendRequest;\r\n if (onBeforeSendRequest) {\r\n const event = {\r\n request: request,\r\n cancel: false,\r\n handled: false\r\n } as Parameters<IRequestCallbacks[\"onBeforeSendRequest\"]>[0];\r\n await onBeforeSendRequest(event);\r\n if (event.cancel) {\r\n // interrupt\r\n proceed = false;\r\n request.status = \"canceled\";\r\n if (event.handled) {\r\n request.result = event.result;\r\n } else {\r\n // ApiError?\r\n throw new Error(\"The request was aborted\"); // has been? canceled?\r\n }\r\n }\r\n }\r\n if (proceed) {\r\n request.status = \"executing\";\r\n const response = await this.fetcher.fetch(request.url, request);\r\n ApiError.assert(response, request);\r\n let onResponseRead = request.callbacks && request.callbacks.onResponseRead;\r\n if (!onResponseRead) {\r\n onResponseRead = async (event) => {\r\n const result = await getResponseResult(response, request);\r\n event.result = result;\r\n };\r\n }\r\n const event = {\r\n response: response\r\n } as Parameters<IRequestCallbacks[\"onResponseRead\"]>[0];\r\n\r\n await onResponseRead(event);\r\n request.result = event.result;\r\n request.status = \"succeeded\";\r\n }\r\n } catch (err) {\r\n request.status = \"failed\";\r\n // throw ApiError.create(undefined, request);\r\n throw err;\r\n }\r\n return request;\r\n }\r\n\r\n private async executeRequestAsync(request: IRequestState): Promise<IRequestState> {\r\n let attempt = 0;\r\n do {\r\n try {\r\n if (request.useAuth) {\r\n await this.addAuthorizationAsync(request);\r\n }\r\n return this.executeRequestInternalAsync(request);\r\n } catch (err) {\r\n if (err instanceof ApiError) {\r\n if (attempt > 0) {\r\n throw err;\r\n }\r\n if (err.status === httpStatus.UPGRADE_REQUIRED) {\r\n // await this.context.msgBus.dispatchAsync({\r\n // channel: \"APP_RELOAD\" // APP_REQUEST_UPDGRADE\r\n // });\r\n throw err;\r\n } else if (err.status === httpStatus.UNAUTHORIZED) {\r\n if (err.response?.headers?.get(\"token-expired\")) {\r\n // token expired or invalid\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-SECURITY-AUTH-REFRESH\"\r\n });\r\n } else {\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-SECURITY-REQUEST-AUTH\"\r\n });\r\n }\r\n // codes:\r\n // TOKEN_EXPIRED\r\n // TOKEN_INVALID\r\n // TOKEN_MISSING\r\n // AUTH_REQUIRED\r\n // header: WWW-Authenticate\r\n continue;\r\n }\r\n continue;\r\n }\r\n throw err;\r\n } finally {\r\n attempt++;\r\n }\r\n } while (true);\r\n }\r\n\r\n // T extends IApiResponse\r\n public async fetchAsync<T>(requestParams: IRequestParams): Promise<T> {\r\n await this.init;\r\n\r\n const defaultParams: Partial<IRequestParams> = {\r\n contentType: \"application/json\",\r\n method: \"POST\",\r\n body: null,\r\n headers: {},\r\n cache: \"default\",\r\n credentials: \"same-origin\",\r\n mode: \"cors\"\r\n };\r\n\r\n requestParams = { ...defaultParams, ...requestParams };\r\n if (!requestParams.id) {\r\n requestParams.id = uuid();\r\n }\r\n\r\n let request = {\r\n ...requestParams,\r\n status: \"queued\",\r\n response: undefined,\r\n result: undefined\r\n } as IRequestState;\r\n\r\n this.requestStateMap.set(requestParams.id, request);\r\n\r\n if (!(requestParams.headers instanceof Headers)) {\r\n requestParams.headers = new Headers(requestParams.headers);\r\n }\r\n\r\n requestParams.headers.append(\"Content-Type\", requestParams.contentType);\r\n // \"api-version\"\r\n\r\n if (requestParams.method === \"POST\") {\r\n if (!requestParams.body) {\r\n requestParams.body = \"\";\r\n }\r\n }\r\n\r\n await this.executeRequestAsync(request);\r\n return request.result;\r\n }\r\n}\r\n/* \r\nif (status === 404) {\r\n return response.text().then((_responseText) => {\r\n let result404: any = null;\r\n result404 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as __API__ProblemDetails;\r\n return throwException(\"Not Found\", status, _responseText, _headers, result404);\r\n });\r\n } else if (status !== 200 && status !== 204) {\r\n return response.text().then((_responseText) => {\r\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\r\n });\r\n }\r\n\r\nBLOB\r\nlet reader = new FileReader();\r\n reader.onload = event => resolve((event.target as any).result);\r\n reader.readAsText(blob);\r\n*/\r\n"],"names":["extractApiName","name","suffixes","group","s","pattern","result","API_SUFFIXES","ClientBase","context","fetcher","msg","config","apiName","apiEntry","entry","request","accessToken","ApiError","httpStatus","authorizationHeader","headers","headerValue","proceed","onBeforeSendRequest","event","response","onResponseRead","getResponseResult","err","attempt","requestParams","uuid"],"mappings":"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"}
|
package/dist/net/request.es.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import n from "http-status";
|
|
2
|
-
const l = (t) => t.blob(),
|
|
2
|
+
const l = (t) => t.blob(), c = (t) => t.json(), d = (t) => t.text(), f = (t) => t.arrayBuffer();
|
|
3
3
|
async function h(t, s) {
|
|
4
4
|
let e = s.contentType || (s.headers && s.headers instanceof Headers ? s.headers.get("content-type") : s.headers["Content-Type"]);
|
|
5
5
|
t.headers && (e = t.headers instanceof Headers ? t.headers.get("content-type") : t.headers["content-type"]);
|
|
@@ -26,8 +26,8 @@ async function h(t, s) {
|
|
|
26
26
|
export {
|
|
27
27
|
f as getResponseArrayBuffer,
|
|
28
28
|
l as getResponseBlob,
|
|
29
|
-
|
|
29
|
+
c as getResponseJson,
|
|
30
30
|
h as getResponseResult,
|
|
31
|
-
|
|
31
|
+
d as getResponseText
|
|
32
32
|
};
|
|
33
33
|
//# sourceMappingURL=request.es.js.map
|