vovk 3.0.0-draft.235 → 3.0.0-draft.237
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/cjs/JSONLinesResponse.d.ts +13 -0
- package/cjs/JSONLinesResponse.js +23 -0
- package/cjs/index.d.ts +2 -1
- package/cjs/index.js +3 -1
- package/cjs/utils/jsonSchemaSampler.js +20 -0
- package/cjs/utils/progressive.d.ts +8 -0
- package/cjs/utils/progressive.js +38 -0
- package/mjs/JSONLinesResponse.d.ts +13 -0
- package/mjs/JSONLinesResponse.js +23 -0
- package/mjs/index.d.ts +2 -1
- package/mjs/index.js +3 -1
- package/mjs/utils/jsonSchemaSampler.js +20 -0
- package/mjs/utils/progressive.d.ts +8 -0
- package/mjs/utils/progressive.js +38 -0
- package/package.json +1 -1
|
@@ -11,4 +11,17 @@ export declare class JSONLinesResponse<T> extends Response {
|
|
|
11
11
|
close(): void;
|
|
12
12
|
throw(e: KnownAny): void;
|
|
13
13
|
[Symbol.dispose](): void;
|
|
14
|
+
[Symbol.asyncDispose](): void;
|
|
15
|
+
private nextValueReject;
|
|
16
|
+
private nextValueResolve;
|
|
17
|
+
private nextValue;
|
|
18
|
+
[Symbol.asyncIterator](): {
|
|
19
|
+
next: () => Promise<{
|
|
20
|
+
done: boolean;
|
|
21
|
+
value?: undefined;
|
|
22
|
+
} | {
|
|
23
|
+
done: boolean;
|
|
24
|
+
value: Awaited<T>;
|
|
25
|
+
}>;
|
|
26
|
+
};
|
|
14
27
|
}
|
package/cjs/JSONLinesResponse.js
CHANGED
|
@@ -39,6 +39,7 @@ class JSONLinesResponse extends Response {
|
|
|
39
39
|
const { controller, encoder } = this;
|
|
40
40
|
if (this.isClosed)
|
|
41
41
|
return;
|
|
42
|
+
this.nextValueResolve(data);
|
|
42
43
|
return controller?.enqueue(encoder.encode(JSON.stringify(data) + '\n'));
|
|
43
44
|
}
|
|
44
45
|
close() {
|
|
@@ -50,10 +51,32 @@ class JSONLinesResponse extends Response {
|
|
|
50
51
|
}
|
|
51
52
|
throw(e) {
|
|
52
53
|
this.send({ isError: true, reason: e instanceof Error ? e.message : e });
|
|
54
|
+
this.nextValueReject(e);
|
|
53
55
|
return this.close();
|
|
54
56
|
}
|
|
55
57
|
[Symbol.dispose]() {
|
|
56
58
|
this.close();
|
|
57
59
|
}
|
|
60
|
+
[Symbol.asyncDispose]() {
|
|
61
|
+
this.close();
|
|
62
|
+
}
|
|
63
|
+
nextValueReject = () => { };
|
|
64
|
+
nextValueResolve = () => { };
|
|
65
|
+
nextValue() {
|
|
66
|
+
const { resolve, reject, promise } = Promise.withResolvers();
|
|
67
|
+
this.nextValueResolve = resolve;
|
|
68
|
+
this.nextValueReject = reject;
|
|
69
|
+
return promise;
|
|
70
|
+
}
|
|
71
|
+
[Symbol.asyncIterator]() {
|
|
72
|
+
return {
|
|
73
|
+
next: async () => {
|
|
74
|
+
if (this.isClosed) {
|
|
75
|
+
return { done: true };
|
|
76
|
+
}
|
|
77
|
+
return { done: false, value: await this.nextValue() };
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
58
81
|
}
|
|
59
82
|
exports.JSONLinesResponse = JSONLinesResponse;
|
package/cjs/index.d.ts
CHANGED
|
@@ -11,7 +11,8 @@ import { withStandard } from './utils/withStandard';
|
|
|
11
11
|
import { multitenant } from './utils/multitenant';
|
|
12
12
|
import { createLLMTools } from './utils/createLLMTools';
|
|
13
13
|
import { createCodeExamples } from './utils/createCodeExamples';
|
|
14
|
-
|
|
14
|
+
import { progressive } from './utils/progressive';
|
|
15
|
+
export { type KnownAny, type VovkClient, type VovkClientFetcher, type VovkDefaultFetcherOptions, type VovkStreamAsyncIterable, type VovkValidateOnClient, type VovkSegmentSchema, type VovkErrorResponse, type VovkRequest, type VovkOutput, type VovkIteration, type VovkBody, type VovkQuery, type VovkParams, type VovkYieldType, type VovkReturnType, type VovkControllerSchema, type VovkHandlerSchema, type VovkSchema, type VovkConfig, type VovkStrictConfig, type VovkValidationType, type VovkLLMTool, type VovkTypedMethod, VovkSchemaIdEnum, JSONLinesResponse, HttpException, HttpStatus, HttpMethod, createVovkApp, createDecorator, createRPC, fetcher, createFetcher, generateStaticAPI, withValidationLibrary, withStandard, multitenant, createLLMTools, createCodeExamples, progressive, openapi, openAPIToVovkSchema, vovkSchemaToOpenAPI, };
|
|
15
16
|
export declare const get: {
|
|
16
17
|
(givenPath?: string | undefined, options?: import("./types").DecoratorOptions | undefined): ReturnType<(givenPath?: string, options?: import("./types").DecoratorOptions) => (givenTarget: KnownAny, propertyKey: string) => void>;
|
|
17
18
|
auto: (options?: import("./types").DecoratorOptions) => (givenTarget: KnownAny, propertyKey: string) => void;
|
package/cjs/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var _a;
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.initVovk = exports.prefix = exports.options = exports.head = exports.del = exports.patch = exports.put = exports.post = exports.get = exports.vovkSchemaToOpenAPI = exports.openAPIToVovkSchema = exports.openapi = exports.createCodeExamples = exports.createLLMTools = exports.multitenant = exports.withStandard = exports.withValidationLibrary = exports.generateStaticAPI = exports.createFetcher = exports.fetcher = exports.createRPC = exports.createDecorator = exports.createVovkApp = exports.HttpMethod = exports.HttpStatus = exports.HttpException = exports.JSONLinesResponse = exports.VovkSchemaIdEnum = void 0;
|
|
4
|
+
exports.initVovk = exports.prefix = exports.options = exports.head = exports.del = exports.patch = exports.put = exports.post = exports.get = exports.vovkSchemaToOpenAPI = exports.openAPIToVovkSchema = exports.openapi = exports.progressive = exports.createCodeExamples = exports.createLLMTools = exports.multitenant = exports.withStandard = exports.withValidationLibrary = exports.generateStaticAPI = exports.createFetcher = exports.fetcher = exports.createRPC = exports.createDecorator = exports.createVovkApp = exports.HttpMethod = exports.HttpStatus = exports.HttpException = exports.JSONLinesResponse = exports.VovkSchemaIdEnum = void 0;
|
|
5
5
|
const createVovkApp_1 = require("./createVovkApp");
|
|
6
6
|
Object.defineProperty(exports, "createVovkApp", { enumerable: true, get: function () { return createVovkApp_1.createVovkApp; } });
|
|
7
7
|
const types_1 = require("./types");
|
|
@@ -34,4 +34,6 @@ const createLLMTools_1 = require("./utils/createLLMTools");
|
|
|
34
34
|
Object.defineProperty(exports, "createLLMTools", { enumerable: true, get: function () { return createLLMTools_1.createLLMTools; } });
|
|
35
35
|
const createCodeExamples_1 = require("./utils/createCodeExamples");
|
|
36
36
|
Object.defineProperty(exports, "createCodeExamples", { enumerable: true, get: function () { return createCodeExamples_1.createCodeExamples; } });
|
|
37
|
+
const progressive_1 = require("./utils/progressive");
|
|
38
|
+
Object.defineProperty(exports, "progressive", { enumerable: true, get: function () { return progressive_1.progressive; } });
|
|
37
39
|
_a = (0, createVovkApp_1.createVovkApp)(), exports.get = _a.get, exports.post = _a.post, exports.put = _a.put, exports.patch = _a.patch, exports.del = _a.del, exports.head = _a.head, exports.options = _a.options, exports.prefix = _a.prefix, exports.initVovk = _a.initVovk;
|
|
@@ -77,16 +77,36 @@ function handleString(schema) {
|
|
|
77
77
|
if (schema.format) {
|
|
78
78
|
switch (schema.format) {
|
|
79
79
|
case 'email':
|
|
80
|
+
case 'idn-email':
|
|
80
81
|
return 'user@example.com';
|
|
81
82
|
case 'uri':
|
|
82
83
|
case 'url':
|
|
84
|
+
case 'iri':
|
|
83
85
|
return 'https://example.com';
|
|
84
86
|
case 'date':
|
|
85
87
|
return '2023-01-01';
|
|
86
88
|
case 'date-time':
|
|
87
89
|
return '2023-01-01T00:00:00Z';
|
|
90
|
+
case 'time':
|
|
91
|
+
return '12:00:00Z';
|
|
92
|
+
case 'duration':
|
|
93
|
+
return 'PT1H';
|
|
88
94
|
case 'uuid':
|
|
89
95
|
return '00000000-0000-0000-0000-000000000000';
|
|
96
|
+
case 'regex':
|
|
97
|
+
return '^[a-zA-Z0-9]+$';
|
|
98
|
+
case 'relative-json-pointer':
|
|
99
|
+
return '/some/relative/path';
|
|
100
|
+
case 'color':
|
|
101
|
+
return '#000000';
|
|
102
|
+
case 'hostname':
|
|
103
|
+
return 'example.com';
|
|
104
|
+
case 'zipcode':
|
|
105
|
+
return '12345';
|
|
106
|
+
case 'phone':
|
|
107
|
+
return '+123-456-7890';
|
|
108
|
+
case 'password':
|
|
109
|
+
return '******';
|
|
90
110
|
default:
|
|
91
111
|
return 'string';
|
|
92
112
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { VovkStreamAsyncIterable } from '../client/types';
|
|
2
|
+
import type { KnownAny } from '../types';
|
|
3
|
+
type UnionToIntersection<U> = (U extends KnownAny ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
|
|
4
|
+
type PromisifyProperties<T> = {
|
|
5
|
+
[K in keyof T]: Promise<T[K]>;
|
|
6
|
+
};
|
|
7
|
+
export declare function progressive<T extends (...args: KnownAny[]) => Promise<VovkStreamAsyncIterable<KnownAny>>>(fn: T, ...args: undefined extends Parameters<T>[0] ? [arg?: Parameters<T>[0]] : [arg: Parameters<T>[0]]): PromisifyProperties<UnionToIntersection<T>>;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.progressive = progressive;
|
|
4
|
+
function progressive(fn, ...args) {
|
|
5
|
+
const [arg] = args;
|
|
6
|
+
const reg = {};
|
|
7
|
+
void fn(arg)
|
|
8
|
+
.then(async (result) => {
|
|
9
|
+
for await (const item of result) {
|
|
10
|
+
for (const [key, value] of Object.entries(item)) {
|
|
11
|
+
if (key in reg && !reg[key].isFulfilled) {
|
|
12
|
+
reg[key].isFulfilled = true;
|
|
13
|
+
reg[key].resolve(value);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return result;
|
|
18
|
+
})
|
|
19
|
+
.catch((error) => {
|
|
20
|
+
Object.keys(reg).forEach((key) => {
|
|
21
|
+
if (reg[key].isFulfilled)
|
|
22
|
+
return;
|
|
23
|
+
reg[key].isFulfilled = true;
|
|
24
|
+
reg[key].reject(error);
|
|
25
|
+
});
|
|
26
|
+
return error;
|
|
27
|
+
});
|
|
28
|
+
return new Proxy({}, {
|
|
29
|
+
get(_target, prop) {
|
|
30
|
+
if (prop in reg) {
|
|
31
|
+
return reg[prop].promise;
|
|
32
|
+
}
|
|
33
|
+
const { promise, resolve, reject } = Promise.withResolvers();
|
|
34
|
+
reg[prop] = { resolve, reject, promise, isFulfilled: false };
|
|
35
|
+
return promise;
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
}
|
|
@@ -11,4 +11,17 @@ export declare class JSONLinesResponse<T> extends Response {
|
|
|
11
11
|
close(): void;
|
|
12
12
|
throw(e: KnownAny): void;
|
|
13
13
|
[Symbol.dispose](): void;
|
|
14
|
+
[Symbol.asyncDispose](): void;
|
|
15
|
+
private nextValueReject;
|
|
16
|
+
private nextValueResolve;
|
|
17
|
+
private nextValue;
|
|
18
|
+
[Symbol.asyncIterator](): {
|
|
19
|
+
next: () => Promise<{
|
|
20
|
+
done: boolean;
|
|
21
|
+
value?: undefined;
|
|
22
|
+
} | {
|
|
23
|
+
done: boolean;
|
|
24
|
+
value: Awaited<T>;
|
|
25
|
+
}>;
|
|
26
|
+
};
|
|
14
27
|
}
|
package/mjs/JSONLinesResponse.js
CHANGED
|
@@ -39,6 +39,7 @@ class JSONLinesResponse extends Response {
|
|
|
39
39
|
const { controller, encoder } = this;
|
|
40
40
|
if (this.isClosed)
|
|
41
41
|
return;
|
|
42
|
+
this.nextValueResolve(data);
|
|
42
43
|
return controller?.enqueue(encoder.encode(JSON.stringify(data) + '\n'));
|
|
43
44
|
}
|
|
44
45
|
close() {
|
|
@@ -50,10 +51,32 @@ class JSONLinesResponse extends Response {
|
|
|
50
51
|
}
|
|
51
52
|
throw(e) {
|
|
52
53
|
this.send({ isError: true, reason: e instanceof Error ? e.message : e });
|
|
54
|
+
this.nextValueReject(e);
|
|
53
55
|
return this.close();
|
|
54
56
|
}
|
|
55
57
|
[Symbol.dispose]() {
|
|
56
58
|
this.close();
|
|
57
59
|
}
|
|
60
|
+
[Symbol.asyncDispose]() {
|
|
61
|
+
this.close();
|
|
62
|
+
}
|
|
63
|
+
nextValueReject = () => { };
|
|
64
|
+
nextValueResolve = () => { };
|
|
65
|
+
nextValue() {
|
|
66
|
+
const { resolve, reject, promise } = Promise.withResolvers();
|
|
67
|
+
this.nextValueResolve = resolve;
|
|
68
|
+
this.nextValueReject = reject;
|
|
69
|
+
return promise;
|
|
70
|
+
}
|
|
71
|
+
[Symbol.asyncIterator]() {
|
|
72
|
+
return {
|
|
73
|
+
next: async () => {
|
|
74
|
+
if (this.isClosed) {
|
|
75
|
+
return { done: true };
|
|
76
|
+
}
|
|
77
|
+
return { done: false, value: await this.nextValue() };
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
58
81
|
}
|
|
59
82
|
exports.JSONLinesResponse = JSONLinesResponse;
|
package/mjs/index.d.ts
CHANGED
|
@@ -11,7 +11,8 @@ import { withStandard } from './utils/withStandard';
|
|
|
11
11
|
import { multitenant } from './utils/multitenant';
|
|
12
12
|
import { createLLMTools } from './utils/createLLMTools';
|
|
13
13
|
import { createCodeExamples } from './utils/createCodeExamples';
|
|
14
|
-
|
|
14
|
+
import { progressive } from './utils/progressive';
|
|
15
|
+
export { type KnownAny, type VovkClient, type VovkClientFetcher, type VovkDefaultFetcherOptions, type VovkStreamAsyncIterable, type VovkValidateOnClient, type VovkSegmentSchema, type VovkErrorResponse, type VovkRequest, type VovkOutput, type VovkIteration, type VovkBody, type VovkQuery, type VovkParams, type VovkYieldType, type VovkReturnType, type VovkControllerSchema, type VovkHandlerSchema, type VovkSchema, type VovkConfig, type VovkStrictConfig, type VovkValidationType, type VovkLLMTool, type VovkTypedMethod, VovkSchemaIdEnum, JSONLinesResponse, HttpException, HttpStatus, HttpMethod, createVovkApp, createDecorator, createRPC, fetcher, createFetcher, generateStaticAPI, withValidationLibrary, withStandard, multitenant, createLLMTools, createCodeExamples, progressive, openapi, openAPIToVovkSchema, vovkSchemaToOpenAPI, };
|
|
15
16
|
export declare const get: {
|
|
16
17
|
(givenPath?: string | undefined, options?: import("./types").DecoratorOptions | undefined): ReturnType<(givenPath?: string, options?: import("./types").DecoratorOptions) => (givenTarget: KnownAny, propertyKey: string) => void>;
|
|
17
18
|
auto: (options?: import("./types").DecoratorOptions) => (givenTarget: KnownAny, propertyKey: string) => void;
|
package/mjs/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var _a;
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.initVovk = exports.prefix = exports.options = exports.head = exports.del = exports.patch = exports.put = exports.post = exports.get = exports.vovkSchemaToOpenAPI = exports.openAPIToVovkSchema = exports.openapi = exports.createCodeExamples = exports.createLLMTools = exports.multitenant = exports.withStandard = exports.withValidationLibrary = exports.generateStaticAPI = exports.createFetcher = exports.fetcher = exports.createRPC = exports.createDecorator = exports.createVovkApp = exports.HttpMethod = exports.HttpStatus = exports.HttpException = exports.JSONLinesResponse = exports.VovkSchemaIdEnum = void 0;
|
|
4
|
+
exports.initVovk = exports.prefix = exports.options = exports.head = exports.del = exports.patch = exports.put = exports.post = exports.get = exports.vovkSchemaToOpenAPI = exports.openAPIToVovkSchema = exports.openapi = exports.progressive = exports.createCodeExamples = exports.createLLMTools = exports.multitenant = exports.withStandard = exports.withValidationLibrary = exports.generateStaticAPI = exports.createFetcher = exports.fetcher = exports.createRPC = exports.createDecorator = exports.createVovkApp = exports.HttpMethod = exports.HttpStatus = exports.HttpException = exports.JSONLinesResponse = exports.VovkSchemaIdEnum = void 0;
|
|
5
5
|
const createVovkApp_1 = require("./createVovkApp");
|
|
6
6
|
Object.defineProperty(exports, "createVovkApp", { enumerable: true, get: function () { return createVovkApp_1.createVovkApp; } });
|
|
7
7
|
const types_1 = require("./types");
|
|
@@ -34,4 +34,6 @@ const createLLMTools_1 = require("./utils/createLLMTools");
|
|
|
34
34
|
Object.defineProperty(exports, "createLLMTools", { enumerable: true, get: function () { return createLLMTools_1.createLLMTools; } });
|
|
35
35
|
const createCodeExamples_1 = require("./utils/createCodeExamples");
|
|
36
36
|
Object.defineProperty(exports, "createCodeExamples", { enumerable: true, get: function () { return createCodeExamples_1.createCodeExamples; } });
|
|
37
|
+
const progressive_1 = require("./utils/progressive");
|
|
38
|
+
Object.defineProperty(exports, "progressive", { enumerable: true, get: function () { return progressive_1.progressive; } });
|
|
37
39
|
_a = (0, createVovkApp_1.createVovkApp)(), exports.get = _a.get, exports.post = _a.post, exports.put = _a.put, exports.patch = _a.patch, exports.del = _a.del, exports.head = _a.head, exports.options = _a.options, exports.prefix = _a.prefix, exports.initVovk = _a.initVovk;
|
|
@@ -77,16 +77,36 @@ function handleString(schema) {
|
|
|
77
77
|
if (schema.format) {
|
|
78
78
|
switch (schema.format) {
|
|
79
79
|
case 'email':
|
|
80
|
+
case 'idn-email':
|
|
80
81
|
return 'user@example.com';
|
|
81
82
|
case 'uri':
|
|
82
83
|
case 'url':
|
|
84
|
+
case 'iri':
|
|
83
85
|
return 'https://example.com';
|
|
84
86
|
case 'date':
|
|
85
87
|
return '2023-01-01';
|
|
86
88
|
case 'date-time':
|
|
87
89
|
return '2023-01-01T00:00:00Z';
|
|
90
|
+
case 'time':
|
|
91
|
+
return '12:00:00Z';
|
|
92
|
+
case 'duration':
|
|
93
|
+
return 'PT1H';
|
|
88
94
|
case 'uuid':
|
|
89
95
|
return '00000000-0000-0000-0000-000000000000';
|
|
96
|
+
case 'regex':
|
|
97
|
+
return '^[a-zA-Z0-9]+$';
|
|
98
|
+
case 'relative-json-pointer':
|
|
99
|
+
return '/some/relative/path';
|
|
100
|
+
case 'color':
|
|
101
|
+
return '#000000';
|
|
102
|
+
case 'hostname':
|
|
103
|
+
return 'example.com';
|
|
104
|
+
case 'zipcode':
|
|
105
|
+
return '12345';
|
|
106
|
+
case 'phone':
|
|
107
|
+
return '+123-456-7890';
|
|
108
|
+
case 'password':
|
|
109
|
+
return '******';
|
|
90
110
|
default:
|
|
91
111
|
return 'string';
|
|
92
112
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { VovkStreamAsyncIterable } from '../client/types';
|
|
2
|
+
import type { KnownAny } from '../types';
|
|
3
|
+
type UnionToIntersection<U> = (U extends KnownAny ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
|
|
4
|
+
type PromisifyProperties<T> = {
|
|
5
|
+
[K in keyof T]: Promise<T[K]>;
|
|
6
|
+
};
|
|
7
|
+
export declare function progressive<T extends (...args: KnownAny[]) => Promise<VovkStreamAsyncIterable<KnownAny>>>(fn: T, ...args: undefined extends Parameters<T>[0] ? [arg?: Parameters<T>[0]] : [arg: Parameters<T>[0]]): PromisifyProperties<UnionToIntersection<T>>;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.progressive = progressive;
|
|
4
|
+
function progressive(fn, ...args) {
|
|
5
|
+
const [arg] = args;
|
|
6
|
+
const reg = {};
|
|
7
|
+
void fn(arg)
|
|
8
|
+
.then(async (result) => {
|
|
9
|
+
for await (const item of result) {
|
|
10
|
+
for (const [key, value] of Object.entries(item)) {
|
|
11
|
+
if (key in reg && !reg[key].isFulfilled) {
|
|
12
|
+
reg[key].isFulfilled = true;
|
|
13
|
+
reg[key].resolve(value);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return result;
|
|
18
|
+
})
|
|
19
|
+
.catch((error) => {
|
|
20
|
+
Object.keys(reg).forEach((key) => {
|
|
21
|
+
if (reg[key].isFulfilled)
|
|
22
|
+
return;
|
|
23
|
+
reg[key].isFulfilled = true;
|
|
24
|
+
reg[key].reject(error);
|
|
25
|
+
});
|
|
26
|
+
return error;
|
|
27
|
+
});
|
|
28
|
+
return new Proxy({}, {
|
|
29
|
+
get(_target, prop) {
|
|
30
|
+
if (prop in reg) {
|
|
31
|
+
return reg[prop].promise;
|
|
32
|
+
}
|
|
33
|
+
const { promise, resolve, reject } = Promise.withResolvers();
|
|
34
|
+
reg[prop] = { resolve, reject, promise, isFulfilled: false };
|
|
35
|
+
return promise;
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
}
|