vovk 3.0.0-draft.48 → 3.0.0-draft.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/.DS_Store +0 -0
  2. package/.npmignore +2 -1
  3. package/.turbo/turbo-build.log +6 -0
  4. package/.turbo/turbo-ncu.log +9 -0
  5. package/.turbo/turbo-tsc.log +6 -0
  6. package/README.md +1 -112
  7. package/{StreamJSONResponse.d.ts → dist/StreamJSONResponse.d.ts} +1 -1
  8. package/dist/client/createRPC.d.ts +4 -0
  9. package/{client/clientizeController.js → dist/client/createRPC.js} +3 -3
  10. package/dist/client/index.d.ts +4 -0
  11. package/dist/client/index.js +5 -0
  12. package/{index.d.ts → dist/index.d.ts} +5 -4
  13. package/{index.js → dist/index.js} +6 -1
  14. package/{utils → dist/utils}/generateStaticAPI.d.ts +1 -1
  15. package/{utils → dist/utils}/getSchema.d.ts +1 -1
  16. package/{utils → dist/utils}/reqForm.d.ts +1 -2
  17. package/{utils → dist/utils}/reqMeta.d.ts +1 -2
  18. package/{utils → dist/utils}/reqQuery.d.ts +1 -2
  19. package/{utils → dist/utils}/reqQuery.js +3 -3
  20. package/dist/utils/setClientValidatorsForHandler.d.ts +5 -0
  21. package/{utils → dist/utils}/setClientValidatorsForHandler.js +2 -1
  22. package/dist/worker/createWPC.d.ts +2 -0
  23. package/{worker/promisifyWorker.js → dist/worker/createWPC.js} +3 -3
  24. package/dist/worker/index.d.ts +3 -0
  25. package/dist/worker/index.js +7 -0
  26. package/package.json +4 -2
  27. package/src/HttpException.ts +16 -0
  28. package/src/StreamJSONResponse.ts +62 -0
  29. package/src/VovkApp.ts +242 -0
  30. package/src/client/createRPC.ts +133 -0
  31. package/src/client/defaultFetcher.ts +57 -0
  32. package/src/client/defaultHandler.ts +23 -0
  33. package/src/client/defaultStreamHandler.ts +88 -0
  34. package/src/client/index.ts +5 -0
  35. package/src/client/types.ts +115 -0
  36. package/src/createDecorator.ts +60 -0
  37. package/src/createVovkApp.ts +167 -0
  38. package/src/index.ts +66 -0
  39. package/src/types.ts +215 -0
  40. package/src/utils/generateStaticAPI.ts +18 -0
  41. package/src/utils/getSchema.ts +48 -0
  42. package/src/utils/reqForm.ts +16 -0
  43. package/src/utils/reqMeta.ts +16 -0
  44. package/src/utils/reqQuery.ts +26 -0
  45. package/src/utils/setClientValidatorsForHandler.ts +45 -0
  46. package/src/utils/shim.ts +17 -0
  47. package/src/worker/createWPC.ts +156 -0
  48. package/src/worker/index.ts +4 -0
  49. package/src/worker/types.ts +45 -0
  50. package/src/worker/worker.ts +53 -0
  51. package/client/clientizeController.d.ts +0 -4
  52. package/client/index.d.ts +0 -4
  53. package/client/index.js +0 -5
  54. package/utils/setClientValidatorsForHandler.d.ts +0 -5
  55. package/worker/index.d.ts +0 -3
  56. package/worker/index.js +0 -7
  57. package/worker/promisifyWorker.d.ts +0 -2
  58. /package/{HttpException.d.ts → dist/HttpException.d.ts} +0 -0
  59. /package/{HttpException.js → dist/HttpException.js} +0 -0
  60. /package/{StreamJSONResponse.js → dist/StreamJSONResponse.js} +0 -0
  61. /package/{VovkApp.d.ts → dist/VovkApp.d.ts} +0 -0
  62. /package/{VovkApp.js → dist/VovkApp.js} +0 -0
  63. /package/{client → dist/client}/defaultFetcher.d.ts +0 -0
  64. /package/{client → dist/client}/defaultFetcher.js +0 -0
  65. /package/{client → dist/client}/defaultHandler.d.ts +0 -0
  66. /package/{client → dist/client}/defaultHandler.js +0 -0
  67. /package/{client → dist/client}/defaultStreamHandler.d.ts +0 -0
  68. /package/{client → dist/client}/defaultStreamHandler.js +0 -0
  69. /package/{client → dist/client}/types.d.ts +0 -0
  70. /package/{client → dist/client}/types.js +0 -0
  71. /package/{createDecorator.d.ts → dist/createDecorator.d.ts} +0 -0
  72. /package/{createDecorator.js → dist/createDecorator.js} +0 -0
  73. /package/{createVovkApp.d.ts → dist/createVovkApp.d.ts} +0 -0
  74. /package/{createVovkApp.js → dist/createVovkApp.js} +0 -0
  75. /package/{types.d.ts → dist/types.d.ts} +0 -0
  76. /package/{types.js → dist/types.js} +0 -0
  77. /package/{utils → dist/utils}/generateStaticAPI.js +0 -0
  78. /package/{utils → dist/utils}/getSchema.js +0 -0
  79. /package/{utils → dist/utils}/reqForm.js +0 -0
  80. /package/{utils → dist/utils}/reqMeta.js +0 -0
  81. /package/{utils → dist/utils}/shim.d.ts +0 -0
  82. /package/{utils → dist/utils}/shim.js +0 -0
  83. /package/{worker → dist/worker}/types.d.ts +0 -0
  84. /package/{worker → dist/worker}/types.js +0 -0
  85. /package/{worker → dist/worker}/worker.d.ts +0 -0
  86. /package/{worker → dist/worker}/worker.js +0 -0
