@ndiinginc/router 4.6.1 → 4.6.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/README.md +11 -11
- package/package.json +1 -1
- package/src/app.js +2 -2
- package/src/router.js +2 -2
package/README.md
CHANGED
|
@@ -198,18 +198,18 @@ Jika tidak ada handler yang mengirim response, router mengirim JSON otomatis:
|
|
|
198
198
|
|
|
199
199
|
## Timeout
|
|
200
200
|
|
|
201
|
-
Aktifkan lewat opsi `
|
|
201
|
+
Aktifkan lewat opsi `requestTimeout` (milidetik) pada `App`. Jika seluruh chain handler melebihi waktu tersebut, error `504 Gateway Timeout` dilempar dan diteruskan ke error handler.
|
|
202
202
|
|
|
203
203
|
```js
|
|
204
|
-
const app = new App({
|
|
204
|
+
const app = new App({ requestTimeout: 5000 });
|
|
205
205
|
```
|
|
206
206
|
|
|
207
|
-
- Tanpa opsi `
|
|
207
|
+
- Tanpa opsi `requestTimeout` (atau bernilai `0`), tidak ada batas waktu
|
|
208
208
|
- Handler yang sudah berjalan tidak dihentikan paksa. Tetapi setelah response dikirim, `res.json()` dan `res.send()` mengabaikan penulisan berikutnya, dan handler selanjutnya di chain tidak dipanggil
|
|
209
209
|
|
|
210
210
|
### `req.signal`
|
|
211
211
|
|
|
212
|
-
Saat `
|
|
212
|
+
Saat `requestTimeout` aktif, `req.signal` adalah `AbortSignal` yang di-abort ketika timeout terjadi (reason-nya error 504) atau ketika salah satu handler melempar error (reason-nya error tersebut). Teruskan ke operasi yang mendukungnya agar pekerjaan ikut dibatalkan:
|
|
213
213
|
|
|
214
214
|
```js
|
|
215
215
|
app.get("/proxy", async (req, res) => {
|
|
@@ -218,7 +218,7 @@ app.get("/proxy", async (req, res) => {
|
|
|
218
218
|
});
|
|
219
219
|
```
|
|
220
220
|
|
|
221
|
-
`req.signal` bernilai `undefined` jika `
|
|
221
|
+
`req.signal` bernilai `undefined` jika `requestTimeout` tidak diaktifkan.
|
|
222
222
|
|
|
223
223
|
## Request
|
|
224
224
|
|
|
@@ -228,7 +228,7 @@ app.get("/proxy", async (req, res) => {
|
|
|
228
228
|
| `req.query` | Object query string, di-parse secara lazy. Key yang berulang menjadi array, dan `+` di-decode menjadi spasi |
|
|
229
229
|
| `req.params` | Parameter dari route dinamis (sudah di-decode) |
|
|
230
230
|
| `req.body` | Hasil parse body (butuh middleware `json()`) |
|
|
231
|
-
| `req.signal` | `AbortSignal` yang di-abort saat timeout atau error handler (hanya jika `
|
|
231
|
+
| `req.signal` | `AbortSignal` yang di-abort saat timeout atau error handler (hanya jika `requestTimeout` aktif) |
|
|
232
232
|
|
|
233
233
|
```js
|
|
234
234
|
// GET /search?tag=a&tag=b&page=2
|
|
@@ -310,21 +310,21 @@ Perilaku:
|
|
|
310
310
|
## Opsi
|
|
311
311
|
|
|
312
312
|
```js
|
|
313
|
-
const app = new App({
|
|
313
|
+
const app = new App({ cacheSize: 1000, requestTimeout: 5000 });
|
|
314
314
|
```
|
|
315
315
|
|
|
316
316
|
| Opsi | Default | Keterangan |
|
|
317
317
|
| --- | --- | --- |
|
|
318
|
-
| `
|
|
319
|
-
| `
|
|
318
|
+
| `cacheSize` | `1000` | Jumlah maksimum entri LRU cache untuk hasil lookup `METHOD path` |
|
|
319
|
+
| `requestTimeout` | - | Batas waktu handler dalam ms (khusus `App`). Lihat bagian [Timeout](#requestTimeout) |
|
|
320
320
|
|
|
321
|
-
`Router` hanya menerima `
|
|
321
|
+
`Router` hanya menerima `cacheSize`.
|
|
322
322
|
|
|
323
323
|
## API
|
|
324
324
|
|
|
325
325
|
### `new App([options])` / `new Router([options])`
|
|
326
326
|
|
|
327
|
-
Membuat instance baru. `App` adalah `Router` ditambah `listen()` dan dukungan `
|
|
327
|
+
Membuat instance baru. `App` adalah `Router` ditambah `listen()` dan dukungan `requestTimeout`.
|
|
328
328
|
|
|
329
329
|
### `router.use([path], ...handlers | router)`
|
|
330
330
|
|
package/package.json
CHANGED
package/src/app.js
CHANGED
|
@@ -19,7 +19,7 @@ class App extends Router {
|
|
|
19
19
|
|
|
20
20
|
const timeout = setTimeout(() => {
|
|
21
21
|
controller.abort(ErrorResponse.status(504));
|
|
22
|
-
}, this.
|
|
22
|
+
}, this.requestTimeout);
|
|
23
23
|
|
|
24
24
|
let handleAbort;
|
|
25
25
|
const timeoutPromise = new Promise((_, reject) => {
|
|
@@ -54,7 +54,7 @@ class App extends Router {
|
|
|
54
54
|
await handler(req, res);
|
|
55
55
|
}
|
|
56
56
|
};
|
|
57
|
-
if (this.
|
|
57
|
+
if (this.requestTimeout) await this.withTimeout(req, handlerPromise);
|
|
58
58
|
else await handlerPromise();
|
|
59
59
|
} catch (error) {
|
|
60
60
|
err = error;
|
package/src/router.js
CHANGED
|
@@ -4,8 +4,8 @@ const { decodePathParam } = require("./util.js");
|
|
|
4
4
|
|
|
5
5
|
class Router {
|
|
6
6
|
constructor(options = {}) {
|
|
7
|
-
this.
|
|
8
|
-
this.cacheSize = options.
|
|
7
|
+
this.requestTimeout = options.requestTimeout ?? 0;
|
|
8
|
+
this.cacheSize = options.cacheSize ?? 1000;
|
|
9
9
|
this.root = new Node();
|
|
10
10
|
this.seq = 0;
|
|
11
11
|
this.cache = new Cache(this.cacheSize);
|