bun-crumb 0.12.0 → 0.12.1

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 CHANGED
@@ -9,11 +9,11 @@
9
9
 
10
10
  ### Features
11
11
 
12
- - Only Bun is supported
12
+ - Only Bun is supported
13
13
 
14
- - No classes
14
+ - No classes
15
15
 
16
- - Uses Bun’s HTTP API
16
+ - Uses `Bun.serve` routes
17
17
 
18
18
  ### Installation
19
19
 
@@ -34,59 +34,158 @@ const products: Product[] = [];
34
34
 
35
35
  createRoute({
36
36
  url: '/products',
37
+
37
38
  method: 'GET',
39
+
38
40
  handler: (request, response: RouteResponse<{ body: Product[] }>) => {
39
41
  return response.send(
40
42
  [
41
- { title: 'cookie', price: 100, id: 1 },
42
- { title: 'bread', price: 1600, id: 2 },
43
+ { title: 'bananas', price: 0.57, id: 1 },
44
+
45
+ { title: 'bread', price: 0.89, id: 2 },
46
+
47
+ { title: 'milk', price: 0.83, id: 3 },
43
48
  ],
44
- { status: 200 }
49
+
50
+ { status: 200 },
45
51
  );
46
52
  },
47
53
  });
48
54
  ```
49
55
 
50
- &nbsp;
56
+ ### Benchmarks
57
+
58
+ - Machine:
59
+ - windows 11
60
+ - intel core i5 10300H
61
+ - 16gb ram
62
+
63
+ - Load testing tool: grafana/k6
64
+
65
+ - Bun version: 1.3.6
66
+
67
+ <details>
68
+ <summary>k6 script</summary>
69
+
70
+ ```bash
71
+ sleep 1 | k6 run script.js
72
+ ```
51
73
 
52
- Middleware / Pre-handlers
74
+ ```javascript
75
+ import { PORT } from './constants.js';
76
+
77
+ import http from 'k6/http';
78
+
79
+ export const options = {
80
+ scenarios: {
81
+ load: {
82
+ executor: 'constant-arrival-rate',
83
+
84
+ rate: 16000,
85
+ timeUnit: '1s',
86
+
87
+ duration: '30s',
88
+ preAllocatedVUs: 1000,
89
+
90
+ maxVUs: 3000,
91
+ },
92
+ },
93
+ };
94
+
95
+ export default () => {
96
+ http.post(
97
+ 'http://localhost:' + PORT + '/',
98
+ JSON.stringify({ key: 'value' }),
99
+ { headers: { 'Content-Type': 'application/json' } },
100
+ );
101
+ };
102
+ ```
103
+
104
+ </details>
105
+
106
+ <details>
107
+ <summary>Pure Bun server code</summary>
53
108
 
54
109
  ```typescript
