k99 0.6.0-alpha.0 → 0.6.0-alpha.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/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2019-2022 Fierflame
3
+ Copyright (c) 2019-2023 猛火Fierflame
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy of
6
6
  this software and associated documentation files (the "Software"), to deal in
@@ -1,9 +1,9 @@
1
1
  /*!
2
- * k99 v0.6.0-alpha.0
3
- * (c) 2019-2022 猛火 Fierflame
2
+ * k99 v0.6.0-alpha.1
3
+ * (c) 2019-2023 猛火Fierflame
4
4
  * @license MIT
5
5
  */
6
- import { Log, Asset, Setting, K99Request, K99Response, App } from 'k99';
6
+ import { Log, Asset, Setting, K99Request, K99Response } from 'k99';
7
7
 
8
8
  declare function createCacheApis(name?: string, { assets, log, settings, }?: {
9
9
  assets?: string;
@@ -33,6 +33,6 @@ declare function createRequest(request: Request, searchParser?: (search: string)
33
33
 
34
34
  declare function createResponse(target: K99Response): Response;
35
35
 
36
- declare function createFetch(app: App, notFound?: null | ((request: Request) => Response | Promise<Response>), searchParser?: (search: string) => Record<string, string | string[]>): (input: RequestInfo, init?: RequestInit) => Promise<Response>;
36
+ declare function createFetch(run: (request: K99Request) => Promise<K99Response | null>, notFound?: null | ((request: Request) => Response | Promise<Response>), searchParser?: (search: string) => Record<string, string | string[]>): (input: RequestInfo, init?: RequestInit) => Promise<Response>;
37
37
 
38
38
  export { createBufferRead, createCacheApis, createFetch, createIndexedApis, createRequest, createResponse, createStreamRead };
package/browser/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /*!
2
- * k99 v0.6.0-alpha.0
3
- * (c) 2019-2022 猛火 Fierflame
2
+ * k99 v0.6.0-alpha.1
3
+ * (c) 2019-2023 猛火Fierflame
4
4
  * @license MIT
5
5
  */
6
6
  (function (global, factory) {
@@ -14,59 +14,45 @@
14
14
  async read(path) {
15
15
  path = `${root}${path}`;
16
16
  const response = await cache.match(path);
17
-
18
17
  if (!response) {
19
18
  return undefined;
20
19
  }
21
-
22
20
  return response.json();
23
21
  },
24
-
25
22
  async write(path, cfg) {
26
23
  path = `${root}${path}`;
27
-
28
24
  if (cfg === undefined) {
29
25
  return cache.delete(path);
30
26
  }
31
-
32
27
  await cache.put(path, new Response(JSON.stringify(cfg)));
33
28
  return true;
34
29
  }
35
-
36
30
  };
37
31
  }
38
-
39
32
  function createAssetsApi$1(cache, root) {
40
33
  return {
41
34
  async read(path) {
42
35
  path = `${root}${path}`;
43
36
  const response = await cache.match(path);
44
-
45
37
  if (!response) {
46
38
  return null;
47
39
  }
48
-
49
40
  return new Uint8Array(await response.arrayBuffer());
50
41
  },
51
-
52
42
  async write(path, data) {
53
43
  path = `${root}${path}`;
54
44
  await cache.put(path, new Response(data));
55
45
  return true;
56
46
  },
57
-
58
47
  async delete(path) {
59
48
  path = `${root}${path}`;
60
49
  return cache.delete(path);
61
50
  },
62
-
63
51
  stat() {
64
52
  return null;
65
53
  }
66
-
67
54
  };
68
55
  }
69
-
70
56
  function createLogApi$1(cache, root) {
71
57
  return {
72
58
  async read(path) {
@@ -74,7 +60,6 @@
74
60
  const response = await cache.match(path);
75
61
  return response ? response.text() : '';
76
62
  },
77
-
78
63
  async write(path, log) {
79
64
  path = `${root}${path}`;
80
65
  const response = await cache.match(path);
@@ -82,46 +67,36 @@
82
67
  await cache.put(path, new Response(text));
83
68
  return true;
84
69
  },
85
-
86
70
  async clear(path) {
87
71
  path = `${root}${path}`;
88
72
  await cache.delete(path);
89
73
  }
90
-
91
74
  };
92
75
  }
93
-
94
76
  async function createCacheApis(name = 'k99', {
95
77
  assets = '/k99/assets',
96
78
  log = '/k99/log',
97
79
  settings = '/k99/settings'
98
80
  } = {}) {
99
81
  const cache = await caches.open(name);
100
-
101
82
  if (assets[assets.length - 1] !== '/') {
102
83
  assets = `${assets}/`;
103
84
  }
104
-
105
85
  if (assets[0] !== '/') {
106
86
  assets = `/${assets}`;
107
87
  }
108
-
109
88
  if (log[log.length - 1] !== '/') {
110
89
  log = `${log}/`;
111
90
  }
112
-
113
91
  if (log[0] !== '/') {
114
92
  log = `/${log}`;
115
93
  }
116
-
117
94
  if (settings[log.length - 1] !== '/') {
118
95
  settings = `${settings}/`;
119
96
  }
120
-
121
97
  if (settings[0] !== '/') {
122
98
  settings = `/${settings}`;
123
99
  }
124
-
125
100
  return {
126
101
  logApi: createLogApi$1(cache, log),
127
102
  assetsApi: createAssetsApi$1(cache, assets),
@@ -138,7 +113,6 @@
138
113
  request.addEventListener('success', () => r(request.result || null));
139
114
  });
140
115
  },
141
-
142
116
  async write(path, data) {
143
117
  return new Promise(r => {
144
118
  const request = db.transaction(store, 'readwrite').objectStore(store).add(data, path);
@@ -146,7 +120,6 @@
146
120
  request.addEventListener('success', () => r(true));
147
121
  });
148
122
  },
149
-
150
123
  async delete(path) {
151
124
  return new Promise(r => {
152
125
  const request = db.transaction(store, 'readwrite').objectStore(store).delete(path);
@@ -154,14 +127,11 @@
154
127
  request.addEventListener('success', () => r(true));
155
128
  });
156
129
  },
157
-
158
130
  stat() {
159
131
  return null;
160
132
  }
161
-
162
133
  };
163
134
  }
