k99 0.6.0-alpha.1 → 0.6.0-alpha.2
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/app.cjs +43 -0
- package/app.d.ts +31 -0
- package/app.js +45 -0
- package/app.min.js +6 -0
- package/app.min.mjs +6 -0
- package/app.mjs +41 -0
- package/browser.cjs +457 -0
- package/{browser/index.d.ts → browser.d.ts} +1 -1
- package/{browser/index.js → browser.js} +1 -1
- package/{browser/index.min.js → browser.min.js} +1 -1
- package/{browser/index.min.mjs → browser.min.mjs} +1 -1
- package/{browser/index.mjs → browser.mjs} +1 -1
- package/cli/index.d.ts +1 -1
- package/cli/{index.mjs → index.js} +38 -14
- package/cli.cjs +14 -0
- package/index.cjs +1116 -0
- package/index.d.ts +91 -249
- package/index.js +266 -792
- package/index.min.js +2 -2
- package/index.min.mjs +2 -2
- package/index.mjs +262 -782
- package/node/index.d.ts +14 -11
- package/node/{index.mjs → index.js} +104 -71
- package/package.json +42 -1
- package/plugin.cjs +89 -0
- package/plugin.d.ts +39 -0
- package/plugin.js +95 -0
- package/plugin.min.js +6 -0
- package/plugin.min.mjs +6 -0
- package/plugin.mjs +87 -0
- package/router.cjs +334 -0
- package/router.d.ts +112 -0
- package/router.js +340 -0
- package/router.min.js +6 -0
- package/router.min.mjs +6 -0
- package/router.mjs +332 -0
- package/services.cjs +106 -0
- package/{services/index.d.ts → services.d.ts} +1 -1
- package/{services/index.js → services.js} +1 -1
- package/{services/index.min.js → services.min.js} +1 -1
- package/{services/index.min.mjs → services.min.mjs} +1 -1
- package/{services/index.mjs → services.mjs} +1 -1
- package/starter.cjs +15 -0
- package/browser/package.json +0 -7
- package/cli/package.json +0 -4
- package/cli.mjs +0 -12
- package/node/package.json +0 -4
- package/services/package.json +0 -7
- package/starter.mjs +0 -13
package/app.cjs
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* k99 v0.6.0-alpha.2
|
|
3
|
+
* (c) 2019-2023 猛火Fierflame
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
'use strict';
|
|
7
|
+
|
|
8
|
+
var run = require('k99');
|
|
9
|
+
var Plugin = require('k99/plugin');
|
|
10
|
+
var Router = require('k99/router');
|
|
11
|
+
|
|
12
|
+
class App {
|
|
13
|
+
/** 设置接口 */
|
|
14
|
+
|
|
15
|
+
/** 资产接口 */
|
|
16
|
+
|
|
17
|
+
/** 日志接口 */
|
|
18
|
+
|
|
19
|
+
routers = [];
|
|
20
|
+
constructor({
|
|
21
|
+
router,
|
|
22
|
+
setting,
|
|
23
|
+
asset,
|
|
24
|
+
log
|
|
25
|
+
} = {}, plugins = {}) {
|
|
26
|
+
this.setting = setting;
|
|
27
|
+
this.asset = Plugin.bindAsset(asset, plugins);
|
|
28
|
+
this.log = log;
|
|
29
|
+
this.plugins = plugins;
|
|
30
|
+
const {
|
|
31
|
+
routers
|
|
32
|
+
} = this;
|
|
33
|
+
for (const plugin of Object.values(plugins)) {
|
|
34
|
+
routers.push(plugin.router);
|
|
35
|
+
}
|
|
36
|
+
if (router instanceof Router) {
|
|
37
|
+
routers.push(router);
|
|
38
|
+
}
|
|
39
|
+
this.run = run.make(Router.make(routers), this);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
module.exports = App;
|
package/app.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* k99 v0.6.0-alpha.2
|
|
3
|
+
* (c) 2019-2023 猛火Fierflame
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
import { Setting, Asset, Log, K99Request, K99Response } from 'k99';
|
|
7
|
+
import Plugin from 'k99/plugin';
|
|
8
|
+
import Router from 'k99/router';
|
|
9
|
+
|
|
10
|
+
declare class App {
|
|
11
|
+
/** 设置接口 */
|
|
12
|
+
readonly setting?: Setting.Api;
|
|
13
|
+
/** 资产接口 */
|
|
14
|
+
readonly asset?: Asset.Api;
|
|
15
|
+
/** 日志接口 */
|
|
16
|
+
readonly log?: Log.Api;
|
|
17
|
+
readonly plugins: Record<string, Plugin>;
|
|
18
|
+
readonly routers: Router[];
|
|
19
|
+
readonly run: (request: K99Request) => Promise<null | K99Response>;
|
|
20
|
+
constructor({ router, setting, asset, log }?: App.Options, plugins?: Record<string, Plugin>);
|
|
21
|
+
}
|
|
22
|
+
declare namespace App {
|
|
23
|
+
interface Options {
|
|
24
|
+
router?: Router;
|
|
25
|
+
asset?: Asset.Api;
|
|
26
|
+
setting?: Setting.Api;
|
|
27
|
+
log?: Log.Api;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export { App as default };
|
package/app.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* k99 v0.6.0-alpha.2
|
|
3
|
+
* (c) 2019-2023 猛火Fierflame
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
(function (global, factory) {
|
|
7
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('k99'), require('k99/plugin'), require('k99/router')) :
|
|
8
|
+
typeof define === 'function' && define.amd ? define(['k99', 'k99/plugin', 'k99/router'], factory) :
|
|
9
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.k99App = factory(global.k99, global.k99Plugin, global.k99Router));
|
|
10
|
+
})(this, (function (run, Plugin, Router) { 'use strict';
|
|
11
|
+
|
|
12
|
+
class App {
|
|
13
|
+
/** 设置接口 */
|
|
14
|
+
|
|
15
|
+
/** 资产接口 */
|
|
16
|
+
|
|
17
|
+
/** 日志接口 */
|
|
18
|
+
|
|
19
|
+
routers = [];
|
|
20
|
+
constructor({
|
|
21
|
+
router,
|
|
22
|
+
setting,
|
|
23
|
+
asset,
|
|
24
|
+
log
|
|
25
|
+
} = {}, plugins = {}) {
|
|
26
|
+
this.setting = setting;
|
|
27
|
+
this.asset = Plugin.bindAsset(asset, plugins);
|
|
28
|
+
this.log = log;
|
|
29
|
+
this.plugins = plugins;
|
|
30
|
+
const {
|
|
31
|
+
routers
|
|
32
|
+
} = this;
|
|
33
|
+
for (const plugin of Object.values(plugins)) {
|
|
34
|
+
routers.push(plugin.router);
|
|
35
|
+
}
|
|
36
|
+
if (router instanceof Router) {
|
|
37
|
+
routers.push(router);
|
|
38
|
+
}
|
|
39
|
+
this.run = run.make(Router.make(routers), this);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return App;
|
|
44
|
+
|
|
45
|
+
}));
|
package/app.min.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* k99 v0.6.0-alpha.2
|
|
3
|
+
* (c) 2019-2023 猛火Fierflame
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("k99"),require("k99/plugin"),require("k99/router")):"function"==typeof define&&define.amd?define(["k99","k99/plugin","k99/router"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).k99App=t(e.k99,e.k99Plugin,e.k99Router)}(this,(function(e,t,s){"use strict";return class{routers=[];constructor({router:i,setting:o,asset:r,log:u}={},n={}){this.setting=o,this.asset=t.bindAsset(r,n),this.log=u,this.plugins=n;const{routers:f}=this;for(const e of Object.values(n))f.push(e.router);i instanceof s&&f.push(i),this.run=e.make(s.make(f),this)}}}));
|
package/app.min.mjs
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* k99 v0.6.0-alpha.2
|
|
3
|
+
* (c) 2019-2023 猛火Fierflame
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
import t from"k99";import s from"k99/plugin";import o from"k99/router";class r{routers=[];constructor({router:r,setting:e,asset:i,log:u}={},n={}){this.setting=e,this.asset=s.bindAsset(i,n),this.log=u,this.plugins=n;const{routers:a}=this;for(const t of Object.values(n))a.push(t.router);r instanceof o&&a.push(r),this.run=t.make(o.make(a),this)}}export{r as default};
|
package/app.mjs
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* k99 v0.6.0-alpha.2
|
|
3
|
+
* (c) 2019-2023 猛火Fierflame
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
import run from 'k99';
|
|
7
|
+
import Plugin from 'k99/plugin';
|
|
8
|
+
import Router from 'k99/router';
|
|
9
|
+
|
|
10
|
+
class App {
|
|
11
|
+
/** 设置接口 */
|
|
12
|
+
|
|
13
|
+
/** 资产接口 */
|
|
14
|
+
|
|
15
|
+
/** 日志接口 */
|
|
16
|
+
|
|
17
|
+
routers = [];
|
|
18
|
+
constructor({
|
|
19
|
+
router,
|
|
20
|
+
setting,
|
|
21
|
+
asset,
|
|
22
|
+
log
|
|
23
|
+
} = {}, plugins = {}) {
|
|
24
|
+
this.setting = setting;
|
|
25
|
+
this.asset = Plugin.bindAsset(asset, plugins);
|
|
26
|
+
this.log = log;
|
|
27
|
+
this.plugins = plugins;
|
|
28
|
+
const {
|
|
29
|
+
routers
|
|
30
|
+
} = this;
|
|
31
|
+
for (const plugin of Object.values(plugins)) {
|
|
32
|
+
routers.push(plugin.router);
|
|
33
|
+
}
|
|
34
|
+
if (router instanceof Router) {
|
|
35
|
+
routers.push(router);
|
|
36
|
+
}
|
|
37
|
+
this.run = run.make(Router.make(routers), this);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export { App as default };
|
package/browser.cjs
ADDED
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* k99 v0.6.0-alpha.2
|
|
3
|
+
* (c) 2019-2023 猛火Fierflame
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
'use strict';
|
|
7
|
+
|
|
8
|
+
function createSettingsApi$1(cache, root) {
|
|
9
|
+
return {
|
|
10
|
+
async read(path) {
|
|
11
|
+
path = `${root}${path}`;
|
|
12
|
+
const response = await cache.match(path);
|
|
13
|
+
if (!response) {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
return response.json();
|
|
17
|
+
},
|
|
18
|
+
async write(path, cfg) {
|
|
19
|
+
path = `${root}${path}`;
|
|
20
|
+
if (cfg === undefined) {
|
|
21
|
+
return cache.delete(path);
|
|
22
|
+
}
|
|
23
|
+
await cache.put(path, new Response(JSON.stringify(cfg)));
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function createAssetsApi$1(cache, root) {
|
|
29
|
+
return {
|
|
30
|
+
async read(path) {
|
|
31
|
+
path = `${root}${path}`;
|
|
32
|
+
const response = await cache.match(path);
|
|
33
|
+
if (!response) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
return new Uint8Array(await response.arrayBuffer());
|
|
37
|
+
},
|
|
38
|
+
async write(path, data) {
|
|
39
|
+
path = `${root}${path}`;
|
|
40
|
+
await cache.put(path, new Response(data));
|
|
41
|
+
return true;
|
|
42
|
+
},
|
|
43
|
+
async delete(path) {
|
|
44
|
+
path = `${root}${path}`;
|
|
45
|
+
return cache.delete(path);
|
|
46
|
+
},
|
|
47
|
+
stat() {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function createLogApi$1(cache, root) {
|
|
53
|
+
return {
|
|
54
|
+
async read(path) {
|
|
55
|
+
path = `${root}${path}`;
|
|
56
|
+
const response = await cache.match(path);
|
|
57
|
+
return response ? response.text() : '';
|
|
58
|
+
},
|
|
59
|
+
async write(path, log) {
|
|
60
|
+
path = `${root}${path}`;
|
|
61
|
+
const response = await cache.match(path);
|
|
62
|
+
const text = `${(await response?.text()) || ''}${log}\n`;
|
|
63
|
+
await cache.put(path, new Response(text));
|
|
64
|
+
return true;
|
|
65
|
+
},
|
|
66
|
+
async clear(path) {
|
|
67
|
+
path = `${root}${path}`;
|
|
68
|
+
await cache.delete(path);
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
async function createCacheApis(name = 'k99', {
|
|
73
|
+
assets = '/k99/assets',
|
|
74
|
+
log = '/k99/log',
|
|
75
|
+
settings = '/k99/settings'
|
|
76
|
+
} = {}) {
|
|
77
|
+
const cache = await caches.open(name);
|
|
78
|
+
if (assets[assets.length - 1] !== '/') {
|
|
79
|
+
assets = `${assets}/`;
|
|
80
|
+
}
|
|
81
|
+
if (assets[0] !== '/') {
|
|
82
|
+
assets = `/${assets}`;
|
|
83
|
+
}
|
|
84
|
+
if (log[log.length - 1] !== '/') {
|
|
85
|
+
log = `${log}/`;
|
|
86
|
+
}
|
|
87
|
+
if (log[0] !== '/') {
|
|
88
|
+
log = `/${log}`;
|
|
89
|
+
}
|
|
90
|
+
if (settings[log.length - 1] !== '/') {
|
|
91
|
+
settings = `${settings}/`;
|
|
92
|
+
}
|
|
93
|
+
if (settings[0] !== '/') {
|
|
94
|
+
settings = `/${settings}`;
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
logApi: createLogApi$1(cache, log),
|
|
98
|
+
assetsApi: createAssetsApi$1(cache, assets),
|
|
99
|
+
settingsApi: createSettingsApi$1(cache, settings)
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function createAssetsApi(db, store) {
|
|
104
|
+
return {
|
|
105
|
+
async read(path) {
|
|
106
|
+
return new Promise(r => {
|
|
107
|
+
const request = db.transaction(store).objectStore(store).get(path);
|
|
108
|
+
request.addEventListener('error', () => r(null));
|
|
109
|
+
request.addEventListener('success', () => r(request.result || null));
|
|
110
|
+
});
|
|
111
|
+
},
|
|
112
|
+
async write(path, data) {
|
|
113
|
+
return new Promise(r => {
|
|
114
|
+
const request = db.transaction(store, 'readwrite').objectStore(store).add(data, path);
|
|
115
|
+
request.addEventListener('error', () => r(false));
|
|
116
|
+
request.addEventListener('success', () => r(true));
|
|
117
|
+
});
|
|
118
|
+
},
|
|
119
|
+
async delete(path) {
|
|
120
|
+
return new Promise(r => {
|
|
121
|
+
const request = db.transaction(store, 'readwrite').objectStore(store).delete(path);
|
|
122
|
+
request.addEventListener('error', () => r(false));
|
|
123
|
+
request.addEventListener('success', () => r(true));
|
|
124
|
+
});
|
|
125
|
+
},
|
|
126
|
+
stat() {
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
function createSettingsApi(db, store) {
|
|
132
|
+
return {
|
|
133
|
+
async read(path) {
|
|
134
|
+
return new Promise(r => {
|
|
135
|
+
const request = db.transaction(store).objectStore(store).get(path);
|
|
136
|
+
request.addEventListener('error', () => r(null));
|
|
137
|
+
request.addEventListener('success', () => r(request.result || null));
|
|
138
|
+
});
|
|
139
|
+
},
|
|
140
|
+
async write(path, cfg) {
|
|
141
|
+
if (cfg === null || cfg === undefined) {
|
|
142
|
+
return new Promise(r => {
|
|
143
|
+
const request = db.transaction(store, 'readwrite').objectStore(store).delete(path);
|
|
144
|
+
request.addEventListener('error', () => r(false));
|
|
145
|
+
request.addEventListener('success', () => r(true));
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
return new Promise(r => {
|
|
149
|
+
const request = db.transaction(store, 'readwrite').objectStore(store).add(cfg, path);
|
|
150
|
+
request.addEventListener('error', () => r(false));
|
|
151
|
+
request.addEventListener('success', () => r(true));
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
function createLogApi(db, store) {
|
|
157
|
+
return {
|
|
158
|
+
async read(path) {
|
|
159
|
+
return new Promise(r => {
|
|
160
|
+
const request = db.transaction(store).objectStore(store).get(path);
|
|
161
|
+
request.addEventListener('error', () => r(''));
|
|
162
|
+
request.addEventListener('success', () => r(request.result || null));
|
|
163
|
+
});
|
|
164
|
+
},
|
|
165
|
+
async write(path, log) {
|
|
166
|
+
return new Promise(r => {
|
|
167
|
+
const transaction = db.transaction(store, 'readwrite');
|
|
168
|
+
const request = transaction.objectStore(store).get(path);
|
|
169
|
+
request.addEventListener('error', () => r(false));
|
|
170
|
+
request.addEventListener('success', () => {
|
|
171
|
+
const request2 = transaction.objectStore(store).add(`${request.result || ''}${log}\n`, path);
|
|
172
|
+
request2.addEventListener('error', () => r(false));
|
|
173
|
+
request2.addEventListener('success', () => r(true));
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
},
|
|
177
|
+
async clear(path) {
|
|
178
|
+
return new Promise(r => {
|
|
179
|
+
const request = db.transaction(store, 'readwrite').objectStore(store).delete(path);
|
|
180
|
+
request.addEventListener('error', () => r());
|
|
181
|
+
request.addEventListener('success', () => r());
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
function createIndexedApis(database = 'k99', {
|
|
187
|
+
assets = 'assets',
|
|
188
|
+
log = 'log',
|
|
189
|
+
settings = 'settings'
|
|
190
|
+
} = {}, version = 1) {
|
|
191
|
+
return new Promise((resolve, reject) => {
|
|
192
|
+
const req = indexedDB.open(database, version);
|
|
193
|
+
req.addEventListener('upgradeneeded', e => {
|
|
194
|
+
const db = e.target.result;
|
|
195
|
+
db.createObjectStore(assets);
|
|
196
|
+
db.createObjectStore(log);
|
|
197
|
+
db.createObjectStore(settings);
|
|
198
|
+
});
|
|
199
|
+
req.addEventListener('error', () => reject(req.error));
|
|
200
|
+
req.addEventListener('success', () => resolve(req.result));
|
|
201
|
+
}).then(db => ({
|
|
202
|
+
logApi: createLogApi(db, log),
|
|
203
|
+
assetsApi: createAssetsApi(db, assets),
|
|
204
|
+
settingsApi: createSettingsApi(db, settings)
|
|
205
|
+
}));
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function createStreamRead(readableStream) {
|
|
209
|
+
let reader;
|
|
210
|
+
let current = 0;
|
|
211
|
+
let cb = null;
|
|
212
|
+
let end = false;
|
|
213
|
+
const dataList = [];
|
|
214
|
+
let dataSize = 0;
|
|
215
|
+
const list = [];
|
|
216
|
+
function get() {
|
|
217
|
+
if (!current || dataSize <= current) {
|
|
218
|
+
const chunk = new Uint8Array(dataSize);
|
|
219
|
+
let index = 0;
|
|
220
|
+
for (const item of dataList) {
|
|
221
|
+
for (let i = 0; i < item.byteLength; i++, index++) {
|
|
222
|
+
chunk[index] = item[i];
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
dataSize = 0;
|
|
226
|
+
dataList.length = 0;
|
|
227
|
+
return chunk;
|
|
228
|
+
}
|
|
229
|
+
let item = dataList.shift();
|
|
230
|
+
if (!item) {
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
const chunk = new Uint8Array(current);
|
|
234
|
+
let index = 0;
|
|
235
|
+
let i = 0;
|
|
236
|
+
let len = item.length;
|
|
237
|
+
while (index < current) {
|
|
238
|
+
if (i >= length) {
|
|
239
|
+
item = dataList.shift();
|
|
240
|
+
if (!item) {
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
i = 0;
|
|
244
|
+
len = item.length;
|
|
245
|
+
}
|
|
246
|
+
chunk[index] = item[i];
|
|
247
|
+
i++;
|
|
248
|
+
index++;
|
|
249
|
+
}
|
|
250
|
+
if (item && i < len) {
|
|
251
|
+
dataList.unshift(new Uint8Array(item.buffer.slice(i)));
|
|
252
|
+
}
|
|
253
|
+
dataSize -= current;
|
|
254
|
+
return chunk;
|
|
255
|
+
}
|
|
256
|
+
function add(data) {
|
|
257
|
+
dataSize += data.length || 0;
|
|
258
|
+
dataList.push(data);
|
|
259
|
+
return dataSize;
|
|
260
|
+
}
|
|
261
|
+
function runCb() {
|
|
262
|
+
if (!cb) {
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
const v = dataSize ? get() : null;
|
|
266
|
+
cb(v);
|
|
267
|
+
[current, cb] = list.shift() || [0, null];
|
|
268
|
+
}
|
|
269
|
+
async function run() {
|
|
270
|
+
for (;;) {
|
|
271
|
+
if (!cb) {
|
|
272
|
+
break;
|
|
273
|
+
}
|
|
274
|
+
if (end) {
|
|
275
|
+
runCb();
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
if (dataSize && (!current || dataSize >= current)) {
|
|
279
|
+
runCb();
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
const {
|
|
283
|
+
value,
|
|
284
|
+
done
|
|
285
|
+
} = await reader.read();
|
|
286
|
+
if (done) {
|
|
287
|
+
end = true;
|
|
288
|
+
continue;
|
|
289
|
+
}
|
|
290
|
+
add(value);
|
|
291
|
+
if (dataSize && (!current || dataSize >= current)) {
|
|
292
|
+
runCb();
|
|
293
|
+
continue;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
function read(size = 0) {
|
|
298
|
+
return new Promise(resolve => {
|
|
299
|
+
if (!reader) {
|
|
300
|
+
reader = readableStream.getReader();
|
|
301
|
+
}
|
|
302
|
+
size = Math.max(size, 0);
|
|
303
|
+
if (cb) {
|
|
304
|
+
list.push([size, resolve]);
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
current = size;
|
|
308
|
+
cb = resolve;
|
|
309
|
+
run();
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
return read;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
function createBufferRead(request) {
|
|
316
|
+
let arrayBuffer;
|
|
317
|
+
function read(size = 0) {
|
|
318
|
+
if (!arrayBuffer) {
|
|
319
|
+
arrayBuffer = request.arrayBuffer().then(t => [new Uint8Array(0), new Uint8Array(t), 0]);
|
|
320
|
+
}
|
|
321
|
+
arrayBuffer = arrayBuffer.then(v => {
|
|
322
|
+
if (!v) {
|
|
323
|
+
return null;
|
|
324
|
+
}
|
|
325
|
+
let [, buff, index] = v;
|
|
326
|
+
if (index >= buff.byteLength) {
|
|
327
|
+
return null;
|
|
328
|
+
}
|
|
329
|
+
if (!size || size + index >= buff.byteLength) {
|
|
330
|
+
return [buff.slice(index), buff, buff.byteLength];
|
|
331
|
+
}
|
|
332
|
+
let end = index + size;
|
|
333
|
+
return [buff.slice(index, end), buff, end];
|
|
334
|
+
});
|
|
335
|
+
return arrayBuffer.then(v => {
|
|
336
|
+
if (!v) {
|
|
337
|
+
return null;
|
|
338
|
+
}
|
|
339
|
+
const [value] = v;
|
|
340
|
+
return value;
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
return read;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
function getNameValue(s) {
|
|
347
|
+
const index = s.indexOf('=');
|
|
348
|
+
if (index < 0) {
|
|
349
|
+
return [decodeURIComponent(s), ''];
|
|
350
|
+
}
|
|
351
|
+
return [decodeURIComponent(s.substring(0, index)), decodeURIComponent(s.substring(index + 1))];
|
|
352
|
+
}
|
|
353
|
+
function parseQuery(s) {
|
|
354
|
+
const query = {};
|
|
355
|
+
for (const k of s.split('&').filter(Boolean)) {
|
|
356
|
+
const [index, value] = getNameValue(k);
|
|
357
|
+
if (index in query) {
|
|
358
|
+
query[index] = [query[index], value].flat();
|
|
359
|
+
} else {
|
|
360
|
+
query[index] = value;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
return query;
|
|
364
|
+
}
|
|
365
|
+
function getHeaders(h) {
|
|
366
|
+
const headers = {};
|
|
367
|
+
for (const [k, v] of h.entries()) {
|
|
368
|
+
headers[k.toLowerCase()] = v;
|
|
369
|
+
}
|
|
370
|
+
return headers;
|
|
371
|
+
}
|
|
372
|
+
function createRequest(request, searchParser = parseQuery) {
|
|
373
|
+
const url = new URL(request.url);
|
|
374
|
+
const {
|
|
375
|
+
body,
|
|
376
|
+
signal
|
|
377
|
+
} = request;
|
|
378
|
+
const aborted = new Promise((_, reject) => {
|
|
379
|
+
if (signal.aborted) {
|
|
380
|
+
return reject(signal.reason);
|
|
381
|
+
}
|
|
382
|
+
signal.addEventListener('abort', () => reject(signal.reason), {
|
|
383
|
+
once: true
|
|
384
|
+
});
|
|
385
|
+
});
|
|
386
|
+
return {
|
|
387
|
+
method: (request.method || 'GET').toUpperCase(),
|
|
388
|
+
url: `${url.pathname}${url.search}` || '/',
|
|
389
|
+
headers: getHeaders(request.headers),
|
|
390
|
+
pathname: url.pathname || '/',
|
|
391
|
+
search: url.search || '',
|
|
392
|
+
query: searchParser(url.search.substring(1)),
|
|
393
|
+
aborted,
|
|
394
|
+
read: body ? createStreamRead(body) : createBufferRead(request)
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
function createHeaders(target) {
|
|
399
|
+
const headers = new Headers();
|
|
400
|
+
for (const [k, v] of Object.entries(target.headers)) {
|
|
401
|
+
for (const it of [v].flat()) {
|
|
402
|
+
headers.append(k.toLowerCase(), String(it));
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
return headers;
|
|
406
|
+
}
|
|
407
|
+
function createResponse(target) {
|
|
408
|
+
return new Response(new ReadableStream({
|
|
409
|
+
async pull(controller) {
|
|
410
|
+
const {
|
|
411
|
+
value,
|
|
412
|
+
done
|
|
413
|
+
} = await target.next();
|
|
414
|
+
if (done) {
|
|
415
|
+
controller.close();
|
|
416
|
+
} else {
|
|
417
|
+
controller.enqueue(value);
|
|
418
|
+
}
|
|
419
|
+
},
|
|
420
|
+
async cancel(reason) {
|
|
421
|
+
return target.throw(reason).then(() => {}, () => {});
|
|
422
|
+
}
|
|
423
|
+
}), {
|
|
424
|
+
status: target.status,
|
|
425
|
+
headers: createHeaders(target)
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
function createFetch(run, notFound, searchParser) {
|
|
430
|
+
return async function fetch(input, init) {
|
|
431
|
+
const request = new Request(input, init);
|
|
432
|
+
const {
|
|
433
|
+
signal
|
|
434
|
+
} = request;
|
|
435
|
+
if (signal.aborted) {
|
|
436
|
+
return Promise.reject(new DOMException('The user aborted a request.'));
|
|
437
|
+
}
|
|
438
|
+
const r = await run(createRequest(request, searchParser));
|
|
439
|
+
if (r) {
|
|
440
|
+
return createResponse(r);
|
|
441
|
+
}
|
|
442
|
+
if (typeof notFound === 'function') {
|
|
443
|
+
return notFound(request);
|
|
444
|
+
}
|
|
445
|
+
return new Response(null, {
|
|
446
|
+
status: 404
|
|
447
|
+
});
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
exports.createBufferRead = createBufferRead;
|
|
452
|
+
exports.createCacheApis = createCacheApis;
|
|
453
|
+
exports.createFetch = createFetch;
|
|
454
|
+
exports.createIndexedApis = createIndexedApis;
|
|
455
|
+
exports.createRequest = createRequest;
|
|
456
|
+
exports.createResponse = createResponse;
|
|
457
|
+
exports.createStreamRead = createStreamRead;
|
package/cli/index.d.ts
CHANGED