55
- import { createRoute, type RouteResponse } from 'bun-crumb';
110
+ import { serve, stdout } from 'bun';
111
+
112
+ import { PORT } from './constants';
113
+
114
+ serve({
115
+ routes: {
116
+ '/': {
117
+ POST: (request) => {
118
+ return request.json().then(
119
+ (body) =>
120
+ new Response(JSON.stringify(body), {
121
+ headers: { 'Content-Type': 'application/json' },
122
+ }),
123
+ );
124
+ },
125
+ },
126
+ },
127
+ port: PORT,
128
+ });
129
+ stdout.write('Bun is running\n');
130
+ ```
56
131
 
57
- type Product = { title: string; price: number; id: number };
132
+ </details>
58
133
 
59
- const products: Product[] = [];
134
+ <details>
135
+ <summary>Fastify server code</summary>
60
136
 
61
- createRoute({
62
- url: '/products',
137
+ ```typescript
138
+ import Fastify from 'fastify';
139
+
140
+ import { PORT } from './constants';
141
+
142
+ const fastify = Fastify({ logger: false });
143
+
144
+ fastify.route({
145
+ url: '/',
63
146
  method: 'POST',
64
- preHandler: (request, response) => {
65
- if (products.find((product) => product.id === request.body.id)) {
66
- return response.send(
67
- { message: 'Product with this id already exists' },
68
- { status: 409 }
69
- );
70
- }
147
+ handler: (request, response) => {
148
+ return response.send(request.body);
71
149
  },
72
- handler: (request, response: RouteResponse<{ body: Product }>) => {
73
- products.push(body);
150
+ });
74
151
 
75
- return response.send(body, { status: 201 });
76
- },
152
+ fastify.listen({ port: PORT }, () => {
153
+ Bun.stdout.write('Fastify is running\n');
77
154
  });
78
155
  ```
79
156
 
80
- &nbsp;
157
+ </details>
158
+
159
+ <details>
160
+ <summary>Bun Crumb server code</summary>
81
161
 
82
- Setting Headers and Status
162
+ ```bash
163
+ sleep 1 | k6 run script.js
164
+ ```
83
165
 
84
166
  ```typescript
85
- import { createRoute } from 'bun-crumb';
167
+ import { PORT } from './constants';
168
+
169
+ import { listen, createRoute } from 'bun-crumb';
86
170
 
171
+ //
87
172
  createRoute({
88
- url: '/auth',
173
+ url: '/',
174
+
89
175
  method: 'POST',
90
- handler: (request, response) => {},
176
+
177
+ handler: (request, response) => {
178
+ return request.handleBody().then(response.send);
179
+ },
91
180
  });
181
+
182
+ listen({ port: PORT });
92
183
  ```
184
+
185
+ </details>
186
+
187
+ | Library | Total requests | RPS | Requests failed | Avg. request duration |
188
+ | --------- | -------------- | -------------- | --------------- | --------------------- |
189
+ | Pure Bun | 482681 | 15958.069946/s | 0.00% (0) | 12.48ms |
190
+ | Bun Crumb | 474870 | 15789.504029/s | 0.02% (101) | 23.08ms |
191
+ | Fastify | 364525 | 12060.63486/s | 0.27% (1002) | 237.68ms |
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -1,6 +1,14 @@
1
1
  export namespace options {
2
- let vus: number;
3
- let duration: string;
2
+ namespace scenarios {
3
+ namespace load {
4
+ let executor: string;
5
+ let rate: number;
6
+ let timeUnit: string;
7
+ let duration: string;
8
+ let preAllocatedVUs: number;
9
+ let maxVUs: number;
10
+ }
11
+ }
4
12
  }
5
13
  declare function _default(): void;
6
14
  export default _default;
package/dist/index.d.ts CHANGED
@@ -121,7 +121,7 @@ interface RouteResponse<T extends {
121
121
  } = {
122
122
  body: unknown;
123
123
  }> {
124
- send: (data: T['body'], options?: ResponseOptions) => void;
124
+ send: (data?: T['body'], options?: ResponseOptions) => void;
125
125
  /**
126
126
  * Sets `Location` header to provided `url` and `response.status` to provided `status`
127
127
  *
@@ -169,7 +169,7 @@ interface RouteResponse<T extends {
169
169
  setHeader: (name: Header['name'], value: Header['value']) => void;
170
170
  /**
171
171
  *
172
- * @param options `Bun.Cookie` options parametr
172
+ * @param options `Bun.Cookie` options parameter
173
173
  *
174
174
  *
175
175
  *
@@ -215,7 +215,8 @@ interface ListenOptions {
215
215
  }
216
216
 
217
217
  /**
218
- * Starts serving http server.
218
+ *
219
+ * Starts to serve http server.
219
220
  *
220
221
  *
221
222
  * @param {ListenOption} options - options
package/dist/server.d.ts CHANGED
@@ -25,6 +25,10 @@ export declare const _routes: Routes;
25
25
  * @param {Validate} schemaValidator schema validator function that receives `data` and `schema` arguments.
26
26
  *
27
27
  * @returns {Promise<unknown>} Promise with body
28
+ *
29
+ *
30
+ *
31
+ *
28
32
  */
29
33
  export declare const handleBody: (request: BunRequest, contentType: string, schema?: SchemaData, schemaValidator?: Validate) => Promise<unknown>;
30
34
  /**
@@ -90,7 +94,8 @@ export declare const prepareRoute: (route: Route, schemaValidator?: Validate) =>
90
94
  */
91
95
  export declare const prepareRoutes: (routes: Routes, schemaValidator?: Validate) => PreparedRoutes;
92
96
  /**
93
- * Starts serving http server.
97
+ *
98
+ * Starts to serve http server.
94
99
  *
95
100
  *
96
101
  * @param {ListenOption} options - options
@@ -60,7 +60,7 @@ export interface RouteResponse<T extends {
60
60
  } = {
61
61
  body: unknown;
62
62
  }> {
63
- send: (data: T['body'], options?: ResponseOptions) => void;
63
+ send: (data?: T['body'], options?: ResponseOptions) => void;
64
64
  /**
65
65
  * Sets `Location` header to provided `url` and `response.status` to provided `status`
66
66
  *
@@ -108,7 +108,7 @@ export interface RouteResponse<T extends {
108
108
  setHeader: (name: Header['name'], value: Header['value']) => void;
109
109
  /**
110
110
  *
111
- * @param options `Bun.Cookie` options parametr
111
+ * @param options `Bun.Cookie` options parameter
112
112
  *
113
113
  *
114
114
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bun-crumb",
3
- "version": "0.12.0",
3
+ "version": "0.12.1",
4
4
  "author": "marigold",
5
5
  "module": "dist/index.js",
6
6
  "license": "UNLICENSED",