164
-
165
135
  function createSettingsApi(db, store) {
166
136
  return {
167
137
  async read(path) {
@@ -171,7 +141,6 @@
171
141
  request.addEventListener('success', () => r(request.result || null));
172
142
  });
173
143
  },
174
-
175
144
  async write(path, cfg) {
176
145
  if (cfg === null || cfg === undefined) {
177
146
  return new Promise(r => {
@@ -180,17 +149,14 @@
180
149
  request.addEventListener('success', () => r(true));
181
150
  });
182
151
  }
183
-
184
152
  return new Promise(r => {
185
153
  const request = db.transaction(store, 'readwrite').objectStore(store).add(cfg, path);
186
154
  request.addEventListener('error', () => r(false));
187
155
  request.addEventListener('success', () => r(true));
188
156
  });
189
157
  }
190
-
191
158
  };
192
159
  }
193
-
194
160
  function createLogApi(db, store) {
195
161
  return {
196
162
  async read(path) {
@@ -200,7 +166,6 @@
200
166
  request.addEventListener('success', () => r(request.result || null));
201
167
  });
202
168
  },
203
-
204
169
  async write(path, log) {
205
170
  return new Promise(r => {
206
171
  const transaction = db.transaction(store, 'readwrite');
@@ -213,7 +178,6 @@
213
178
  });
214
179
  });
215
180
  },
216
-
217
181
  async clear(path) {
218
182
  return new Promise(r => {
219
183
  const request = db.transaction(store, 'readwrite').objectStore(store).delete(path);
@@ -221,10 +185,8 @@
221
185
  request.addEventListener('success', () => r());
222
186
  });
223
187
  }
224
-
225
188
  };
226
189
  }
227
-
228
190
  function createIndexedApis(database = 'k99', {
229
191
  assets = 'assets',
230
192
  log = 'log',
@@ -255,156 +217,122 @@
255
217
  const dataList = [];
256
218
  let dataSize = 0;
257
219
  const list = [];
258
-
259
220
  function get() {
260
221
  if (!current || dataSize <= current) {
261
222
  const chunk = new Uint8Array(dataSize);
262
223
  let index = 0;
263
-
264
224
  for (const item of dataList) {
265
225
  for (let i = 0; i < item.byteLength; i++, index++) {
266
226
  chunk[index] = item[i];
267
227
  }
268
228
  }
269
-
270
229
  dataSize = 0;
271
230
  dataList.length = 0;
272
231
  return chunk;
273
232
  }
274
-
275
233
  let item = dataList.shift();
276
-
277
234
  if (!item) {
278
235
  return null;
279
236
  }
280
-
281
237
  const chunk = new Uint8Array(current);
282
238
  let index = 0;
283
239
  let i = 0;
284
240
  let len = item.length;
285
-
286
241
  while (index < current) {
287
242
  if (i >= length) {
288
243
  item = dataList.shift();
289
-
290
244
  if (!item) {
291
245
  break;
292
246
  }
293
-
294
247
  i = 0;
295
248
  len = item.length;
296
249
  }
297
-
298
250
  chunk[index] = item[i];
299
251
  i++;
300
252
  index++;
301
253
  }
302
-
303
254
  if (item && i < len) {
304
255
  dataList.unshift(new Uint8Array(item.buffer.slice(i)));
305
256
  }
306
-
307
257
  dataSize -= current;
308
258
  return chunk;
309
259
  }
310
-
311
260
  function add(data) {
312
261
  dataSize += data.length || 0;
313
262
  dataList.push(data);
314
263
  return dataSize;
315
264
  }
316
-
317
265
  function runCb() {
318
266
  if (!cb) {
319
267
  return;
320
268
  }
321
-
322
269
  const v = dataSize ? get() : null;
323
270
  cb(v);
324
271
  [current, cb] = list.shift() || [0, null];
325
272
  }
326
-
327
273
  async function run() {
328
-
329
274
  for (;;) {
330
275
  if (!cb) {
331
276
  break;
332
277
  }
333
-
334
278
  if (end) {
335
279
  runCb();
336
280
  continue;
337
281
  }
338
-
339
282
  if (dataSize && (!current || dataSize >= current)) {
340
283
  runCb();
341
284
  continue;
342
285
  }
343
-
344
286
  const {
345
287
  value,
346
288
  done
347
289
  } = await reader.read();
348
-
349
290
  if (done) {
350
291
  end = true;
351
292
  continue;
352
293
  }
353
-
354
294
  add(value);
355
-
356
295
  if (dataSize && (!current || dataSize >= current)) {
357
296
  runCb();
358
297
  continue;
359
298
  }
360
299
  }
361
300
  }
362
-
363
301
  function read(size = 0) {
364
302
  return new Promise(resolve => {
365
303
  if (!reader) {
366
304
  reader = readableStream.getReader();
367
305
  }
368
-
369
306
  size = Math.max(size, 0);
370
-
371
307
  if (cb) {
372
308
  list.push([size, resolve]);
373
309
  return;
374
310
  }
375
-
376
311
  current = size;
377
312
  cb = resolve;
378
313
  run();
379
314
  });
380
315
  }
381
-
382
316
  return read;
383
317
  }
384
318
 
385
319
  function createBufferRead(request) {
386
320
  let arrayBuffer;
387
-
388
321
  function read(size = 0) {
389
322
  if (!arrayBuffer) {
390
323
  arrayBuffer = request.arrayBuffer().then(t => [new Uint8Array(0), new Uint8Array(t), 0]);
391
324
  }
392
-
393
325
  arrayBuffer = arrayBuffer.then(v => {
394
326
  if (!v) {
395
327
  return null;
396
328
  }
397
-
398
329
  let [, buff, index] = v;
399
-
400
330
  if (index >= buff.byteLength) {
401
331
  return null;
402
332
  }
403
-
404
333
  if (!size || size + index >= buff.byteLength) {
405
334
  return [buff.slice(index), buff, buff.byteLength];
406
335
  }
407
-
408
336
  let end = index + size;
409
337
  return [buff.slice(index, end), buff, end];
410
338
  });
@@ -412,51 +340,39 @@
412
340
  if (!v) {
413
341
  return null;
414
342
  }
415
-
416
343
  const [value] = v;
417
344
  return value;
418
345
  });
419
346
  }
