wenay-common2 1.0.32 → 1.0.33

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.
@@ -0,0 +1,20 @@
1
+ import { funcListenCallbackBase } from "../events/Listen";
2
+ import { type PromiseServerHooks, type RpcLimits } from "./rpc-server";
3
+ import { DeepSocketListen } from "./listen-deep";
4
+ import { type SocketTmpl } from "./rpc-protocol";
5
+ type ListenCallbackBase<T extends any[] = any[]> = ReturnType<typeof funcListenCallbackBase<T>>;
6
+ type ClientProtocol = 'v2' | 'legacy' | null;
7
+ export declare function createRpcServerAuto2<T extends object>({ socket, object: target, socketKey: key, debug, hooks, disconnectListen, limits, onProtocolDetect, }: {
8
+ socket: SocketTmpl;
9
+ object: T;
10
+ socketKey: string;
11
+ debug?: boolean;
12
+ hooks?: Omit<PromiseServerHooks<DeepSocketListen<T>>, "resolveTransform">;
13
+ disconnectListen?: ListenCallbackBase<any>;
14
+ limits?: RpcLimits;
15
+ onProtocolDetect?: (protocol: 'v2' | 'legacy') => void;
16
+ }): {
17
+ getProtocol: () => ClientProtocol;
18
+ getSchema: () => any;
19
+ };
20
+ export {};
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createRpcServerAuto2 = createRpcServerAuto2;
4
+ const Listen_1 = require("../events/Listen");
5
+ const listen_socket_1 = require("./listen-socket");
6
+ const rpc_server_1 = require("./rpc-server");
7
+ const rpc_protocol_1 = require("./rpc-protocol");
8
+ const old_ommonsServerMini_1 = require("./old\u0421ommonsServerMini");
9
+ function createRpcServerAuto_({ socket, object: target, socketKey: key, debug, hooks, disconnectListen, limits }) {
10
+ const cache = new WeakMap();
11
+ function getListenSocket(parent, disconnectListen) {
12
+ let result = cache.get(parent);
13
+ if (!result) {
14
+ result = (0, listen_socket_1.listenSocket)(parent, { addListenClose: disconnectListen });
15
+ cache.set(parent, result);
16
+ }
17
+ return result;
18
+ }
19
+ (0, rpc_server_1.createRpcServer)({
20
+ socket, object: target, socketKey: key, debug, limits,
21
+ hooks: {
22
+ ...hooks,
23
+ resolveTransform: (obj) => {
24
+ if (!(0, Listen_1.isListenCallback)(obj))
25
+ return obj;
26
+ return getListenSocket(obj, disconnectListen);
27
+ },
28
+ },
29
+ });
30
+ }
31
+ function createRpcServerAuto2({ socket, object: target, socketKey: key, debug = false, hooks, disconnectListen, limits, onProtocolDetect, }) {
32
+ const cache = new WeakMap();
33
+ function getListenSocket(parent) {
34
+ let result = cache.get(parent);
35
+ if (!result) {
36
+ result = (0, listen_socket_1.listenSocket)(parent, { addListenClose: disconnectListen });
37
+ cache.set(parent, result);
38
+ }
39
+ return result;
40
+ }
41
+ function resolveTransform(obj) {
42
+ if (!(0, Listen_1.isListenCallback)(obj))
43
+ return obj;
44
+ return getListenSocket(obj);
45
+ }
46
+ function transformTree(obj) {
47
+ if (obj == null || typeof obj !== 'object')
48
+ return obj;
49
+ const transformed = resolveTransform(obj);
50
+ if (transformed !== obj)
51
+ return transformed;
52
+ const out = {};
53
+ for (const k of Object.keys(obj)) {
54
+ const v = obj[k];
55
+ out[k] = typeof v === 'function' ? v : (v != null && typeof v === 'object') ? transformTree(v) : v;
56
+ }
57
+ return out;
58
+ }
59
+ function serialize(obj) {
60
+ const out = {};
61
+ for (const k of Object.keys(obj)) {
62
+ const v = obj[k];
63
+ if (v == null)
64
+ out[k] = 'null';
65
+ else if (typeof v === 'function')
66
+ out[k] = 'func';
67
+ else if (typeof v === 'object')
68
+ out[k] = serialize(v);
69
+ else
70
+ out[k] = 'unknown';
71
+ }
72
+ return out;
73
+ }
74
+ const resolved = transformTree(target);
75
+ const strictSchema = serialize(resolved);
76
+ let protocol = null;
77
+ let v2Handler = null;
78
+ let legacyHandler = null;
79
+ function isLegacyMessage(msg) {
80
+ return (typeof msg === 'object' &&
81
+ msg !== null &&
82
+ !Array.isArray(msg) &&
83
+ typeof msg.mapId === 'number' &&
84
+ (msg.data !== undefined || msg.error !== undefined));
85
+ }
86
+ function isLegacyStrictRequest(msg) {
87
+ return msg === '___STRICTLY';
88
+ }
89
+ function isV2Message(msg) {
90
+ return (Array.isArray(msg) && (msg[0] === rpc_protocol_1.Pkt.CALL || msg[0] === rpc_protocol_1.Pkt.PIPE)) || msg === rpc_protocol_1.Pkt.STRICT;
91
+ }
92
+ function initLegacy() {
93
+ if (legacyHandler)
94
+ return;
95
+ let onMessageCb = null;
96
+ (0, old_ommonsServerMini_1.promiseServer)({
97
+ sendMessage: (msg) => socket.emit(key, msg),
98
+ api: ({ onMessage }) => { onMessageCb = onMessage; },
99
+ }, resolved);
100
+ legacyHandler = (msg) => onMessageCb?.(msg);
101
+ }
102
+ function initV2() {
103
+ if (v2Handler)
104
+ return;
105
+ let onMsgCb = null;
106
+ const innerSocket = {
107
+ emit: (e, d) => socket.emit(e, d),
108
+ on: (e, cb) => { if (e === key)
109
+ onMsgCb = cb; },
110
+ };
111
+ if (debug) {
112
+ const origOn = innerSocket.on.bind(innerSocket);
113
+ innerSocket.on = (e, cb) => origOn(e, (d) => { console.log('[RPC IN]', typeof d === 'object' ? JSON.stringify(d) : d); cb(d); });
114
+ }
115
+ (0, rpc_server_1.createRpcServer)({
116
+ socket: innerSocket,
117
+ object: target,
118
+ socketKey: key,
119
+ debug: false,
120
+ limits,
121
+ hooks: {
122
+ ...hooks,
123
+ resolveTransform,
124
+ },
125
+ });
126
+ v2Handler = (msg) => onMsgCb?.(msg);
127
+ }
128
+ socket.on(key, (msg) => {
129
+ if (debug) {
130
+ console.log('[RPC-AUTO2]', typeof msg === 'object' ? JSON.stringify(msg) : msg);
131
+ }
132
+ if (protocol === null) {
133
+ if (isLegacyStrictRequest(msg)) {
134
+ protocol = 'legacy';
135
+ onProtocolDetect?.('legacy');
136
+ socket.emit(key, { STRICTLY: strictSchema });
137
+ initLegacy();
138
+ return;
139
+ }
140
+ if (isLegacyMessage(msg)) {
141
+ protocol = 'legacy';
142
+ onProtocolDetect?.('legacy');
143
+ initLegacy();
144
+ legacyHandler(msg);
145
+ return;
146
+ }
147
+ if (isV2Message(msg)) {
148
+ protocol = 'v2';
149
+ onProtocolDetect?.('v2');
150
+ initV2();
151
+ v2Handler(msg);
152
+ return;
153
+ }
154
+ return;
155
+ }
156
+ if (protocol === 'legacy') {
157
+ if (isLegacyStrictRequest(msg)) {
158
+ socket.emit(key, { STRICTLY: strictSchema });
159
+ return;
160
+ }
161
+ legacyHandler(msg);
162
+ }
163
+ else {
164
+ v2Handler(msg);
165
+ }
166
+ });
167
+ return {
168
+ getProtocol: () => protocol,
169
+ getSchema: () => strictSchema,
170
+ };
171
+ }
@@ -0,0 +1,117 @@
1
+ type tSocket = {
2
+ emit: (marker: string, object: any) => any;
3
+ on: (marker: string, callback: (a: any) => any) => any;
4
+ };
5
+ export type tRequestScreenerT<T> = {
6
+ key: string[];
7
+ callbacksId?: string[];
8
+ request: any[];
9
+ };
10
+ type tt = {
11
+ [k: string]: any;
12
+ };
13
+ export declare function funcPromiseServer<T extends tt>(data: screenerSoc<tSocketData<tRequestScreenerT<T>>>, obj: T): void;
14
+ export declare function funcPromiseServer2<T extends object>(sendMessage: screenerSoc222<tSocketData<tRequestScreenerT<T>>>, obj: T): (datum: any) => Promise<void>;
15
+ type tSocketData<T> = ({
16
+ data: T;
17
+ error?: undefined;
18
+ } | {
19
+ error: any;
20
+ data?: undefined;
21
+ }) & {
22
+ mapId: number;
23
+ wait?: boolean;
24
+ callbacksId?: number[];
25
+ };
26
+ type screenerSoc<T> = {
27
+ sendMessage: (data: T) => void;
28
+ api: (data: {
29
+ onMessage: (data: T) => void | Promise<void>;
30
+ }) => void;
31
+ };
32
+ type screenerSoc222<T> = (data: T) => void;
33
+ export declare function funcForWebSocket<T>(data: screenerSoc<tSocketData<tRequestScreenerT<T>>> & {
34
+ limit?: number;
35
+ }): screenerSoc2<T>;
36
+ type tFunc = (a: any) => any;
37
+ export type screenerSoc2<T> = {
38
+ send: (data: tRequestScreenerT<T>, wait?: boolean, callbacksId?: tFunc[]) => Promise<any>;
39
+ api: screenerSocApi<T>;
40
+ };
41
+ export type screenerSocApi<T> = {
42
+ log: (status: boolean) => void;
43
+ promiseTotal: () => number;
44
+ callbackTotal: () => number;
45
+ promiseDeleteAll: (reject: boolean) => void;
46
+ callbackDeleteAll: () => void;
47
+ callbackDelete: (func: tFunc) => void;
48
+ };
49
+ export type tMethodToPromise2<T extends object> = {
50
+ [P in keyof T]: T[P] extends ((...args: infer Z) => infer X) ? X extends Promise<any> ? T[P] : (...args: Z) => Promise<X> : T[P] extends object ? tMethodToPromise2<T[P]> : never;
51
+ };
52
+ export type tMethodToPromise4<T extends object> = {
53
+ [P in keyof T]: T[P] extends ((...args: infer Z) => infer X) ? X extends Promise<any> ? T[P] : (...args: Z) => Promise<X> : T[P] extends object ? tMethodToPromise4<T[P]> : T[P];
54
+ };
55
+ type tt5<T extends any> = T extends Promise<infer R> ? R : T;
56
+ export type tMethodToPromise5<T extends object> = {
57
+ [P in keyof T]: T[P] extends ((...args: infer Z) => infer X) ? (...args: Z) => Promise<tt5<X>> : T[P] extends object ? tMethodToPromise5<T[P]> : never;
58
+ };
59
+ export type tMethodToPromise6<T extends object> = {
60
+ [P in keyof T]: T[P] extends ((...args: infer Z) => infer X) ? (...args: Z) => Promise<tt5<X>> : T[P] extends object ? tMethodToPromise6<T[P]> : T[P];
61
+ };
62
+ export declare function funcScreenerClient2<T extends object>(data: screenerSoc2<T>, wait?: boolean): tMethodToPromise5<T>;
63
+ type tAndB<T> = {
64
+ data: T;
65
+ void: () => void;
66
+ };
67
+ export type screenerSoc3<T> = {
68
+ send: (data: tRequestScreenerT<T>) => tAndB<Promise<any>>;
69
+ };
70
+ export type tMethodToPromise3<T extends object> = {
71
+ [P in keyof T]: T[P] extends ((...args: infer Z) => infer X) ? (...args: Z) => (X extends Promise<any> ? tAndB<X> : tAndB<Promise<X>>) : tAndB<Promise<T[P]>>;
72
+ };
73
+ export type typeVoid2<T> = {
74
+ [P in Exclude<keyof T, {
75
+ [P in keyof T]: T[P] extends (any: any) => any ? ReturnType<T[P]> extends void ? P : never : never;
76
+ }[keyof T]>]: T[P];
77
+ };
78
+ export type typeNoVoid2<T> = {
79
+ [P in Exclude<keyof T, {
80
+ [P in keyof T]: T[P] extends (any: any) => any ? ReturnType<T[P]> extends void ? never : P : never;
81
+ }[keyof T]>]: T[P];
82
+ };
83
+ export type UnAwaited<T extends Promise<any>> = T extends Promise<infer R> ? R : never;
84
+ export type UnAwaitedArr<T extends Promise<any>[]> = T extends Promise<infer R>[] ? R[] : never;
85
+ export type ReturnTypePromise<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R extends Promise<any> ? UnAwaited<R> : R : any;
86
+ export type UnObject<T extends object> = T extends {
87
+ [k: string]: infer R;
88
+ } ? R : never;
89
+ export type UnArray<T extends any[]> = T extends (infer R)[] ? R : never;
90
+ export type tElArr<T extends any[]> = UnArray<T>;
91
+ export declare function CreatAPIFacadeClientOld<T extends object>({ socketKey, socket, limit }: {
92
+ socket: tSocket;
93
+ socketKey: string;
94
+ limit?: number;
95
+ }): {
96
+ api: screenerSocApi<any>;
97
+ func: tMethodToPromise5<typeVoid2<T>>;
98
+ space: tMethodToPromise5<typeNoVoid2<T>>;
99
+ all: tMethodToPromise5<T>;
100
+ strictly: tMethodToPromise6<T>;
101
+ infoStrictly(): any;
102
+ strictlyInit(obj?: object): Promise<unknown>;
103
+ };
104
+ export declare function CreatAPIFacadeServerOld<T extends object>({ object, socket, socketKey, debug }: {
105
+ socket: tSocket;
106
+ object: T;
107
+ socketKey: string;
108
+ debug?: boolean;
109
+ }): void;
110
+ export declare function fMiniTest(): void;
111
+ export declare class CTestWeb {
112
+ func(a: number, b: number): number;
113
+ func2(a: number, b: number): Promise<number>;
114
+ fun3(a: number, b: number): number;
115
+ test(): string;
116
+ }
117
+ export {};
@@ -0,0 +1,372 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CTestWeb = void 0;
4
+ exports.funcPromiseServer = funcPromiseServer;
5
+ exports.funcPromiseServer2 = funcPromiseServer2;
6
+ exports.funcForWebSocket = funcForWebSocket;
7
+ exports.funcScreenerClient2 = funcScreenerClient2;
8
+ exports.CreatAPIFacadeClientOld = CreatAPIFacadeClientOld;
9
+ exports.CreatAPIFacadeServerOld = CreatAPIFacadeServerOld;
10
+ exports.fMiniTest = fMiniTest;
11
+ const common_1 = require("../core/common");
12
+ function funcPromiseServer(data, obj) {
13
+ const buf = data;
14
+ data.api({
15
+ onMessage: async (datum) => {
16
+ const { key, request } = datum.data;
17
+ let buf2 = obj;
18
+ let nameF = "";
19
+ try {
20
+ for (let k of key) {
21
+ nameF = k;
22
+ if (typeof buf2[nameF] == "function")
23
+ break;
24
+ buf2 = buf2[nameF];
25
+ }
26
+ }
27
+ catch (e) {
28
+ data.sendMessage({ mapId: datum.mapId, error: { error: e, key: key, arguments: request } });
29
+ console.error({ error: e, key: key, arguments: request });
30
+ return;
31
+ }
32
+ const buf = buf2;
33
+ if (typeof buf[nameF] == "function") {
34
+ const { callbacksId } = datum;
35
+ if (callbacksId && Array.isArray(callbacksId)) {
36
+ const arr = callbacksId.map((e) => {
37
+ return (d) => {
38
+ try {
39
+ data.sendMessage({ mapId: e, data: d ?? undefined });
40
+ }
41
+ catch (e) {
42
+ console.log("errrrr !!!!!!", e);
43
+ }
44
+ };
45
+ });
46
+ let r = 0;
47
+ request.forEach((e, i) => {
48
+ if (e == "___FUNC")
49
+ request[i] = arr[r++];
50
+ });
51
+ }
52
+ const trt = async () => buf[nameF](...request);
53
+ await trt()
54
+ .then(a => {
55
+ if (datum.wait !== false)
56
+ data.sendMessage({ mapId: datum.mapId, data: a ?? undefined });
57
+ })
58
+ .catch((e) => {
59
+ console.log(nameF, request, key);
60
+ data.sendMessage({ mapId: datum.mapId, error: { error: e, key: key, arguments: request } });
61
+ console.error({ error: e, key: key, arguments: request });
62
+ });
63
+ }
64
+ else {
65
+ data.sendMessage({
66
+ mapId: datum.mapId,
67
+ error: JSON.stringify({ data: "это не функция", key: key, arguments: request })
68
+ });
69
+ console.error({ data: "это не функция", key: key, arguments: request });
70
+ }
71
+ }
72
+ });
73
+ }
74
+ function funcPromiseServer2(sendMessage, obj) {
75
+ return async (datum) => {
76
+ const { key, request } = datum.data;
77
+ const buf = obj[key];
78
+ if (!buf)
79
+ return;
80
+ if (typeof buf == "function") {
81
+ const a = await (async () => buf(...request))();
82
+ sendMessage({ mapId: datum.mapId, data: a ?? undefined });
83
+ }
84
+ else
85
+ throw "это не функция";
86
+ };
87
+ }
88
+ function funcForWebSocket(data) {
89
+ const limit = data.limit;
90
+ const sendMessage = data.sendMessage;
91
+ const free = (() => {
92
+ const freeNums = [];
93
+ let [total, _poz] = [0, 0];
94
+ return {
95
+ log() {
96
+ console.log({ freeNums, total, _poz });
97
+ },
98
+ next() {
99
+ return _poz > 0 ? freeNums[--_poz] : ++total;
100
+ },
101
+ numsSet(num) {
102
+ freeNums[_poz++] = num;
103
+ }
104
+ };
105
+ })();
106
+ const map = new Map();
107
+ const callbackMany = new Map();
108
+ data.api({
109
+ onMessage: (data) => {
110
+ const { mapId } = data;
111
+ if (map.has(mapId)) {
112
+ const buf = map.get(mapId);
113
+ map.delete(mapId);
114
+ free.numsSet(mapId);
115
+ if (data.error)
116
+ buf?.reject(data.error);
117
+ else
118
+ buf?.resolve(data.data);
119
+ }
120
+ else if (callbackMany.has(mapId)) {
121
+ const buf = callbackMany.get(mapId);
122
+ if (data.data == "___STOP") {
123
+ callbackMany.delete(mapId);
124
+ free.numsSet(mapId);
125
+ }
126
+ buf?.(data.data);
127
+ }
128
+ else {
129
+ console.error("пришел ответ которого не ждали ", data);
130
+ }
131
+ }
132
+ });
133
+ let status = false;
134
+ const api = {
135
+ log(_status) { status = _status; },
136
+ promiseTotal: () => map.size,
137
+ callbackTotal: () => callbackMany.size,
138
+ promiseDeleteAll: (reject = true) => {
139
+ const arr = [...map.values()];
140
+ const arrKey = [...map.keys()];
141
+ map.clear();
142
+ arrKey.forEach(e => free.numsSet(+e));
143
+ arr.forEach((e) => reject ? e.reject("promiseDeleteAll") : e.resolve(undefined));
144
+ },
145
+ callbackDeleteAll: () => {
146
+ const arr = [...callbackMany.keys()];
147
+ callbackMany.clear();
148
+ arr.forEach(e => free.numsSet(+e));
149
+ },
150
+ callbackDelete: (func) => {
151
+ callbackMany.forEach((e, key) => {
152
+ if (e == func) {
153
+ callbackMany.delete(key);
154
+ free.numsSet(+key);
155
+ }
156
+ });
157
+ },
158
+ };
159
+ return {
160
+ api,
161
+ send: (data, wait, callbacksId) => new Promise((resolve, reject) => {
162
+ const send = {
163
+ mapId: free.next(),
164
+ data,
165
+ wait: wait,
166
+ callbacksId: []
167
+ };
168
+ for (const el of callbacksId ?? []) {
169
+ const id = free.next();
170
+ send.callbacksId?.push(id);
171
+ if (status) {
172
+ console.log("ключ стрмиа ", id, " ", send);
173
+ }
174
+ callbackMany.set(id, el);
175
+ }
176
+ if (wait !== false)
177
+ map.set(send.mapId, { resolve, reject });
178
+ if (status) {
179
+ free.log();
180
+ console.log("ключ сокета ", send.mapId, " ", send);
181
+ }
182
+ if (limit && callbackMany.size >= limit)
183
+ console.log("callbackMany.size = ", callbackMany.size);
184
+ if (limit && map.size >= limit)
185
+ console.log("map.size = ", map.size);
186
+ sendMessage(send);
187
+ })
188
+ };
189
+ }
190
+ function funcScreenerClient2(data, wait) {
191
+ const tr = (address) => new Proxy((() => { }), {
192
+ get(target, p, receiver) {
193
+ address.push(p);
194
+ return tr(address);
195
+ },
196
+ apply(target, thisArg, argArray) {
197
+ const callback = [];
198
+ const callback2 = [];
199
+ argArray.forEach((el, i) => {
200
+ if (typeof el == "function") {
201
+ callback.push({ func: el, poz: i });
202
+ callback2.push(el);
203
+ argArray[i] = "___FUNC";
204
+ }
205
+ });
206
+ return data.send({ key: address, request: argArray }, wait, callback2);
207
+ }
208
+ });
209
+ const tr2 = () => new Proxy({}, {
210
+ get(target, p, receiver) {
211
+ return tr([String(p)]);
212
+ },
213
+ });
214
+ return tr2();
215
+ }
216
+ function funcScreenerClient3(data, obj, wait) {
217
+ const tr = (address) => new Proxy((() => { }), {
218
+ has(target, p) {
219
+ let o = obj();
220
+ for (let a of address) {
221
+ o = o?.[a];
222
+ if (!o)
223
+ break;
224
+ if (o == "null")
225
+ return false;
226
+ }
227
+ o = o?.[p];
228
+ if (o == "null")
229
+ return false;
230
+ return true;
231
+ },
232
+ get(target, p, receiver) {
233
+ let o = obj();
234
+ for (let a of address) {
235
+ o = o?.[a];
236
+ if (!o)
237
+ break;
238
+ if (o == "null")
239
+ return undefined;
240
+ }
241
+ o = o?.[p];
242
+ if (o == "null")
243
+ return undefined;
244
+ return tr([...address, String(p)]);
245
+ },
246
+ apply(target, thisArg, argArray) {
247
+ let o = obj();
248
+ for (let a of address) {
249
+ o = o?.[a];
250
+ if (!o)
251
+ break;
252
+ if (o == "null")
253
+ return undefined;
254
+ }
255
+ if (address.at(-1) == "call") {
256
+ address.length = address.length - 1;
257
+ argArray.splice(0, 1);
258
+ }
259
+ const callback = [];
260
+ const callback2 = [];
261
+ argArray.forEach((el, i) => {
262
+ if (typeof el == "function") {
263
+ callback.push({ func: el, poz: i });
264
+ callback2.push(el);
265
+ argArray[i] = "___FUNC";
266
+ }
267
+ });
268
+ return data.send({ key: address, request: argArray }, wait, callback2);
269
+ }
270
+ });
271
+ const tr2 = () => new Proxy({}, {
272
+ has(target, p) {
273
+ let o = obj();
274
+ o = o?.[p];
275
+ if (o == "null")
276
+ return false;
277
+ return true;
278
+ },
279
+ get(target, p, receiver) {
280
+ let o = obj();
281
+ if (o) {
282
+ if (o[p] == "null")
283
+ return undefined;
284
+ }
285
+ return tr([String(p)]);
286
+ },
287
+ });
288
+ return tr2();
289
+ }
290
+ function CreatAPIFacadeClientOld({ socketKey, socket, limit }) {
291
+ let strictlyObj = {};
292
+ let promiseStrictly = Promise.resolve();
293
+ let funcPromise;
294
+ const tr = funcForWebSocket({
295
+ sendMessage: (data) => socket.emit(socketKey, data),
296
+ api: (data) => {
297
+ socket.on(socketKey, (d) => {
298
+ if (typeof d == "object" && d?.STRICTLY) {
299
+ Object.keys(strictlyObj).forEach(k => { delete strictlyObj[k]; });
300
+ Object.assign(strictlyObj, d.STRICTLY);
301
+ funcPromise?.(undefined);
302
+ }
303
+ else
304
+ data.onMessage(d);
305
+ });
306
+ },
307
+ limit
308
+ });
309
+ const func = funcScreenerClient2(tr);
310
+ const strictly = funcScreenerClient3(tr, () => strictlyObj);
311
+ const space = funcScreenerClient2(tr, false);
312
+ return {
313
+ api: tr.api,
314
+ func,
315
+ space,
316
+ all: func,
317
+ strictly,
318
+ infoStrictly() { return strictlyObj; },
319
+ async strictlyInit(obj) {
320
+ if (obj)
321
+ strictlyObj = obj;
322
+ else {
323
+ socket.emit(socketKey, "___STRICTLY");
324
+ return new Promise(resolve => {
325
+ funcPromise = resolve;
326
+ });
327
+ }
328
+ }
329
+ };
330
+ }
331
+ function CreatAPIFacadeServerOld({ object, socket, socketKey, debug = false }) {
332
+ function ff(obj) {
333
+ return Object.fromEntries(Object.entries(obj).map(([k, v]) => {
334
+ return [
335
+ k, typeof v == "object" && v != null ? ff(v) : typeof v == "function" ? "func" : !v ? "null" : "unknow"
336
+ ];
337
+ }));
338
+ }
339
+ const t = ff(object);
340
+ funcPromiseServer({
341
+ sendMessage: (data) => socket.emit(socketKey, data),
342
+ api: (api) => {
343
+ socket.on(socketKey, (d) => {
344
+ if (debug)
345
+ console.log(typeof d == "object" ? JSON.stringify(d) : d);
346
+ if (d == "___STRICTLY") {
347
+ socket.emit(socketKey, { STRICTLY: t });
348
+ }
349
+ else
350
+ api.onMessage(d);
351
+ });
352
+ }
353
+ }, object);
354
+ }
355
+ function fMiniTest() {
356
+ }
357
+ class CTestWeb {
358
+ func(a, b) {
359
+ return a + b;
360
+ }
361
+ async func2(a, b) {
362
+ await (0, common_1.sleepAsync)(1000);
363
+ return a * b;
364
+ }
365
+ fun3(a, b) {
366
+ return a ** b;
367
+ }
368
+ test() {
369
+ return "status ok";
370
+ }
371
+ }
372
+ exports.CTestWeb = CTestWeb;
@@ -0,0 +1,105 @@
1
+ type Socket = {
2
+ emit: (e: string, p: any) => any;
3
+ on: (e: string, cb: (d: any) => any) => any;
4
+ };
5
+ export type RequestScreener<T> = {
6
+ key: string[];
7
+ callbacksId?: string[];
8
+ request: any[];
9
+ };
10
+ type Obj = {
11
+ [k: string]: any;
12
+ };
13
+ type SocketData<T> = ({
14
+ data: T;
15
+ error?: undefined;
16
+ } | {
17
+ error: any;
18
+ data?: undefined;
19
+ }) & {
20
+ mapId: number;
21
+ wait?: boolean;
22
+ callbacksId?: number[];
23
+ };
24
+ type PromiseServerHooks<T> = {
25
+ onRequest?: (ctx: {
26
+ key: string[];
27
+ request: any[];
28
+ fnName: string;
29
+ fn: Func;
30
+ msg: SocketData<RequestScreener<T>>;
31
+ }) => boolean | Promise<boolean>;
32
+ onInvalid?: (ctx: {
33
+ reason: "invalid_payload" | "not_function" | "resolve_error" | "rate_limit";
34
+ key?: any;
35
+ request?: any;
36
+ error?: any;
37
+ msg: SocketData<RequestScreener<T>>;
38
+ }) => void | Promise<void>;
39
+ };
40
+ type ScreenerSoc<T> = {
41
+ sendMessage: (d: T) => void;
42
+ api: (h: {
43
+ onMessage: (m: T) => void | Promise<void>;
44
+ }) => void;
45
+ };
46
+ export declare function promiseServer<T extends Obj>(soc: ScreenerSoc<SocketData<RequestScreener<T>>> & {
47
+ hooks?: PromiseServerHooks<T>;
48
+ }, target: T): void;
49
+ type Func = (a: any) => any;
50
+ export type ScreenerSoc2<T> = {
51
+ send: (d: RequestScreener<T>, wait?: boolean, cbs?: Func[]) => Promise<any>;
52
+ api: ScreenerSocApi<T>;
53
+ abortAll: (textError: string) => void;
54
+ };
55
+ export type ScreenerSocApi<T> = {
56
+ log: (s: boolean) => void;
57
+ promiseTotal: () => number;
58
+ callbackTotal: () => number;
59
+ promiseDeleteAll: (rej: boolean) => void;
60
+ callbackDeleteAll: () => void;
61
+ callbackDelete: (fn: Func) => void;
62
+ };
63
+ type UnwrapPromise<T> = T extends Promise<infer R> ? R : T;
64
+ export type MethodToPromise<T extends object> = {
65
+ [P in keyof T]: T[P] extends (...args: infer Z) => infer X ? (...args: Z) => Promise<UnwrapPromise<X>> : T[P] extends object ? MethodToPromise<T[P]> : never;
66
+ };
67
+ export type MethodToPromiseStrict<T extends object> = {
68
+ [P in keyof T]: T[P] extends (...args: infer Z) => infer X ? (...args: Z) => Promise<UnwrapPromise<X>> : T[P] extends object ? MethodToPromiseStrict<T[P]> : T[P];
69
+ };
70
+ export declare function wsWrapper<T>(soc: ScreenerSoc<SocketData<RequestScreener<T>>> & {
71
+ limit?: number;
72
+ }): ScreenerSoc2<T>;
73
+ export declare function createClientProxy<T extends object>(soc2: ScreenerSoc2<T>, wait?: boolean): MethodToPromise<T>;
74
+ export type NoVoid<T> = {
75
+ [P in Exclude<keyof T, {
76
+ [K in keyof T]: T[K] extends (...args: any[]) => any ? ReturnType<T[K]> extends void ? K : never : never;
77
+ }[keyof T]>]: T[P];
78
+ };
79
+ export type OnlyVoid<T> = {
80
+ [P in Exclude<keyof T, {
81
+ [K in keyof T]: T[K] extends (...args: any[]) => any ? ReturnType<T[K]> extends void ? never : K : never;
82
+ }[keyof T]>]: T[P];
83
+ };
84
+ export declare function createAPIFacadeClient<T extends object>({ socket: sock, socketKey: key, limit }: {
85
+ socket: Socket;
86
+ socketKey: string;
87
+ limit?: number;
88
+ }): {
89
+ api: ScreenerSocApi<any>;
90
+ func: MethodToPromise<NoVoid<T>>;
91
+ space: MethodToPromise<OnlyVoid<T>>;
92
+ all: MethodToPromise<T>;
93
+ strict: MethodToPromiseStrict<T>;
94
+ infoStrict: () => any;
95
+ strictInit(obj?: object): Promise<unknown>;
96
+ };
97
+ export declare function createAPIFacadeServer<T extends object>({ socket: sock, object: targetObj, socketKey: key, debug }: {
98
+ socket: Socket;
99
+ object: T;
100
+ socketKey: string;
101
+ debug?: boolean;
102
+ }): void;
103
+ export declare const CreatAPIFacadeServer: typeof createAPIFacadeServer;
104
+ export declare const CreatAPIFacadeClient: typeof createAPIFacadeClient;
105
+ export {};
@@ -0,0 +1,320 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CreatAPIFacadeClient = exports.CreatAPIFacadeServer = void 0;
4
+ exports.promiseServer = promiseServer;
5
+ exports.wsWrapper = wsWrapper;
6
+ exports.createClientProxy = createClientProxy;
7
+ exports.createAPIFacadeClient = createAPIFacadeClient;
8
+ exports.createAPIFacadeServer = createAPIFacadeServer;
9
+ function createSimpleRateLimitHook(options) {
10
+ let count = 0;
11
+ let resetAt = 0;
12
+ return () => {
13
+ const now = Date.now();
14
+ if (now >= resetAt) {
15
+ resetAt = now + options.intervalMs;
16
+ count = 0;
17
+ }
18
+ count += 1;
19
+ if (count > options.max) {
20
+ throw new Error("Rate limit exceeded");
21
+ }
22
+ return true;
23
+ };
24
+ }
25
+ function promiseServer(soc, target) {
26
+ const serializeError = (err) => {
27
+ if (err instanceof Error) {
28
+ return { name: err.name, message: err.message, stack: err.stack };
29
+ }
30
+ return err;
31
+ };
32
+ const hooks = soc.hooks;
33
+ soc.api({ onMessage: async (msg) => {
34
+ if (!msg || typeof msg !== "object" || !msg.data || !Array.isArray(msg.data.key) || !Array.isArray(msg.data.request)) {
35
+ const err = serializeError(new Error("Invalid request payload"));
36
+ try {
37
+ await hooks?.onInvalid?.({ reason: "invalid_payload", key: msg?.data?.key, request: msg?.data?.request, error: err, msg });
38
+ }
39
+ catch (hookErr) {
40
+ console.error({ error: serializeError(hookErr), where: "onInvalid" });
41
+ }
42
+ soc.sendMessage({ mapId: msg?.mapId ?? -1, error: { error: err, key: msg?.data?.key, arguments: msg?.data?.request } });
43
+ console.error({ error: err, key: msg?.data?.key, arguments: msg?.data?.request });
44
+ return;
45
+ }
46
+ const { key, request } = msg.data;
47
+ let curr = target, fnName = "";
48
+ try {
49
+ for (const k of key) {
50
+ fnName = k;
51
+ if (typeof curr[fnName] === "function")
52
+ break;
53
+ curr = curr[fnName];
54
+ }
55
+ }
56
+ catch (e) {
57
+ const err = serializeError(e);
58
+ try {
59
+ await hooks?.onInvalid?.({ reason: "resolve_error", key, request, error: err, msg });
60
+ }
61
+ catch (hookErr) {
62
+ console.error({ error: serializeError(hookErr), where: "onInvalid" });
63
+ }
64
+ soc.sendMessage({ mapId: msg.mapId, error: { error: err, key, arguments: request } });
65
+ console.error({ error: err, key, arguments: request });
66
+ return;
67
+ }
68
+ if (typeof curr[fnName] === "function") {
69
+ const fn = curr[fnName];
70
+ if (hooks?.onRequest) {
71
+ try {
72
+ const allowed = await hooks.onRequest({ key, request, fnName, fn, msg });
73
+ if (allowed === false) {
74
+ const err = serializeError(new Error("Request rejected by hook"));
75
+ soc.sendMessage({ mapId: msg.mapId, error: { error: err, key, arguments: request } });
76
+ console.error({ error: err, key, arguments: request });
77
+ return;
78
+ }
79
+ }
80
+ catch (hookErr) {
81
+ const err = serializeError(hookErr);
82
+ soc.sendMessage({ mapId: msg.mapId, error: { error: err, key, arguments: request } });
83
+ console.error({ error: err, key, arguments: request });
84
+ return;
85
+ }
86
+ }
87
+ const { callbacksId } = msg;
88
+ if (callbacksId && Array.isArray(callbacksId)) {
89
+ const cbArr = callbacksId.map(id => (data) => {
90
+ try {
91
+ soc.sendMessage({ mapId: id, data: data ?? undefined });
92
+ }
93
+ catch (err) {
94
+ console.log("Ошибка callback", err);
95
+ }
96
+ });
97
+ let idx = 0;
98
+ request.forEach((item, i) => { if (item === "___FUNC")
99
+ request[i] = cbArr[idx++]; });
100
+ }
101
+ try {
102
+ const res = await curr[fnName](...request);
103
+ if (msg.wait !== false)
104
+ soc.sendMessage({ mapId: msg.mapId, data: res ?? undefined });
105
+ }
106
+ catch (e) {
107
+ console.log(fnName, request, key);
108
+ const err = serializeError(e);
109
+ soc.sendMessage({ mapId: msg.mapId, error: { error: err, key, arguments: request } });
110
+ console.error({ error: err, key, arguments: request });
111
+ }
112
+ }
113
+ else {
114
+ try {
115
+ await hooks?.onInvalid?.({ reason: "not_function", key, request, msg });
116
+ }
117
+ catch (hookErr) {
118
+ console.error({ error: serializeError(hookErr), where: "onInvalid" });
119
+ }
120
+ soc.sendMessage({ mapId: msg.mapId, error: JSON.stringify({ data: "это не функция", key, arguments: request }) });
121
+ console.error({ data: "это не функция", key, arguments: request });
122
+ }
123
+ } });
124
+ }
125
+ function wsWrapper(soc) {
126
+ const max = soc.limit, sendMsg = soc.sendMessage;
127
+ const pool = (() => { const free = []; let tot = 0, pos = 0; return { log: () => console.log({ free, tot, pos }), next: () => pos > 0 ? free[--pos] : ++tot, release: (id) => { free[pos++] = id; } }; })();
128
+ const promises = new Map(), cbsMap = new Map();
129
+ const forceRejectAll = (reason) => {
130
+ promises.forEach((p, id) => {
131
+ p.reject({
132
+ error: { name: "RPC_ABORT", message: reason },
133
+ mapId: id
134
+ });
135
+ pool.release(id);
136
+ });
137
+ promises.clear();
138
+ cbsMap.clear();
139
+ };
140
+ soc.api({ onMessage: (msg) => {
141
+ const id = msg.mapId;
142
+ if (promises.has(id)) {
143
+ const p = promises.get(id);
144
+ promises.delete(id);
145
+ pool.release(id);
146
+ msg.error ? p.reject(msg.error) : p.resolve(msg.data);
147
+ }
148
+ else if (cbsMap.has(id)) {
149
+ const cb = cbsMap.get(id);
150
+ if (msg.data === "___STOP") {
151
+ cbsMap.delete(id);
152
+ pool.release(id);
153
+ }
154
+ cb(msg.data);
155
+ }
156
+ else
157
+ console.error("Неожиданный ответ", msg);
158
+ }
159
+ });
160
+ let debug = false;
161
+ const api = {
162
+ log: (s) => { debug = s; },
163
+ promiseTotal: () => promises.size,
164
+ callbackTotal: () => cbsMap.size,
165
+ promiseDeleteAll: (rej = true) => {
166
+ const arr = [...promises.values()], keys = [...promises.keys()];
167
+ promises.clear();
168
+ keys.forEach(k => pool.release(k));
169
+ arr.forEach(p => (rej ? p.reject("promiseDeleteAll") : p.resolve(undefined)));
170
+ },
171
+ callbackDeleteAll: () => { const keys = [...cbsMap.keys()]; cbsMap.clear(); keys.forEach(k => pool.release(k)); },
172
+ callbackDelete: (fn) => { cbsMap.forEach((cb, key) => { if (cb === fn) {
173
+ cbsMap.delete(key);
174
+ pool.release(key);
175
+ } }); }
176
+ };
177
+ return {
178
+ abortAll: forceRejectAll,
179
+ api,
180
+ send: (data, wait, cbs) => new Promise((resolve, reject) => {
181
+ const msg = { mapId: pool.next(), data, wait, callbacksId: [] };
182
+ for (const fn of cbs ?? []) {
183
+ const id = pool.next();
184
+ msg.callbacksId.push(id);
185
+ if (debug)
186
+ console.log("Ключ callback", id, msg);
187
+ cbsMap.set(id, fn);
188
+ }
189
+ if (wait !== false)
190
+ promises.set(msg.mapId, { resolve, reject });
191
+ if (debug) {
192
+ pool.log();
193
+ console.log("Ключ сокета", msg.mapId, msg);
194
+ }
195
+ if (max && cbsMap.size >= max)
196
+ console.log("callbacksMap.size =", cbsMap.size);
197
+ if (max && promises.size >= max)
198
+ console.log("promises.size =", promises.size);
199
+ sendMsg(msg);
200
+ })
201
+ };
202
+ }
203
+ function createClientProxy(soc2, wait) {
204
+ const chain = (path) => new Proxy(() => { }, {
205
+ get: (_, p) => { path.push(String(p)); return chain(path); },
206
+ apply: (_, __, args) => {
207
+ const fns = [];
208
+ args.forEach((arg, i) => { if (typeof arg === "function") {
209
+ fns.push(arg);
210
+ args[i] = "___FUNC";
211
+ } });
212
+ return soc2.send({ key: path, request: args }, wait, fns);
213
+ }
214
+ });
215
+ return new Proxy({}, { get: (_, p) => chain([String(p)]) });
216
+ }
217
+ function createClientProxyStrict(soc2, getTarget, wait) {
218
+ const chain = (path) => {
219
+ let tgt = getTarget();
220
+ for (const a of path) {
221
+ tgt = tgt?.[a];
222
+ }
223
+ if (!tgt || tgt === "null" || tgt === "unknown")
224
+ return undefined;
225
+ const baseObject = tgt === "func" ? function () { } : {};
226
+ const r = new Proxy(baseObject, {
227
+ has: (_, p) => {
228
+ console.log(_, p, "has", path);
229
+ return tgt?.[p] !== "null";
230
+ },
231
+ getPrototypeOf(_) {
232
+ if (!tgt || tgt === "null")
233
+ return Object.prototype;
234
+ if (tgt == "func")
235
+ return Function.prototype;
236
+ return null;
237
+ },
238
+ ownKeys: typeof tgt != "object" ? undefined : (target) => Object.keys(tgt),
239
+ getOwnPropertyDescriptor: typeof tgt != "object" ? undefined : (target, prop) => ({ enumerable: true, configurable: true }),
240
+ get: (_, p) => {
241
+ if (p == "call" && tgt == "func") {
242
+ return (_, ...args) => {
243
+ const fns = [];
244
+ args.forEach((arg, i) => { if (typeof arg === "function") {
245
+ fns.push(arg);
246
+ args[i] = "___FUNC";
247
+ } });
248
+ return soc2.send({ key: path, request: args }, wait, fns);
249
+ };
250
+ }
251
+ return tgt?.[p] === "null" ? undefined : chain([...path, String(p)]);
252
+ },
253
+ apply: (_, __, args) => {
254
+ console.log(path);
255
+ if (path.at(-1) === "call") {
256
+ path.length--;
257
+ args.splice(0, 1);
258
+ }
259
+ const fns = [];
260
+ args.forEach((arg, i) => { if (typeof arg === "function") {
261
+ fns.push(arg);
262
+ args[i] = "___FUNC";
263
+ } });
264
+ return soc2.send({ key: path, request: args }, wait, fns);
265
+ }
266
+ });
267
+ return r;
268
+ };
269
+ return new Proxy({}, {
270
+ has: (_, p) => getTarget()?.[p] !== "null",
271
+ get: (_, p) => (getTarget() && getTarget()[p] === "null" ? undefined : chain([String(p)]))
272
+ });
273
+ }
274
+ function createAPIFacadeClient({ socket: sock, socketKey: key, limit }) {
275
+ let strictData = {}, resolveStrict;
276
+ const wsWrap = wsWrapper({
277
+ sendMessage: (msg) => sock.emit(key, msg),
278
+ api: ({ onMessage }) => {
279
+ sock.on(key, (d) => {
280
+ if (typeof d === "object" && d?.STRICTLY) {
281
+ Object.keys(strictData).forEach(k => delete strictData[k]);
282
+ Object.assign(strictData, d.STRICTLY);
283
+ resolveStrict?.(undefined);
284
+ }
285
+ else
286
+ onMessage(d);
287
+ });
288
+ },
289
+ limit,
290
+ });
291
+ const func = createClientProxy(wsWrap);
292
+ const strict = createClientProxyStrict(wsWrap, () => strictData);
293
+ const space = createClientProxy(wsWrap, false);
294
+ return { api: wsWrap.api, func, space, all: func, strict, infoStrict: () => strictData, async strictInit(obj) {
295
+ if (obj)
296
+ strictData = obj;
297
+ else {
298
+ sock.emit(key, "___STRICTLY");
299
+ return new Promise(resolve => { resolveStrict = resolve; });
300
+ }
301
+ } };
302
+ }
303
+ function createAPIFacadeServer({ socket: sock, object: targetObj, socketKey: key, debug = false }) {
304
+ function serialize(obj) {
305
+ return Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, typeof v === "object" && v != null ? serialize(v) : typeof v === "function" ? "func" : !v ? "null" : "unknown"]));
306
+ }
307
+ const ser = serialize(targetObj);
308
+ promiseServer({ sendMessage: (msg) => sock.emit(key, msg), api: ({ onMessage }) => {
309
+ sock.on(key, (d) => {
310
+ if (debug)
311
+ console.log(typeof d === "object" ? JSON.stringify(d) : d);
312
+ if (d === "___STRICTLY")
313
+ sock.emit(key, { STRICTLY: ser });
314
+ else
315
+ onMessage(d);
316
+ });
317
+ } }, targetObj);
318
+ }
319
+ exports.CreatAPIFacadeServer = createAPIFacadeServer;
320
+ exports.CreatAPIFacadeClient = createAPIFacadeClient;
@@ -9,3 +9,4 @@ export * from "./rpc-server";
9
9
  export * from "./rpc-client-auto";
10
10
  export * from "./rpc-server-auto";
11
11
  export * from "./rpc-clientHub";
12
+ export { createRpcServerAuto2 } from "./createRpcServerAutoWithProtocolDetection";
@@ -14,6 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.createRpcServerAuto2 = void 0;
17
18
  __exportStar(require("./listen-socket"), exports);
18
19
  __exportStar(require("./listen-deep"), exports);
19
20
  __exportStar(require("./rpc-dynamic"), exports);
@@ -25,3 +26,5 @@ __exportStar(require("./rpc-server"), exports);
25
26
  __exportStar(require("./rpc-client-auto"), exports);
26
27
  __exportStar(require("./rpc-server-auto"), exports);
27
28
  __exportStar(require("./rpc-clientHub"), exports);
29
+ var createRpcServerAutoWithProtocolDetection_1 = require("./createRpcServerAutoWithProtocolDetection");
30
+ Object.defineProperty(exports, "createRpcServerAuto2", { enumerable: true, get: function () { return createRpcServerAutoWithProtocolDetection_1.createRpcServerAuto2; } });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wenay-common2",
3
- "version": "1.0.32",
3
+ "version": "1.0.33",
4
4
  "description": "Common library",
5
5
  "strict": true,
6
6
  "main": "lib/index.js",