@kevisual/api 0.0.46 → 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.
@@ -0,0 +1,1407 @@
1
+ // node_modules/.pnpm/@kevisual+query@0.0.39/node_modules/@kevisual/query/dist/query-browser.js
2
+ var isTextForContentType = (contentType) => {
3
+ if (!contentType)
4
+ return false;
5
+ const textTypes = ["text/", "xml", "html", "javascript", "css", "csv", "plain", "x-www-form-urlencoded", "md"];
6
+ return textTypes.some((type) => contentType.includes(type));
7
+ };
8
+ var adapter = async (opts = {}, overloadOpts) => {
9
+ const controller = new AbortController;
10
+ const signal = controller.signal;
11
+ const isPostFile = opts.isPostFile || false;
12
+ let responseType = opts.responseType || "json";
13
+ if (opts.isBlob) {
14
+ responseType = "blob";
15
+ } else if (opts.isText) {
16
+ responseType = "text";
17
+ }
18
+ const timeout = opts.timeout || 60000 * 3;
19
+ const timer = setTimeout(() => {
20
+ controller.abort();
21
+ }, timeout);
22
+ let method = overloadOpts?.method || opts?.method || "POST";
23
+ let headers = { ...opts?.headers, ...overloadOpts?.headers };
24
+ let origin = "";
25
+ let url;
26
+ if (opts?.url?.startsWith("http")) {
27
+ url = new URL(opts.url);
28
+ } else {
29
+ origin = window?.location?.origin || "http://localhost:51515";
30
+ url = new URL(opts.url, origin);
31
+ }
32
+ const isGet = method === "GET";
33
+ const oldSearchParams = url.searchParams;
34
+ if (isGet) {
35
+ let searchParams = new URLSearchParams({ ...Object.fromEntries(oldSearchParams), ...opts.body });
36
+ url.search = searchParams.toString();
37
+ } else {
38
+ const params = {
39
+ ...Object.fromEntries(oldSearchParams),
40
+ ...opts.params
41
+ };
42
+ const searchParams = new URLSearchParams(params);
43
+ if (typeof opts.body === "object" && opts.body !== null) {
44
+ let body2 = opts.body || {};
45
+ if (!params.path && body2?.path) {
46
+ searchParams.set("path", body2.path);
47
+ if (body2?.key) {
48
+ searchParams.set("key", body2.key);
49
+ }
50
+ }
51
+ }
52
+ url.search = searchParams.toString();
53
+ }
54
+ let body = undefined;
55
+ if (isGet) {
56
+ body = undefined;
57
+ } else if (isPostFile) {
58
+ body = opts.body;
59
+ } else {
60
+ headers = {
61
+ "Content-Type": "application/json",
62
+ ...headers
63
+ };
64
+ body = JSON.stringify(opts.body);
65
+ }
66
+ return fetch(url, {
67
+ method: method.toUpperCase(),
68
+ signal,
69
+ body,
70
+ ...overloadOpts,
71
+ headers
72
+ }).then(async (response) => {
73
+ const contentType = response.headers.get("Content-Type");
74
+ if (responseType === "blob") {
75
+ return await response.blob();
76
+ }
77
+ const isText = responseType === "text";
78
+ const isJson = contentType && contentType.includes("application/json");
79
+ if (isJson && !isText) {
80
+ return await response.json();
81
+ } else if (isTextForContentType(contentType)) {
82
+ return {
83
+ code: response.status,
84
+ status: response.status,
85
+ data: await response.text()
86
+ };
87
+ } else {
88
+ return response;
89
+ }
90
+ }).catch((err) => {
91
+ if (err.name === "AbortError") {
92
+ return {
93
+ code: 408,
94
+ message: "请求超时"
95
+ };
96
+ }
97
+ return {
98
+ code: 500,
99
+ message: err.message || "网络错误"
100
+ };
101
+ }).finally(() => {
102
+ clearTimeout(timer);
103
+ });
104
+ };
105
+ var wrapperError = ({ code, message }) => {
106
+ const result = {
107
+ code: code || 500,
108
+ success: false,
109
+ message: message || "api request error",
110
+ showError: (fn) => {},
111
+ noMsg: true
112
+ };
113
+ return result;
114
+ };
115
+
116
+ class Query {
117
+ adapter;
118
+ url;
119
+ beforeRequest;
120
+ afterResponse;
121
+ headers;
122
+ timeout;
123
+ stop;
124
+ qws;
125
+ isClient = false;
126
+ constructor(opts) {
127
+ this.adapter = opts?.adapter || adapter;
128
+ const defaultURL = opts?.isClient ? "/client/router" : "/api/router";
129
+ this.url = opts?.url || defaultURL;
130
+ this.headers = opts?.headers || {
131
+ "Content-Type": "application/json"
132
+ };
133
+ this.timeout = opts?.timeout || 60000 * 3;
134
+ if (opts.beforeRequest) {
135
+ this.beforeRequest = opts.beforeRequest;
136
+ } else {
137
+ this.beforeRequest = async (opts2) => {
138
+ const token = globalThis?.localStorage?.getItem("token");
139
+ if (token) {
140
+ opts2.headers = {
141
+ ...opts2.headers,
142
+ Authorization: `Bearer ${token}`
143
+ };
144
+ }
145
+ return opts2;
146
+ };
147
+ }
148
+ }
149
+ setQueryWs(qws) {
150
+ this.qws = qws;
151
+ }
152
+ setStop(stop) {
153
+ this.stop = stop;
154
+ }
155
+ async get(params, options) {
156
+ return this.post(params, options);
157
+ }
158
+ async post(body, options) {
159
+ const url = options?.url || this.url;
160
+ const { headers, adapter: adapter2, beforeRequest, afterResponse, timeout, ...rest } = options || {};
161
+ const _headers = { ...this.headers, ...headers };
162
+ const _adapter = adapter2 || this.adapter;
163
+ const _beforeRequest = beforeRequest || this.beforeRequest;
164
+ const _afterResponse = afterResponse || this.afterResponse;
165
+ const _timeout = timeout || this.timeout;
166
+ const req = {
167
+ url,
168
+ headers: _headers,
169
+ body,
170
+ timeout: _timeout,
171
+ ...rest
172
+ };
173
+ try {
174
+ if (_beforeRequest) {
175
+ const res = await _beforeRequest(req);
176
+ if (res === false) {
177
+ return wrapperError({
178
+ code: 500,
179
+ message: "request is cancel",
180
+ req
181
+ });
182
+ }
183
+ }
184
+ } catch (e) {
185
+ console.error("request beforeFn error", e, req);
186
+ return wrapperError({
187
+ code: 500,
188
+ message: "api request beforeFn error"
189
+ });
190
+ }
191
+ if (this.stop && !options?.noStop) {
192
+ const that = this;
193
+ await new Promise((resolve) => {
194
+ let timer = 0;
195
+ const detect = setInterval(() => {
196
+ if (!that.stop) {
197
+ clearInterval(detect);
198
+ resolve(true);
199
+ }
200
+ timer++;
201
+ if (timer > 30) {
202
+ console.error("request stop: timeout", req.url, timer);
203
+ }
204
+ }, 1000);
205
+ });
206
+ }
207
+ return _adapter(req).then(async (res) => {
208
+ try {
209
+ if (_afterResponse) {
210
+ return await _afterResponse(res, {
211
+ req,
212
+ res,
213
+ fetch: adapter2
214
+ });
215
+ }
216
+ return res;
217
+ } catch (e) {
218
+ console.error("request afterFn error", e, req);
219
+ return wrapperError({
220
+ code: 500,
221
+ message: "api request afterFn error"
222
+ });
223
+ }
224
+ });
225
+ }
226
+ before(fn) {
227
+ this.beforeRequest = fn;
228
+ }
229
+ after(fn) {
230
+ this.afterResponse = fn;
231
+ }
232
+ async fetchText(urlOrOptions, options) {
233
+ let _options = { ...options };
234
+ if (typeof urlOrOptions === "string" && !_options.url) {
235
+ _options.url = urlOrOptions;
236
+ }
237
+ if (typeof urlOrOptions === "object") {
238
+ _options = { ...urlOrOptions, ..._options };
239
+ }
240
+ const res = await adapter({
241
+ method: "GET",
242
+ ..._options,
243
+ headers: {
244
+ ...this.headers,
245
+ ..._options?.headers || {}
246
+ }
247
+ });
248
+ if (res && !res.code) {
249
+ return {
250
+ code: 200,
251
+ data: res
252
+ };
253
+ }
254
+ return res;
255
+ }
256
+ }
257
+
258
+ class BaseQuery {
259
+ query;
260
+ queryDefine;
261
+ constructor(opts) {
262
+ if (opts?.clientQuery) {
263
+ this.query = opts.clientQuery;
264
+ } else {
265
+ this.query = opts?.query;
266
+ }
267
+ if (opts.queryDefine) {
268
+ this.queryDefine = opts.queryDefine;
269
+ this.queryDefine.query = this.query;
270
+ }
271
+ }
272
+ get chain() {
273
+ return this.queryDefine.queryChain;
274
+ }
275
+ post(data, options) {
276
+ return this.query.post(data, options);
277
+ }
278
+ get(data, options) {
279
+ return this.query.get(data, options);
280
+ }
281
+ }
282
+
283
+ // node_modules/.pnpm/@kevisual+query@0.0.39/node_modules/@kevisual/query/dist/query.js
284
+ var setBaseResponse = (res) => {
285
+ res.success = res.code === 200;
286
+ res.showError = (fn) => {
287
+ if (!res.success && !res.noMsg) {
288
+ fn?.();
289
+ }
290
+ };
291
+ return res;
292
+ };
293
+
294
+ // query/query-login/login-cache.ts
295
+ class LoginCacheStore {
296
+ cache;
297
+ name;
298
+ cacheData;
299
+ constructor(opts) {
300
+ if (!opts.cache) {
301
+ throw new Error("cache is required");
302
+ }
303
+ this.cache = opts.cache;
304
+ this.cacheData = {
305
+ loginUsers: [],
306
+ user: undefined,
307
+ id: undefined,
308
+ accessToken: undefined,
309
+ refreshToken: undefined
310
+ };
311
+ this.name = opts.name;
312
+ }
313
+ async setValue(value) {
314
+ await this.cache.set(this.name, value);
315
+ this.cacheData = value;
316
+ return value;
317
+ }
318
+ async delValue() {
319
+ await this.cache.del();
320
+ }
321
+ getValue() {
322
+ return this.cache.get(this.name);
323
+ }
324
+ async init() {
325
+ const defaultData = {
326
+ loginUsers: [],
327
+ user: null,
328
+ id: null,
329
+ accessToken: null,
330
+ refreshToken: null
331
+ };
332
+ if (this.cache.init) {
333
+ try {
334
+ const cacheData = await this.cache.init();
335
+ this.cacheData = cacheData || defaultData;
336
+ } catch (error) {
337
+ console.log("cacheInit error", error);
338
+ }
339
+ } else {
340
+ this.cacheData = await this.getValue() || defaultData;
341
+ }
342
+ }
343
+ async setLoginUser(user) {
344
+ const has = this.cacheData.loginUsers.find((u) => u.id === user.id);
345
+ if (has) {
346
+ this.cacheData.loginUsers = this.cacheData?.loginUsers?.filter((u) => u?.id && u.id !== user.id);
347
+ }
348
+ this.cacheData.loginUsers.push(user);
349
+ this.cacheData.user = user.user;
350
+ this.cacheData.id = user.id;
351
+ this.cacheData.accessToken = user.accessToken;
352
+ this.cacheData.refreshToken = user.refreshToken;
353
+ await this.setValue(this.cacheData);
354
+ }
355
+ getCurrentUser() {
356
+ const cacheData = this.cacheData;
357
+ return Promise.resolve(cacheData.user);
358
+ }
359
+ getCurrentUserList() {
360
+ return Promise.resolve(this.cacheData.loginUsers.filter((u) => u?.id));
361
+ }
362
+ getRefreshToken() {
363
+ const cacheData = this.cacheData;
364
+ return Promise.resolve(cacheData.refreshToken || "");
365
+ }
366
+ getAccessToken() {
367
+ const cacheData = this.cacheData;
368
+ return Promise.resolve(cacheData.accessToken || "");
369
+ }
370
+ async clearCurrentUser() {
371
+ const user = await this.getCurrentUser();
372
+ const has = this.cacheData.loginUsers.find((u) => u.id === user.id);
373
+ if (has) {
374
+ this.cacheData.loginUsers = this.cacheData?.loginUsers?.filter((u) => u?.id && u.id !== user.id);
375
+ }
376
+ this.cacheData.user = undefined;
377
+ this.cacheData.id = undefined;
378
+ this.cacheData.accessToken = undefined;
379
+ this.cacheData.refreshToken = undefined;
380
+ await this.setValue(this.cacheData);
381
+ }
382
+ async clearAll() {
383
+ this.cacheData.loginUsers = [];
384
+ this.cacheData.user = undefined;
385
+ this.cacheData.id = undefined;
386
+ this.cacheData.accessToken = undefined;
387
+ this.cacheData.refreshToken = undefined;
388
+ await this.setValue(this.cacheData);
389
+ }
390
+ }
391
+
392
+ // node_modules/.pnpm/@kevisual+load@0.0.6/node_modules/@kevisual/load/dist/load.js
393
+ function getDefaultExportFromCjs(x) {
394
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
395
+ }
396
+ var eventemitter3 = { exports: {} };
397
+ var hasRequiredEventemitter3;
398
+ function requireEventemitter3() {
399
+ if (hasRequiredEventemitter3)
400
+ return eventemitter3.exports;
401
+ hasRequiredEventemitter3 = 1;
402
+ (function(module) {
403
+ var has = Object.prototype.hasOwnProperty, prefix = "~";
404
+ function Events() {}
405
+ if (Object.create) {
406
+ Events.prototype = Object.create(null);
407
+ if (!new Events().__proto__)
408
+ prefix = false;
409
+ }
410
+ function EE(fn, context, once) {
411
+ this.fn = fn;
412
+ this.context = context;
413
+ this.once = once || false;
414
+ }
415
+ function addListener(emitter, event, fn, context, once) {
416
+ if (typeof fn !== "function") {
417
+ throw new TypeError("The listener must be a function");
418
+ }
419
+ var listener = new EE(fn, context || emitter, once), evt = prefix ? prefix + event : event;
420
+ if (!emitter._events[evt])
421
+ emitter._events[evt] = listener, emitter._eventsCount++;
422
+ else if (!emitter._events[evt].fn)
423
+ emitter._events[evt].push(listener);
424
+ else
425
+ emitter._events[evt] = [emitter._events[evt], listener];
426
+ return emitter;
427
+ }
428
+ function clearEvent(emitter, evt) {
429
+ if (--emitter._eventsCount === 0)
430
+ emitter._events = new Events;
431
+ else
432
+ delete emitter._events[evt];
433
+ }
434
+ function EventEmitter() {
435
+ this._events = new Events;
436
+ this._eventsCount = 0;
437
+ }
438
+ EventEmitter.prototype.eventNames = function eventNames() {
439
+ var names = [], events, name;
440
+ if (this._eventsCount === 0)
441
+ return names;
442
+ for (name in events = this._events) {
443
+ if (has.call(events, name))
444
+ names.push(prefix ? name.slice(1) : name);
445
+ }
446
+ if (Object.getOwnPropertySymbols) {
447
+ return names.concat(Object.getOwnPropertySymbols(events));
448
+ }
449
+ return names;
450
+ };
451
+ EventEmitter.prototype.listeners = function listeners(event) {
452
+ var evt = prefix ? prefix + event : event, handlers = this._events[evt];
453
+ if (!handlers)
454
+ return [];
455
+ if (handlers.fn)
456
+ return [handlers.fn];
457
+ for (var i = 0, l = handlers.length, ee = new Array(l);i < l; i++) {
458
+ ee[i] = handlers[i].fn;
459
+ }
460
+ return ee;
461
+ };
462
+ EventEmitter.prototype.listenerCount = function listenerCount(event) {
463
+ var evt = prefix ? prefix + event : event, listeners = this._events[evt];
464
+ if (!listeners)
465
+ return 0;
466
+ if (listeners.fn)
467
+ return 1;
468
+ return listeners.length;
469
+ };
470
+ EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
471
+ var evt = prefix ? prefix + event : event;
472
+ if (!this._events[evt])
473
+ return false;
474
+ var listeners = this._events[evt], len = arguments.length, args, i;
475
+ if (listeners.fn) {
476
+ if (listeners.once)
477
+ this.removeListener(event, listeners.fn, undefined, true);
478
+ switch (len) {
479
+ case 1:
480
+ return listeners.fn.call(listeners.context), true;
481
+ case 2:
482
+ return listeners.fn.call(listeners.context, a1), true;
483
+ case 3:
484
+ return listeners.fn.call(listeners.context, a1, a2), true;
485
+ case 4:
486
+ return listeners.fn.call(listeners.context, a1, a2, a3), true;
487
+ case 5:
488
+ return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
489
+ case 6:
490
+ return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
491
+ }
492
+ for (i = 1, args = new Array(len - 1);i < len; i++) {
493
+ args[i - 1] = arguments[i];
494
+ }
495
+ listeners.fn.apply(listeners.context, args);
496
+ } else {
497
+ var length = listeners.length, j;
498
+ for (i = 0;i < length; i++) {
499
+ if (listeners[i].once)
500
+ this.removeListener(event, listeners[i].fn, undefined, true);
501
+ switch (len) {
502
+ case 1:
503
+ listeners[i].fn.call(listeners[i].context);
504
+ break;
505
+ case 2:
506
+ listeners[i].fn.call(listeners[i].context, a1);
507
+ break;
508
+ case 3:
509
+ listeners[i].fn.call(listeners[i].context, a1, a2);
510
+ break;
511
+ case 4:
512
+ listeners[i].fn.call(listeners[i].context, a1, a2, a3);
513
+ break;
514
+ default:
515
+ if (!args)
516
+ for (j = 1, args = new Array(len - 1);j < len; j++) {
517
+ args[j - 1] = arguments[j];
518
+ }
519
+ listeners[i].fn.apply(listeners[i].context, args);
520
+ }
521
+ }
522
+ }
523
+ return true;
524
+ };
525
+ EventEmitter.prototype.on = function on(event, fn, context) {
526
+ return addListener(this, event, fn, context, false);
527
+ };
528
+ EventEmitter.prototype.once = function once(event, fn, context) {
529
+ return addListener(this, event, fn, context, true);
530
+ };
531
+ EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {
532
+ var evt = prefix ? prefix + event : event;
533
+ if (!this._events[evt])
534
+ return this;
535
+ if (!fn) {
536
+ clearEvent(this, evt);
537
+ return this;
538
+ }
539
+ var listeners = this._events[evt];
540
+ if (listeners.fn) {
541
+ if (listeners.fn === fn && (!once || listeners.once) && (!context || listeners.context === context)) {
542
+ clearEvent(this, evt);
543
+ }
544
+ } else {
545
+ for (var i = 0, events = [], length = listeners.length;i < length; i++) {
546
+ if (listeners[i].fn !== fn || once && !listeners[i].once || context && listeners[i].context !== context) {
547
+ events.push(listeners[i]);
548
+ }
549
+ }
550
+ if (events.length)
551
+ this._events[evt] = events.length === 1 ? events[0] : events;
552
+ else
553
+ clearEvent(this, evt);
554
+ }
555
+ return this;
556
+ };
557
+ EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {
558
+ var evt;
559
+ if (event) {
560
+ evt = prefix ? prefix + event : event;
561
+ if (this._events[evt])
562
+ clearEvent(this, evt);
563
+ } else {
564
+ this._events = new Events;
565
+ this._eventsCount = 0;
566
+ }
567
+ return this;
568
+ };
569
+ EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
570
+ EventEmitter.prototype.addListener = EventEmitter.prototype.on;
571
+ EventEmitter.prefixed = prefix;
572
+ EventEmitter.EventEmitter = EventEmitter;
573
+ {
574
+ module.exports = EventEmitter;
575
+ }
576
+ })(eventemitter3);
577
+ return eventemitter3.exports;
578
+ }
579
+ var eventemitter3Exports = requireEventemitter3();
580
+ var EventEmitter = /* @__PURE__ */ getDefaultExportFromCjs(eventemitter3Exports);
581
+ var reRunFn = (promiseOpts) => {
582
+ const timeout = promiseOpts.timeout || 5 * 60 * 1000;
583
+ const interval = promiseOpts.interval || 1000;
584
+ const checkSuccess = promiseOpts?.checkSuccess || (() => true);
585
+ const signal = promiseOpts.signal;
586
+ return new Promise(async (resolve, reject) => {
587
+ let intervalId;
588
+ let timeoutId = setTimeout(() => {
589
+ clearTimeout(intervalId);
590
+ resolve({
591
+ code: 500,
592
+ message: "timeout"
593
+ });
594
+ }, timeout);
595
+ const fn = promiseOpts.fn || (() => true);
596
+ const runFn = async () => {
597
+ if (signal?.aborted) {
598
+ clearInterval(intervalId);
599
+ clearTimeout(timeoutId);
600
+ return resolve({
601
+ code: 499,
602
+ message: "operation cancelled"
603
+ });
604
+ }
605
+ const res = await fn();
606
+ if (!!checkSuccess(res)) {
607
+ clearInterval(intervalId);
608
+ clearTimeout(timeoutId);
609
+ resolve({
610
+ code: 200,
611
+ data: res
612
+ });
613
+ } else {
614
+ setTimeout(() => {
615
+ runFn();
616
+ }, interval);
617
+ }
618
+ };
619
+ if (signal) {
620
+ signal.addEventListener("abort", () => {
621
+ clearInterval(intervalId);
622
+ clearTimeout(timeoutId);
623
+ resolve({
624
+ code: 499,
625
+ message: "operation cancelled"
626
+ });
627
+ });
628
+ }
629
+ runFn();
630
+ });
631
+ };
632
+
633
+ class BaseLoad {
634
+ modules = new Map;
635
+ event;
636
+ loading;
637
+ static reRunFn = reRunFn;
638
+ timeout = 5 * 60 * 1000;
639
+ constructor() {
640
+ this.event = new EventEmitter;
641
+ this.loading = false;
642
+ }
643
+ listenKey(key, listenOpts) {
644
+ const timeout = listenOpts?.timeout ?? this.timeout;
645
+ return new Promise((resolve) => {
646
+ const timeoutId = setTimeout(() => {
647
+ this.event.removeListener(key, onEvent);
648
+ resolve({
649
+ code: 500,
650
+ message: "timeout"
651
+ });
652
+ }, timeout);
653
+ const onEvent = (error) => {
654
+ clearTimeout(timeoutId);
655
+ if (error) {
656
+ return resolve({
657
+ code: 500,
658
+ message: error
659
+ });
660
+ }
661
+ const data = this.modules.get(key);
662
+ if (data?.loadSuccessClear) {
663
+ this.remove(key);
664
+ }
665
+ resolve({
666
+ code: 200,
667
+ data: data?.modules
668
+ });
669
+ };
670
+ this.event.once(key, onEvent);
671
+ });
672
+ }
673
+ async hasLoaded(key, hasLoadOpts) {
674
+ if (!key) {
675
+ return {
676
+ code: 404,
677
+ message: "key is required"
678
+ };
679
+ }
680
+ const has = this.modules.has(key);
681
+ if (!has) {
682
+ const isExist = hasLoadOpts?.isExist ?? true;
683
+ const timeout = hasLoadOpts?.timeout ?? this.timeout;
684
+ if (isExist) {
685
+ return await this.listenKey(key, { timeout });
686
+ }
687
+ return {
688
+ code: 404
689
+ };
690
+ }
691
+ const data = this.modules.get(key);
692
+ if (data?.status === "loaded") {
693
+ return {
694
+ code: 200,
695
+ data: data.modules
696
+ };
697
+ }
698
+ if (data?.status === "loading") {
699
+ return await this.listenKey(key, { timeout: hasLoadOpts?.timeout ?? this.timeout });
700
+ }
701
+ if (data?.status === "error") {
702
+ return {
703
+ code: 500,
704
+ message: "load error"
705
+ };
706
+ }
707
+ if (data?.status === "cancel") {
708
+ return {
709
+ code: 499,
710
+ message: "operation cancelled"
711
+ };
712
+ }
713
+ return {
714
+ code: 404
715
+ };
716
+ }
717
+ async loadFn(loadContent, opts) {
718
+ const key = opts.key;
719
+ if (!key) {
720
+ return {
721
+ code: 404,
722
+ message: "key is required"
723
+ };
724
+ }
725
+ const newModule = {
726
+ key: opts.key,
727
+ status: "loading",
728
+ loading: true,
729
+ loadSuccessClear: opts.loadSuccessClear ?? true
730
+ };
731
+ let errorMessage = "";
732
+ try {
733
+ const isReRun = opts.isReRun ?? false;
734
+ let res;
735
+ if (!isReRun) {
736
+ this.modules.set(key, newModule);
737
+ res = await loadContent();
738
+ } else {
739
+ newModule.controller = new AbortController;
740
+ const signal = newModule.controller.signal;
741
+ this.modules.set(key, newModule);
742
+ const data = await reRunFn({
743
+ timeout: opts.timeout,
744
+ interval: opts.interval,
745
+ checkSuccess: opts.checkSuccess,
746
+ fn: loadContent,
747
+ signal
748
+ });
749
+ newModule.controller = null;
750
+ if (data.code === 499) {
751
+ newModule.status = "cancel";
752
+ return {
753
+ code: 499,
754
+ message: "operation cancelled"
755
+ };
756
+ }
757
+ if (data.code !== 200) {
758
+ throw new Error(data.message);
759
+ }
760
+ res = data.data;
761
+ }
762
+ newModule.modules = res;
763
+ newModule.status = "loaded";
764
+ return {
765
+ code: 200,
766
+ data: res
767
+ };
768
+ } catch (error) {
769
+ errorMessage = error.message;
770
+ newModule.status = "error";
771
+ return {
772
+ code: 500,
773
+ message: error
774
+ };
775
+ } finally {
776
+ newModule.loading = false;
777
+ this.modules.set(opts.key, newModule);
778
+ if (!errorMessage) {
779
+ this.event.emit(opts.key);
780
+ } else {
781
+ this.event.emit(opts.key, errorMessage);
782
+ }
783
+ }
784
+ }
785
+ async load(loadContent, opts) {
786
+ this.loading = true;
787
+ const key = opts.key;
788
+ if (!key) {
789
+ return {
790
+ code: 404,
791
+ message: "key is required"
792
+ };
793
+ }
794
+ if (opts?.force) {
795
+ this.remove(key);
796
+ }
797
+ const has = this.modules.has(key);
798
+ if (has) {
799
+ return await this.hasLoaded(key);
800
+ }
801
+ if (typeof loadContent === "function") {
802
+ return this.loadFn(loadContent, opts);
803
+ }
804
+ console.error("loadContent is not a function and not has loaded");
805
+ }
806
+ remove(key) {
807
+ const has = this.modules.has(key);
808
+ if (has) {
809
+ this.checkRemoveController(key);
810
+ this.modules.delete(key);
811
+ }
812
+ }
813
+ emitLoaded(key) {
814
+ this.checkRemoveController(key);
815
+ this.event.emit(key);
816
+ }
817
+ setModule(key, data, loadData) {
818
+ const newModule = {
819
+ key,
820
+ status: "loaded",
821
+ loading: false,
822
+ modules: data || {},
823
+ ...loadData
824
+ };
825
+ this.modules.set(key, newModule);
826
+ this.emitLoaded(key);
827
+ return newModule;
828
+ }
829
+ cancel(key) {
830
+ this.checkRemoveController(key);
831
+ }
832
+ checkRemoveController(key) {
833
+ const data = this.modules.get(key);
834
+ if (data?.controller) {
835
+ data.controller?.abort?.();
836
+ delete data.controller;
837
+ this.modules.set(key, data);
838
+ }
839
+ }
840
+ }
841
+
842
+ // query/query-login/query-login.ts
843
+ class QueryLogin extends BaseQuery {
844
+ cacheStore;
845
+ isBrowser;
846
+ load;
847
+ storage;
848
+ onLoad;
849
+ constructor(opts) {
850
+ super({
851
+ query: opts?.query || new Query
852
+ });
853
+ this.cacheStore = new LoginCacheStore({ name: "login", cache: opts?.cache });
854
+ this.isBrowser = opts?.isBrowser ?? true;
855
+ this.init();
856
+ this.onLoad = opts?.onLoad;
857
+ this.storage = opts?.storage || localStorage;
858
+ }
859
+ setQuery(query) {
860
+ this.query = query;
861
+ }
862
+ async init() {
863
+ await this.cacheStore.init();
864
+ this.load = true;
865
+ this.onLoad?.();
866
+ }
867
+ async post(data, opts) {
868
+ try {
869
+ return this.query.post({ path: "user", ...data }, opts);
870
+ } catch (error) {
871
+ console.log("error", error);
872
+ return {
873
+ code: 400
874
+ };
875
+ }
876
+ }
877
+ async login(data) {
878
+ const res = await this.post({ key: "login", ...data });
879
+ if (res.code === 200) {
880
+ const { accessToken, refreshToken } = res?.data || {};
881
+ this.storage.setItem("token", accessToken || "");
882
+ await this.beforeSetLoginUser({ accessToken, refreshToken });
883
+ }
884
+ return res;
885
+ }
886
+ async loginByCode(data) {
887
+ const res = await this.post({ path: "sms", key: "login", data });
888
+ if (res.code === 200) {
889
+ const { accessToken, refreshToken } = res?.data || {};
890
+ this.storage.setItem("token", accessToken || "");
891
+ await this.beforeSetLoginUser({ accessToken, refreshToken });
892
+ }
893
+ return res;
894
+ }
895
+ async setLoginToken(token) {
896
+ const { accessToken, refreshToken } = token;
897
+ this.storage.setItem("token", accessToken || "");
898
+ await this.beforeSetLoginUser({ accessToken, refreshToken });
899
+ }
900
+ async loginByWechat(data) {
901
+ const res = await this.post({ path: "wx", key: "open-login", code: data.code });
902
+ if (res.code === 200) {
903
+ const { accessToken, refreshToken } = res?.data || {};
904
+ this.storage.setItem("token", accessToken || "");
905
+ await this.beforeSetLoginUser({ accessToken, refreshToken });
906
+ }
907
+ return res;
908
+ }
909
+ async checkWechat({ onSuccess, onError }) {
910
+ const url = new URL(window.location.href);
911
+ const code = url.searchParams.get("code");
912
+ const state = url.searchParams.get("state");
913
+ if (code && state) {
914
+ const res = await this.loginByWechat({ code });
915
+ if (res.code === 200) {
916
+ onSuccess?.(res.data);
917
+ } else {
918
+ onError?.(res);
919
+ }
920
+ }
921
+ }
922
+ async beforeSetLoginUser({ accessToken, refreshToken, check401 }) {
923
+ if (accessToken && refreshToken) {
924
+ const resUser = await this.getMe(accessToken, check401);
925
+ if (resUser.code === 200) {
926
+ const user = resUser.data;
927
+ if (user) {
928
+ this.cacheStore.setLoginUser({
929
+ user,
930
+ id: user.id,
931
+ accessToken,
932
+ refreshToken
933
+ });
934
+ } else {
935
+ console.error("登录失败");
936
+ }
937
+ }
938
+ }
939
+ }
940
+ async queryRefreshToken(refreshToken) {
941
+ const _refreshToken = refreshToken || this.cacheStore.getRefreshToken();
942
+ let data = { refreshToken: _refreshToken };
943
+ if (!_refreshToken) {
944
+ await this.cacheStore.clearCurrentUser();
945
+ return {
946
+ code: 401,
947
+ message: "请先登录",
948
+ data: {}
949
+ };
950
+ }
951
+ return this.post({ key: "refreshToken", data }, {
952
+ afterResponse: async (response, ctx) => {
953
+ setBaseResponse(response);
954
+ return response;
955
+ }
956
+ });
957
+ }
958
+ async afterCheck401ToRefreshToken(response, ctx, refetch) {
959
+ const that = this;
960
+ if (response?.code === 401) {
961
+ const hasRefreshToken = await that.cacheStore.getRefreshToken();
962
+ if (hasRefreshToken) {
963
+ const res = await that.queryRefreshToken(hasRefreshToken);
964
+ if (res.code === 200) {
965
+ const { accessToken, refreshToken } = res?.data || {};
966
+ that.storage.setItem("token", accessToken || "");
967
+ await that.beforeSetLoginUser({ accessToken, refreshToken, check401: false });
968
+ if (refetch && ctx && ctx.req && ctx.req.url && ctx.fetch) {
969
+ await new Promise((resolve) => setTimeout(resolve, 1500));
970
+ const url = ctx.req?.url;
971
+ const body = ctx.req?.body;
972
+ const headers = ctx.req?.headers;
973
+ const res2 = await ctx.fetch(url, {
974
+ method: "POST",
975
+ body,
976
+ headers: { ...headers, Authorization: `Bearer ${accessToken}` }
977
+ });
978
+ setBaseResponse(res2);
979
+ return res2;
980
+ }
981
+ } else {
982
+ that.storage.removeItem("token");
983
+ await that.cacheStore.clearCurrentUser();
984
+ }
985
+ return res;
986
+ }
987
+ }
988
+ return response;
989
+ }
990
+ async run401Action(response, ctx, opts) {
991
+ const that = this;
992
+ const refetch = opts?.refetch ?? false;
993
+ if (response?.code === 401) {
994
+ if (that.query.stop === true) {
995
+ return { code: 500, success: false, message: "refresh token loading..." };
996
+ }
997
+ that.query.stop = true;
998
+ const res = await that.afterCheck401ToRefreshToken(response, ctx, refetch);
999
+ that.query.stop = false;
1000
+ opts?.afterCheck?.(res);
1001
+ if (res.code === 401) {
1002
+ opts?.afterAlso401?.(res);
1003
+ }
1004
+ return res;
1005
+ } else {
1006
+ return response;
1007
+ }
1008
+ }
1009
+ async getMe(token, check401 = true) {
1010
+ const _token = token || this.storage.getItem("token");
1011
+ const that = this;
1012
+ return that.post({ key: "me" }, {
1013
+ beforeRequest: async (config) => {
1014
+ if (config.headers) {
1015
+ config.headers["Authorization"] = `Bearer ${_token}`;
1016
+ }
1017
+ if (!_token) {
1018
+ return false;
1019
+ }
1020
+ return config;
1021
+ },
1022
+ afterResponse: async (response, ctx) => {
1023
+ if (response?.code === 401 && check401 && !token) {
1024
+ return await that.afterCheck401ToRefreshToken(response, ctx);
1025
+ }
1026
+ return response;
1027
+ }
1028
+ });
1029
+ }
1030
+ async checkLocalUser() {
1031
+ const user = await this.cacheStore.getCurrentUser();
1032
+ if (user) {
1033
+ return user;
1034
+ }
1035
+ return null;
1036
+ }
1037
+ async checkLocalToken() {
1038
+ const token = this.storage.getItem("token");
1039
+ return !!token;
1040
+ }
1041
+ async getToken() {
1042
+ const token = this.storage.getItem("token");
1043
+ return token || "";
1044
+ }
1045
+ async beforeRequest(opts = {}) {
1046
+ const token = this.storage.getItem("token");
1047
+ if (token) {
1048
+ opts.headers = { ...opts.headers, Authorization: `Bearer ${token}` };
1049
+ }
1050
+ return opts;
1051
+ }
1052
+ async postSwitchUser(username) {
1053
+ return this.post({ key: "switchCheck", data: { username } });
1054
+ }
1055
+ async switchUser(username) {
1056
+ const localUserList = await this.cacheStore.getCurrentUserList();
1057
+ const user = localUserList.find((userItem) => userItem.user.username === username);
1058
+ if (user) {
1059
+ this.storage.setItem("token", user.accessToken || "");
1060
+ await this.beforeSetLoginUser({ accessToken: user.accessToken, refreshToken: user.refreshToken });
1061
+ return {
1062
+ code: 200,
1063
+ data: {
1064
+ accessToken: user.accessToken,
1065
+ refreshToken: user.refreshToken
1066
+ },
1067
+ success: true,
1068
+ message: "切换用户成功"
1069
+ };
1070
+ }
1071
+ const res = await this.postSwitchUser(username);
1072
+ if (res.code === 200) {
1073
+ const { accessToken, refreshToken } = res?.data || {};
1074
+ this.storage.setItem("token", accessToken || "");
1075
+ await this.beforeSetLoginUser({ accessToken, refreshToken });
1076
+ }
1077
+ return res;
1078
+ }
1079
+ async logout() {
1080
+ this.storage.removeItem("token");
1081
+ const users = await this.cacheStore.getCurrentUserList();
1082
+ const tokens = users.map((user) => {
1083
+ return user?.accessToken;
1084
+ }).filter(Boolean);
1085
+ this.cacheStore.delValue();
1086
+ return this.post({ key: "logout", data: { tokens } });
1087
+ }
1088
+ async hasUser(username) {
1089
+ const that = this;
1090
+ return this.post({
1091
+ path: "org",
1092
+ key: "hasUser",
1093
+ data: {
1094
+ username
1095
+ }
1096
+ }, {
1097
+ afterResponse: async (response, ctx) => {
1098
+ if (response?.code === 401) {
1099
+ const res = await that.afterCheck401ToRefreshToken(response, ctx, true);
1100
+ return res;
1101
+ }
1102
+ return response;
1103
+ }
1104
+ });
1105
+ }
1106
+ async checkLoginStatus(token) {
1107
+ const res = await this.post({
1108
+ path: "user",
1109
+ key: "checkLoginStatus",
1110
+ loginToken: token
1111
+ });
1112
+ if (res.code === 200) {
1113
+ const accessToken = res.data?.accessToken;
1114
+ this.storage.setItem("token", accessToken || "");
1115
+ await this.beforeSetLoginUser({ accessToken, refreshToken: res.data?.refreshToken });
1116
+ return res;
1117
+ }
1118
+ return false;
1119
+ }
1120
+ loginWithWeb(baseURL, { MD5, jsonwebtoken }) {
1121
+ const randomId = Math.random().toString(36).substring(2, 15);
1122
+ const timestamp = Date.now();
1123
+ const tokenSecret = "xiao" + randomId;
1124
+ let sign = "";
1125
+ if (MD5) {
1126
+ sign = MD5(`${tokenSecret}${timestamp}`).toString();
1127
+ }
1128
+ let token = "";
1129
+ if (jsonwebtoken) {
1130
+ token = jsonwebtoken.sign({ randomId, timestamp, sign }, tokenSecret, {
1131
+ expiresIn: 60 * 10
1132
+ });
1133
+ } else {
1134
+ token = tokenSecret;
1135
+ }
1136
+ const url = `${baseURL}/api/router?path=user&key=webLogin&p&loginToken=${token}&sign=${sign}&randomId=${randomId}`;
1137
+ return { url, token, tokenSecret };
1138
+ }
1139
+ async pollLoginStatus(data) {
1140
+ const token = data.token;
1141
+ const load = new BaseLoad;
1142
+ load.load(async () => {
1143
+ const res2 = await this.checkLoginStatus(token);
1144
+ if (res2.code === 500) {
1145
+ load.cancel("check-login-status");
1146
+ }
1147
+ return res2;
1148
+ }, {
1149
+ key: "check-login-status",
1150
+ isReRun: true,
1151
+ checkSuccess: (data2) => {
1152
+ return data2?.code === 200;
1153
+ }
1154
+ });
1155
+ const res = await load.hasLoaded("check-login-status", {
1156
+ timeout: 60 * 3 * 1000
1157
+ });
1158
+ if (res.code === 200 && res.data?.code === 200) {
1159
+ try {
1160
+ console.log("网页登录成功");
1161
+ return true;
1162
+ } catch (error) {
1163
+ console.log("登录失败", error);
1164
+ return false;
1165
+ }
1166
+ }
1167
+ console.log("登录失败", res);
1168
+ return false;
1169
+ }
1170
+ }
1171
+
1172
+ // node_modules/.pnpm/@kevisual+cache@0.0.5/node_modules/@kevisual/cache/dist/cache.js
1173
+ function promisifyRequest(request) {
1174
+ return new Promise((resolve, reject) => {
1175
+ request.oncomplete = request.onsuccess = () => resolve(request.result);
1176
+ request.onabort = request.onerror = () => reject(request.error);
1177
+ });
1178
+ }
1179
+ function createStore(dbName, storeName) {
1180
+ let dbp;
1181
+ const getDB = () => {
1182
+ if (dbp)
1183
+ return dbp;
1184
+ const request = indexedDB.open(dbName);
1185
+ request.onupgradeneeded = () => request.result.createObjectStore(storeName);
1186
+ dbp = promisifyRequest(request);
1187
+ dbp.then((db) => {
1188
+ db.onclose = () => dbp = undefined;
1189
+ }, () => {});
1190
+ return dbp;
1191
+ };
1192
+ return (txMode, callback) => getDB().then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));
1193
+ }
1194
+ var defaultGetStoreFunc;
1195
+ function defaultGetStore() {
1196
+ if (!defaultGetStoreFunc) {
1197
+ defaultGetStoreFunc = createStore("keyval-store", "keyval");
1198
+ }
1199
+ return defaultGetStoreFunc;
1200
+ }
1201
+ function get(key, customStore = defaultGetStore()) {
1202
+ return customStore("readonly", (store) => promisifyRequest(store.get(key)));
1203
+ }
1204
+ function set(key, value, customStore = defaultGetStore()) {
1205
+ return customStore("readwrite", (store) => {
1206
+ store.put(value, key);
1207
+ return promisifyRequest(store.transaction);
1208
+ });
1209
+ }
1210
+ function setMany(entries, customStore = defaultGetStore()) {
1211
+ return customStore("readwrite", (store) => {
1212
+ entries.forEach((entry) => store.put(entry[1], entry[0]));
1213
+ return promisifyRequest(store.transaction);
1214
+ });
1215
+ }
1216
+ function getMany(keys, customStore = defaultGetStore()) {
1217
+ return customStore("readonly", (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));
1218
+ }
1219
+ function update(key, updater, customStore = defaultGetStore()) {
1220
+ return customStore("readwrite", (store) => new Promise((resolve, reject) => {
1221
+ store.get(key).onsuccess = function() {
1222
+ try {
1223
+ store.put(updater(this.result), key);
1224
+ resolve(promisifyRequest(store.transaction));
1225
+ } catch (err) {
1226
+ reject(err);
1227
+ }
1228
+ };
1229
+ }));
1230
+ }
1231
+ function del(key, customStore = defaultGetStore()) {
1232
+ return customStore("readwrite", (store) => {
1233
+ store.delete(key);
1234
+ return promisifyRequest(store.transaction);
1235
+ });
1236
+ }
1237
+ function delMany(keys, customStore = defaultGetStore()) {
1238
+ return customStore("readwrite", (store) => {
1239
+ keys.forEach((key) => store.delete(key));
1240
+ return promisifyRequest(store.transaction);
1241
+ });
1242
+ }
1243
+ function clear(customStore = defaultGetStore()) {
1244
+ return customStore("readwrite", (store) => {
1245
+ store.clear();
1246
+ return promisifyRequest(store.transaction);
1247
+ });
1248
+ }
1249
+ function eachCursor(store, callback) {
1250
+ store.openCursor().onsuccess = function() {
1251
+ if (!this.result)
1252
+ return;
1253
+ callback(this.result);
1254
+ this.result.continue();
1255
+ };
1256
+ return promisifyRequest(store.transaction);
1257
+ }
1258
+ function keys(customStore = defaultGetStore()) {
1259
+ return customStore("readonly", (store) => {
1260
+ if (store.getAllKeys) {
1261
+ return promisifyRequest(store.getAllKeys());
1262
+ }
1263
+ const items = [];
1264
+ return eachCursor(store, (cursor) => items.push(cursor.key)).then(() => items);
1265
+ });
1266
+ }
1267
+ function values(customStore = defaultGetStore()) {
1268
+ return customStore("readonly", (store) => {
1269
+ if (store.getAll) {
1270
+ return promisifyRequest(store.getAll());
1271
+ }
1272
+ const items = [];
1273
+ return eachCursor(store, (cursor) => items.push(cursor.value)).then(() => items);
1274
+ });
1275
+ }
1276
+ function entries(customStore = defaultGetStore()) {
1277
+ return customStore("readonly", (store) => {
1278
+ if (store.getAll && store.getAllKeys) {
1279
+ return Promise.all([
1280
+ promisifyRequest(store.getAllKeys()),
1281
+ promisifyRequest(store.getAll())
1282
+ ]).then(([keys2, values2]) => keys2.map((key, i) => [key, values2[i]]));
1283
+ }
1284
+ const items = [];
1285
+ return customStore("readonly", (store2) => eachCursor(store2, (cursor) => items.push([cursor.key, cursor.value])).then(() => items));
1286
+ });
1287
+ }
1288
+
1289
+ class BaseCacheStore {
1290
+ store;
1291
+ constructor(opts) {
1292
+ this.store = createStore(opts?.dbName || "default-db", opts?.storeName || "cache-store");
1293
+ }
1294
+ async get(key) {
1295
+ return get(key, this.store);
1296
+ }
1297
+ async set(key, value) {
1298
+ return set(key, value, this.store);
1299
+ }
1300
+ async del(key) {
1301
+ return del(key, this.store);
1302
+ }
1303
+ async clear() {
1304
+ return clear(this.store);
1305
+ }
1306
+ async keys() {
1307
+ return keys(this.store);
1308
+ }
1309
+ async values() {
1310
+ return values(this.store);
1311
+ }
1312
+ async entries() {
1313
+ return entries(this.store);
1314
+ }
1315
+ async update(key, updater) {
1316
+ return update(key, updater, this.store);
1317
+ }
1318
+ async setMany(entries2) {
1319
+ return setMany(entries2, this.store);
1320
+ }
1321
+ async getMany(keys2) {
1322
+ return getMany(keys2, this.store);
1323
+ }
1324
+ async delMany(keys2) {
1325
+ return delMany(keys2, this.store);
1326
+ }
1327
+ }
1328
+
1329
+ class CacheStore2 extends BaseCacheStore {
1330
+ constructor(opts) {
1331
+ super(opts);
1332
+ }
1333
+ async getData(key) {
1334
+ const data = await this.get(key);
1335
+ return data.data;
1336
+ }
1337
+ async setData(key, data) {
1338
+ return this.set(key, data);
1339
+ }
1340
+ async getCheckData(key) {
1341
+ const data = await this.get(key);
1342
+ if (data.expireTime && data.expireTime < Date.now()) {
1343
+ await super.del(key);
1344
+ return null;
1345
+ }
1346
+ return data.data;
1347
+ }
1348
+ async setCheckData(key, data, opts) {
1349
+ const now = Date.now();
1350
+ const expireTime = now + (opts?.expireTime || 1000 * 60 * 60 * 24 * 10);
1351
+ const newData = {
1352
+ data,
1353
+ updatedAt: opts?.updatedAt || Date.now(),
1354
+ expireTime
1355
+ };
1356
+ await this.set(key, newData);
1357
+ return data;
1358
+ }
1359
+ async checkNew(key, data) {
1360
+ const existing = await this.get(key);
1361
+ if (!existing) {
1362
+ return true;
1363
+ }
1364
+ if (!data?.updatedAt) {
1365
+ return false;
1366
+ }
1367
+ const updatedAt = new Date(data.updatedAt).getTime();
1368
+ if (isNaN(updatedAt)) {
1369
+ return false;
1370
+ }
1371
+ return updatedAt > existing.updatedAt;
1372
+ }
1373
+ async delCheckData(key) {
1374
+ return this.del(key);
1375
+ }
1376
+ }
1377
+
1378
+ class MyCache extends CacheStore2 {
1379
+ key;
1380
+ constructor(opts) {
1381
+ const { key, ...rest } = opts || {};
1382
+ super(rest);
1383
+ this.key = key || "my-cache";
1384
+ }
1385
+ async getData() {
1386
+ return super.getCheckData(this.key);
1387
+ }
1388
+ async setData(data, opts) {
1389
+ super.setCheckData(this.key, data, opts);
1390
+ }
1391
+ async del() {
1392
+ await super.del(this.key);
1393
+ }
1394
+ }
1395
+
1396
+ // query/query-login/query-login-browser.ts
1397
+ class QueryLoginBrowser extends QueryLogin {
1398
+ constructor(opts) {
1399
+ super({
1400
+ ...opts,
1401
+ cache: new MyCache({ key: "login" })
1402
+ });
1403
+ }
1404
+ }
1405
+ export {
1406
+ QueryLoginBrowser
1407
+ };