420
-
421
347
  return read;
422
348
  }
423
349
 
424
350
  function getNameValue(s) {
425
351
  const index = s.indexOf('=');
426
-
427
352
  if (index < 0) {
428
353
  return [decodeURIComponent(s), ''];
429
354
  }
430
-
431
355
  return [decodeURIComponent(s.substring(0, index)), decodeURIComponent(s.substring(index + 1))];
432
356
  }
433
-
434
357
  function parseQuery(s) {
435
358
  const query = {};
436
-
437
359
  for (const k of s.split('&').filter(Boolean)) {
438
360
  const [index, value] = getNameValue(k);
439
-
440
361
  if (index in query) {
441
362
  query[index] = [query[index], value].flat();
442
363
  } else {
443
364
  query[index] = value;
444
365
  }
445
366
  }
446
-
447
367
  return query;
448
368
  }
449
-
450
369
  function getHeaders(h) {
451
370
  const headers = {};
452
-
453
371
  for (const [k, v] of h.entries()) {
454
372
  headers[k.toLowerCase()] = v;
455
373
  }
456
-
457
374
  return headers;
458
375
  }
459
-
460
376
  function createRequest(request, searchParser = parseQuery) {
461
377
  const url = new URL(request.url);
462
378
  const {
@@ -465,15 +381,11 @@
465
381
  } = request;
466
382
  const aborted = new Promise((_, reject) => {
467
383
  if (signal.aborted) {
468
- return reject(new DOMException('The user aborted a request.'));
384
+ return reject(signal.reason);
469
385
  }
470
-
471
- const abort = () => {
472
- signal.removeEventListener('abort', abort);
473
- reject(new DOMException('The user aborted a request.'));
474
- };
475
-
476
- signal.addEventListener('abort', abort);
386
+ signal.addEventListener('abort', () => reject(signal.reason), {
387
+ once: true
388
+ });
477
389
  });
478
390
  return {
479
391
  method: (request.method || 'GET').toUpperCase(),
@@ -489,16 +401,13 @@
489
401
 
490
402
  function createHeaders(target) {
491
403
  const headers = new Headers();
492
-
493
404
  for (const [k, v] of Object.entries(target.headers)) {
494
405
  for (const it of [v].flat()) {
495
406
  headers.append(k.toLowerCase(), String(it));
496
407
  }
497
408
  }
498
-
499
409
  return headers;
500
410
  }
501
-
502
411
  function createResponse(target) {
503
412
  return new Response(new ReadableStream({
504
413
  async pull(controller) {
@@ -506,45 +415,37 @@
506
415
  value,
507
416
  done
508
417
  } = await target.next();
509
-
510
418
  if (done) {
511
419
  controller.close();
512
420
  } else {
513
421
  controller.enqueue(value);
514
422
  }
515
423
  },
516
-
517
424
  async cancel(reason) {
518
425
  return target.throw(reason).then(() => {}, () => {});
519
426
  }
520
-
521
427
  }), {
522
428
  status: target.status,
523
429
  headers: createHeaders(target)
524
430
  });
525
431
  }
526
432
 
527
- function createFetch(app, notFound, searchParser) {
433
+ function createFetch(run, notFound, searchParser) {
528
434
  return async function fetch(input, init) {
529
435
  const request = new Request(input, init);
530
436
  const {
531
437
  signal
532
438
  } = request;
533
-
534
439
  if (signal.aborted) {
535
440
  return Promise.reject(new DOMException('The user aborted a request.'));
536
441
  }
537
-
538
- const r = await app.request(createRequest(request, searchParser));
539
-
442
+ const r = await run(createRequest(request, searchParser));
540
443
  if (r) {
541
444
  return createResponse(r);
542
445
  }
543
-
544
446
  if (typeof notFound === 'function') {
545
447
  return notFound(request);
546
448
  }
547
-
548
449
  return new Response(null, {
549
450
  status: 404
550
451
  });
@@ -559,6 +460,4 @@
559
460
  exports.createResponse = createResponse;
560
461
  exports.createStreamRead = createStreamRead;
561
462
 
562
- Object.defineProperty(exports, '__esModule', { value: true });
563
-
564
463
  }));
@@ -1,6 +1,6 @@
1
1
  /*!
2
- * k99 v0.6.0-alpha.0
3
- * (c) 2019-2022 猛火 Fierflame
2
+ * k99 v0.6.0-alpha.1
3
+ * (c) 2019-2023 猛火Fierflame
4
4
  * @license MIT
5
5
  */
6
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).k99Browser={})}(this,(function(e){"use strict";function t(e,t){return{async read(n){n=`${t}${n}`;const r=await e.match(n);if(r)return r.json()},write:async(n,r)=>(n=`${t}${n}`,void 0===r?e.delete(n):(await e.put(n,new Response(JSON.stringify(r))),!0))}}function n(e,t){return{async read(n){n=`${t}${n}`;const r=await e.match(n);return r?new Uint8Array(await r.arrayBuffer()):null},write:async(n,r)=>(n=`${t}${n}`,await e.put(n,new Response(r)),!0),delete:async n=>(n=`${t}${n}`,e.delete(n)),stat:()=>null}}function r(e,t){return{async read(n){n=`${t}${n}`;const r=await e.match(n);return r?r.text():""},async write(n,r){n=`${t}${n}`;const s=await e.match(n),o=`${await(s?.text())||""}${r}\n`;return await e.put(n,new Response(o)),!0},async clear(n){n=`${t}${n}`,await e.delete(n)}}}function s(e,t){return{read:async n=>new Promise((r=>{const s=e.transaction(t).objectStore(t).get(n);s.addEventListener("error",(()=>r(null))),s.addEventListener("success",(()=>r(s.result||null)))})),write:async(n,r)=>new Promise((s=>{const o=e.transaction(t,"readwrite").objectStore(t).add(r,n);o.addEventListener("error",(()=>s(!1))),o.addEventListener("success",(()=>s(!0)))})),delete:async n=>new Promise((r=>{const s=e.transaction(t,"readwrite").objectStore(t).delete(n);s.addEventListener("error",(()=>r(!1))),s.addEventListener("success",(()=>r(!0)))})),stat:()=>null}}function o(e,t){return{read:async n=>new Promise((r=>{const s=e.transaction(t).objectStore(t).get(n);s.addEventListener("error",(()=>r(null))),s.addEventListener("success",(()=>r(s.result||null)))})),write:async(n,r)=>new Promise(null==r?r=>{const s=e.transaction(t,"readwrite").objectStore(t).delete(n);s.addEventListener("error",(()=>r(!1))),s.addEventListener("success",(()=>r(!0)))}:s=>{const o=e.transaction(t,"readwrite").objectStore(t).add(r,n);o.addEventListener("error",(()=>s(!1))),o.addEventListener("success",(()=>s(!0)))})}}function a(e,t){return{read:async n=>new Promise((r=>{const s=e.transaction(t).objectStore(t).get(n);s.addEventListener("error",(()=>r(""))),s.addEventListener("success",(()=>r(s.result||null)))})),write:async(n,r)=>new Promise((s=>{const o=e.transaction(t,"readwrite"),a=o.objectStore(t).get(n);a.addEventListener("error",(()=>s(!1))),a.addEventListener("success",(()=>{const e=o.objectStore(t).add(`${a.result||""}${r}\n`,n);e.addEventListener("error",(()=>s(!1))),e.addEventListener("success",(()=>s(!0)))}))})),clear:async n=>new Promise((r=>{const s=e.transaction(t,"readwrite").objectStore(t).delete(n);s.addEventListener("error",(()=>r())),s.addEventListener("success",(()=>r()))}))}}function c(e){let t,n=0,r=null,s=!1;const o=[];let a=0;const c=[];function i(){if(!r)return;const e=a?function(){if(!n||a<=n){const e=new Uint8Array(a);let t=0;for(const n of o)for(let r=0;r<n.byteLength;r++,t++)e[t]=n[r];return a=0,o.length=0,e}let e=o.shift();if(!e)return null;const t=new Uint8Array(n);let r=0,s=0,c=e.length;for(;r<n;){if(s>=length){if(e=o.shift(),!e)break;s=0,c=e.length}t[r]=e[s],s++,r++}return e&&s<c&&o.unshift(new Uint8Array(e.buffer.slice(s))),a-=n,t}():null;r(e),[n,r]=c.shift()||[0,null]}return function(u=0){return new Promise((d=>{t||(t=e.getReader()),u=Math.max(u,0),r?c.push([u,d]):(n=u,r=d,async function(){for(;r;){if(s){i();continue}if(a&&(!n||a>=n)){i();continue}const{value:r,done:c}=await t.read();c?s=!0:(a+=(e=r).length||0,o.push(e),a&&(!n||a>=n)&&i())}var e}())}))}}function i(e){let t;return function(n=0){return t||(t=e.arrayBuffer().then((e=>[new Uint8Array(0),new Uint8Array(e),0]))),t=t.then((e=>{if(!e)return null;let[,t,r]=e;if(r>=t.byteLength)return null;if(!n||n+r>=t.byteLength)return[t.slice(r),t,t.byteLength];let s=r+n;return[t.slice(r,s),t,s]})),t.then((e=>{if(!e)return null;const[t]=e;return t}))}}function u(e){const t=e.indexOf("=");return t<0?[decodeURIComponent(e),""]:[decodeURIComponent(e.substring(0,t)),decodeURIComponent(e.substring(t+1))]}function d(e){const t={};for(const n of e.split("&").filter(Boolean)){const[e,r]=u(n);t[e]=e in t?[t[e],r].flat():r}return t}function l(e){const t={};for(const[n,r]of e.entries())t[n.toLowerCase()]=r;return t}function f(e,t=d){const n=new URL(e.url),{body:r,signal:s}=e,o=new Promise(((e,t)=>{if(s.aborted)return t(new DOMException("The user aborted a request."));const n=()=>{s.removeEventListener("abort",n),t(new DOMException("The user aborted a request."))};s.addEventListener("abort",n)}));return{method:(e.method||"GET").toUpperCase(),url:`${n.pathname}${n.search}`||"/",headers:l(e.headers),pathname:n.pathname||"/",search:n.search||"",query:t(n.search.substring(1)),aborted:o,read:r?c(r):i(e)}}function w(e){const t=new Headers;for(const[n,r]of Object.entries(e.headers))for(const e of[r].flat())t.append(n.toLowerCase(),String(e));return t}function h(e){return new Response(new ReadableStream({async pull(t){const{value:n,done:r}=await e.next();r?t.close():t.enqueue(n)},cancel:async t=>e.throw(t).then((()=>{}),(()=>{}))}),{status:e.status,headers:w(e)})}e.createBufferRead=i,e.createCacheApis=async function(e="k99",{assets:s="/k99/assets",log:o="/k99/log",settings:a="/k99/settings"}={}){const c=await caches.open(e);return"/"!==s[s.length-1]&&(s=`${s}/`),"/"!==s[0]&&(s=`/${s}`),"/"!==o[o.length-1]&&(o=`${o}/`),"/"!==o[0]&&(o=`/${o}`),"/"!==a[o.length-1]&&(a=`${a}/`),"/"!==a[0]&&(a=`/${a}`),{logApi:r(c,o),assetsApi:n(c,s),settingsApi:t(c,a)}},e.createFetch=function(e,t,n){return async function(r,s){const o=new Request(r,s),{signal:a}=o;if(a.aborted)return Promise.reject(new DOMException("The user aborted a request."));const c=await e.request(f(o,n));return c?h(c):"function"==typeof t?t(o):new Response(null,{status:404})}},e.createIndexedApis=function(e="k99",{assets:t="assets",log:n="log",settings:r="settings"}={},c=1){return new Promise(((s,o)=>{const a=indexedDB.open(e,c);a.addEventListener("upgradeneeded",(e=>{const s=e.target.result;s.createObjectStore(t),s.createObjectStore(n),s.createObjectStore(r)})),a.addEventListener("error",(()=>o(a.error))),a.addEventListener("success",(()=>s(a.result)))})).then((e=>({logApi:a(e,n),assetsApi:s(e,t),settingsApi:o(e,r)})))},e.createRequest=f,e.createResponse=h,e.createStreamRead=c,Object.defineProperty(e,"__esModule",{value:!0})}));
6
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).k99Browser={})}(this,(function(e){"use strict";function t(e,t){return{async read(n){n=`${t}${n}`;const r=await e.match(n);if(r)return r.json()},write:async(n,r)=>(n=`${t}${n}`,void 0===r?e.delete(n):(await e.put(n,new Response(JSON.stringify(r))),!0))}}function n(e,t){return{async read(n){n=`${t}${n}`;const r=await e.match(n);return r?new Uint8Array(await r.arrayBuffer()):null},write:async(n,r)=>(n=`${t}${n}`,await e.put(n,new Response(r)),!0),delete:async n=>(n=`${t}${n}`,e.delete(n)),stat:()=>null}}function r(e,t){return{async read(n){n=`${t}${n}`;const r=await e.match(n);return r?r.text():""},async write(n,r){n=`${t}${n}`;const s=await e.match(n),a=`${await(s?.text())||""}${r}\n`;return await e.put(n,new Response(a)),!0},async clear(n){n=`${t}${n}`,await e.delete(n)}}}function s(e,t){return{read:async n=>new Promise((r=>{const s=e.transaction(t).objectStore(t).get(n);s.addEventListener("error",(()=>r(null))),s.addEventListener("success",(()=>r(s.result||null)))})),write:async(n,r)=>new Promise((s=>{const a=e.transaction(t,"readwrite").objectStore(t).add(r,n);a.addEventListener("error",(()=>s(!1))),a.addEventListener("success",(()=>s(!0)))})),delete:async n=>new Promise((r=>{const s=e.transaction(t,"readwrite").objectStore(t).delete(n);s.addEventListener("error",(()=>r(!1))),s.addEventListener("success",(()=>r(!0)))})),stat:()=>null}}function a(e,t){return{read:async n=>new Promise((r=>{const s=e.transaction(t).objectStore(t).get(n);s.addEventListener("error",(()=>r(null))),s.addEventListener("success",(()=>r(s.result||null)))})),write:async(n,r)=>new Promise(null==r?r=>{const s=e.transaction(t,"readwrite").objectStore(t).delete(n);s.addEventListener("error",(()=>r(!1))),s.addEventListener("success",(()=>r(!0)))}:s=>{const a=e.transaction(t,"readwrite").objectStore(t).add(r,n);a.addEventListener("error",(()=>s(!1))),a.addEventListener("success",(()=>s(!0)))})}}function o(e,t){return{read:async n=>new Promise((r=>{const s=e.transaction(t).objectStore(t).get(n);s.addEventListener("error",(()=>r(""))),s.addEventListener("success",(()=>r(s.result||null)))})),write:async(n,r)=>new Promise((s=>{const a=e.transaction(t,"readwrite"),o=a.objectStore(t).get(n);o.addEventListener("error",(()=>s(!1))),o.addEventListener("success",(()=>{const e=a.objectStore(t).add(`${o.result||""}${r}\n`,n);e.addEventListener("error",(()=>s(!1))),e.addEventListener("success",(()=>s(!0)))}))})),clear:async n=>new Promise((r=>{const s=e.transaction(t,"readwrite").objectStore(t).delete(n);s.addEventListener("error",(()=>r())),s.addEventListener("success",(()=>r()))}))}}function c(e){let t,n=0,r=null,s=!1;const a=[];let o=0;const c=[];function i(){if(!r)return;const e=o?function(){if(!n||o<=n){const e=new Uint8Array(o);let t=0;for(const n of a)for(let r=0;r<n.byteLength;r++,t++)e[t]=n[r];return o=0,a.length=0,e}let e=a.shift();if(!e)return null;const t=new Uint8Array(n);let r=0,s=0,c=e.length;for(;r<n;){if(s>=length){if(e=a.shift(),!e)break;s=0,c=e.length}t[r]=e[s],s++,r++}return e&&s<c&&a.unshift(new Uint8Array(e.buffer.slice(s))),o-=n,t}():null;r(e),[n,r]=c.shift()||[0,null]}return function(u=0){return new Promise((d=>{t||(t=e.getReader()),u=Math.max(u,0),r?c.push([u,d]):(n=u,r=d,async function(){for(;r;){if(s){i();continue}if(o&&(!n||o>=n)){i();continue}const{value:r,done:c}=await t.read();c?s=!0:(o+=(e=r).length||0,a.push(e),o&&(!n||o>=n)&&i())}var e}())}))}}function i(e){let t;return function(n=0){return t||(t=e.arrayBuffer().then((e=>[new Uint8Array(0),new Uint8Array(e),0]))),t=t.then((e=>{if(!e)return null;let[,t,r]=e;if(r>=t.byteLength)return null;if(!n||n+r>=t.byteLength)return[t.slice(r),t,t.byteLength];let s=r+n;return[t.slice(r,s),t,s]})),t.then((e=>{if(!e)return null;const[t]=e;return t}))}}function u(e){const t=e.indexOf("=");return t<0?[decodeURIComponent(e),""]:[decodeURIComponent(e.substring(0,t)),decodeURIComponent(e.substring(t+1))]}function d(e){const t={};for(const n of e.split("&").filter(Boolean)){const[e,r]=u(n);t[e]=e in t?[t[e],r].flat():r}return t}function l(e){const t={};for(const[n,r]of e.entries())t[n.toLowerCase()]=r;return t}function f(e,t=d){const n=new URL(e.url),{body:r,signal:s}=e,a=new Promise(((e,t)=>{if(s.aborted)return t(s.reason);s.addEventListener("abort",(()=>t(s.reason)),{once:!0})}));return{method:(e.method||"GET").toUpperCase(),url:`${n.pathname}${n.search}`||"/",headers:l(e.headers),pathname:n.pathname||"/",search:n.search||"",query:t(n.search.substring(1)),aborted:a,read:r?c(r):i(e)}}function w(e){const t=new Headers;for(const[n,r]of Object.entries(e.headers))for(const e of[r].flat())t.append(n.toLowerCase(),String(e));return t}function h(e){return new Response(new ReadableStream({async pull(t){const{value:n,done:r}=await e.next();r?t.close():t.enqueue(n)},cancel:async t=>e.throw(t).then((()=>{}),(()=>{}))}),{status:e.status,headers:w(e)})}e.createBufferRead=i,e.createCacheApis=async function(e="k99",{assets:s="/k99/assets",log:a="/k99/log",settings:o="/k99/settings"}={}){const c=await caches.open(e);return"/"!==s[s.length-1]&&(s=`${s}/`),"/"!==s[0]&&(s=`/${s}`),"/"!==a[a.length-1]&&(a=`${a}/`),"/"!==a[0]&&(a=`/${a}`),"/"!==o[a.length-1]&&(o=`${o}/`),"/"!==o[0]&&(o=`/${o}`),{logApi:r(c,a),assetsApi:n(c,s),settingsApi:t(c,o)}},e.createFetch=function(e,t,n){return async function(r,s){const a=new Request(r,s),{signal:o}=a;if(o.aborted)return Promise.reject(new DOMException("The user aborted a request."));const c=await e(f(a,n));return c?h(c):"function"==typeof t?t(a):new Response(null,{status:404})}},e.createIndexedApis=function(e="k99",{assets:t="assets",log:n="log",settings:r="settings"}={},c=1){return new Promise(((s,a)=>{const o=indexedDB.open(e,c);o.addEventListener("upgradeneeded",(e=>{const s=e.target.result;s.createObjectStore(t),s.createObjectStore(n),s.createObjectStore(r)})),o.addEventListener("error",(()=>a(o.error))),o.addEventListener("success",(()=>s(o.result)))})).then((e=>({logApi:o(e,n),assetsApi:s(e,t),settingsApi:a(e,r)})))},e.createRequest=f,e.createResponse=h,e.createStreamRead=c}));
@@ -1,6 +1,6 @@
1
1
  /*!
2
- * k99 v0.6.0-alpha.0
3
- * (c) 2019-2022 猛火 Fierflame
2
+ * k99 v0.6.0-alpha.1
3
+ * (c) 2019-2023 猛火Fierflame
4
4
  * @license MIT
5
5
  */
6
- function e(e,t){return{async read(n){n=`${t}${n}`;const r=await e.match(n);if(r)return r.json()},write:async(n,r)=>(n=`${t}${n}`,void 0===r?e.delete(n):(await e.put(n,new Response(JSON.stringify(r))),!0))}}function t(e,t){return{async read(n){n=`${t}${n}`;const r=await e.match(n);return r?new Uint8Array(await r.arrayBuffer()):null},write:async(n,r)=>(n=`${t}${n}`,await e.put(n,new Response(r)),!0),delete:async n=>(n=`${t}${n}`,e.delete(n)),stat:()=>null}}function n(e,t){return{async read(n){n=`${t}${n}`;const r=await e.match(n);return r?r.text():""},async write(n,r){n=`${t}${n}`;const s=await e.match(n),a=`${await(s?.text())||""}${r}\n`;return await e.put(n,new Response(a)),!0},async clear(n){n=`${t}${n}`,await e.delete(n)}}}async function r(r="k99",{assets:s="/k99/assets",log:a="/k99/log",settings:o="/k99/settings"}={}){const c=await caches.open(r);return"/"!==s[s.length-1]&&(s=`${s}/`),"/"!==s[0]&&(s=`/${s}`),"/"!==a[a.length-1]&&(a=`${a}/`),"/"!==a[0]&&(a=`/${a}`),"/"!==o[a.length-1]&&(o=`${o}/`),"/"!==o[0]&&(o=`/${o}`),{logApi:n(c,a),assetsApi:t(c,s),settingsApi:e(c,o)}}function s(e,t){return{read:async n=>new Promise((r=>{const s=e.transaction(t).objectStore(t).get(n);s.addEventListener("error",(()=>r(null))),s.addEventListener("success",(()=>r(s.result||null)))})),write:async(n,r)=>new Promise((s=>{const a=e.transaction(t,"readwrite").objectStore(t).add(r,n);a.addEventListener("error",(()=>s(!1))),a.addEventListener("success",(()=>s(!0)))})),delete:async n=>new Promise((r=>{const s=e.transaction(t,"readwrite").objectStore(t).delete(n);s.addEventListener("error",(()=>r(!1))),s.addEventListener("success",(()=>r(!0)))})),stat:()=>null}}function a(e,t){return{read:async n=>new Promise((r=>{const s=e.transaction(t).objectStore(t).get(n);s.addEventListener("error",(()=>r(null))),s.addEventListener("success",(()=>r(s.result||null)))})),write:async(n,r)=>new Promise(null==r?r=>{const s=e.transaction(t,"readwrite").objectStore(t).delete(n);s.addEventListener("error",(()=>r(!1))),s.addEventListener("success",(()=>r(!0)))}:s=>{const a=e.transaction(t,"readwrite").objectStore(t).add(r,n);a.addEventListener("error",(()=>s(!1))),a.addEventListener("success",(()=>s(!0)))})}}function o(e,t){return{read:async n=>new Promise((r=>{const s=e.transaction(t).objectStore(t).get(n);s.addEventListener("error",(()=>r(""))),s.addEventListener("success",(()=>r(s.result||null)))})),write:async(n,r)=>new Promise((s=>{const a=e.transaction(t,"readwrite"),o=a.objectStore(t).get(n);o.addEventListener("error",(()=>s(!1))),o.addEventListener("success",(()=>{const e=a.objectStore(t).add(`${o.result||""}${r}\n`,n);e.addEventListener("error",(()=>s(!1))),e.addEventListener("success",(()=>s(!0)))}))})),clear:async n=>new Promise((r=>{const s=e.transaction(t,"readwrite").objectStore(t).delete(n);s.addEventListener("error",(()=>r())),s.addEventListener("success",(()=>r()))}))}}function c(e="k99",{assets:t="assets",log:n="log",settings:r="settings"}={},c=1){return new Promise(((s,a)=>{const o=indexedDB.open(e,c);o.addEventListener("upgradeneeded",(e=>{const s=e.target.result;s.createObjectStore(t),s.createObjectStore(n),s.createObjectStore(r)})),o.addEventListener("error",(()=>a(o.error))),o.addEventListener("success",(()=>s(o.result)))})).then((e=>({logApi:o(e,n),assetsApi:s(e,t),settingsApi:a(e,r)})))}function i(e){let t,n=0,r=null,s=!1;const a=[];let o=0;const c=[];function i(){if(!r)return;const e=o?function(){if(!n||o<=n){const e=new Uint8Array(o);let t=0;for(const n of a)for(let r=0;r<n.byteLength;r++,t++)e[t]=n[r];return o=0,a.length=0,e}let e=a.shift();if(!e)return null;const t=new Uint8Array(n);let r=0,s=0,c=e.length;for(;r<n;){if(s>=length){if(e=a.shift(),!e)break;s=0,c=e.length}t[r]=e[s],s++,r++}return e&&s<c&&a.unshift(new Uint8Array(e.buffer.slice(s))),o-=n,t}():null;r(e),[n,r]=c.shift()||[0,null]}return function(u=0){return new Promise((d=>{t||(t=e.getReader()),u=Math.max(u,0),r?c.push([u,d]):(n=u,r=d,async function(){for(;r;){if(s){i();continue}if(o&&(!n||o>=n)){i();continue}const{value:r,done:c}=await t.read();c?s=!0:(o+=(e=r).length||0,a.push(e),o&&(!n||o>=n)&&i())}var e}())}))}}function u(e){let t;return function(n=0){return t||(t=e.arrayBuffer().then((e=>[new Uint8Array(0),new Uint8Array(e),0]))),t=t.then((e=>{if(!e)return null;let[,t,r]=e;if(r>=t.byteLength)return null;if(!n||n+r>=t.byteLength)return[t.slice(r),t,t.byteLength];let s=r+n;return[t.slice(r,s),t,s]})),t.then((e=>{if(!e)return null;const[t]=e;return t}))}}function d(e){const t=e.indexOf("=");return t<0?[decodeURIComponent(e),""]:[decodeURIComponent(e.substring(0,t)),decodeURIComponent(e.substring(t+1))]}function l(e){const t={};for(const n of e.split("&").filter(Boolean)){const[e,r]=d(n);t[e]=e in t?[t[e],r].flat():r}return t}function f(e){const t={};for(const[n,r]of e.entries())t[n.toLowerCase()]=r;return t}function w(e,t=l){const n=new URL(e.url),{body:r,signal:s}=e,a=new Promise(((e,t)=>{if(s.aborted)return t(new DOMException("The user aborted a request."));const n=()=>{s.removeEventListener("abort",n),t(new DOMException("The user aborted a request."))};s.addEventListener("abort",n)}));return{method:(e.method||"GET").toUpperCase(),url:`${n.pathname}${n.search}`||"/",headers:f(e.headers),pathname:n.pathname||"/",search:n.search||"",query:t(n.search.substring(1)),aborted:a,read:r?i(r):u(e)}}function h(e){const t=new Headers;for(const[n,r]of Object.entries(e.headers))for(const e of[r].flat())t.append(n.toLowerCase(),String(e));return t}function g(e){return new Response(new ReadableStream({async pull(t){const{value:n,done:r}=await e.next();r?t.close():t.enqueue(n)},cancel:async t=>e.throw(t).then((()=>{}),(()=>{}))}),{status:e.status,headers:h(e)})}function y(e,t,n){return async function(r,s){const a=new Request(r,s),{signal:o}=a;if(o.aborted)return Promise.reject(new DOMException("The user aborted a request."));const c=await e.request(w(a,n));return c?g(c):"function"==typeof t?t(a):new Response(null,{status:404})}}export{u as createBufferRead,r as createCacheApis,y as createFetch,c as createIndexedApis,w as createRequest,g as createResponse,i as createStreamRead};
6
+ function e(e,t){return{async read(n){n=`${t}${n}`;const r=await e.match(n);if(r)return r.json()},write:async(n,r)=>(n=`${t}${n}`,void 0===r?e.delete(n):(await e.put(n,new Response(JSON.stringify(r))),!0))}}function t(e,t){return{async read(n){n=`${t}${n}`;const r=await e.match(n);return r?new Uint8Array(await r.arrayBuffer()):null},write:async(n,r)=>(n=`${t}${n}`,await e.put(n,new Response(r)),!0),delete:async n=>(n=`${t}${n}`,e.delete(n)),stat:()=>null}}function n(e,t){return{async read(n){n=`${t}${n}`;const r=await e.match(n);return r?r.text():""},async write(n,r){n=`${t}${n}`;const s=await e.match(n),a=`${await(s?.text())||""}${r}\n`;return await e.put(n,new Response(a)),!0},async clear(n){n=`${t}${n}`,await e.delete(n)}}}async function r(r="k99",{assets:s="/k99/assets",log:a="/k99/log",settings:o="/k99/settings"}={}){const c=await caches.open(r);return"/"!==s[s.length-1]&&(s=`${s}/`),"/"!==s[0]&&(s=`/${s}`),"/"!==a[a.length-1]&&(a=`${a}/`),"/"!==a[0]&&(a=`/${a}`),"/"!==o[a.length-1]&&(o=`${o}/`),"/"!==o[0]&&(o=`/${o}`),{logApi:n(c,a),assetsApi:t(c,s),settingsApi:e(c,o)}}function s(e,t){return{read:async n=>new Promise((r=>{const s=e.transaction(t).objectStore(t).get(n);s.addEventListener("error",(()=>r(null))),s.addEventListener("success",(()=>r(s.result||null)))})),write:async(n,r)=>new Promise((s=>{const a=e.transaction(t,"readwrite").objectStore(t).add(r,n);a.addEventListener("error",(()=>s(!1))),a.addEventListener("success",(()=>s(!0)))})),delete:async n=>new Promise((r=>{const s=e.transaction(t,"readwrite").objectStore(t).delete(n);s.addEventListener("error",(()=>r(!1))),s.addEventListener("success",(()=>r(!0)))})),stat:()=>null}}function a(e,t){return{read:async n=>new Promise((r=>{const s=e.transaction(t).objectStore(t).get(n);s.addEventListener("error",(()=>r(null))),s.addEventListener("success",(()=>r(s.result||null)))})),write:async(n,r)=>new Promise(null==r?r=>{const s=e.transaction(t,"readwrite").objectStore(t).delete(n);s.addEventListener("error",(()=>r(!1))),s.addEventListener("success",(()=>r(!0)))}:s=>{const a=e.transaction(t,"readwrite").objectStore(t).add(r,n);a.addEventListener("error",(()=>s(!1))),a.addEventListener("success",(()=>s(!0)))})}}function o(e,t){return{read:async n=>new Promise((r=>{const s=e.transaction(t).objectStore(t).get(n);s.addEventListener("error",(()=>r(""))),s.addEventListener("success",(()=>r(s.result||null)))})),write:async(n,r)=>new Promise((s=>{const a=e.transaction(t,"readwrite"),o=a.objectStore(t).get(n);o.addEventListener("error",(()=>s(!1))),o.addEventListener("success",(()=>{const e=a.objectStore(t).add(`${o.result||""}${r}\n`,n);e.addEventListener("error",(()=>s(!1))),e.addEventListener("success",(()=>s(!0)))}))})),clear:async n=>new Promise((r=>{const s=e.transaction(t,"readwrite").objectStore(t).delete(n);s.addEventListener("error",(()=>r())),s.addEventListener("success",(()=>r()))}))}}function c(e="k99",{assets:t="assets",log:n="log",settings:r="settings"}={},c=1){return new Promise(((s,a)=>{const o=indexedDB.open(e,c);o.addEventListener("upgradeneeded",(e=>{const s=e.target.result;s.createObjectStore(t),s.createObjectStore(n),s.createObjectStore(r)})),o.addEventListener("error",(()=>a(o.error))),o.addEventListener("success",(()=>s(o.result)))})).then((e=>({logApi:o(e,n),assetsApi:s(e,t),settingsApi:a(e,r)})))}function i(e){let t,n=0,r=null,s=!1;const a=[];let o=0;const c=[];function i(){if(!r)return;const e=o?function(){if(!n||o<=n){const e=new Uint8Array(o);let t=0;for(const n of a)for(let r=0;r<n.byteLength;r++,t++)e[t]=n[r];return o=0,a.length=0,e}let e=a.shift();if(!e)return null;const t=new Uint8Array(n);let r=0,s=0,c=e.length;for(;r<n;){if(s>=length){if(e=a.shift(),!e)break;s=0,c=e.length}t[r]=e[s],s++,r++}return e&&s<c&&a.unshift(new Uint8Array(e.buffer.slice(s))),o-=n,t}():null;r(e),[n,r]=c.shift()||[0,null]}return function(u=0){return new Promise((d=>{t||(t=e.getReader()),u=Math.max(u,0),r?c.push([u,d]):(n=u,r=d,async function(){for(;r;){if(s){i();continue}if(o&&(!n||o>=n)){i();continue}const{value:r,done:c}=await t.read();c?s=!0:(o+=(e=r).length||0,a.push(e),o&&(!n||o>=n)&&i())}var e}())}))}}function u(e){let t;return function(n=0){return t||(t=e.arrayBuffer().then((e=>[new Uint8Array(0),new Uint8Array(e),0]))),t=t.then((e=>{if(!e)return null;let[,t,r]=e;if(r>=t.byteLength)return null;if(!n||n+r>=t.byteLength)return[t.slice(r),t,t.byteLength];let s=r+n;return[t.slice(r,s),t,s]})),t.then((e=>{if(!e)return null;const[t]=e;return t}))}}function d(e){const t=e.indexOf("=");return t<0?[decodeURIComponent(e),""]:[decodeURIComponent(e.substring(0,t)),decodeURIComponent(e.substring(t+1))]}function l(e){const t={};for(const n of e.split("&").filter(Boolean)){const[e,r]=d(n);t[e]=e in t?[t[e],r].flat():r}return t}function f(e){const t={};for(const[n,r]of e.entries())t[n.toLowerCase()]=r;return t}function w(e,t=l){const n=new URL(e.url),{body:r,signal:s}=e,a=new Promise(((e,t)=>{if(s.aborted)return t(s.reason);s.addEventListener("abort",(()=>t(s.reason)),{once:!0})}));return{method:(e.method||"GET").toUpperCase(),url:`${n.pathname}${n.search}`||"/",headers:f(e.headers),pathname:n.pathname||"/",search:n.search||"",query:t(n.search.substring(1)),aborted:a,read:r?i(r):u(e)}}function h(e){const t=new Headers;for(const[n,r]of Object.entries(e.headers))for(const e of[r].flat())t.append(n.toLowerCase(),String(e));return t}function g(e){return new Response(new ReadableStream({async pull(t){const{value:n,done:r}=await e.next();r?t.close():t.enqueue(n)},cancel:async t=>e.throw(t).then((()=>{}),(()=>{}))}),{status:e.status,headers:h(e)})}function y(e,t,n){return async function(r,s){const a=new Request(r,s),{signal:o}=a;if(o.aborted)return Promise.reject(new DOMException("The user aborted a request."));const c=await e(w(a,n));return c?g(c):"function"==typeof t?t(a):new Response(null,{status:404})}}export{u as createBufferRead,r as createCacheApis,y as createFetch,c as createIndexedApis,w as createRequest,g as createResponse,i as createStreamRead};