k99 0.6.0-alpha.0 → 0.6.0-alpha.10

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