koa-files 4.0.7 → 4.1.0
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 +7 -3
- package/cjs/ReadStream.cjs +5 -5
- package/cjs/ReadStream.d.cts +3 -2
- package/cjs/Service.cjs +16 -18
- package/cjs/Service.d.cts +5 -9
- package/cjs/index.cjs +1 -1
- package/cjs/utils/fs.cjs +1 -1
- package/cjs/utils/hash.cjs +1 -1
- package/cjs/utils/http.cjs +1 -1
- package/cjs/utils/path.cjs +1 -1
- package/cjs/utils/type.cjs +1 -1
- package/esm/ReadStream.d.ts +3 -2
- package/esm/ReadStream.js +5 -5
- package/esm/Service.d.ts +5 -9
- package/esm/Service.js +16 -18
- package/esm/index.js +1 -1
- package/esm/utils/fs.js +1 -1
- package/esm/utils/hash.js +1 -1
- package/esm/utils/http.js +1 -1
- package/esm/utils/path.js +1 -1
- package/esm/utils/type.js +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -29,6 +29,10 @@ interface IgnoreFunction {
|
|
|
29
29
|
(path: string): boolean | Promise<boolean>;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
+
interface HighWaterMarkFunction {
|
|
33
|
+
(path: string, stats: Stats): Promise<number> | number;
|
|
34
|
+
}
|
|
35
|
+
|
|
32
36
|
interface HeadersFunction {
|
|
33
37
|
(path: string, stats: Stats): Promise<Headers | void> | Headers | void;
|
|
34
38
|
}
|
|
@@ -41,14 +45,14 @@ export interface FileSystem {
|
|
|
41
45
|
}
|
|
42
46
|
|
|
43
47
|
export interface Options {
|
|
44
|
-
fs?: FileSystem;
|
|
45
|
-
defer?: boolean;
|
|
46
48
|
etag?: boolean;
|
|
49
|
+
defer?: boolean;
|
|
50
|
+
fs?: FileSystem;
|
|
47
51
|
acceptRanges?: boolean;
|
|
48
52
|
lastModified?: boolean;
|
|
49
|
-
highWaterMark?: number;
|
|
50
53
|
ignore?: IgnoreFunction;
|
|
51
54
|
headers?: Headers | HeadersFunction;
|
|
55
|
+
highWaterMark?: number | HighWaterMarkFunction;
|
|
52
56
|
}
|
|
53
57
|
|
|
54
58
|
export function server(root: string, options?: Options): Middleware;
|
package/cjs/ReadStream.cjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @package koa-files
|
|
3
3
|
* @license MIT
|
|
4
|
-
* @version 4.0
|
|
4
|
+
* @version 4.1.0
|
|
5
5
|
* @author nuintun <nuintun@qq.com>
|
|
6
6
|
* @description A static files serving middleware for koa.
|
|
7
7
|
* @see https://github.com/nuintun/koa-files#readme
|
|
@@ -128,13 +128,13 @@ class ReadStream extends stream.Readable {
|
|
|
128
128
|
const buffer$1 = buffer.Buffer.allocUnsafeSlow(bytesToRead);
|
|
129
129
|
const position = range.offset + bytesRead;
|
|
130
130
|
// Read file range.
|
|
131
|
-
this.fs.read(fd, buffer$1, 0, bytesToRead, position, (
|
|
131
|
+
this.fs.read(fd, buffer$1, 0, bytesToRead, position, (readError, bytesRead, buffer) => {
|
|
132
132
|
this.reading = false;
|
|
133
133
|
// Tell ._destroy() that it's safe to close the fd now.
|
|
134
134
|
if (this.destroyed) {
|
|
135
|
-
this.emit(DISPOSE_EVENT,
|
|
136
|
-
} else if (
|
|
137
|
-
this.destroy(
|
|
135
|
+
this.emit(DISPOSE_EVENT, readError);
|
|
136
|
+
} else if (readError != null) {
|
|
137
|
+
this.destroy(readError);
|
|
138
138
|
} else if (bytesRead !== bytesToRead) {
|
|
139
139
|
this.destroy(new RangeError('invalid read operation'));
|
|
140
140
|
} else {
|
package/cjs/ReadStream.d.cts
CHANGED
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
* @module ReadStream
|
|
3
3
|
*/
|
|
4
4
|
import { PathLike } from 'fs';
|
|
5
|
+
import { Readable } from 'stream';
|
|
5
6
|
import { Range } from './utils/http.cjs';
|
|
6
7
|
import { FileSystem } from './utils/fs.cjs';
|
|
7
|
-
|
|
8
|
-
export interface Options extends Pick<ReadableOptions, 'highWaterMark'> {
|
|
8
|
+
export interface Options {
|
|
9
9
|
fs: FileSystem;
|
|
10
|
+
highWaterMark?: number;
|
|
10
11
|
}
|
|
11
12
|
interface Callback {
|
|
12
13
|
(error?: Error | null): void;
|
package/cjs/Service.cjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @package koa-files
|
|
3
3
|
* @license MIT
|
|
4
|
-
* @version 4.0
|
|
4
|
+
* @version 4.1.0
|
|
5
5
|
* @author nuintun <nuintun@qq.com>
|
|
6
6
|
* @description A static files serving middleware for koa.
|
|
7
7
|
* @see https://github.com/nuintun/koa-files#readme
|
|
@@ -38,20 +38,15 @@ class Service {
|
|
|
38
38
|
* @param root The file service root.
|
|
39
39
|
* @param options The file service options.
|
|
40
40
|
*/
|
|
41
|
-
constructor(root, options) {
|
|
41
|
+
constructor(root, options = {}) {
|
|
42
|
+
var _a;
|
|
42
43
|
this.root = path.unixify(path$1.resolve(root));
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
* @param path The path to check.
|
|
50
|
-
*/
|
|
51
|
-
async isIgnore(path) {
|
|
52
|
-
const { ignore } = this.options;
|
|
53
|
-
const isIgnored = type.isFunction(ignore) ? await ignore(path) : false;
|
|
54
|
-
return isIgnored === true;
|
|
44
|
+
const { ignore, highWaterMark = 65536 } = options;
|
|
45
|
+
this.options = Object.assign(Object.assign({}, options), {
|
|
46
|
+
fs: (_a = options.fs) !== null && _a !== void 0 ? _a : fs__default.default,
|
|
47
|
+
ignore: type.isFunction(ignore) ? ignore : () => false,
|
|
48
|
+
highWaterMark: type.isFunction(highWaterMark) ? highWaterMark : () => highWaterMark
|
|
49
|
+
});
|
|
55
50
|
}
|
|
56
51
|
/**
|
|
57
52
|
* @private
|
|
@@ -131,12 +126,12 @@ class Service {
|
|
|
131
126
|
if (path.isOutRoot(path$2, root)) {
|
|
132
127
|
return false;
|
|
133
128
|
}
|
|
129
|
+
// Get options.
|
|
130
|
+
const { options } = this;
|
|
134
131
|
// Is ignore path or file (403).
|
|
135
|
-
if (await
|
|
132
|
+
if (await options.ignore(path$2)) {
|
|
136
133
|
return false;
|
|
137
134
|
}
|
|
138
|
-
// Get options.
|
|
139
|
-
const { options } = this;
|
|
140
135
|
// File stats.
|
|
141
136
|
const stats = await fs$1.stat(options.fs, path$2);
|
|
142
137
|
// Check file stats.
|
|
@@ -193,7 +188,10 @@ class Service {
|
|
|
193
188
|
return context.throw(400);
|
|
194
189
|
}
|
|
195
190
|
// Set response body.
|
|
196
|
-
response.body = new ReadStream.ReadStream(path$2, ranges,
|
|
191
|
+
response.body = new ReadStream.ReadStream(path$2, ranges, {
|
|
192
|
+
fs: options.fs,
|
|
193
|
+
highWaterMark: await options.highWaterMark(path$2, stats)
|
|
194
|
+
});
|
|
197
195
|
// File found.
|
|
198
196
|
return true;
|
|
199
197
|
}
|
package/cjs/Service.d.cts
CHANGED
|
@@ -10,17 +10,20 @@ interface Headers {
|
|
|
10
10
|
interface IgnoreFunction {
|
|
11
11
|
(path: string): boolean | Promise<boolean>;
|
|
12
12
|
}
|
|
13
|
+
interface HighWaterMarkFunction {
|
|
14
|
+
(path: string, stats: Stats): Promise<number> | number;
|
|
15
|
+
}
|
|
13
16
|
interface HeadersFunction {
|
|
14
17
|
(path: string, stats: Stats): Promise<Headers | void> | Headers | void;
|
|
15
18
|
}
|
|
16
19
|
export interface Options {
|
|
17
|
-
fs?: FileSystem;
|
|
18
20
|
etag?: boolean;
|
|
21
|
+
fs?: FileSystem;
|
|
19
22
|
acceptRanges?: boolean;
|
|
20
23
|
lastModified?: boolean;
|
|
21
|
-
highWaterMark?: number;
|
|
22
24
|
ignore?: IgnoreFunction;
|
|
23
25
|
headers?: Headers | HeadersFunction;
|
|
26
|
+
highWaterMark?: number | HighWaterMarkFunction;
|
|
24
27
|
}
|
|
25
28
|
/**
|
|
26
29
|
* @class Service
|
|
@@ -35,13 +38,6 @@ export declare class Service {
|
|
|
35
38
|
* @param options The file service options.
|
|
36
39
|
*/
|
|
37
40
|
constructor(root: string, options?: Options);
|
|
38
|
-
/**
|
|
39
|
-
* @private
|
|
40
|
-
* @method isIgnore
|
|
41
|
-
* @description Check if path is ignore.
|
|
42
|
-
* @param path The path to check.
|
|
43
|
-
*/
|
|
44
|
-
private isIgnore;
|
|
45
41
|
/**
|
|
46
42
|
* @private
|
|
47
43
|
* @method setupHeaders
|
package/cjs/index.cjs
CHANGED
package/cjs/utils/fs.cjs
CHANGED
package/cjs/utils/hash.cjs
CHANGED
package/cjs/utils/http.cjs
CHANGED
package/cjs/utils/path.cjs
CHANGED
package/cjs/utils/type.cjs
CHANGED
package/esm/ReadStream.d.ts
CHANGED
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
* @module ReadStream
|
|
3
3
|
*/
|
|
4
4
|
import { PathLike } from 'fs';
|
|
5
|
+
import { Readable } from 'stream';
|
|
5
6
|
import { Range } from './utils/http.js';
|
|
6
7
|
import { FileSystem } from './utils/fs.js';
|
|
7
|
-
|
|
8
|
-
export interface Options extends Pick<ReadableOptions, 'highWaterMark'> {
|
|
8
|
+
export interface Options {
|
|
9
9
|
fs: FileSystem;
|
|
10
|
+
highWaterMark?: number;
|
|
10
11
|
}
|
|
11
12
|
interface Callback {
|
|
12
13
|
(error?: Error | null): void;
|
package/esm/ReadStream.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @package koa-files
|
|
3
3
|
* @license MIT
|
|
4
|
-
* @version 4.0
|
|
4
|
+
* @version 4.1.0
|
|
5
5
|
* @author nuintun <nuintun@qq.com>
|
|
6
6
|
* @description A static files serving middleware for koa.
|
|
7
7
|
* @see https://github.com/nuintun/koa-files#readme
|
|
@@ -126,13 +126,13 @@ class ReadStream extends Readable {
|
|
|
126
126
|
const buffer = Buffer.allocUnsafeSlow(bytesToRead);
|
|
127
127
|
const position = range.offset + bytesRead;
|
|
128
128
|
// Read file range.
|
|
129
|
-
this.fs.read(fd, buffer, 0, bytesToRead, position, (
|
|
129
|
+
this.fs.read(fd, buffer, 0, bytesToRead, position, (readError, bytesRead, buffer) => {
|
|
130
130
|
this.reading = false;
|
|
131
131
|
// Tell ._destroy() that it's safe to close the fd now.
|
|
132
132
|
if (this.destroyed) {
|
|
133
|
-
this.emit(DISPOSE_EVENT,
|
|
134
|
-
} else if (
|
|
135
|
-
this.destroy(
|
|
133
|
+
this.emit(DISPOSE_EVENT, readError);
|
|
134
|
+
} else if (readError != null) {
|
|
135
|
+
this.destroy(readError);
|
|
136
136
|
} else if (bytesRead !== bytesToRead) {
|
|
137
137
|
this.destroy(new RangeError('invalid read operation'));
|
|
138
138
|
} else {
|
package/esm/Service.d.ts
CHANGED
|
@@ -10,17 +10,20 @@ interface Headers {
|
|
|
10
10
|
interface IgnoreFunction {
|
|
11
11
|
(path: string): boolean | Promise<boolean>;
|
|
12
12
|
}
|
|
13
|
+
interface HighWaterMarkFunction {
|
|
14
|
+
(path: string, stats: Stats): Promise<number> | number;
|
|
15
|
+
}
|
|
13
16
|
interface HeadersFunction {
|
|
14
17
|
(path: string, stats: Stats): Promise<Headers | void> | Headers | void;
|
|
15
18
|
}
|
|
16
19
|
export interface Options {
|
|
17
|
-
fs?: FileSystem;
|
|
18
20
|
etag?: boolean;
|
|
21
|
+
fs?: FileSystem;
|
|
19
22
|
acceptRanges?: boolean;
|
|
20
23
|
lastModified?: boolean;
|
|
21
|
-
highWaterMark?: number;
|
|
22
24
|
ignore?: IgnoreFunction;
|
|
23
25
|
headers?: Headers | HeadersFunction;
|
|
26
|
+
highWaterMark?: number | HighWaterMarkFunction;
|
|
24
27
|
}
|
|
25
28
|
/**
|
|
26
29
|
* @class Service
|
|
@@ -35,13 +38,6 @@ export declare class Service {
|
|
|
35
38
|
* @param options The file service options.
|
|
36
39
|
*/
|
|
37
40
|
constructor(root: string, options?: Options);
|
|
38
|
-
/**
|
|
39
|
-
* @private
|
|
40
|
-
* @method isIgnore
|
|
41
|
-
* @description Check if path is ignore.
|
|
42
|
-
* @param path The path to check.
|
|
43
|
-
*/
|
|
44
|
-
private isIgnore;
|
|
45
41
|
/**
|
|
46
42
|
* @private
|
|
47
43
|
* @method setupHeaders
|
package/esm/Service.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @package koa-files
|
|
3
3
|
* @license MIT
|
|
4
|
-
* @version 4.0
|
|
4
|
+
* @version 4.1.0
|
|
5
5
|
* @author nuintun <nuintun@qq.com>
|
|
6
6
|
* @description A static files serving middleware for koa.
|
|
7
7
|
* @see https://github.com/nuintun/koa-files#readme
|
|
@@ -29,20 +29,15 @@ class Service {
|
|
|
29
29
|
* @param root The file service root.
|
|
30
30
|
* @param options The file service options.
|
|
31
31
|
*/
|
|
32
|
-
constructor(root, options) {
|
|
32
|
+
constructor(root, options = {}) {
|
|
33
|
+
var _a;
|
|
33
34
|
this.root = unixify(resolve(root));
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
* @param path The path to check.
|
|
41
|
-
*/
|
|
42
|
-
async isIgnore(path) {
|
|
43
|
-
const { ignore } = this.options;
|
|
44
|
-
const isIgnored = isFunction(ignore) ? await ignore(path) : false;
|
|
45
|
-
return isIgnored === true;
|
|
35
|
+
const { ignore, highWaterMark = 65536 } = options;
|
|
36
|
+
this.options = Object.assign(Object.assign({}, options), {
|
|
37
|
+
fs: (_a = options.fs) !== null && _a !== void 0 ? _a : fs,
|
|
38
|
+
ignore: isFunction(ignore) ? ignore : () => false,
|
|
39
|
+
highWaterMark: isFunction(highWaterMark) ? highWaterMark : () => highWaterMark
|
|
40
|
+
});
|
|
46
41
|
}
|
|
47
42
|
/**
|
|
48
43
|
* @private
|
|
@@ -122,12 +117,12 @@ class Service {
|
|
|
122
117
|
if (isOutRoot(path, root)) {
|
|
123
118
|
return false;
|
|
124
119
|
}
|
|
120
|
+
// Get options.
|
|
121
|
+
const { options } = this;
|
|
125
122
|
// Is ignore path or file (403).
|
|
126
|
-
if (await
|
|
123
|
+
if (await options.ignore(path)) {
|
|
127
124
|
return false;
|
|
128
125
|
}
|
|
129
|
-
// Get options.
|
|
130
|
-
const { options } = this;
|
|
131
126
|
// File stats.
|
|
132
127
|
const stats = await stat(options.fs, path);
|
|
133
128
|
// Check file stats.
|
|
@@ -184,7 +179,10 @@ class Service {
|
|
|
184
179
|
return context.throw(400);
|
|
185
180
|
}
|
|
186
181
|
// Set response body.
|
|
187
|
-
response.body = new ReadStream(path, ranges,
|
|
182
|
+
response.body = new ReadStream(path, ranges, {
|
|
183
|
+
fs: options.fs,
|
|
184
|
+
highWaterMark: await options.highWaterMark(path, stats)
|
|
185
|
+
});
|
|
188
186
|
// File found.
|
|
189
187
|
return true;
|
|
190
188
|
}
|
package/esm/index.js
CHANGED
package/esm/utils/fs.js
CHANGED
package/esm/utils/hash.js
CHANGED
package/esm/utils/http.js
CHANGED
package/esm/utils/path.js
CHANGED
package/esm/utils/type.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "koa-files",
|
|
3
|
-
"version": "4.0
|
|
3
|
+
"version": "4.1.0",
|
|
4
4
|
"description": "A static files serving middleware for koa.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "cjs/index.cjs",
|
|
@@ -54,11 +54,11 @@
|
|
|
54
54
|
"@types/node": "^24.1.0",
|
|
55
55
|
"@types/range-parser": "^1.2.7",
|
|
56
56
|
"dts-paths": "^1.1.10",
|
|
57
|
-
"koa": "^3.0.
|
|
57
|
+
"koa": "^3.0.1",
|
|
58
58
|
"magic-string": "^0.30.17",
|
|
59
59
|
"prettier": "^3.6.2",
|
|
60
60
|
"rimraf": "^6.0.1",
|
|
61
|
-
"rollup": "^4.
|
|
61
|
+
"rollup": "^4.46.1",
|
|
62
62
|
"typescript": "^5.8.3"
|
|
63
63
|
},
|
|
64
64
|
"peerDependencies": {
|