@@ -0,0 +1,17 @@
1
+ if (typeof Symbol.dispose !== 'symbol') {
2
+ Object.defineProperty(Symbol, 'dispose', {
3
+ configurable: false,
4
+ enumerable: false,
5
+ writable: false,
6
+ value: Symbol.for('dispose'),
7
+ });
8
+ }
9
+
10
+ if (typeof Symbol.asyncDispose !== 'symbol') {
11
+ Object.defineProperty(Symbol, 'asyncDispose', {
12
+ configurable: false,
13
+ enumerable: false,
14
+ writable: false,
15
+ value: Symbol.for('asyncDispose'),
16
+ });
17
+ }
@@ -0,0 +1,156 @@
1
+ import type { VovkWorkerSchema } from '../types';
2
+ import type { WorkerInput, WorkerOutput, WorkerPromiseInstance } from './types';
3
+
4
+ export function createWPC<T extends object>(
5
+ currentWorker: Worker | null,
6
+ workerSchema: object
7
+ ): WorkerPromiseInstance<T> {
8
+ if (!workerSchema) throw new Error('Worker schema is not provided');
9
+ const schema = workerSchema as T & VovkWorkerSchema;
10
+ const instance = {
11
+ worker: currentWorker,
12
+ } as WorkerPromiseInstance<T>;
13
+ let callsKey = 0;
14
+
15
+ instance.terminate = () => {
16
+ if (instance._isTerminated) return;
17
+ instance._isTerminated = true;
18
+ instance.worker?.terminate();
19
+ instance.worker = null;
20
+ };
21
+
22
+ instance.employ = (worker: Worker) => {
23
+ if (instance._isTerminated) return instance;
24
+ instance._isTerminated = true;
25
+ instance.worker = worker;
26
+ return instance;
27
+ };
28
+
29
+ instance.fork = (worker: Worker) => createWPC<T>(worker, schema);
30
+
31
+ for (const methodName of Object.keys(schema.handlers) as (keyof T & string)[]) {
32
+ const { isGenerator } = schema.handlers[methodName];
33
+
34
+ if (isGenerator) {
35
+ const method = (...args: unknown[]) => {
36
+ const key = callsKey;
37
+ callsKey += 1;
38
+ return {
39
+ async *[Symbol.asyncIterator]() {
40
+ if (!instance.worker) {
41
+ throw new Error('Worker is not provided or terminated');
42
+ }
43
+ const w = instance.worker;
44
+ const messageQueue: WorkerOutput[] = [];
45
+ let messageResolver: ((message: WorkerOutput) => void) | null = null;
46
+
47
+ const onMessage = (e: MessageEvent<WorkerOutput>) => {
48
+ const { methodName: m, key: k } = e.data;
49
+ if (k !== key || m !== methodName) {
50
+ return;
51
+ }
52
+ if (messageResolver) {
53
+ messageResolver(e.data);
54
+ messageResolver = null;
55
+ } else {
56
+ messageQueue.push(e.data);
57
+ }
58
+ };
59
+
60
+ const onError = (e: ErrorEvent) => {
61
+ if (messageResolver) {
62
+ messageResolver({ error: e.error } as WorkerOutput);
63
+ messageResolver = null;
64
+ } else {
65
+ messageQueue.push({ error: e.error } as WorkerOutput);
66
+ }
67
+
68
+ w.removeEventListener('message', onMessage);
69
+ w.removeEventListener('error', onError);
70
+ throw e.error;
71
+ };
72
+
73
+ w.addEventListener('message', onMessage);
74
+ w.addEventListener('error', onError);
75
+
76
+ w.postMessage({ key, args, methodName } satisfies WorkerInput);
77
+
78
+ try {
79
+ while (true) {
80
+ let message: WorkerOutput | null = null;
81
+ if (messageQueue.length > 0) {
82
+ message = messageQueue.shift()!;
83
+ } else {
84
+ message = await new Promise<WorkerOutput>((resolve) => {
85
+ messageResolver = resolve;
86
+ });
87
+ }
88
+
89
+ const { result, error, done } = message;
90
+
91
+ if (error) {
92
+ throw error;
93
+ }
94
+
95
+ if (done) {
96
+ break;
97
+ }
98
+
99
+ yield result;
100
+ }
101
+
102
+ w.removeEventListener('message', onMessage);
103
+ w.removeEventListener('error', onError);
104
+ } catch (e) {
105
+ w.removeEventListener('message', onMessage);
106
+ w.removeEventListener('error', onError);
107
+ throw e;
108
+ }
109
+ },
110
+ };
111
+ };
112
+
113
+ // @ts-expect-error TODO
114
+ instance[methodName] = method;
115
+ } else {
116
+ const method = (...args: unknown[]) => {
117
+ if (!instance.worker) {
118
+ throw new Error('Worker is not provided or terminated');
119
+ }
120
+ const w = instance.worker;
121
+ return new Promise((resolve, reject) => {
122
+ const key = callsKey;
123
+ callsKey += 1;
124
+
125
+ const onError = (e: ErrorEvent) => {
126
+ w.removeEventListener('message', onMessage);
127
+ w.removeEventListener('error', onError);
128
+ reject(e);
129
+ };
130
+
131
+ const onMessage = (e: MessageEvent<WorkerOutput>) => {
132
+ const { result, error, key: k, methodName: m } = e.data;
133
+ if (k !== key || m !== methodName) {
134
+ return;
135
+ }
136
+ w.removeEventListener('message', onMessage);
137
+ w.removeEventListener('error', onError);
138
+ if (error) {
139
+ reject(error);
140
+ } else {
141
+ resolve(result);
142
+ }
143
+ };
144
+
145
+ w.addEventListener('message', onMessage);
146
+ w.addEventListener('error', onError);
147
+ w.postMessage({ key, args, methodName } satisfies WorkerInput);
148
+ });
149
+ };
150
+
151
+ // @ts-expect-error TODO
152
+ instance[methodName] = method;
153
+ }
154
+ }
155
+ return instance;
156
+ }
@@ -0,0 +1,4 @@
1
+ import { worker } from './worker';
2
+ import { createWPC } from './createWPC';
3
+
4
+ export { worker, createWPC };
@@ -0,0 +1,45 @@
1
+ import type { KnownAny } from '../types';
2
+
3
+ type ToPromise<T> = T extends PromiseLike<unknown> ? T : Promise<T>;
4
+ type ToAsyncGenerator<T> =
5
+ T extends AsyncGenerator<unknown, unknown, unknown>
6
+ ? T
7
+ : T extends Generator<infer U, unknown, unknown>
8
+ ? AsyncGenerator<U, unknown, unknown>
9
+ : AsyncGenerator<T, unknown, unknown>;
10
+ type ToProperReturnType<T> = T extends Generator<unknown, unknown, unknown> | AsyncGenerator<unknown, unknown, unknown>
11
+ ? ToAsyncGenerator<T>
12
+ : ToPromise<T>;
13
+
14
+ type OmitNever<T> = {
15
+ [K in keyof T as T[K] extends never ? never : K]: T[K];
16
+ };
17
+
18
+ export type WorkerPromiseInstanceWithNever<T> = {
19
+ [K in keyof T]: T[K] extends (...args: KnownAny[]) => KnownAny
20
+ ? (...args: Parameters<T[K]>) => ToProperReturnType<ReturnType<T[K]>>
21
+ : never;
22
+ };
23
+
24
+ export type WorkerPromiseInstance<T> = OmitNever<WorkerPromiseInstanceWithNever<T>> & {
25
+ terminate: () => void;
26
+ employ: (w: Worker) => WorkerPromiseInstance<T>;
27
+ fork: (w: Worker) => WorkerPromiseInstance<T>;
28
+ worker: Worker | null;
29
+ _isTerminated?: true;
30
+ [Symbol.dispose]: () => void;
31
+ };
32
+
33
+ export interface WorkerInput {
34
+ methodName: string;
35
+ args: unknown[];
36
+ key: number;
37
+ }
38
+
39
+ export interface WorkerOutput {
40
+ methodName: string;
41
+ result?: unknown;
42
+ error?: unknown;
43
+ done?: true;
44
+ key: number;
45
+ }
@@ -0,0 +1,53 @@
1
+ import type { VovkWorker } from '../types';
2
+ import type { WorkerInput, WorkerOutput } from './types';
3
+
4
+ export function worker() {
5
+ return (t: object) => {
6
+ const target = t as Record<
7
+ string,
8
+ (
9
+ ...args: unknown[]
10
+ ) => Iterable<unknown> | AsyncIterable<unknown> | Promise<Iterable<unknown> | AsyncIterable<unknown>>
11
+ > &
12
+ VovkWorker;
13
+ target._handlers = {};
14
+
15
+ for (const key of Object.getOwnPropertyNames(target)) {
16
+ const member = target[key];
17
+ if (typeof member === 'function') {
18
+ const prototype = Object.getPrototypeOf(member) as unknown;
19
+ const isGenerator =
20
+ prototype === Object.getPrototypeOf(function* () {}) ||
21
+ prototype === Object.getPrototypeOf(async function* () {});
22
+ target._handlers[key] = {};
23
+
24
+ if (isGenerator) {
25
+ target._handlers[key].isGenerator = true;
26
+ }
27
+ }
28
+ }
29
+
30
+ if (typeof self === 'undefined') return; // no-op in non-worker environment
31
+
32
+ const w = self as unknown as Worker;
33
+
34
+ w.onmessage = async (evt: MessageEvent<WorkerInput>) => {
35
+ const { methodName, args, key } = evt.data;
36
+ try {
37
+ const result = await target[methodName](...args);
38
+
39
+ if (result && typeof result === 'object' && 'next' in result && typeof result.next === 'function') {
40
+ const iterable = result as Iterable<unknown> | AsyncIterable<unknown>;
41
+ for await (const result of iterable) {
42
+ w.postMessage({ result, key, methodName } satisfies WorkerOutput);
43
+ }
44
+ w.postMessage({ done: true, key, methodName } satisfies WorkerOutput);
45
+ } else {
46
+ w.postMessage({ result, key, methodName } satisfies WorkerOutput);
47
+ }
48
+ } catch (e) {
49
+ w.postMessage({ error: e, key, methodName } satisfies WorkerOutput);
50
+ }
51
+ };
52
+ };
53
+ }
@@ -1,4 +0,0 @@
1
- import { type VovkControllerSchema, type KnownAny } from '../types';
2
- import { type VovkClientOptions, type VovkClient, type VovkDefaultFetcherOptions } from './types';
3
- export declare const ARRAY_QUERY_KEY = "_vovkarr";
4
- export declare const clientizeController: <T, OPTS extends Record<string, KnownAny> = VovkDefaultFetcherOptions>(controllerSchema: VovkControllerSchema, segmentName?: string, options?: VovkClientOptions<OPTS>) => VovkClient<T, OPTS>;
package/client/index.d.ts DELETED
@@ -1,4 +0,0 @@
1
- import { clientizeController } from './clientizeController';
2
- import type { VovkClientFetcher, VovkClientOptions, VovkDefaultFetcherOptions } from './types';
3
- export { clientizeController };
4
- export type { VovkClientFetcher, VovkClientOptions, VovkDefaultFetcherOptions };
package/client/index.js DELETED
@@ -1,5 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.clientizeController = void 0;
4
- const clientizeController_1 = require("./clientizeController");
5
- Object.defineProperty(exports, "clientizeController", { enumerable: true, get: function () { return clientizeController_1.clientizeController; } });
@@ -1,5 +0,0 @@
1
- import { KnownAny as KnownAny } from '../types';
2
- export default function setClientValidatorsForHandler(h: (...args: KnownAny[]) => KnownAny, validation: {
3
- body: unknown;
4
- query: unknown;
5
- }): Promise<void>;
package/worker/index.d.ts DELETED
@@ -1,3 +0,0 @@
1
- import { worker } from './worker';
2
- import { promisifyWorker } from './promisifyWorker';
3
- export { worker, promisifyWorker };
package/worker/index.js DELETED
@@ -1,7 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.promisifyWorker = exports.worker = void 0;
4
- const worker_1 = require("./worker");
5
- Object.defineProperty(exports, "worker", { enumerable: true, get: function () { return worker_1.worker; } });
6
- const promisifyWorker_1 = require("./promisifyWorker");
7
- Object.defineProperty(exports, "promisifyWorker", { enumerable: true, get: function () { return promisifyWorker_1.promisifyWorker; } });
@@ -1,2 +0,0 @@
1
- import type { WorkerPromiseInstance } from './types';
2
- export declare function promisifyWorker<T extends object>(currentWorker: Worker | null, workerSchema: object): WorkerPromiseInstance<T>;
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes