@kevisual/api 0.0.44 → 0.0.47
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/query-ai.js +1 -1
- package/dist/query-app.d.ts +22 -1
- package/dist/query-app.js +8 -1
- package/dist/query-proxy.js +55 -11
- package/dist/query-remote.d.ts +1 -0
- package/dist/query-remote.js +433 -0
- package/dist/query-shop.js +1 -1
- package/package.json +7 -5
- package/query/query-app/query-app.ts +28 -1
- package/query/query-remote/index.ts +5 -0
package/dist/query-ai.js
CHANGED
|
@@ -255,7 +255,7 @@ class Query {
|
|
|
255
255
|
}
|
|
256
256
|
}
|
|
257
257
|
|
|
258
|
-
// node_modules/.pnpm/@kevisual+router@0.0.
|
|
258
|
+
// node_modules/.pnpm/@kevisual+router@0.0.70/node_modules/@kevisual/router/dist/router-define.js
|
|
259
259
|
class Chain {
|
|
260
260
|
object;
|
|
261
261
|
app;
|
package/dist/query-app.d.ts
CHANGED
|
@@ -12,7 +12,28 @@ declare class QueryApp extends BaseQuery {
|
|
|
12
12
|
});
|
|
13
13
|
getList(data: any, opts?: DataOpts): any;
|
|
14
14
|
getPublicApp(data: any, opts?: DataOpts): any;
|
|
15
|
-
getApp(data:
|
|
15
|
+
getApp(data: {
|
|
16
|
+
key?: string;
|
|
17
|
+
version?: string;
|
|
18
|
+
/**
|
|
19
|
+
* 当app不存在,会创建一个新的,
|
|
20
|
+
* 之后上传文件就好了,会执行检测任务
|
|
21
|
+
*/
|
|
22
|
+
create?: boolean;
|
|
23
|
+
}, opts?: DataOpts): any;
|
|
24
|
+
/**
|
|
25
|
+
* 发布应用
|
|
26
|
+
* @param data
|
|
27
|
+
* @param opts
|
|
28
|
+
* @returns
|
|
29
|
+
*/
|
|
30
|
+
publichApp(data: {
|
|
31
|
+
id?: string;
|
|
32
|
+
username?: string;
|
|
33
|
+
detect?: boolean;
|
|
34
|
+
appKey?: string;
|
|
35
|
+
version?: string;
|
|
36
|
+
}, opts?: DataOpts): any;
|
|
16
37
|
}
|
|
17
38
|
|
|
18
39
|
export { QueryApp, appDefine, userAppDefine };
|
package/dist/query-app.js
CHANGED
|
@@ -255,7 +255,7 @@ class Query {
|
|
|
255
255
|
}
|
|
256
256
|
}
|
|
257
257
|
|
|
258
|
-
// node_modules/.pnpm/@kevisual+router@0.0.
|
|
258
|
+
// node_modules/.pnpm/@kevisual+router@0.0.70/node_modules/@kevisual/router/dist/router-define.js
|
|
259
259
|
class Chain {
|
|
260
260
|
object;
|
|
261
261
|
app;
|
|
@@ -515,6 +515,13 @@ class QueryApp extends BaseQuery {
|
|
|
515
515
|
data
|
|
516
516
|
}, opts);
|
|
517
517
|
}
|
|
518
|
+
publichApp(data, opts) {
|
|
519
|
+
return this.query.post({
|
|
520
|
+
path: "app",
|
|
521
|
+
key: "publish",
|
|
522
|
+
data: { detect: true, ...data }
|
|
523
|
+
}, opts);
|
|
524
|
+
}
|
|
518
525
|
}
|
|
519
526
|
export {
|
|
520
527
|
userAppDefine,
|
package/dist/query-proxy.js
CHANGED
|
@@ -679,7 +679,7 @@ class QueryClient extends Query {
|
|
|
679
679
|
}
|
|
680
680
|
}
|
|
681
681
|
|
|
682
|
-
// node_modules/.pnpm/@kevisual+router@0.0.
|
|
682
|
+
// node_modules/.pnpm/@kevisual+router@0.0.70/node_modules/@kevisual/router/dist/router-browser.js
|
|
683
683
|
var urlAlphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";
|
|
684
684
|
var nanoid$2 = (size = 21) => {
|
|
685
685
|
let id = "";
|
|
@@ -938,6 +938,44 @@ function requireEventemitter3() {
|
|
|
938
938
|
}
|
|
939
939
|
var eventemitter3Exports = requireEventemitter3();
|
|
940
940
|
var EventEmitter = /* @__PURE__ */ getDefaultExportFromCjs(eventemitter3Exports);
|
|
941
|
+
function isPlainObject$1(value) {
|
|
942
|
+
if (!value || typeof value !== "object") {
|
|
943
|
+
return false;
|
|
944
|
+
}
|
|
945
|
+
const proto = Object.getPrototypeOf(value);
|
|
946
|
+
const hasObjectPrototype = proto === null || proto === Object.prototype || Object.getPrototypeOf(proto) === null;
|
|
947
|
+
if (!hasObjectPrototype) {
|
|
948
|
+
return false;
|
|
949
|
+
}
|
|
950
|
+
return Object.prototype.toString.call(value) === "[object Object]";
|
|
951
|
+
}
|
|
952
|
+
function isUnsafeProperty(key) {
|
|
953
|
+
return key === "__proto__";
|
|
954
|
+
}
|
|
955
|
+
function merge$1(target, source) {
|
|
956
|
+
const sourceKeys = Object.keys(source);
|
|
957
|
+
for (let i = 0;i < sourceKeys.length; i++) {
|
|
958
|
+
const key = sourceKeys[i];
|
|
959
|
+
if (isUnsafeProperty(key)) {
|
|
960
|
+
continue;
|
|
961
|
+
}
|
|
962
|
+
const sourceValue = source[key];
|
|
963
|
+
const targetValue = target[key];
|
|
964
|
+
if (isMergeableValue(sourceValue) && isMergeableValue(targetValue)) {
|
|
965
|
+
target[key] = merge$1(targetValue, sourceValue);
|
|
966
|
+
} else if (Array.isArray(sourceValue)) {
|
|
967
|
+
target[key] = merge$1([], sourceValue);
|
|
968
|
+
} else if (isPlainObject$1(sourceValue)) {
|
|
969
|
+
target[key] = merge$1({}, sourceValue);
|
|
970
|
+
} else if (targetValue === undefined || sourceValue !== undefined) {
|
|
971
|
+
target[key] = sourceValue;
|
|
972
|
+
}
|
|
973
|
+
}
|
|
974
|
+
return target;
|
|
975
|
+
}
|
|
976
|
+
function isMergeableValue(value) {
|
|
977
|
+
return isPlainObject$1(value) || Array.isArray(value);
|
|
978
|
+
}
|
|
941
979
|
|
|
942
980
|
class MockProcess {
|
|
943
981
|
emitter;
|
|
@@ -976,7 +1014,7 @@ class MockProcess {
|
|
|
976
1014
|
this.process = undefined;
|
|
977
1015
|
}
|
|
978
1016
|
}
|
|
979
|
-
var listenProcess = async ({ app, mockProcess, params, timeout = 10 * 60 * 60 * 1000 }) => {
|
|
1017
|
+
var listenProcess = async ({ app, mockProcess, params = {}, timeout = 10 * 60 * 60 * 1000 }) => {
|
|
980
1018
|
const process = mockProcess || new MockProcess;
|
|
981
1019
|
let isEnd = false;
|
|
982
1020
|
const timer = setTimeout(() => {
|
|
@@ -989,23 +1027,25 @@ var listenProcess = async ({ app, mockProcess, params, timeout = 10 * 60 * 60 *
|
|
|
989
1027
|
}, timeout);
|
|
990
1028
|
const getParams = async () => {
|
|
991
1029
|
return new Promise((resolve) => {
|
|
992
|
-
process.on((
|
|
1030
|
+
process.on((params2) => {
|
|
993
1031
|
if (isEnd)
|
|
994
1032
|
return;
|
|
995
1033
|
isEnd = true;
|
|
996
1034
|
clearTimeout(timer);
|
|
997
|
-
resolve(
|
|
1035
|
+
resolve(params2 || {});
|
|
998
1036
|
});
|
|
999
1037
|
});
|
|
1000
1038
|
};
|
|
1001
1039
|
try {
|
|
1002
|
-
const
|
|
1003
|
-
const
|
|
1040
|
+
const _params = await getParams();
|
|
1041
|
+
const mergeParams = merge$1(params, _params);
|
|
1042
|
+
const msg = mergeParams?.message || {};
|
|
1043
|
+
const ctx = mergeParams?.context || {};
|
|
1004
1044
|
if (!msg.path && !msg.id) {
|
|
1005
1045
|
const route = app.routes.find((r) => r.path !== "router");
|
|
1006
1046
|
msg.id = route?.id;
|
|
1007
1047
|
}
|
|
1008
|
-
const result = await app.run(msg);
|
|
1048
|
+
const result = await app.run(msg, ctx);
|
|
1009
1049
|
const response = {
|
|
1010
1050
|
success: true,
|
|
1011
1051
|
data: result,
|
|
@@ -1015,6 +1055,7 @@ var listenProcess = async ({ app, mockProcess, params, timeout = 10 * 60 * 60 *
|
|
|
1015
1055
|
process.exit?.(0);
|
|
1016
1056
|
});
|
|
1017
1057
|
} catch (error) {
|
|
1058
|
+
console.error("Error in listenProcess:", error);
|
|
1018
1059
|
process.send?.({
|
|
1019
1060
|
success: false,
|
|
1020
1061
|
error: error.message
|
|
@@ -8011,14 +8052,17 @@ var toJSONSchema = (route) => {
|
|
|
8011
8052
|
return pickValues;
|
|
8012
8053
|
};
|
|
8013
8054
|
var fromJSONSchema = (route) => {
|
|
8014
|
-
const args = route?.metadata?.args
|
|
8055
|
+
const args = route?.metadata?.args;
|
|
8056
|
+
if (!args)
|
|
8057
|
+
return route;
|
|
8015
8058
|
const keys = Object.keys(args);
|
|
8016
8059
|
const newArgs = {};
|
|
8017
8060
|
for (let key of keys) {
|
|
8018
8061
|
const item = args[key];
|
|
8019
8062
|
newArgs[key] = fromJSONSchema$1(item);
|
|
8020
8063
|
}
|
|
8021
|
-
|
|
8064
|
+
route.metadata.args = newArgs;
|
|
8065
|
+
return route;
|
|
8022
8066
|
};
|
|
8023
8067
|
|
|
8024
8068
|
class QueryRouter {
|
|
@@ -8357,8 +8401,8 @@ class QueryRouter {
|
|
|
8357
8401
|
}
|
|
8358
8402
|
return listenProcess({ app: this, params, ...opts });
|
|
8359
8403
|
}
|
|
8360
|
-
|
|
8361
|
-
|
|
8404
|
+
toJSONSchema = toJSONSchema;
|
|
8405
|
+
fromJSONSchema = fromJSONSchema;
|
|
8362
8406
|
}
|
|
8363
8407
|
|
|
8364
8408
|
class QueryRouterServer extends QueryRouter {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { RemoteApp } from '@kevisual/remote-app';
|
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
// node_modules/.pnpm/@kevisual+remote-app@0.0.4/node_modules/@kevisual/remote-app/dist/app.js
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __toESM = (mod, isNodeMode, target) => {
|
|
8
|
+
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
9
|
+
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
10
|
+
for (let key of __getOwnPropNames(mod))
|
|
11
|
+
if (!__hasOwnProp.call(to, key))
|
|
12
|
+
__defProp(to, key, {
|
|
13
|
+
get: () => mod[key],
|
|
14
|
+
enumerable: true
|
|
15
|
+
});
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
19
|
+
var require_eventemitter3 = __commonJS((exports, module) => {
|
|
20
|
+
var has = Object.prototype.hasOwnProperty;
|
|
21
|
+
var prefix = "~";
|
|
22
|
+
function Events() {}
|
|
23
|
+
if (Object.create) {
|
|
24
|
+
Events.prototype = Object.create(null);
|
|
25
|
+
if (!new Events().__proto__)
|
|
26
|
+
prefix = false;
|
|
27
|
+
}
|
|
28
|
+
function EE(fn, context, once) {
|
|
29
|
+
this.fn = fn;
|
|
30
|
+
this.context = context;
|
|
31
|
+
this.once = once || false;
|
|
32
|
+
}
|
|
33
|
+
function addListener(emitter, event, fn, context, once) {
|
|
34
|
+
if (typeof fn !== "function") {
|
|
35
|
+
throw new TypeError("The listener must be a function");
|
|
36
|
+
}
|
|
37
|
+
var listener = new EE(fn, context || emitter, once), evt = prefix ? prefix + event : event;
|
|
38
|
+
if (!emitter._events[evt])
|
|
39
|
+
emitter._events[evt] = listener, emitter._eventsCount++;
|
|
40
|
+
else if (!emitter._events[evt].fn)
|
|
41
|
+
emitter._events[evt].push(listener);
|
|
42
|
+
else
|
|
43
|
+
emitter._events[evt] = [emitter._events[evt], listener];
|
|
44
|
+
return emitter;
|
|
45
|
+
}
|
|
46
|
+
function clearEvent(emitter, evt) {
|
|
47
|
+
if (--emitter._eventsCount === 0)
|
|
48
|
+
emitter._events = new Events;
|
|
49
|
+
else
|
|
50
|
+
delete emitter._events[evt];
|
|
51
|
+
}
|
|
52
|
+
function EventEmitter() {
|
|
53
|
+
this._events = new Events;
|
|
54
|
+
this._eventsCount = 0;
|
|
55
|
+
}
|
|
56
|
+
EventEmitter.prototype.eventNames = function eventNames() {
|
|
57
|
+
var names = [], events, name;
|
|
58
|
+
if (this._eventsCount === 0)
|
|
59
|
+
return names;
|
|
60
|
+
for (name in events = this._events) {
|
|
61
|
+
if (has.call(events, name))
|
|
62
|
+
names.push(prefix ? name.slice(1) : name);
|
|
63
|
+
}
|
|
64
|
+
if (Object.getOwnPropertySymbols) {
|
|
65
|
+
return names.concat(Object.getOwnPropertySymbols(events));
|
|
66
|
+
}
|
|
67
|
+
return names;
|
|
68
|
+
};
|
|
69
|
+
EventEmitter.prototype.listeners = function listeners(event) {
|
|
70
|
+
var evt = prefix ? prefix + event : event, handlers = this._events[evt];
|
|
71
|
+
if (!handlers)
|
|
72
|
+
return [];
|
|
73
|
+
if (handlers.fn)
|
|
74
|
+
return [handlers.fn];
|
|
75
|
+
for (var i = 0, l = handlers.length, ee = new Array(l);i < l; i++) {
|
|
76
|
+
ee[i] = handlers[i].fn;
|
|
77
|
+
}
|
|
78
|
+
return ee;
|
|
79
|
+
};
|
|
80
|
+
EventEmitter.prototype.listenerCount = function listenerCount(event) {
|
|
81
|
+
var evt = prefix ? prefix + event : event, listeners = this._events[evt];
|
|
82
|
+
if (!listeners)
|
|
83
|
+
return 0;
|
|
84
|
+
if (listeners.fn)
|
|
85
|
+
return 1;
|
|
86
|
+
return listeners.length;
|
|
87
|
+
};
|
|
88
|
+
EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
|
|
89
|
+
var evt = prefix ? prefix + event : event;
|
|
90
|
+
if (!this._events[evt])
|
|
91
|
+
return false;
|
|
92
|
+
var listeners = this._events[evt], len = arguments.length, args, i;
|
|
93
|
+
if (listeners.fn) {
|
|
94
|
+
if (listeners.once)
|
|
95
|
+
this.removeListener(event, listeners.fn, undefined, true);
|
|
96
|
+
switch (len) {
|
|
97
|
+
case 1:
|
|
98
|
+
return listeners.fn.call(listeners.context), true;
|
|
99
|
+
case 2:
|
|
100
|
+
return listeners.fn.call(listeners.context, a1), true;
|
|
101
|
+
case 3:
|
|
102
|
+
return listeners.fn.call(listeners.context, a1, a2), true;
|
|
103
|
+
case 4:
|
|
104
|
+
return listeners.fn.call(listeners.context, a1, a2, a3), true;
|
|
105
|
+
case 5:
|
|
106
|
+
return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
|
|
107
|
+
case 6:
|
|
108
|
+
return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
|
|
109
|
+
}
|
|
110
|
+
for (i = 1, args = new Array(len - 1);i < len; i++) {
|
|
111
|
+
args[i - 1] = arguments[i];
|
|
112
|
+
}
|
|
113
|
+
listeners.fn.apply(listeners.context, args);
|
|
114
|
+
} else {
|
|
115
|
+
var length = listeners.length, j;
|
|
116
|
+
for (i = 0;i < length; i++) {
|
|
117
|
+
if (listeners[i].once)
|
|
118
|
+
this.removeListener(event, listeners[i].fn, undefined, true);
|
|
119
|
+
switch (len) {
|
|
120
|
+
case 1:
|
|
121
|
+
listeners[i].fn.call(listeners[i].context);
|
|
122
|
+
break;
|
|
123
|
+
case 2:
|
|
124
|
+
listeners[i].fn.call(listeners[i].context, a1);
|
|
125
|
+
break;
|
|
126
|
+
case 3:
|
|
127
|
+
listeners[i].fn.call(listeners[i].context, a1, a2);
|
|
128
|
+
break;
|
|
129
|
+
case 4:
|
|
130
|
+
listeners[i].fn.call(listeners[i].context, a1, a2, a3);
|
|
131
|
+
break;
|
|
132
|
+
default:
|
|
133
|
+
if (!args)
|
|
134
|
+
for (j = 1, args = new Array(len - 1);j < len; j++) {
|
|
135
|
+
args[j - 1] = arguments[j];
|
|
136
|
+
}
|
|
137
|
+
listeners[i].fn.apply(listeners[i].context, args);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return true;
|
|
142
|
+
};
|
|
143
|
+
EventEmitter.prototype.on = function on(event, fn, context) {
|
|
144
|
+
return addListener(this, event, fn, context, false);
|
|
145
|
+
};
|
|
146
|
+
EventEmitter.prototype.once = function once(event, fn, context) {
|
|
147
|
+
return addListener(this, event, fn, context, true);
|
|
148
|
+
};
|
|
149
|
+
EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {
|
|
150
|
+
var evt = prefix ? prefix + event : event;
|
|
151
|
+
if (!this._events[evt])
|
|
152
|
+
return this;
|
|
153
|
+
if (!fn) {
|
|
154
|
+
clearEvent(this, evt);
|
|
155
|
+
return this;
|
|
156
|
+
}
|
|
157
|
+
var listeners = this._events[evt];
|
|
158
|
+
if (listeners.fn) {
|
|
159
|
+
if (listeners.fn === fn && (!once || listeners.once) && (!context || listeners.context === context)) {
|
|
160
|
+
clearEvent(this, evt);
|
|
161
|
+
}
|
|
162
|
+
} else {
|
|
163
|
+
for (var i = 0, events = [], length = listeners.length;i < length; i++) {
|
|
164
|
+
if (listeners[i].fn !== fn || once && !listeners[i].once || context && listeners[i].context !== context) {
|
|
165
|
+
events.push(listeners[i]);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (events.length)
|
|
169
|
+
this._events[evt] = events.length === 1 ? events[0] : events;
|
|
170
|
+
else
|
|
171
|
+
clearEvent(this, evt);
|
|
172
|
+
}
|
|
173
|
+
return this;
|
|
174
|
+
};
|
|
175
|
+
EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {
|
|
176
|
+
var evt;
|
|
177
|
+
if (event) {
|
|
178
|
+
evt = prefix ? prefix + event : event;
|
|
179
|
+
if (this._events[evt])
|
|
180
|
+
clearEvent(this, evt);
|
|
181
|
+
} else {
|
|
182
|
+
this._events = new Events;
|
|
183
|
+
this._eventsCount = 0;
|
|
184
|
+
}
|
|
185
|
+
return this;
|
|
186
|
+
};
|
|
187
|
+
EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
|
|
188
|
+
EventEmitter.prototype.addListener = EventEmitter.prototype.on;
|
|
189
|
+
EventEmitter.prefixed = prefix;
|
|
190
|
+
EventEmitter.EventEmitter = EventEmitter;
|
|
191
|
+
if (typeof module !== "undefined") {
|
|
192
|
+
module.exports = EventEmitter;
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
var import__ = __toESM(require_eventemitter3(), 1);
|
|
196
|
+
|
|
197
|
+
class RemoteApp {
|
|
198
|
+
mainApp;
|
|
199
|
+
url;
|
|
200
|
+
id;
|
|
201
|
+
emitter;
|
|
202
|
+
isConnected;
|
|
203
|
+
ws;
|
|
204
|
+
remoteIsConnected;
|
|
205
|
+
isError = false;
|
|
206
|
+
autoReconnect;
|
|
207
|
+
maxReconnectAttempts;
|
|
208
|
+
reconnectDelay;
|
|
209
|
+
maxReconnectDelay;
|
|
210
|
+
enableBackoff;
|
|
211
|
+
reconnectAttempts = 0;
|
|
212
|
+
reconnectTimer = null;
|
|
213
|
+
isManuallyClosed = false;
|
|
214
|
+
constructor(opts) {
|
|
215
|
+
this.mainApp = opts?.app;
|
|
216
|
+
const token = opts.token;
|
|
217
|
+
const url = opts.url;
|
|
218
|
+
const id = opts.id;
|
|
219
|
+
this.emitter = opts?.emitter || new import__.default;
|
|
220
|
+
const _url = new URL(url);
|
|
221
|
+
if (token) {
|
|
222
|
+
_url.searchParams.set("token", token);
|
|
223
|
+
}
|
|
224
|
+
_url.searchParams.set("id", id);
|
|
225
|
+
this.url = _url.toString();
|
|
226
|
+
this.id = id;
|
|
227
|
+
this.autoReconnect = opts?.autoReconnect ?? true;
|
|
228
|
+
this.maxReconnectAttempts = opts?.maxReconnectAttempts ?? Infinity;
|
|
229
|
+
this.reconnectDelay = opts?.reconnectDelay ?? 1000;
|
|
230
|
+
this.maxReconnectDelay = opts?.maxReconnectDelay ?? 30000;
|
|
231
|
+
this.enableBackoff = opts?.enableBackoff ?? true;
|
|
232
|
+
this.init();
|
|
233
|
+
}
|
|
234
|
+
async isConnect() {
|
|
235
|
+
const that = this;
|
|
236
|
+
if (this.isConnected) {
|
|
237
|
+
return true;
|
|
238
|
+
}
|
|
239
|
+
if (this.reconnectTimer !== null) {
|
|
240
|
+
console.log(`远程应用 ${this.id} 正在重连中...`);
|
|
241
|
+
}
|
|
242
|
+
return new Promise((resolve) => {
|
|
243
|
+
const timeout = setTimeout(() => {
|
|
244
|
+
resolve(false);
|
|
245
|
+
that.emitter.off("open", listenOnce);
|
|
246
|
+
}, 5000);
|
|
247
|
+
const listenOnce = () => {
|
|
248
|
+
clearTimeout(timeout);
|
|
249
|
+
that.isConnected = true;
|
|
250
|
+
that.remoteIsConnected = true;
|
|
251
|
+
resolve(true);
|
|
252
|
+
};
|
|
253
|
+
that.emitter.once("open", listenOnce);
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
getWsURL(url) {
|
|
257
|
+
const { protocol } = new URL(url);
|
|
258
|
+
const wsProtocol = protocol === "https:" ? "wss:" : "ws:";
|
|
259
|
+
const wsURL = url.toString().replace(protocol, wsProtocol);
|
|
260
|
+
return wsURL;
|
|
261
|
+
}
|
|
262
|
+
async init() {
|
|
263
|
+
if (!this.url) {
|
|
264
|
+
throw new Error("No url provided for remote app");
|
|
265
|
+
}
|
|
266
|
+
if (!this.id) {
|
|
267
|
+
throw new Error("No id provided for remote app");
|
|
268
|
+
}
|
|
269
|
+
this.isError = false;
|
|
270
|
+
if (this.ws) {
|
|
271
|
+
this.ws.close();
|
|
272
|
+
}
|
|
273
|
+
const ws = new WebSocket(this.getWsURL(this.url));
|
|
274
|
+
const that = this;
|
|
275
|
+
ws.onopen = function() {
|
|
276
|
+
that.isConnected = true;
|
|
277
|
+
that.onOpen();
|
|
278
|
+
};
|
|
279
|
+
ws.onclose = function() {
|
|
280
|
+
that.isConnected = false;
|
|
281
|
+
that.onClose();
|
|
282
|
+
};
|
|
283
|
+
ws.onmessage = function(event) {
|
|
284
|
+
that.onMessage(event.data);
|
|
285
|
+
};
|
|
286
|
+
ws.onerror = function(error) {
|
|
287
|
+
that.onError(error);
|
|
288
|
+
};
|
|
289
|
+
this.ws = ws;
|
|
290
|
+
}
|
|
291
|
+
onOpen() {
|
|
292
|
+
this.isError = false;
|
|
293
|
+
this.reconnectAttempts = 0;
|
|
294
|
+
if (this.reconnectTimer) {
|
|
295
|
+
clearTimeout(this.reconnectTimer);
|
|
296
|
+
this.reconnectTimer = null;
|
|
297
|
+
}
|
|
298
|
+
this.emitter.emit("open", this.id);
|
|
299
|
+
}
|
|
300
|
+
onClose() {
|
|
301
|
+
console.log("远程应用关闭:", this.id);
|
|
302
|
+
this.isConnected = false;
|
|
303
|
+
this.emitter.emit("close", this.id);
|
|
304
|
+
if (this.autoReconnect && !this.isManuallyClosed) {
|
|
305
|
+
this.scheduleReconnect();
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
calculateReconnectDelay() {
|
|
309
|
+
if (!this.enableBackoff) {
|
|
310
|
+
return this.reconnectDelay;
|
|
311
|
+
}
|
|
312
|
+
const delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts);
|
|
313
|
+
return Math.min(delay, this.maxReconnectDelay);
|
|
314
|
+
}
|
|
315
|
+
scheduleReconnect() {
|
|
316
|
+
if (this.reconnectAttempts >= this.maxReconnectAttempts) {
|
|
317
|
+
console.error(`远程应用 ${this.id} 已达到最大重连次数 ${this.maxReconnectAttempts},停止重连`);
|
|
318
|
+
this.emitter.emit("maxReconnectAttemptsReached", this.id);
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
if (this.reconnectTimer) {
|
|
322
|
+
clearTimeout(this.reconnectTimer);
|
|
323
|
+
}
|
|
324
|
+
const delay = this.calculateReconnectDelay();
|
|
325
|
+
this.reconnectAttempts++;
|
|
326
|
+
console.log(`远程应用 ${this.id} 将在 ${delay}ms 后尝试第 ${this.reconnectAttempts} 次重连`);
|
|
327
|
+
this.reconnectTimer = setTimeout(() => {
|
|
328
|
+
this.reconnectTimer = null;
|
|
329
|
+
try {
|
|
330
|
+
this.init();
|
|
331
|
+
} catch (error) {
|
|
332
|
+
console.error(`远程应用 ${this.id} 重连失败:`, error);
|
|
333
|
+
this.emitter.emit("reconnectFailed", { id: this.id, attempt: this.reconnectAttempts, error });
|
|
334
|
+
this.scheduleReconnect();
|
|
335
|
+
}
|
|
336
|
+
}, delay);
|
|
337
|
+
}
|
|
338
|
+
disconnect() {
|
|
339
|
+
this.isManuallyClosed = true;
|
|
340
|
+
this.autoReconnect = false;
|
|
341
|
+
if (this.reconnectTimer) {
|
|
342
|
+
clearTimeout(this.reconnectTimer);
|
|
343
|
+
this.reconnectTimer = null;
|
|
344
|
+
}
|
|
345
|
+
if (this.ws) {
|
|
346
|
+
this.ws.close();
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
reconnect() {
|
|
350
|
+
this.isManuallyClosed = false;
|
|
351
|
+
this.reconnectAttempts = 0;
|
|
352
|
+
if (this.reconnectTimer) {
|
|
353
|
+
clearTimeout(this.reconnectTimer);
|
|
354
|
+
this.reconnectTimer = null;
|
|
355
|
+
}
|
|
356
|
+
this.init();
|
|
357
|
+
}
|
|
358
|
+
onMessage(data) {
|
|
359
|
+
this.emitter.emit("message", data);
|
|
360
|
+
}
|
|
361
|
+
onError(error) {
|
|
362
|
+
console.error("远程应用错误:", this.id, error);
|
|
363
|
+
this.isError = true;
|
|
364
|
+
this.emitter.emit("error", error);
|
|
365
|
+
}
|
|
366
|
+
on(event, listener) {
|
|
367
|
+
this.emitter.on(event, listener);
|
|
368
|
+
return () => {
|
|
369
|
+
this.emitter.off(event, listener);
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
json(data) {
|
|
373
|
+
this.ws.send(JSON.stringify(data));
|
|
374
|
+
}
|
|
375
|
+
listenProxy() {
|
|
376
|
+
const remoteApp = this;
|
|
377
|
+
const app = this.mainApp;
|
|
378
|
+
const listenFn = async (event) => {
|
|
379
|
+
try {
|
|
380
|
+
const data = event.toString();
|
|
381
|
+
const body = JSON.parse(data);
|
|
382
|
+
const bodyData = body?.data;
|
|
383
|
+
const message = bodyData?.message || {};
|
|
384
|
+
const context = bodyData?.context || {};
|
|
385
|
+
if (body?.code === 401) {
|
|
386
|
+
console.error("远程应用认证失败,请检查 token 是否正确");
|
|
387
|
+
this.isError = true;
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
if (body?.type !== "proxy")
|
|
391
|
+
return;
|
|
392
|
+
if (!body.id) {
|
|
393
|
+
remoteApp.json({
|
|
394
|
+
id: body.id,
|
|
395
|
+
data: {
|
|
396
|
+
code: 400,
|
|
397
|
+
message: "id is required"
|
|
398
|
+
}
|
|
399
|
+
});
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
const res = await app.run(message, context);
|
|
403
|
+
remoteApp.json({
|
|
404
|
+
id: body.id,
|
|
405
|
+
data: {
|
|
406
|
+
code: res.code,
|
|
407
|
+
data: res.data,
|
|
408
|
+
message: res.message
|
|
409
|
+
}
|
|
410
|
+
});
|
|
411
|
+
} catch (error) {
|
|
412
|
+
console.error("处理远程代理请求出错:", error);
|
|
413
|
+
}
|
|
414
|
+
};
|
|
415
|
+
remoteApp.json({
|
|
416
|
+
id: this.id,
|
|
417
|
+
type: "registryClient"
|
|
418
|
+
});
|
|
419
|
+
remoteApp.emitter.on("message", listenFn);
|
|
420
|
+
const closeMessage = () => {
|
|
421
|
+
remoteApp.emitter.off("message", listenFn);
|
|
422
|
+
};
|
|
423
|
+
remoteApp.emitter.once("close", () => {
|
|
424
|
+
closeMessage();
|
|
425
|
+
});
|
|
426
|
+
return () => {
|
|
427
|
+
closeMessage();
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
export {
|
|
432
|
+
RemoteApp
|
|
433
|
+
};
|
package/dist/query-shop.js
CHANGED
|
@@ -255,7 +255,7 @@ class Query {
|
|
|
255
255
|
}
|
|
256
256
|
}
|
|
257
257
|
|
|
258
|
-
// node_modules/.pnpm/@kevisual+router@0.0.
|
|
258
|
+
// node_modules/.pnpm/@kevisual+router@0.0.70/node_modules/@kevisual/router/dist/router-define.js
|
|
259
259
|
class Chain {
|
|
260
260
|
object;
|
|
261
261
|
app;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kevisual/api",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.47",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "mod.ts",
|
|
6
6
|
"scripts": {
|
|
@@ -21,18 +21,20 @@
|
|
|
21
21
|
"type": "module",
|
|
22
22
|
"devDependencies": {
|
|
23
23
|
"@kevisual/cache": "^0.0.5",
|
|
24
|
-
"@kevisual/code-builder": "^0.0.
|
|
24
|
+
"@kevisual/code-builder": "^0.0.6",
|
|
25
25
|
"@kevisual/query": "^0.0.39",
|
|
26
|
-
"@kevisual/
|
|
26
|
+
"@kevisual/remote-app": "^0.0.4",
|
|
27
|
+
"@kevisual/router": "^0.0.70",
|
|
27
28
|
"@kevisual/types": "^0.0.12",
|
|
28
29
|
"@kevisual/use-config": "^1.0.30",
|
|
29
|
-
"@types/spark-md5": "^3.0.5",
|
|
30
30
|
"@types/bun": "^1.3.8",
|
|
31
31
|
"@types/crypto-js": "^4.2.2",
|
|
32
32
|
"@types/node": "^25.2.0",
|
|
33
|
+
"@types/spark-md5": "^3.0.5",
|
|
33
34
|
"crypto-js": "^4.2.0",
|
|
34
35
|
"dotenv": "^17.2.3",
|
|
35
|
-
"fast-glob": "^3.3.3"
|
|
36
|
+
"fast-glob": "^3.3.3",
|
|
37
|
+
"ws": "npm:@kevisual/ws"
|
|
36
38
|
},
|
|
37
39
|
"dependencies": {
|
|
38
40
|
"@kevisual/js-filter": "^0.0.5",
|
|
@@ -22,11 +22,38 @@ export class QueryApp extends BaseQuery {
|
|
|
22
22
|
data: data,
|
|
23
23
|
}, opts);
|
|
24
24
|
}
|
|
25
|
-
getApp(data:
|
|
25
|
+
getApp(data: {
|
|
26
|
+
key?: string;
|
|
27
|
+
version?: string;
|
|
28
|
+
/**
|
|
29
|
+
* 当app不存在,会创建一个新的,
|
|
30
|
+
* 之后上传文件就好了,会执行检测任务
|
|
31
|
+
*/
|
|
32
|
+
create?: boolean;
|
|
33
|
+
}, opts?: DataOpts) {
|
|
26
34
|
return this.query.post({
|
|
27
35
|
path: 'app',
|
|
28
36
|
key: 'get',
|
|
29
37
|
data: data,
|
|
30
38
|
}, opts);
|
|
31
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* 发布应用
|
|
42
|
+
* @param data
|
|
43
|
+
* @param opts
|
|
44
|
+
* @returns
|
|
45
|
+
*/
|
|
46
|
+
publichApp(data: {
|
|
47
|
+
id?: string;
|
|
48
|
+
username?: string,
|
|
49
|
+
detect?: boolean,
|
|
50
|
+
appKey?: string;
|
|
51
|
+
version?: string;
|
|
52
|
+
}, opts?: DataOpts) {
|
|
53
|
+
return this.query.post({
|
|
54
|
+
path: 'app',
|
|
55
|
+
key: 'publish',
|
|
56
|
+
data: { detect: true, ...data },
|
|
57
|
+
}, opts);
|
|
58
|
+
}
|
|
32
59
|
}
|