@net-vert/core 0.1.0 → 0.1.1

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/README.md CHANGED
@@ -83,7 +83,6 @@ retryApi.get('/unstable-api');
83
83
  ## 🔎 缓存设计说明
84
84
 
85
85
  - 本库默认内置缓存支持
86
- - **后续将完全依赖官方独立包:`@net-vert/cache`**
87
86
  - 用户无需关注存储机制,专注请求本身
88
87
 
89
88
  ---
@@ -98,7 +97,6 @@ retryApi.get('/unstable-api');
98
97
  | `requestExtender.idempotencyRequestor(options)` | 创建幂等请求器 |
99
98
  | `requestExtender.retryRequestor(options)` | 创建重试请求器 |
100
99
 
101
- 非常专业!以下是针对你这份缓存扩展的专属文档(带源码思路和示例):
102
100
 
103
101
  ---
104
102
 
package/dist/index.js CHANGED
@@ -1,244 +1,179 @@
1
+ import h from "localforage";
2
+ import { TaskQueue as I } from "id-queue";
1
3
  const f = {
2
- get: (r, e) => ({
3
- url: r,
4
+ get: (t, e) => ({
5
+ url: t,
4
6
  method: "get",
5
7
  ...e,
6
8
  params: e == null ? void 0 : e.params
7
9
  }),
8
- post: (r, e, t) => ({
9
- url: r,
10
+ post: (t, e, r) => ({
11
+ url: t,
10
12
  method: "post",
11
13
  data: e,
12
- headers: { "Content-Type": "application/json", ...t == null ? void 0 : t.headers },
13
- ...t
14
+ headers: { "Content-Type": "application/json", ...r == null ? void 0 : r.headers },
15
+ ...r
14
16
  }),
15
- delete: (r, e) => ({
16
- url: r,
17
+ delete: (t, e) => ({
18
+ url: t,
17
19
  method: "delete",
18
20
  ...e
19
21
  }),
20
- put: (r, e, t) => ({
21
- url: r,
22
+ put: (t, e, r) => ({
23
+ url: t,
22
24
  method: "put",
23
25
  data: e,
24
- headers: { "Content-Type": "application/json", ...t == null ? void 0 : t.headers },
25
- ...t
26
+ headers: { "Content-Type": "application/json", ...r == null ? void 0 : r.headers },
27
+ ...r
26
28
  }),
27
- request: (r) => r
29
+ request: (t) => t
28
30
  };
29
- function M(r) {
31
+ function j(t) {
30
32
  const e = {};
31
33
  return Object.keys(f).forEach(
32
- (t) => {
33
- e[t] = (...s) => {
34
- const n = f[t](...s);
35
- return r(n);
34
+ (r) => {
35
+ e[r] = (...o) => {
36
+ const n = f[r](...o);
37
+ return t(n);
36
38
  };
37
39
  }
38
40
  ), {
39
41
  ...e,
40
- request: r
42
+ request: t
41
43
  };
42
44
  }
43
- const w = "default", x = /* @__PURE__ */ new Map(), L = (r, e = w) => {
44
- x.set(e, M(r));
45
- }, v = (r = w) => {
46
- const e = x.get(r);
47
- if (!e) throw new Error(`Requestor实例 ${r} 未注册`);
45
+ const R = "default", k = /* @__PURE__ */ new Map(), U = (t, e = R) => {
46
+ k.set(e, j(t));
47
+ }, g = (t = R) => {
48
+ const e = k.get(t);
49
+ if (!e) throw new Error(`Requestor实例 ${t} 未注册`);
48
50
  return e;
49
51
  };
50
- class j {
51
- // 是否存在
52
- has(e) {
53
- return !!localStorage.getItem(e);
52
+ class E {
53
+ constructor(e) {
54
+ e && h.config(e);
54
55
  }
55
- // 获取缓存
56
- get(e) {
57
- const t = localStorage.getItem(e);
58
- if (t)
59
- try {
60
- return JSON.parse(t);
61
- } catch (s) {
62
- console.error("Error parsing cached data", s);
63
- return;
64
- }
56
+ async has(e) {
57
+ return await h.getItem(e) !== null;
65
58
  }
66
- // 设置缓存
67
- set(e, t) {
59
+ async get(e) {
68
60
  try {
69
- const s = JSON.stringify(t);
70
- localStorage.setItem(e, s);
71
- } catch (s) {
72
- console.error("Error saving data to localStorage", s);
61
+ return await h.getItem(e) ?? void 0;
62
+ } catch (r) {
63
+ console.error("Error getting data", r);
64
+ return;
73
65
  }
74
- return t;
75
66
  }
76
- // 删除缓存
77
- delete(e) {
78
- localStorage.removeItem(e);
67
+ async set(e, r) {
68
+ return await h.setItem(e, r), r;
69
+ }
70
+ async delete(e) {
71
+ await h.removeItem(e);
79
72
  }
80
- // 清空所有缓存
81
- clear() {
82
- localStorage.clear();
73
+ async clear() {
74
+ await h.clear();
83
75
  }
84
76
  }
85
- const E = new j(), I = /* @__PURE__ */ new Map(), b = (r) => r ? E : I, z = () => {
86
- const r = /* @__PURE__ */ new Map();
77
+ const S = new E(), T = /* @__PURE__ */ new Map(), $ = (t) => t ? S : T, D = () => {
78
+ const t = /* @__PURE__ */ new Map();
87
79
  return {
88
- getPromise: (o) => r.get(o),
89
- setPromise: (o, u) => {
90
- r.set(o, u);
80
+ getPromise: (s) => t.get(s),
81
+ setPromise: (s, i) => {
82
+ t.set(s, i);
91
83
  },
92
- delPromise: (o) => {
93
- r.delete(o);
84
+ delPromise: (s) => {
85
+ t.delete(s);
94
86
  },
95
87
  clearCache: () => {
96
- r.clear();
88
+ t.clear();
97
89
  }
98
90
  };
99
- }, O = (r, e) => ({
100
- value: r,
91
+ }, _ = (t, e) => ({
92
+ value: t,
101
93
  expiresAt: Date.now() + e
102
- }), T = (r) => r.expiresAt > Date.now(), $ = {
103
- key: (r) => r.url,
94
+ }), z = (t) => t.expiresAt > Date.now(), A = {
95
+ key: (t) => t.url,
104
96
  persist: !1,
105
97
  duration: 1 / 0
106
- }, R = (r) => {
107
- const e = { ...$, ...r }, t = b(e.persist), { getPromise: s, setPromise: n, delPromise: o } = z(), u = {
108
- get(h, i) {
109
- return async (...l) => {
110
- const c = f[i](...l), a = e.key(c), m = s(a);
111
- if (m)
112
- return m;
113
- const y = t.get(a);
114
- let q = !1;
115
- if (y && T(y)) {
98
+ }, x = (t) => {
99
+ const e = { ...A, ...t }, r = $(e.persist), { getPromise: o, setPromise: n, delPromise: s } = D(), i = {
100
+ get(d, c) {
101
+ return async (...u) => {
102
+ const l = f[c](...u), a = e.key(l), p = o(a);
103
+ if (p)
104
+ return p;
105
+ const C = r.get(a);
106
+ let w = !1;
107
+ if (C && z(C)) {
116
108
  try {
117
- q = e.isValid ? await e.isValid({
109
+ w = e.isValid ? await e.isValid({
118
110
  key: a,
119
- config: c,
120
- cachedData: y
111
+ config: l,
112
+ cachedData: C
121
113
  }) : !0;
122
- } catch (d) {
123
- console.error(`校验异常 ${a}`, d);
114
+ } catch (m) {
115
+ console.error(`校验异常 ${a}`, m);
124
116
  }
125
- q || t.delete(a);
117
+ w || r.delete(a);
126
118
  }
127
- if (q)
128
- return y.value;
129
- const P = Reflect.apply(h[i], h, l).then(async (d) => {
130
- const S = typeof e.duration == "number" ? e.duration : e.duration({
119
+ if (w)
120
+ return C.value;
121
+ const P = Reflect.apply(d[c], d, u).then(async (m) => {
122
+ const v = typeof e.duration == "number" ? e.duration : e.duration({
131
123
  key: a,
132
- config: c,
133
- response: d
124
+ config: l,
125
+ response: m
134
126
  });
135
- return t.set(a, O(d, S)), d;
127
+ return r.set(a, _(m, v)), m;
136
128
  }).finally(() => {
137
- o(a);
129
+ s(a);
138
130
  });
139
131
  return n(a, P), P;
140
132
  };
141
133
  }
142
134
  };
143
- return new Proxy(v(), u);
144
- }, D = (r) => {
145
- const { method: e, url: t, params: s, data: n } = r;
146
- return [e, t, JSON.stringify(s), JSON.stringify(n)].join("|");
147
- }, _ = (r) => R({
148
- key: (e) => r ? r(e) : D(e),
135
+ return new Proxy(g(), i);
136
+ }, O = (t) => {
137
+ const { method: e, url: r, params: o, data: n } = t;
138
+ return [e, r, JSON.stringify(o), JSON.stringify(n)].join("|");
139
+ }, H = (t) => x({
140
+ key: (e) => t ? t(e) : O(e),
149
141
  persist: !1
150
- }), A = {
142
+ }), V = {
151
143
  retries: 3,
152
144
  delay: 0,
153
145
  retryCondition: () => !0
154
- }, k = (r) => {
155
- const { retries: e, delay: t, retryCondition: s } = { ...A, ...r }, n = {
156
- get(o, u) {
157
- return (...h) => {
158
- let i = 0;
159
- const p = () => Reflect.apply(o[u], o, h).catch((l) => {
160
- if (i < e && s(l)) {
161
- i++;
162
- const c = typeof t == "function" ? t(i) : t;
146
+ }, M = (t) => {
147
+ const { retries: e, delay: r, retryCondition: o } = { ...V, ...t }, n = {
148
+ get(s, i) {
149
+ return (...d) => {
150
+ let c = 0;
151
+ const y = () => Reflect.apply(s[i], s, d).catch((u) => {
152
+ if (c < e && o(u)) {
153
+ c++;
154
+ const l = typeof r == "function" ? r(c) : r;
163
155
  return new Promise((a) => {
164
- setTimeout(() => a(p()), c);
156
+ setTimeout(() => a(y()), l);
165
157
  });
166
158
  }
167
- return Promise.reject(l);
159
+ return Promise.reject(u);
168
160
  });
169
- return p();
161
+ return y();
170
162
  };
171
163
  }
172
164
  };
173
- return new Proxy(v(), n);
165
+ return new Proxy(g(), n);
174
166
  };
175
- var J = Object.defineProperty, N = (r, e, t) => e in r ? J(r, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[e] = t, C = (r, e, t) => N(r, typeof e != "symbol" ? e + "" : e, t);
176
- class V {
177
- // 尾部指针(最新加入的任务)
178
- constructor(e) {
179
- if (C(this, "map"), C(this, "head"), C(this, "tail"), this.map = /* @__PURE__ */ new Map(), this.head = null, this.tail = null, e)
180
- for (const [t, s] of e)
181
- this.enqueue(t, s);
182
- }
183
- // 添加任务(O(1))
184
- enqueue(e, t) {
185
- this.has(e) && this.remove(e);
186
- const s = { id: e, data: t, next: null, prev: this.tail };
187
- this.tail ? this.tail.next = s : this.head = s, this.tail = s, this.map.set(e, s);
188
- }
189
- // 取出最早的任务(O(1))
190
- dequeue() {
191
- if (!this.head) return null;
192
- const e = this.head;
193
- return this.head = e.next, this.head ? this.head.prev = null : this.tail = null, this.map.delete(e.id), e.data;
194
- }
195
- // 通过 ID 删除任务(O(1))
196
- remove(e) {
197
- const t = this.map.get(e);
198
- return t ? (t.prev ? t.prev.next = t.next : this.head = t.next, t.next ? t.next.prev = t.prev : this.tail = t.prev, this.map.delete(e), !0) : !1;
199
- }
200
- // 通过 ID 获取任务(O(1))
201
- getTask(e) {
202
- var t;
203
- return (t = this.map.get(e)) == null ? void 0 : t.data;
204
- }
205
- // 通过id更新任务
206
- update(e, t) {
207
- const s = this.map.get(e);
208
- return s ? (s.data = t, !0) : !1;
209
- }
210
- has(e) {
211
- return this.map.has(e);
212
- }
213
- peek() {
214
- var e;
215
- return ((e = this.head) == null ? void 0 : e.data) ?? null;
216
- }
217
- clear() {
218
- this.map.clear(), this.head = null, this.tail = null;
219
- }
220
- // 获取当前队列大小
221
- get size() {
222
- return this.map.size;
223
- }
224
- get queue() {
225
- const e = [];
226
- let t = this.head;
227
- for (; t; )
228
- e.push(t.data), t = t.next;
229
- return e;
230
- }
231
- }
232
- class H {
167
+ class b {
233
168
  constructor(e = 4) {
234
- this.parallelCount = e, this.tasks = new V(), this.runningCount = 0;
169
+ this.parallelCount = e, this.tasks = new I(), this.runningCount = 0;
235
170
  }
236
171
  // 加入
237
- add(e, t) {
238
- return console.log("poolinset", e, t), new Promise((s, n) => {
172
+ add(e, r) {
173
+ return console.log("poolinset", e, r), new Promise((o, n) => {
239
174
  this.tasks.enqueue(e, {
240
- task: t,
241
- resolve: s,
175
+ task: r,
176
+ resolve: o,
242
177
  reject: n
243
178
  }), this._run();
244
179
  });
@@ -248,8 +183,8 @@ class H {
248
183
  this.tasks.remove(e);
249
184
  }
250
185
  execute(e) {
251
- const { task: t, resolve: s, reject: n } = e;
252
- return t().then(s).catch(n).finally(() => {
186
+ const { task: r, resolve: o, reject: n } = e;
187
+ return r().then(o).catch(n).finally(() => {
253
188
  this.runningCount--, this._run();
254
189
  });
255
190
  }
@@ -260,31 +195,31 @@ class H {
260
195
  }
261
196
  }
262
197
  }
263
- const U = {
198
+ const F = {
264
199
  parallelCount: 4,
265
200
  retries: 0,
266
201
  createId: () => `${Date.now()}_${Math.random().toString().slice(2, 8)}`
267
- }, F = (r) => {
268
- const e = { ...U, ...r }, { parallelCount: t, createId: s, ...n } = e, o = new H(t), u = n.retries > 0 ? k(n) : null, g = {
269
- get(h, i) {
270
- return (...l) => {
271
- const c = f[i](...l), a = s(c), m = () => u ? u.request(c) : Reflect.apply(h[i], h, l);
272
- return o.add(a, m);
202
+ }, J = (t) => {
203
+ const e = { ...F, ...t }, { parallelCount: r, createId: o, ...n } = e, s = new b(r), i = n.retries > 0 ? M(n) : null, q = {
204
+ get(d, c) {
205
+ return (...u) => {
206
+ const l = f[c](...u), a = o(l), p = () => i ? i.request(l) : Reflect.apply(d[c], d, u);
207
+ return s.add(a, p);
273
208
  };
274
209
  }
275
210
  };
276
211
  return {
277
- requestor: new Proxy(v(), g),
278
- concurrentPool: o
212
+ requestor: new Proxy(g(), q),
213
+ concurrentPool: s
279
214
  };
280
- }, W = {
281
- cacheRequestor: R,
282
- idempotencyRequestor: _,
283
- retryRequestor: k,
284
- concurrentPoolRequestor: F
215
+ }, Q = {
216
+ cacheRequestor: x,
217
+ idempotencyRequestor: H,
218
+ retryRequestor: M,
219
+ concurrentPoolRequestor: J
285
220
  };
286
221
  export {
287
- L as inject,
288
- W as requestExtender,
289
- v as useRequestor
222
+ U as inject,
223
+ Q as requestExtender,
224
+ g as useRequestor
290
225
  };
@@ -1 +1 @@
1
- (function(u,l){typeof exports=="object"&&typeof module<"u"?l(exports):typeof define=="function"&&define.amd?define(["exports"],l):(u=typeof globalThis<"u"?globalThis:u||self,l(u["net-vert/core"]={}))})(this,function(u){"use strict";const l={get:(r,e)=>({url:r,method:"get",...e,params:e==null?void 0:e.params}),post:(r,e,t)=>({url:r,method:"post",data:e,headers:{"Content-Type":"application/json",...t==null?void 0:t.headers},...t}),delete:(r,e)=>({url:r,method:"delete",...e}),put:(r,e,t)=>({url:r,method:"put",data:e,headers:{"Content-Type":"application/json",...t==null?void 0:t.headers},...t}),request:r=>r};function M(r){const e={};return Object.keys(l).forEach(t=>{e[t]=(...s)=>{const n=l[t](...s);return r(n)}}),{...e,request:r}}const w="default",x=new Map,j=(r,e=w)=>{x.set(e,M(r))},f=(r=w)=>{const e=x.get(r);if(!e)throw new Error(`Requestor实例 ${r} 未注册`);return e};class b{has(e){return!!localStorage.getItem(e)}get(e){const t=localStorage.getItem(e);if(t)try{return JSON.parse(t)}catch(s){console.error("Error parsing cached data",s);return}}set(e,t){try{const s=JSON.stringify(t);localStorage.setItem(e,s)}catch(s){console.error("Error saving data to localStorage",s)}return t}delete(e){localStorage.removeItem(e)}clear(){localStorage.clear()}}const T=new b,E=new Map,I=r=>r?T:E,O=()=>{const r=new Map;return{getPromise:o=>r.get(o),setPromise:(o,c)=>{r.set(o,c)},delPromise:o=>{r.delete(o)},clearCache:()=>{r.clear()}}},z=(r,e)=>({value:r,expiresAt:Date.now()+e}),$=r=>r.expiresAt>Date.now(),D={key:r=>r.url,persist:!1,duration:1/0},R=r=>{const e={...D,...r},t=I(e.persist),{getPromise:s,setPromise:n,delPromise:o}=O(),c={get(p,i){return async(...h)=>{const d=l[i](...h),a=e.key(d),g=s(a);if(g)return g;const q=t.get(a);let P=!1;if(q&&$(q)){try{P=e.isValid?await e.isValid({key:a,config:d,cachedData:q}):!0}catch(m){console.error(`校验异常 ${a}`,m)}P||t.delete(a)}if(P)return q.value;const k=Reflect.apply(p[i],p,h).then(async m=>{const W=typeof e.duration=="number"?e.duration:e.duration({key:a,config:d,response:m});return t.set(a,z(m,W)),m}).finally(()=>{o(a)});return n(a,k),k}}};return new Proxy(f(),c)},_=r=>{const{method:e,url:t,params:s,data:n}=r;return[e,t,JSON.stringify(s),JSON.stringify(n)].join("|")},A=r=>R({key:e=>r?r(e):_(e),persist:!1}),J={retries:3,delay:0,retryCondition:()=>!0},S=r=>{const{retries:e,delay:t,retryCondition:s}={...J,...r},n={get(o,c){return(...p)=>{let i=0;const y=()=>Reflect.apply(o[c],o,p).catch(h=>{if(i<e&&s(h)){i++;const d=typeof t=="function"?t(i):t;return new Promise(a=>{setTimeout(()=>a(y()),d)})}return Promise.reject(h)});return y()}}};return new Proxy(f(),n)};var N=Object.defineProperty,V=(r,e,t)=>e in r?N(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,C=(r,e,t)=>V(r,typeof e!="symbol"?e+"":e,t);class H{constructor(e){if(C(this,"map"),C(this,"head"),C(this,"tail"),this.map=new Map,this.head=null,this.tail=null,e)for(const[t,s]of e)this.enqueue(t,s)}enqueue(e,t){this.has(e)&&this.remove(e);const s={id:e,data:t,next:null,prev:this.tail};this.tail?this.tail.next=s:this.head=s,this.tail=s,this.map.set(e,s)}dequeue(){if(!this.head)return null;const e=this.head;return this.head=e.next,this.head?this.head.prev=null:this.tail=null,this.map.delete(e.id),e.data}remove(e){const t=this.map.get(e);return t?(t.prev?t.prev.next=t.next:this.head=t.next,t.next?t.next.prev=t.prev:this.tail=t.prev,this.map.delete(e),!0):!1}getTask(e){var t;return(t=this.map.get(e))==null?void 0:t.data}update(e,t){const s=this.map.get(e);return s?(s.data=t,!0):!1}has(e){return this.map.has(e)}peek(){var e;return((e=this.head)==null?void 0:e.data)??null}clear(){this.map.clear(),this.head=null,this.tail=null}get size(){return this.map.size}get queue(){const e=[];let t=this.head;for(;t;)e.push(t.data),t=t.next;return e}}class U{constructor(e=4){this.parallelCount=e,this.tasks=new H,this.runningCount=0}add(e,t){return console.log("poolinset",e,t),new Promise((s,n)=>{this.tasks.enqueue(e,{task:t,resolve:s,reject:n}),this._run()})}remove(e){this.tasks.remove(e)}execute(e){const{task:t,resolve:s,reject:n}=e;return t().then(s).catch(n).finally(()=>{this.runningCount--,this._run()})}_run(){for(;this.runningCount<this.parallelCount&&this.tasks.size>0;){const e=this.tasks.dequeue();this.runningCount++,this.execute(e)}}}const F={parallelCount:4,retries:0,createId:()=>`${Date.now()}_${Math.random().toString().slice(2,8)}`},L={cacheRequestor:R,idempotencyRequestor:A,retryRequestor:S,concurrentPoolRequestor:r=>{const e={...F,...r},{parallelCount:t,createId:s,...n}=e,o=new U(t),c=n.retries>0?S(n):null,v={get(p,i){return(...h)=>{const d=l[i](...h),a=s(d),g=()=>c?c.request(d):Reflect.apply(p[i],p,h);return o.add(a,g)}}};return{requestor:new Proxy(f(),v),concurrentPool:o}}};u.inject=j,u.requestExtender=L,u.useRequestor=f,Object.defineProperty(u,Symbol.toStringTag,{value:"Module"})});
1
+ (function(i,a){typeof exports=="object"&&typeof module<"u"?a(exports,require("localforage"),require("id-queue")):typeof define=="function"&&define.amd?define(["exports","localforage","id-queue"],a):(i=typeof globalThis<"u"?globalThis:i||self,a(i["net-vert/core"]={},i.localforage,i.idQueue))})(this,function(i,a,j){"use strict";const p={get:(t,e)=>({url:t,method:"get",...e,params:e==null?void 0:e.params}),post:(t,e,r)=>({url:t,method:"post",data:e,headers:{"Content-Type":"application/json",...r==null?void 0:r.headers},...r}),delete:(t,e)=>({url:t,method:"delete",...e}),put:(t,e,r)=>({url:t,method:"put",data:e,headers:{"Content-Type":"application/json",...r==null?void 0:r.headers},...r}),request:t=>t};function T(t){const e={};return Object.keys(p).forEach(r=>{e[r]=(...s)=>{const n=p[r](...s);return t(n)}}),{...e,request:t}}const R="default",k=new Map,I=(t,e=R)=>{k.set(e,T(t))},f=(t=R)=>{const e=k.get(t);if(!e)throw new Error(`Requestor实例 ${t} 未注册`);return e};class S{constructor(e){e&&a.config(e)}async has(e){return await a.getItem(e)!==null}async get(e){try{return await a.getItem(e)??void 0}catch(r){console.error("Error getting data",r);return}}async set(e,r){return await a.setItem(e,r),r}async delete(e){await a.removeItem(e)}async clear(){await a.clear()}}const E=new S,$=new Map,D=t=>t?E:$,O=()=>{const t=new Map;return{getPromise:o=>t.get(o),setPromise:(o,l)=>{t.set(o,l)},delPromise:o=>{t.delete(o)},clearCache:()=>{t.clear()}}},_=(t,e)=>({value:t,expiresAt:Date.now()+e}),z=t=>t.expiresAt>Date.now(),A={key:t=>t.url,persist:!1,duration:1/0},v=t=>{const e={...A,...t},r=D(e.persist),{getPromise:s,setPromise:n,delPromise:o}=O(),l={get(y,c){return async(...d)=>{const h=p[c](...d),u=e.key(h),C=s(u);if(C)return C;const w=r.get(u);let g=!1;if(w&&z(w)){try{g=e.isValid?await e.isValid({key:u,config:h,cachedData:w}):!0}catch(m){console.error(`校验异常 ${u}`,m)}g||r.delete(u)}if(g)return w.value;const M=Reflect.apply(y[c],y,d).then(async m=>{const N=typeof e.duration=="number"?e.duration:e.duration({key:u,config:h,response:m});return r.set(u,_(m,N)),m}).finally(()=>{o(u)});return n(u,M),M}}};return new Proxy(f(),l)},b=t=>{const{method:e,url:r,params:s,data:n}=t;return[e,r,JSON.stringify(s),JSON.stringify(n)].join("|")},H=t=>v({key:e=>t?t(e):b(e),persist:!1}),V={retries:3,delay:0,retryCondition:()=>!0},x=t=>{const{retries:e,delay:r,retryCondition:s}={...V,...t},n={get(o,l){return(...y)=>{let c=0;const q=()=>Reflect.apply(o[l],o,y).catch(d=>{if(c<e&&s(d)){c++;const h=typeof r=="function"?r(c):r;return new Promise(u=>{setTimeout(()=>u(q()),h)})}return Promise.reject(d)});return q()}}};return new Proxy(f(),n)};class F{constructor(e=4){this.parallelCount=e,this.tasks=new j.TaskQueue,this.runningCount=0}add(e,r){return console.log("poolinset",e,r),new Promise((s,n)=>{this.tasks.enqueue(e,{task:r,resolve:s,reject:n}),this._run()})}remove(e){this.tasks.remove(e)}execute(e){const{task:r,resolve:s,reject:n}=e;return r().then(s).catch(n).finally(()=>{this.runningCount--,this._run()})}_run(){for(;this.runningCount<this.parallelCount&&this.tasks.size>0;){const e=this.tasks.dequeue();this.runningCount++,this.execute(e)}}}const J={parallelCount:4,retries:0,createId:()=>`${Date.now()}_${Math.random().toString().slice(2,8)}`},L={cacheRequestor:v,idempotencyRequestor:H,retryRequestor:x,concurrentPoolRequestor:t=>{const e={...J,...t},{parallelCount:r,createId:s,...n}=e,o=new F(r),l=n.retries>0?x(n):null,P={get(y,c){return(...d)=>{const h=p[c](...d),u=s(h),C=()=>l?l.request(h):Reflect.apply(y[c],y,d);return o.add(u,C)}}};return{requestor:new Proxy(f(),P),concurrentPool:o}}};i.inject=I,i.requestExtender=L,i.useRequestor=f,Object.defineProperty(i,Symbol.toStringTag,{value:"Module"})});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@net-vert/core",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Dependency Inversion Network Library with Type-Safe Injection.",
5
5
  "main": "dist/index",
6
6
  "type": "module",
@@ -26,7 +26,8 @@
26
26
  "access": "public"
27
27
  },
28
28
  "dependencies": {
29
- "id-queue": "^1.0.9"
29
+ "id-queue": "^1.0.9",
30
+ "localforage": "^1.10.0"
30
31
  },
31
32
  "scripts": {
32
33
  "test": "vitest",