spooder 4.4.2 → 4.4.4

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.
Files changed (3) hide show
  1. package/README.md +27 -1
  2. package/package.json +1 -1
  3. package/src/api.ts +15 -4
package/README.md CHANGED
@@ -46,7 +46,9 @@ The `CLI` component of `spooder` is a global command-line tool for running serve
46
46
  - [`server.handle(status_code: number, handler: RequestHandler)`](#api-routing-server-handle)
47
47
  - [`server.default(handler: DefaultHandler)`](#api-routing-server-default)
48
48
  - [`server.error(handler: ErrorHandler)`](#api-routing-server-error)
49
+ - [API > Routing > Slow Requests](#api-routing-slow-requests)
49
50
  - [`server.on_slow_request(callback: SlowRequestCallback, threshold: number)`](#api-routing-server-on-slow-request)
51
+ - [`server.allow_slow_request(req: Request)`](#api-routing-server-allow-slow-request)
50
52
  - [API > Routing > Validation](#api-routing-validation)
51
53
  - [`validate_req_json(handler: JSONRequestHandler)`](#api-routing-validate-req-json)
52
54
  - [API > Routing > Directory Serving](#api-routing-directory-serving)
@@ -671,6 +673,9 @@ server.error((err, req, url) => {
671
673
  });
672
674
  ```
673
675
 
676
+ <a id="api-routing-slow-requests"></a>
677
+ ## API > Routing > Slow Requests
678
+
674
679
  <a id="api-routing-server-on-slow-request"></a>
675
680
  ### 🔧 `server.on_slow_request(callback: SlowRequestCallback, threshold: number)`
676
681
 
@@ -692,6 +697,27 @@ server.on_slow_request(async (req, time, url) => {
692
697
  > [!NOTE]
693
698
  > The callback is not awaited internally, so you can use `async/await` freely without blocking the server/request.
694
699
 
700
+ <a id="api-routing-server-allow-slow-request"></a>
701
+ ### 🔧 `server.allow_slow_request(req: Request)`
702
+
703
+ In some scenarios, mitigation throttling or heavy workloads may cause slow requests intentionally. To prevent these triggering a caution, requests can be marked as slow.
704
+
705
+ ```ts
706
+ server.on_slow_request(async (req, time, url) => {
707
+ await caution('Slow request warning', { req, time });
708
+ }, 500);
709
+
710
+ server.route('/test', async (req) => {
711
+ // this request is marked as slow, therefore won't
712
+ // trigger on_slow_request despite taking 5000ms+
713
+ server.allow_slow_request(req);
714
+ await new Promise(res => setTimeout(res, 5000));
715
+ });
716
+ ```
717
+
718
+ > [!NOTE]
719
+ > This will have no effect if a handler hasn't been registered with `on_slow_request`.
720
+
695
721
  <a id="api-routing-validation"></a>
696
722
  ## API > Routing > Validation
697
723
 
@@ -734,7 +760,7 @@ server.route('/api/endpoint', async (req, url) => {
734
760
  As you can see this is quite verbose and adds a lot of boilerplate to your handlers. `validate_req_json` can be used to simplify this.
735
761
 
736
762
  ```ts
737
- server.route('/api/endpoint', validate_req_json(async (json, req, url) => {
763
+ server.route('/api/endpoint', validate_req_json(async (req, url, json) => {
738
764
  // do something with json.
739
765
  return 200;
740
766
  }));
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "spooder",
3
3
  "type": "module",
4
- "version": "4.4.2",
4
+ "version": "4.4.4",
5
5
  "exports": {
6
6
  ".": {
7
7
  "bun": "./src/api.ts",
package/src/api.ts CHANGED
@@ -463,10 +463,10 @@ type Resolvable<T> = T | Promise<T>;
463
463
  type PromiseType<T extends Promise<any>> = T extends Promise<infer U> ? U : never;
464
464
 
465
465
  // The following types cover JSON serializable objects/classes.
466
- type JsonPrimitive = string | number | boolean | null;
467
- type JsonArray = JsonSerializable[];
466
+ export type JsonPrimitive = string | number | boolean | null;
467
+ export type JsonArray = JsonSerializable[];
468
468
 
469
- interface JsonObject {
469
+ export interface JsonObject {
470
470
  [key: string]: JsonSerializable;
471
471
  }
472
472
 
@@ -698,6 +698,8 @@ export function serve(port: number) {
698
698
  let slow_request_callback: SlowRequestCallback | null = null;
699
699
  let slow_request_threshold: number = 1000;
700
700
 
701
+ const slow_requests = new WeakSet();
702
+
701
703
  const server = Bun.serve({
702
704
  port,
703
705
  development: false,
@@ -709,9 +711,13 @@ export function serve(port: number) {
709
711
  const response = await generate_response(req, url);
710
712
  const request_time = Date.now() - request_start;
711
713
 
712
- if (slow_request_callback !== null && request_time > slow_request_threshold)
714
+ const is_known_slow = slow_requests.has(req);
715
+ if (slow_request_callback !== null && request_time > slow_request_threshold && is_known_slow)
713
716
  slow_request_callback(req, request_time, url);
714
717
 
718
+ if (is_known_slow)
719
+ slow_requests.delete(req);
720
+
715
721
  return print_request_info(req, response, url, request_time);
716
722
  }
717
723
  });
@@ -758,6 +764,11 @@ export function serve(port: number) {
758
764
  slow_request_threshold = threshold;
759
765
  },
760
766
 
767
+ /** Mark a request as slow, preventing it from triggering slow request callback. */
768
+ allow_slow_request: (req: Request): void => {
769
+ slow_requests.add(req);
770
+ },
771
+
761
772
  /** Register a default handler for all status codes. */
762
773
  default: (handler: DefaultHandler): void => {
763
774
  default_handler = handler;