@kevisual/query 0.0.40 → 0.0.42
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-adapter.js +107 -124
- package/dist/query-api.d.ts +317 -0
- package/dist/query-api.js +449 -0
- package/dist/query-browser.d.ts +1 -8
- package/dist/query-browser.js +489 -582
- package/dist/query-ws.js +163 -181
- package/dist/query.d.ts +1 -8
- package/dist/query.js +278 -359
- package/package.json +13 -25
- package/src/adapter.ts +1 -1
- package/src/create-query/index.ts +159 -0
- package/src/query-api.ts +136 -0
- package/src/query-browser.ts +2 -2
- package/src/query.ts +1 -10
package/dist/query-ws.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
// node_modules/.pnpm/zustand@5.0.11/node_modules/zustand/esm/vanilla.mjs
|
|
2
|
+
var createStoreImpl = (createState) => {
|
|
2
3
|
let state;
|
|
3
|
-
const listeners = /* @__PURE__ */ new Set
|
|
4
|
+
const listeners = /* @__PURE__ */ new Set;
|
|
4
5
|
const setState = (partial, replace) => {
|
|
5
6
|
const nextState = typeof partial === "function" ? partial(state) : partial;
|
|
6
7
|
if (!Object.is(nextState, state)) {
|
|
@@ -19,199 +20,180 @@ const createStoreImpl = (createState) => {
|
|
|
19
20
|
const initialState = state = createState(setState, getState, api);
|
|
20
21
|
return api;
|
|
21
22
|
};
|
|
22
|
-
|
|
23
|
+
var createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;
|
|
23
24
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
// src/utils.ts
|
|
26
|
+
var parseWsUrl = (url) => {
|
|
27
|
+
try {
|
|
28
|
+
new URL(url);
|
|
29
|
+
return url;
|
|
30
|
+
} catch (e) {
|
|
31
|
+
const _url = new URL(url, location.origin);
|
|
32
|
+
if (_url.protocol === "http:") {
|
|
33
|
+
_url.protocol = "ws:";
|
|
28
34
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
if (_url.protocol === 'http:') {
|
|
32
|
-
_url.protocol = 'ws:';
|
|
33
|
-
}
|
|
34
|
-
if (_url.protocol === 'https:') {
|
|
35
|
-
_url.protocol = 'wss:';
|
|
36
|
-
}
|
|
37
|
-
return _url.href;
|
|
35
|
+
if (_url.protocol === "https:") {
|
|
36
|
+
_url.protocol = "wss:";
|
|
38
37
|
}
|
|
38
|
+
return _url.href;
|
|
39
|
+
}
|
|
39
40
|
};
|
|
40
41
|
|
|
42
|
+
// src/ws.ts
|
|
41
43
|
class QueryWs {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
this.store = store;
|
|
58
|
-
}
|
|
59
|
-
const wsUrl = parseWsUrl(url);
|
|
60
|
-
if (opts?.ws && opts.ws instanceof WebSocket) {
|
|
61
|
-
this.ws = opts.ws;
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
this.ws = new WebSocket(wsUrl);
|
|
65
|
-
}
|
|
66
|
-
this.connect();
|
|
44
|
+
url;
|
|
45
|
+
store;
|
|
46
|
+
ws;
|
|
47
|
+
constructor(opts) {
|
|
48
|
+
const url = opts?.url || "/api/router";
|
|
49
|
+
if (opts?.store) {
|
|
50
|
+
this.store = opts.store;
|
|
51
|
+
} else {
|
|
52
|
+
const store = createStore((set) => ({
|
|
53
|
+
connected: false,
|
|
54
|
+
status: "connecting",
|
|
55
|
+
setConnected: (connected) => set({ connected }),
|
|
56
|
+
setStatus: (status) => set({ status })
|
|
57
|
+
}));
|
|
58
|
+
this.store = store;
|
|
67
59
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
const that = this;
|
|
74
|
-
const connected = store.getState().connected;
|
|
75
|
-
if (connected) {
|
|
76
|
-
return Promise.resolve(true);
|
|
77
|
-
}
|
|
78
|
-
return new Promise((resolve, reject) => {
|
|
79
|
-
const ws = that.ws || new WebSocket(that.url);
|
|
80
|
-
const timeout = opts?.timeout || 5 * 60 * 1000; // 默认 5 分钟
|
|
81
|
-
let timer = setTimeout(() => {
|
|
82
|
-
const isOpen = ws.readyState === WebSocket.OPEN;
|
|
83
|
-
if (isOpen) {
|
|
84
|
-
console.log('WebSocket 连接成功 in timer');
|
|
85
|
-
resolve(true);
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
console.error('WebSocket 连接超时', that.url);
|
|
89
|
-
resolve(false);
|
|
90
|
-
}, timeout);
|
|
91
|
-
ws.onopen = (ev) => {
|
|
92
|
-
store.getState().setConnected(true);
|
|
93
|
-
store.getState().setStatus('connected');
|
|
94
|
-
resolve(true);
|
|
95
|
-
clearTimeout(timer);
|
|
96
|
-
};
|
|
97
|
-
ws.onclose = (ev) => {
|
|
98
|
-
store.getState().setConnected(false);
|
|
99
|
-
store.getState().setStatus('disconnected');
|
|
100
|
-
this.ws = null;
|
|
101
|
-
};
|
|
102
|
-
});
|
|
60
|
+
const wsUrl = parseWsUrl(url);
|
|
61
|
+
if (opts?.ws && opts.ws instanceof WebSocket) {
|
|
62
|
+
this.ws = opts.ws;
|
|
63
|
+
} else {
|
|
64
|
+
this.ws = new WebSocket(wsUrl);
|
|
103
65
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
if (connected) {
|
|
113
|
-
callback();
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
const subscriptionOne = (selector, listener) => {
|
|
117
|
-
const unsubscribe = store.subscribe((newState, oldState) => {
|
|
118
|
-
if (selector(newState) !== selector(oldState)) {
|
|
119
|
-
listener(newState, oldState);
|
|
120
|
-
unsubscribe();
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
return unsubscribe;
|
|
124
|
-
};
|
|
125
|
-
const cancel = subscriptionOne((state) => state.connected, () => {
|
|
126
|
-
callback();
|
|
127
|
-
});
|
|
128
|
-
return cancel;
|
|
66
|
+
this.connect();
|
|
67
|
+
}
|
|
68
|
+
async connect(opts) {
|
|
69
|
+
const store = this.store;
|
|
70
|
+
const that = this;
|
|
71
|
+
const connected = store.getState().connected;
|
|
72
|
+
if (connected) {
|
|
73
|
+
return Promise.resolve(true);
|
|
129
74
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
75
|
+
return new Promise((resolve, reject) => {
|
|
76
|
+
const ws = that.ws || new WebSocket(that.url);
|
|
77
|
+
const timeout = opts?.timeout || 5 * 60 * 1000;
|
|
78
|
+
let timer = setTimeout(() => {
|
|
79
|
+
const isOpen = ws.readyState === WebSocket.OPEN;
|
|
80
|
+
if (isOpen) {
|
|
81
|
+
console.log("WebSocket 连接成功 in timer");
|
|
82
|
+
resolve(true);
|
|
83
|
+
return;
|
|
135
84
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
if (newState.status === 'disconnected') {
|
|
147
|
-
callback();
|
|
148
|
-
}
|
|
149
|
-
});
|
|
150
|
-
return cancel;
|
|
151
|
-
}
|
|
152
|
-
onMessage(fn, opts) {
|
|
153
|
-
const ws = this.ws;
|
|
154
|
-
const isJson = opts?.isJson ?? true;
|
|
155
|
-
const selector = opts?.selector;
|
|
156
|
-
const parseIfJson = (data) => {
|
|
157
|
-
try {
|
|
158
|
-
return JSON.parse(data);
|
|
159
|
-
}
|
|
160
|
-
catch (e) {
|
|
161
|
-
return data;
|
|
162
|
-
}
|
|
163
|
-
};
|
|
164
|
-
const listener = (event) => {
|
|
165
|
-
const received = parseIfJson(event.data);
|
|
166
|
-
if (typeof received === 'string' && !isJson) {
|
|
167
|
-
fn(received, event);
|
|
168
|
-
}
|
|
169
|
-
else if (typeof received === 'object' && isJson) {
|
|
170
|
-
fn(selector ? selector(received) : received, event);
|
|
171
|
-
}
|
|
172
|
-
else ;
|
|
173
|
-
};
|
|
174
|
-
ws.addEventListener('message', listener);
|
|
175
|
-
return () => {
|
|
176
|
-
ws.removeEventListener('message', listener);
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
close() {
|
|
180
|
-
const ws = this.ws;
|
|
181
|
-
const store = this.store;
|
|
182
|
-
ws?.close?.();
|
|
183
|
-
this.ws = null;
|
|
85
|
+
console.error("WebSocket 连接超时", that.url);
|
|
86
|
+
resolve(false);
|
|
87
|
+
}, timeout);
|
|
88
|
+
ws.onopen = (ev) => {
|
|
89
|
+
store.getState().setConnected(true);
|
|
90
|
+
store.getState().setStatus("connected");
|
|
91
|
+
resolve(true);
|
|
92
|
+
clearTimeout(timer);
|
|
93
|
+
};
|
|
94
|
+
ws.onclose = (ev) => {
|
|
184
95
|
store.getState().setConnected(false);
|
|
185
|
-
store.getState().setStatus(
|
|
96
|
+
store.getState().setStatus("disconnected");
|
|
97
|
+
this.ws = null;
|
|
98
|
+
};
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
listenConnect(callback) {
|
|
102
|
+
const store = this.store;
|
|
103
|
+
const { connected } = store.getState();
|
|
104
|
+
if (connected) {
|
|
105
|
+
callback();
|
|
106
|
+
return;
|
|
186
107
|
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
* @returns
|
|
193
|
-
*/
|
|
194
|
-
send(data, opts) {
|
|
195
|
-
const ws = this.ws;
|
|
196
|
-
const isJson = opts?.isJson ?? true;
|
|
197
|
-
const wrapper = opts?.wrapper;
|
|
198
|
-
if (!ws || ws.readyState !== WebSocket.OPEN) {
|
|
199
|
-
console.error('WebSocket is not open');
|
|
200
|
-
return;
|
|
201
|
-
}
|
|
202
|
-
if (isJson) {
|
|
203
|
-
ws.send(JSON.stringify(wrapper ? wrapper(data) : data));
|
|
204
|
-
}
|
|
205
|
-
else {
|
|
206
|
-
ws.send(data);
|
|
108
|
+
const subscriptionOne = (selector, listener) => {
|
|
109
|
+
const unsubscribe = store.subscribe((newState, oldState) => {
|
|
110
|
+
if (selector(newState) !== selector(oldState)) {
|
|
111
|
+
listener(newState, oldState);
|
|
112
|
+
unsubscribe();
|
|
207
113
|
}
|
|
114
|
+
});
|
|
115
|
+
return unsubscribe;
|
|
116
|
+
};
|
|
117
|
+
const cancel = subscriptionOne((state) => state.connected, () => {
|
|
118
|
+
callback();
|
|
119
|
+
});
|
|
120
|
+
return cancel;
|
|
121
|
+
}
|
|
122
|
+
listenClose(callback) {
|
|
123
|
+
const store = this.store;
|
|
124
|
+
const { status } = store.getState();
|
|
125
|
+
if (status === "disconnected") {
|
|
126
|
+
callback();
|
|
208
127
|
}
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
128
|
+
const subscriptionOne = (selector, listener) => {
|
|
129
|
+
const unsubscribe = store.subscribe((newState, oldState) => {
|
|
130
|
+
if (selector(newState) !== selector(oldState)) {
|
|
131
|
+
listener(newState, oldState);
|
|
132
|
+
unsubscribe();
|
|
212
133
|
}
|
|
213
|
-
|
|
134
|
+
});
|
|
135
|
+
return unsubscribe;
|
|
136
|
+
};
|
|
137
|
+
const cancel = subscriptionOne((state) => state.status, (newState, oldState) => {
|
|
138
|
+
if (newState.status === "disconnected") {
|
|
139
|
+
callback();
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
return cancel;
|
|
143
|
+
}
|
|
144
|
+
onMessage(fn, opts) {
|
|
145
|
+
const ws = this.ws;
|
|
146
|
+
const isJson = opts?.isJson ?? true;
|
|
147
|
+
const selector = opts?.selector;
|
|
148
|
+
const parseIfJson = (data) => {
|
|
149
|
+
try {
|
|
150
|
+
return JSON.parse(data);
|
|
151
|
+
} catch (e) {
|
|
152
|
+
return data;
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
const listener = (event) => {
|
|
156
|
+
const received = parseIfJson(event.data);
|
|
157
|
+
if (typeof received === "string" && !isJson) {
|
|
158
|
+
fn(received, event);
|
|
159
|
+
} else if (typeof received === "object" && isJson) {
|
|
160
|
+
fn(selector ? selector(received) : received, event);
|
|
161
|
+
} else {}
|
|
162
|
+
};
|
|
163
|
+
ws.addEventListener("message", listener);
|
|
164
|
+
return () => {
|
|
165
|
+
ws.removeEventListener("message", listener);
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
close() {
|
|
169
|
+
const ws = this.ws;
|
|
170
|
+
const store = this.store;
|
|
171
|
+
ws?.close?.();
|
|
172
|
+
this.ws = null;
|
|
173
|
+
store.getState().setConnected(false);
|
|
174
|
+
store.getState().setStatus("disconnected");
|
|
175
|
+
}
|
|
176
|
+
send(data, opts) {
|
|
177
|
+
const ws = this.ws;
|
|
178
|
+
const isJson = opts?.isJson ?? true;
|
|
179
|
+
const wrapper = opts?.wrapper;
|
|
180
|
+
if (!ws || ws.readyState !== WebSocket.OPEN) {
|
|
181
|
+
console.error("WebSocket is not open");
|
|
182
|
+
return;
|
|
214
183
|
}
|
|
184
|
+
if (isJson) {
|
|
185
|
+
ws.send(JSON.stringify(wrapper ? wrapper(data) : data));
|
|
186
|
+
} else {
|
|
187
|
+
ws.send(data);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
getOpen() {
|
|
191
|
+
if (!this.ws) {
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
return this.ws.readyState === WebSocket.OPEN;
|
|
195
|
+
}
|
|
215
196
|
}
|
|
216
|
-
|
|
217
|
-
|
|
197
|
+
export {
|
|
198
|
+
QueryWs
|
|
199
|
+
};
|
package/dist/query.d.ts
CHANGED
|
@@ -250,13 +250,6 @@ declare class BaseQuery<T extends Query = Query, R extends {
|
|
|
250
250
|
post<R = any, P = any>(data: P, options?: DataOpts): Promise<Result<R>>;
|
|
251
251
|
get<R = any, P = any>(data: P, options?: DataOpts): Promise<Result<R>>;
|
|
252
252
|
}
|
|
253
|
-
/**
|
|
254
|
-
* @deprecated
|
|
255
|
-
* 前端调用后端QueryRouter, 默认路径 /client/router
|
|
256
|
-
*/
|
|
257
|
-
declare class ClientQuery extends Query {
|
|
258
|
-
constructor(opts?: QueryOpts);
|
|
259
|
-
}
|
|
260
253
|
|
|
261
|
-
export { BaseQuery,
|
|
254
|
+
export { BaseQuery, Query, adapter, setBaseResponse, wrapperError };
|
|
262
255
|
export type { Data, DataOpts, Fn, QueryOptions, QueryOpts, Result };
|