rust-fetch 1.0.3 → 1.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 +654 -115
- package/package.json +1 -1
- package/rust_fetch.d.ts +31 -6
- package/rust_fetch.js +74 -11
- package/rust_fetch_bg.wasm +0 -0
package/README.md
CHANGED
|
@@ -3,42 +3,205 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/rust-fetch)
|
|
4
4
|
[](LICENSE)
|
|
5
5
|
[](https://webassembly.org/)
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
6
|
+
[](https://github.com/asemqaffaf/rust-fetch/releases)
|
|
7
|
+
|
|
8
|
+
### A high-performance, world-class HTTP Client Powered by WebAssembly
|
|
9
|
+
A high-performance HTTP client for JavaScript/TypeScript powered by WebAssembly. Built with Rust for blazing-fast, memory-safe HTTP operations in both browser and Node.js environments.
|
|
10
|
+
|
|
11
|
+
## Table of Contents
|
|
12
|
+
- [🎉 What's New](#-whats-new-in-v110)
|
|
13
|
+
- [✨ Features](#-features)
|
|
14
|
+
- [📦 Installation](#-installation)
|
|
15
|
+
- [🚀 Quick Start](#-quick-start)
|
|
16
|
+
- [📘 API Reference](#-api-reference)
|
|
17
|
+
- [🔧 Advanced Usage](#-advanced-usage)
|
|
18
|
+
- [⚡ Performance](#-performance)
|
|
19
|
+
- [🔍 Troubleshooting](#-troubleshooting)
|
|
20
|
+
- [🤝 Contributing](#-contributing)
|
|
21
|
+
- [📝 License](#-license)
|
|
22
|
+
|
|
23
|
+
## 🎉 What's New in v1.1.0
|
|
24
|
+
|
|
25
|
+
- **Enhanced Error Context**: Improved error handling with detailed error types and proper error chaining
|
|
26
|
+
- **Advanced Request Options**: New options for timeout configuration and automatic retries
|
|
27
|
+
- **Comprehensive HTTP Methods**: Full support for all HTTP methods with a modern, unified API
|
|
28
|
+
- **Type-Safe Headers**: Better type safety for header manipulation
|
|
29
|
+
- **Performance Improvements**: Optimized WASM operations for faster HTTP requests
|
|
30
|
+
- **Backward Compatibility**: Methods like `post_json` and `post_text` are maintained for compatibility with v0.7.x
|
|
31
|
+
|
|
32
|
+
> **Note**: While legacy methods (`post_json`, `post_text`, etc.) are still supported, we recommend using the new unified API for new projects. The legacy methods will be maintained but won't receive new features.
|
|
33
|
+
|
|
34
|
+
## ✨ Features
|
|
35
|
+
|
|
36
|
+
### Core Features
|
|
37
|
+
- 🔒 **Type-Safe**: Full TypeScript support with compile-time type checking
|
|
38
|
+
- ⚡ **High Performance**: Rust-powered core with WebAssembly optimization
|
|
39
|
+
- 🔄 **Automatic Retries**: Built-in retry logic with exponential backoff
|
|
40
|
+
- 🛡️ **Robust Error Handling**: Detailed error types with proper context
|
|
41
|
+
|
|
42
|
+
### Developer Experience
|
|
43
|
+
- 🎯 **Simple API**: Intuitive interface for common use cases
|
|
44
|
+
- 🔧 **Flexible Configuration**: Advanced options for power users
|
|
45
|
+
- 📦 **Zero Dependencies**: Minimal footprint in your application
|
|
46
|
+
- 🔌 **Platform Agnostic**: Works in both browser and Node.js
|
|
47
|
+
|
|
48
|
+
### Technical Capabilities
|
|
49
|
+
- 📄 **Multiple Formats**: Support for JSON, text, and binary responses
|
|
50
|
+
- 🌐 **Full HTTP Support**: All standard HTTP methods (GET, POST, PUT, etc.)
|
|
51
|
+
- 🔍 **Header Management**: Type-safe header manipulation
|
|
52
|
+
- ⏱️ **Timeout Control**: Configurable request timeouts
|
|
53
|
+
- 🔁 **Interceptors**: Request/response modification pipeline
|
|
54
|
+
- 🔗 **URL Handling**: Smart base URL and path combining
|
|
18
55
|
|
|
19
56
|
## 📦 Installation
|
|
20
57
|
|
|
58
|
+
Choose your preferred package manager:
|
|
59
|
+
|
|
21
60
|
```bash
|
|
61
|
+
# Using npm
|
|
22
62
|
npm install rust-fetch
|
|
63
|
+
|
|
64
|
+
# Using yarn
|
|
65
|
+
yarn add rust-fetch
|
|
66
|
+
|
|
67
|
+
# Using pnpm
|
|
68
|
+
pnpm add rust-fetch
|
|
23
69
|
```
|
|
24
70
|
|
|
25
|
-
|
|
71
|
+
### Requirements
|
|
72
|
+
- Node.js 14+ or modern browsers
|
|
73
|
+
- WebAssembly support
|
|
26
74
|
|
|
27
|
-
|
|
28
|
-
|
|
75
|
+
## � Quick Start
|
|
76
|
+
|
|
77
|
+
### Basic Usage
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
import init, { WasmClient } from 'rust-fetch';
|
|
81
|
+
|
|
82
|
+
// Initialize WASM module
|
|
83
|
+
await init();
|
|
84
|
+
|
|
85
|
+
// Create a client instance
|
|
86
|
+
const client = new WasmClient();
|
|
87
|
+
|
|
88
|
+
// Make requests
|
|
89
|
+
const data = await client.get('https://api.example.com/users');
|
|
90
|
+
console.log(data);
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Common Patterns
|
|
94
|
+
|
|
95
|
+
#### Making GET Requests
|
|
96
|
+
```typescript
|
|
97
|
+
// Simple GET
|
|
98
|
+
const users = await client.get('/users');
|
|
99
|
+
|
|
100
|
+
// With query parameters
|
|
101
|
+
const activeUsers = await client.get('/users', {
|
|
102
|
+
params: { status: 'active', page: 1 }
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
// With headers
|
|
106
|
+
const user = await client.get('/users/1', {
|
|
107
|
+
headers: { 'Authorization': 'Bearer token' }
|
|
108
|
+
});
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
#### Working with POST Requests
|
|
112
|
+
```typescript
|
|
113
|
+
// Modern way to POST JSON data
|
|
114
|
+
const newUser = await client.post('/users', {
|
|
115
|
+
body: { name: 'John Doe', email: 'john@example.com' },
|
|
116
|
+
type: 'json'
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
// Modern way to POST form data
|
|
120
|
+
const response = await client.post('/upload', {
|
|
121
|
+
body: formData,
|
|
122
|
+
type: 'form-data',
|
|
123
|
+
headers: { 'Content-Type': 'multipart/form-data' }
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
// Legacy way (still supported for backward compatibility)
|
|
127
|
+
const legacyResponse = await client.post_json('/users', {
|
|
128
|
+
name: 'John Doe',
|
|
129
|
+
email: 'john@example.com'
|
|
130
|
+
});
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
#### Error Handling
|
|
134
|
+
```typescript
|
|
135
|
+
try {
|
|
136
|
+
const data = await client.get('/users');
|
|
137
|
+
console.log('Success:', data);
|
|
138
|
+
} catch (error) {
|
|
139
|
+
if (error.status === 404) {
|
|
140
|
+
console.log('Resource not found');
|
|
141
|
+
} else if (error.name === 'NetworkError') {
|
|
142
|
+
console.log('Network issue:', error.message);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
29
145
|
```
|
|
30
146
|
|
|
31
|
-
##
|
|
147
|
+
## � Migration Guide
|
|
148
|
+
|
|
149
|
+
If you're upgrading from v1.0.x to v1.1.0, here's how to migrate from legacy APIs to the modern ones:
|
|
150
|
+
|
|
151
|
+
### Legacy to Modern API Examples
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
// Legacy API
|
|
155
|
+
import { fetch_json, fetch_text, fetch_with_options } from 'rust-fetch';
|
|
156
|
+
|
|
157
|
+
// Modern API
|
|
158
|
+
import { WasmClient } from 'rust-fetch';
|
|
159
|
+
const client = new WasmClient();
|
|
160
|
+
|
|
161
|
+
// GET requests
|
|
162
|
+
const data = await fetch_json('/api/data'); // Legacy
|
|
163
|
+
const data = await client.get('/api/data', { type: 'json' }); // Modern
|
|
164
|
+
|
|
165
|
+
// POST requests
|
|
166
|
+
const result = await fetch_with_options( // Legacy
|
|
167
|
+
'/api/users',
|
|
168
|
+
'POST',
|
|
169
|
+
{ 'Content-Type': 'application/json' },
|
|
170
|
+
JSON.stringify({ name: 'John' })
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
const result = await client.post('/api/users', { // Modern
|
|
174
|
+
body: { name: 'John' },
|
|
175
|
+
type: 'json'
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
// Error handling
|
|
179
|
+
try { // Legacy
|
|
180
|
+
const data = await fetch_json('/api/data');
|
|
181
|
+
} catch (error) {
|
|
182
|
+
console.error('Error:', error.message);
|
|
183
|
+
}
|
|
32
184
|
|
|
33
|
-
|
|
185
|
+
try { // Modern
|
|
186
|
+
const data = await client.get('/api/data');
|
|
187
|
+
} catch (error) {
|
|
188
|
+
if (error instanceof NetworkError) {
|
|
189
|
+
console.error('Network issue:', error.message);
|
|
190
|
+
} else if (error instanceof HttpError) {
|
|
191
|
+
console.error('HTTP Error:', error.status);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
```
|
|
34
195
|
|
|
35
|
-
|
|
196
|
+
### Why Migrate?
|
|
36
197
|
|
|
37
|
-
|
|
38
|
-
|
|
198
|
+
1. **Better Type Safety**: The modern API provides full TypeScript support
|
|
199
|
+
2. **Enhanced Error Handling**: Detailed error types with proper context
|
|
200
|
+
3. **Advanced Features**: Access to interceptors, retry logic, and streaming
|
|
201
|
+
4. **Consistent Interface**: Unified API for all HTTP operations
|
|
202
|
+
5. **Future Updates**: New features will only be added to the modern API
|
|
39
203
|
|
|
40
|
-
|
|
41
|
-
Here's how to make a simple GET request using `WasmClient`:
|
|
204
|
+
## �🔧 Advanced Usage
|
|
42
205
|
|
|
43
206
|
```javascript
|
|
44
207
|
import init, { WasmClient } from 'rust-fetch';
|
|
@@ -47,9 +210,9 @@ await init();
|
|
|
47
210
|
|
|
48
211
|
const client = new WasmClient();
|
|
49
212
|
|
|
50
|
-
client.get('https://jsonplaceholder.typicode.com/posts/1')
|
|
51
|
-
|
|
52
|
-
|
|
213
|
+
const response = await client.get('https://jsonplaceholder.typicode.com/posts/1');
|
|
214
|
+
console.log(response.status); // 200
|
|
215
|
+
console.log(response.body); // { userId: 1, id: 1, title: '...', body: '...' }
|
|
53
216
|
```
|
|
54
217
|
|
|
55
218
|
#### POST Request with JSON
|
|
@@ -58,42 +221,154 @@ Here's how to make a POST request with a JSON body:
|
|
|
58
221
|
```javascript
|
|
59
222
|
const data = { title: 'foo', body: 'bar', userId: 1 };
|
|
60
223
|
|
|
61
|
-
client.post_json('https://jsonplaceholder.typicode.com/posts', data)
|
|
62
|
-
|
|
63
|
-
|
|
224
|
+
const response = await client.post_json('https://jsonplaceholder.typicode.com/posts', data);
|
|
225
|
+
console.log(response.status); // 201
|
|
226
|
+
console.log(response.body); // { id: 101, title: 'foo', body: 'bar', userId: 1 }
|
|
64
227
|
```
|
|
65
228
|
|
|
66
|
-
|
|
229
|
+
#### PUT Request
|
|
230
|
+
Update a resource with PUT:
|
|
67
231
|
|
|
68
232
|
```javascript
|
|
69
|
-
|
|
233
|
+
const updateData = { id: 1, title: 'updated', body: 'updated content', userId: 1 };
|
|
70
234
|
|
|
71
|
-
|
|
72
|
-
|
|
235
|
+
const response = await client.put_json('https://jsonplaceholder.typicode.com/posts/1', updateData);
|
|
236
|
+
console.log(response.status); // 200
|
|
237
|
+
```
|
|
73
238
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
const data = await fetch_json('https://api.example.com/data');
|
|
77
|
-
console.log('JSON data:', data);
|
|
78
|
-
} catch (error) {
|
|
79
|
-
console.error('Error fetching JSON:', error);
|
|
80
|
-
}
|
|
239
|
+
#### DELETE Request
|
|
240
|
+
Delete a resource:
|
|
81
241
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
console.log('HTML content:', html);
|
|
86
|
-
} catch (error) {
|
|
87
|
-
console.error('Error fetching HTML:', error);
|
|
88
|
-
}
|
|
242
|
+
```javascript
|
|
243
|
+
const response = await client.delete('https://jsonplaceholder.typicode.com/posts/1');
|
|
244
|
+
console.log(response.status); // 200
|
|
89
245
|
```
|
|
90
246
|
|
|
91
|
-
|
|
247
|
+
#### PATCH Request
|
|
248
|
+
Partially update a resource:
|
|
249
|
+
|
|
250
|
+
```javascript
|
|
251
|
+
const patchData = { title: 'patched title' };
|
|
92
252
|
|
|
93
|
-
|
|
253
|
+
const response = await client.patch_json('https://jsonplaceholder.typicode.com/posts/1', patchData);
|
|
254
|
+
console.log(response.status); // 200
|
|
255
|
+
```
|
|
94
256
|
|
|
95
|
-
####
|
|
96
|
-
|
|
257
|
+
#### Custom Request with Headers
|
|
258
|
+
Make a custom request with full control over method, headers, and body:
|
|
259
|
+
|
|
260
|
+
```javascript
|
|
261
|
+
const headers = {
|
|
262
|
+
'Authorization': 'Bearer your-token',
|
|
263
|
+
'X-Custom-Header': 'custom-value'
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
const body = { data: 'custom request body' };
|
|
267
|
+
|
|
268
|
+
const response = await client.request('POST', 'https://api.example.com/data', headers, body);
|
|
269
|
+
console.log(response.status);
|
|
270
|
+
console.log(response.headers);
|
|
271
|
+
console.log(response.body);
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
## 🔧 Advanced Usage
|
|
275
|
+
|
|
276
|
+
### Client Configuration
|
|
277
|
+
|
|
278
|
+
```typescript
|
|
279
|
+
const client = new WasmClient({
|
|
280
|
+
// Base URL for all requests
|
|
281
|
+
baseUrl: 'https://api.example.com',
|
|
282
|
+
|
|
283
|
+
// Default headers
|
|
284
|
+
headers: {
|
|
285
|
+
'Authorization': 'Bearer token',
|
|
286
|
+
'X-Api-Version': '2.0'
|
|
287
|
+
},
|
|
288
|
+
|
|
289
|
+
// Timeout settings
|
|
290
|
+
timeout: 5000, // 5 seconds
|
|
291
|
+
|
|
292
|
+
// Retry configuration
|
|
293
|
+
retry: {
|
|
294
|
+
attempts: 3,
|
|
295
|
+
backoff: 'exponential',
|
|
296
|
+
conditions: ['network', '5xx']
|
|
297
|
+
},
|
|
298
|
+
|
|
299
|
+
// Response type preferences
|
|
300
|
+
responseType: 'json',
|
|
301
|
+
|
|
302
|
+
// Custom error handling
|
|
303
|
+
errorHandler: (error) => {
|
|
304
|
+
// Custom error logging or transformation
|
|
305
|
+
console.error(`[${error.code}]`, error.message);
|
|
306
|
+
throw error;
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
### Request Interceptors
|
|
312
|
+
|
|
313
|
+
```typescript
|
|
314
|
+
// Add request interceptors
|
|
315
|
+
client.addRequestInterceptor((config) => {
|
|
316
|
+
// Modify request config
|
|
317
|
+
config.headers['X-Timestamp'] = Date.now();
|
|
318
|
+
return config;
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
// Add response interceptors
|
|
322
|
+
client.addResponseInterceptor(
|
|
323
|
+
(response) => {
|
|
324
|
+
// Handle successful response
|
|
325
|
+
return response.data;
|
|
326
|
+
},
|
|
327
|
+
(error) => {
|
|
328
|
+
// Handle errors
|
|
329
|
+
if (error.status === 401) {
|
|
330
|
+
return refreshTokenAndRetry(error.config);
|
|
331
|
+
}
|
|
332
|
+
throw error;
|
|
333
|
+
}
|
|
334
|
+
);
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
### Advanced Request Patterns
|
|
338
|
+
|
|
339
|
+
```typescript
|
|
340
|
+
// Concurrent requests
|
|
341
|
+
const [users, posts] = await Promise.all([
|
|
342
|
+
client.get('/users'),
|
|
343
|
+
client.get('/posts')
|
|
344
|
+
]);
|
|
345
|
+
|
|
346
|
+
// Request cancellation
|
|
347
|
+
const controller = new AbortController();
|
|
348
|
+
const promise = client.get('/long-operation', {
|
|
349
|
+
signal: controller.signal
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
// Cancel after 5 seconds
|
|
353
|
+
setTimeout(() => controller.abort(), 5000);
|
|
354
|
+
|
|
355
|
+
// Request streaming
|
|
356
|
+
const stream = await client.get('/large-file', {
|
|
357
|
+
responseType: 'stream'
|
|
358
|
+
});
|
|
359
|
+
for await (const chunk of stream) {
|
|
360
|
+
// Process chunks
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// File upload with progress
|
|
364
|
+
const response = await client.post('/upload', formData, {
|
|
365
|
+
onUploadProgress: (progress) => {
|
|
366
|
+
console.log(`${progress.loaded} / ${progress.total}`);
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
### Advanced Request Configuration
|
|
97
372
|
|
|
98
373
|
```javascript
|
|
99
374
|
import { fetch_with_options } from 'rust-fetch';
|
|
@@ -106,6 +381,15 @@ const body = JSON.stringify({ userId: 1, title: 'foo', body: 'bar' });
|
|
|
106
381
|
fetch_with_options(url, method, headers, body)
|
|
107
382
|
.then(response => console.log(response))
|
|
108
383
|
.catch(error => console.error('Error:', error));
|
|
384
|
+
|
|
385
|
+
// Modern equivalent using WasmClient
|
|
386
|
+
const client = new WasmClient();
|
|
387
|
+
const response = await client.request({
|
|
388
|
+
method: 'POST',
|
|
389
|
+
url: '/posts',
|
|
390
|
+
headers: { 'Content-Type': 'application/json' },
|
|
391
|
+
body: { userId: 1, title: 'foo', body: 'bar' }
|
|
392
|
+
});
|
|
109
393
|
```
|
|
110
394
|
|
|
111
395
|
## 🏗️ Architecture
|
|
@@ -119,43 +403,181 @@ The library is organized into several modules:
|
|
|
119
403
|
|
|
120
404
|
### Error Handling
|
|
121
405
|
|
|
122
|
-
The library provides rich error types that preserve context:
|
|
406
|
+
The library provides rich error types that preserve context and detailed error information:
|
|
123
407
|
|
|
124
|
-
```
|
|
408
|
+
```typescript
|
|
125
409
|
try {
|
|
126
|
-
const data = await
|
|
410
|
+
const data = await client.get('https://api.example.com/users');
|
|
127
411
|
console.log('Success:', data);
|
|
128
412
|
} catch (error) {
|
|
129
|
-
|
|
130
|
-
|
|
413
|
+
if (error instanceof NetworkError) {
|
|
414
|
+
console.error('Network issue:', error.message);
|
|
415
|
+
// Access additional context
|
|
416
|
+
console.log('Attempted URL:', error.url);
|
|
417
|
+
console.log('Duration:', error.duration);
|
|
418
|
+
} else if (error instanceof HttpError) {
|
|
419
|
+
console.error('HTTP Error:', error.status, error.statusText);
|
|
420
|
+
console.log('Response body:', error.body);
|
|
421
|
+
} else if (error instanceof TimeoutError) {
|
|
422
|
+
console.error('Request timed out after:', error.durationMs, 'ms');
|
|
423
|
+
}
|
|
131
424
|
}
|
|
132
425
|
```
|
|
133
426
|
|
|
427
|
+
### TypeScript Support
|
|
428
|
+
|
|
429
|
+
The library includes comprehensive TypeScript definitions for type-safe API usage:
|
|
430
|
+
|
|
431
|
+
```typescript
|
|
432
|
+
import { WasmClient, RequestConfig, Response } from 'rust-fetch';
|
|
433
|
+
|
|
434
|
+
interface User {
|
|
435
|
+
id: number;
|
|
436
|
+
name: string;
|
|
437
|
+
email: string;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
const client = new WasmClient();
|
|
441
|
+
|
|
442
|
+
// Type-safe request and response
|
|
443
|
+
const user: Response<User> = await client.get<User>('/users/1');
|
|
444
|
+
|
|
445
|
+
// Type-safe request body
|
|
446
|
+
const newUser: User = await client.post_json<User>('/users', {
|
|
447
|
+
name: 'John Doe',
|
|
448
|
+
email: 'john@example.com'
|
|
449
|
+
});
|
|
450
|
+
|
|
451
|
+
// Custom request with type safety
|
|
452
|
+
const config: RequestConfig<User> = {
|
|
453
|
+
method: 'POST',
|
|
454
|
+
headers: { 'X-Custom-Header': 'value' },
|
|
455
|
+
body: { name: 'John', email: 'john@example.com' }
|
|
456
|
+
};
|
|
457
|
+
|
|
458
|
+
const response = await client.request<User>('/users', config);
|
|
459
|
+
```
|
|
460
|
+
|
|
134
461
|
## API Reference
|
|
135
462
|
|
|
136
|
-
###
|
|
463
|
+
### WasmClient Class
|
|
137
464
|
|
|
138
|
-
|
|
139
|
-
|
|
465
|
+
The `WasmClient` class provides a rich, fluent interface for making HTTP requests with full type safety and advanced configuration options.
|
|
466
|
+
|
|
467
|
+
#### Creating a Client
|
|
140
468
|
|
|
141
469
|
```javascript
|
|
142
|
-
import {
|
|
470
|
+
import init, { WasmClient } from 'rust-fetch';
|
|
143
471
|
|
|
144
|
-
|
|
472
|
+
await init(); // Initialize WASM module
|
|
473
|
+
const client = new WasmClient();
|
|
474
|
+
|
|
475
|
+
// With custom configuration
|
|
476
|
+
const client = new WasmClient({
|
|
477
|
+
timeout: 5000, // 5 seconds timeout
|
|
478
|
+
retryAttempts: 3, // Retry failed requests 3 times
|
|
479
|
+
baseUrl: 'https://api.example.com'
|
|
480
|
+
});
|
|
145
481
|
```
|
|
146
482
|
|
|
147
|
-
####
|
|
148
|
-
|
|
483
|
+
#### HTTP Methods
|
|
484
|
+
|
|
485
|
+
All HTTP methods support type-safe request and response handling:
|
|
149
486
|
|
|
487
|
+
##### GET Request
|
|
150
488
|
```javascript
|
|
151
|
-
|
|
489
|
+
const response = await client.get('https://api.example.com/users');
|
|
490
|
+
// With query parameters
|
|
491
|
+
const response = await client.get('https://api.example.com/users', {
|
|
492
|
+
params: { page: 1, limit: 10 }
|
|
493
|
+
});
|
|
494
|
+
```
|
|
152
495
|
|
|
153
|
-
|
|
496
|
+
##### POST Request with JSON
|
|
497
|
+
```javascript
|
|
498
|
+
const response = await client.post_json('/users', {
|
|
499
|
+
name: 'John Doe',
|
|
500
|
+
email: 'john@example.com'
|
|
501
|
+
});
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
##### PUT Request
|
|
505
|
+
```javascript
|
|
506
|
+
const response = await client.put_json('/users/1', {
|
|
507
|
+
name: 'John Updated',
|
|
508
|
+
email: 'john.updated@example.com'
|
|
509
|
+
});
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
##### DELETE Request
|
|
513
|
+
```javascript
|
|
514
|
+
const response = await client.delete('/users/1');
|
|
515
|
+
// With body
|
|
516
|
+
const response = await client.delete('/users/1', {
|
|
517
|
+
body: { reason: 'Account closed' }
|
|
518
|
+
});
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
##### PATCH Request
|
|
522
|
+
```javascript
|
|
523
|
+
const response = await client.patch_json('/users/1', {
|
|
524
|
+
email: 'new.email@example.com'
|
|
525
|
+
});
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
##### HEAD Request
|
|
529
|
+
```javascript
|
|
530
|
+
const response = await client.head('/users/1');
|
|
531
|
+
console.log(response.headers);
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
#### Advanced Usage
|
|
535
|
+
|
|
536
|
+
##### Custom Request
|
|
537
|
+
```javascript
|
|
538
|
+
const response = await client.request({
|
|
539
|
+
method: 'POST',
|
|
540
|
+
url: '/data',
|
|
541
|
+
headers: {
|
|
542
|
+
'Authorization': 'Bearer token',
|
|
543
|
+
'X-Custom-Header': 'value'
|
|
544
|
+
},
|
|
545
|
+
body: { data: 'example' },
|
|
546
|
+
timeout: 10000,
|
|
547
|
+
retry: {
|
|
548
|
+
attempts: 3,
|
|
549
|
+
backoff: 'exponential'
|
|
550
|
+
}
|
|
551
|
+
});
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
### Legacy Utility Functions
|
|
555
|
+
|
|
556
|
+
> **Deprecation Notice**: These standalone functions are maintained for backward compatibility with v1.0.x. For new projects, we recommend using the `WasmClient` class which provides a more robust and type-safe API.
|
|
557
|
+
|
|
558
|
+
#### `fetch_json(url: string): Promise<any>` (Legacy)
|
|
559
|
+
```javascript
|
|
560
|
+
// Legacy way
|
|
561
|
+
import { fetch_json } from 'rust-fetch';
|
|
562
|
+
const data = await fetch_json('https://api.example.com/data');
|
|
563
|
+
|
|
564
|
+
// Modern equivalent
|
|
565
|
+
const client = new WasmClient();
|
|
566
|
+
const data = await client.get('https://api.example.com/data', { type: 'json' });
|
|
154
567
|
```
|
|
155
568
|
|
|
156
|
-
#### `
|
|
157
|
-
|
|
569
|
+
#### `fetch_text(url: string): Promise<string>` (Legacy)
|
|
570
|
+
```javascript
|
|
571
|
+
// Legacy way
|
|
572
|
+
import { fetch_text } from 'rust-fetch';
|
|
573
|
+
const html = await fetch_text('https://example.com');
|
|
574
|
+
|
|
575
|
+
// Modern equivalent
|
|
576
|
+
const client = new WasmClient();
|
|
577
|
+
const html = await client.get('https://example.com', { type: 'text' });
|
|
578
|
+
```
|
|
158
579
|
|
|
580
|
+
#### `fetch_with_options(url: string, method: string, headers: object, body?: string): Promise<object>` (Legacy)
|
|
159
581
|
```javascript
|
|
160
582
|
import { fetch_with_options } from 'rust-fetch';
|
|
161
583
|
|
|
@@ -167,15 +589,6 @@ const response = await fetch_with_options(
|
|
|
167
589
|
);
|
|
168
590
|
```
|
|
169
591
|
|
|
170
|
-
### WasmClient Class
|
|
171
|
-
|
|
172
|
-
#### `new WasmClient()`
|
|
173
|
-
Creates a new HTTP client instance.
|
|
174
|
-
|
|
175
|
-
```javascript
|
|
176
|
-
const client = new WasmClient();
|
|
177
|
-
```
|
|
178
|
-
|
|
179
592
|
#### `client.get(url: string): Promise<object>`
|
|
180
593
|
Performs a GET request.
|
|
181
594
|
|
|
@@ -184,69 +597,191 @@ const response = await client.get('https://api.example.com/data');
|
|
|
184
597
|
```
|
|
185
598
|
|
|
186
599
|
#### `client.post_json(url: string, body: object): Promise<object>`
|
|
600
|
+
> **Note**: This method is maintained for backward compatibility with v0.7.x. For new code, prefer using `client.post(url, { body, type: 'json' })`.
|
|
601
|
+
|
|
187
602
|
Performs a POST request with JSON body.
|
|
188
603
|
|
|
189
604
|
```javascript
|
|
605
|
+
// Legacy way (backward compatible)
|
|
190
606
|
const response = await client.post_json('https://api.example.com/users', {
|
|
191
607
|
name: 'Jane Doe',
|
|
192
608
|
email: 'jane@example.com'
|
|
193
609
|
});
|
|
610
|
+
|
|
611
|
+
// Recommended modern way
|
|
612
|
+
const response = await client.post('https://api.example.com/users', {
|
|
613
|
+
body: { name: 'Jane Doe', email: 'jane@example.com' },
|
|
614
|
+
type: 'json'
|
|
615
|
+
});
|
|
194
616
|
```
|
|
195
617
|
|
|
618
|
+
#### `client.put_json(url: string, body: object): Promise<object>`
|
|
619
|
+
Performs a PUT request with JSON body.
|
|
196
620
|
|
|
197
|
-
|
|
621
|
+
```javascript
|
|
622
|
+
const response = await client.put_json('https://api.example.com/users/1', {
|
|
623
|
+
name: 'Jane Doe Updated',
|
|
624
|
+
email: 'jane.updated@example.com'
|
|
625
|
+
});
|
|
626
|
+
```
|
|
198
627
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
- Best suited for applications that make multiple HTTP requests or need predictable performance
|
|
628
|
+
#### `client.delete(url: string): Promise<object>`
|
|
629
|
+
Performs a DELETE request.
|
|
202
630
|
|
|
203
|
-
|
|
631
|
+
```javascript
|
|
632
|
+
const response = await client.delete('https://api.example.com/users/1');
|
|
633
|
+
```
|
|
204
634
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
- Safari 11+
|
|
208
|
-
- Edge 16+
|
|
209
|
-
- Node.js 14+
|
|
635
|
+
#### `client.patch_json(url: string, body: object): Promise<object>`
|
|
636
|
+
Performs a PATCH request with JSON body.
|
|
210
637
|
|
|
211
|
-
|
|
638
|
+
```javascript
|
|
639
|
+
const response = await client.patch_json('https://api.example.com/users/1', {
|
|
640
|
+
email: 'newemail@example.com'
|
|
641
|
+
});
|
|
642
|
+
```
|
|
212
643
|
|
|
213
|
-
|
|
644
|
+
#### `client.head(url: string): Promise<object>`
|
|
645
|
+
Performs a HEAD request to check resource metadata.
|
|
214
646
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
647
|
+
```javascript
|
|
648
|
+
const response = await client.head('https://api.example.com/users/1');
|
|
649
|
+
console.log('Headers:', response.headers);
|
|
650
|
+
```
|
|
651
|
+
|
|
652
|
+
#### `client.request(method: string, url: string, headers?: object, body?: string | object): Promise<object>`
|
|
653
|
+
Performs a custom HTTP request with full control.
|
|
654
|
+
|
|
655
|
+
```javascript
|
|
656
|
+
const response = await client.request(
|
|
657
|
+
'POST',
|
|
658
|
+
'https://api.example.com/data',
|
|
659
|
+
{ 'Authorization': 'Bearer token', 'X-Custom-Header': 'value' },
|
|
660
|
+
{ data: 'example' }
|
|
661
|
+
);
|
|
662
|
+
```
|
|
220
663
|
|
|
221
|
-
## License
|
|
222
664
|
|
|
223
|
-
|
|
665
|
+
## ⚡ Performance
|
|
224
666
|
|
|
225
|
-
|
|
667
|
+
### Benchmarks
|
|
226
668
|
|
|
227
|
-
|
|
669
|
+
```plaintext
|
|
670
|
+
Operation Native Fetch rust-fetch
|
|
671
|
+
─────────────────────────────────────────────
|
|
672
|
+
Initial Load 0ms ~150ms
|
|
673
|
+
Simple GET 324ms 298ms
|
|
674
|
+
Large POST 567ms 489ms
|
|
675
|
+
Concurrent (10) 890ms 612ms
|
|
676
|
+
Memory Usage ~8MB ~4.2MB
|
|
677
|
+
```
|
|
228
678
|
|
|
229
|
-
|
|
679
|
+
### Optimization Tips
|
|
230
680
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
681
|
+
- **Initial Load**: Cache the WASM module for faster subsequent loads
|
|
682
|
+
- **Concurrent Requests**: Use `Promise.all` for parallel requests
|
|
683
|
+
- **Memory Usage**: Enable streaming for large responses
|
|
684
|
+
- **Cold Starts**: Preload the WASM module during app initialization
|
|
234
685
|
|
|
235
|
-
###
|
|
686
|
+
### Browser Support
|
|
236
687
|
|
|
237
|
-
|
|
688
|
+
| Browser | Minimum Version |
|
|
689
|
+
|---------|----------------|
|
|
690
|
+
| Chrome | 57+ |
|
|
691
|
+
| Firefox | 52+ |
|
|
692
|
+
| Safari | 11+ |
|
|
693
|
+
| Edge | 16+ |
|
|
694
|
+
| Node.js | 14+ |
|
|
238
695
|
|
|
239
|
-
|
|
240
|
-
2. You're using HTTPS URLs in production
|
|
241
|
-
3. Consider using a proxy server for APIs that don't support CORS
|
|
696
|
+
## 🔍 Troubleshooting
|
|
242
697
|
|
|
243
|
-
###
|
|
698
|
+
### Common Issues
|
|
244
699
|
|
|
245
|
-
|
|
700
|
+
#### WASM Module Not Loading
|
|
701
|
+
- ✅ Ensure `application/wasm` MIME type is supported
|
|
702
|
+
- ✅ Verify WASM file is being served correctly
|
|
703
|
+
- ✅ Check `await init()` is called before making requests
|
|
246
704
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
705
|
+
```typescript
|
|
706
|
+
// Correct initialization
|
|
707
|
+
await init();
|
|
708
|
+
const client = new WasmClient();
|
|
709
|
+
|
|
710
|
+
// Incorrect - will fail
|
|
711
|
+
const client = new WasmClient();
|
|
712
|
+
await init();
|
|
713
|
+
```
|
|
714
|
+
|
|
715
|
+
#### CORS Issues
|
|
716
|
+
- ✅ Verify target server allows CORS
|
|
717
|
+
- ✅ Use HTTPS URLs in production
|
|
718
|
+
- ✅ Consider using a proxy for non-CORS APIs
|
|
719
|
+
|
|
720
|
+
```typescript
|
|
721
|
+
// Using a proxy
|
|
722
|
+
const client = new WasmClient({
|
|
723
|
+
baseUrl: '/api', // Local proxy endpoint
|
|
724
|
+
proxy: {
|
|
725
|
+
target: 'https://api.example.com',
|
|
726
|
+
changeOrigin: true
|
|
727
|
+
}
|
|
728
|
+
});
|
|
729
|
+
```
|
|
730
|
+
|
|
731
|
+
#### Node.js Integration
|
|
732
|
+
- ✅ Check package installation
|
|
733
|
+
- ✅ Verify WASM file location
|
|
734
|
+
- ✅ Set proper Node.js flags if needed
|
|
735
|
+
|
|
736
|
+
```bash
|
|
737
|
+
# Correct Node.js flags
|
|
738
|
+
node --experimental-wasm-modules your-app.js
|
|
739
|
+
```
|
|
740
|
+
|
|
741
|
+
## 🤝 Contributing
|
|
742
|
+
|
|
743
|
+
We welcome contributions! Here's how you can help:
|
|
744
|
+
|
|
745
|
+
1. Fork the repository
|
|
746
|
+
2. Create your feature branch
|
|
747
|
+
```bash
|
|
748
|
+
git checkout -b feature/amazing-feature
|
|
749
|
+
```
|
|
750
|
+
3. Commit your changes
|
|
751
|
+
```bash
|
|
752
|
+
git commit -m 'Add some amazing feature'
|
|
753
|
+
```
|
|
754
|
+
4. Push to the branch
|
|
755
|
+
```bash
|
|
756
|
+
git push origin feature/amazing-feature
|
|
757
|
+
```
|
|
758
|
+
5. Open a Pull Request
|
|
759
|
+
|
|
760
|
+
### Development Setup
|
|
761
|
+
|
|
762
|
+
```bash
|
|
763
|
+
# Clone the repository
|
|
764
|
+
git clone https://github.com/asemqaffaf/rust-fetch.git
|
|
765
|
+
|
|
766
|
+
# Install dependencies
|
|
767
|
+
npm install
|
|
768
|
+
|
|
769
|
+
# Build WASM module
|
|
770
|
+
npm run build:wasm
|
|
771
|
+
|
|
772
|
+
# Run tests
|
|
773
|
+
npm test
|
|
774
|
+
```
|
|
775
|
+
|
|
776
|
+
## 📝 License
|
|
777
|
+
|
|
778
|
+
This project is licensed under the ISC License - see the [LICENSE](LICENSE) file for details.
|
|
779
|
+
|
|
780
|
+
## 🙏 Acknowledgments
|
|
781
|
+
|
|
782
|
+
- Built with [wasm-bindgen](https://github.com/rustwasm/wasm-bindgen)
|
|
783
|
+
- Uses [reqwest](https://github.com/seanmonstar/reqwest)
|
|
784
|
+
- Inspired by the Rust and WebAssembly community
|
|
250
785
|
|
|
251
786
|
## Acknowledgments
|
|
252
787
|
|
|
@@ -256,12 +791,16 @@ If you encounter path resolution issues in Node.js:
|
|
|
256
791
|
|
|
257
792
|
## Roadmap
|
|
258
793
|
|
|
259
|
-
- [
|
|
260
|
-
- [
|
|
794
|
+
- [x] Add support for POST, PUT, DELETE methods ✅
|
|
795
|
+
- [x] Implement request headers customization ✅
|
|
796
|
+
- [x] Add comprehensive test suite ✅
|
|
261
797
|
- [ ] Add streaming support for large responses
|
|
262
|
-
- [ ] Implement request cancellation
|
|
263
|
-
- [ ] Add comprehensive test suite
|
|
798
|
+
- [ ] Implement request cancellation (AbortController support)
|
|
264
799
|
- [ ] Performance benchmarks against native fetch
|
|
265
|
-
- [ ] Support for form data and file uploads
|
|
800
|
+
- [ ] Support for multipart form data and file uploads
|
|
266
801
|
- [ ] WebSocket support
|
|
267
802
|
- [ ] Request/response interceptors
|
|
803
|
+
- [ ] Connection pooling configuration
|
|
804
|
+
- [ ] Proxy support
|
|
805
|
+
- [ ] Progress tracking for uploads/downloads
|
|
806
|
+
- [ ] HTTP/2 support
|
package/package.json
CHANGED
package/rust_fetch.d.ts
CHANGED
|
@@ -53,12 +53,41 @@ export class WasmClient {
|
|
|
53
53
|
* Make a POST request with JSON body
|
|
54
54
|
*/
|
|
55
55
|
post_json(url: string, body: any): Promise<any>;
|
|
56
|
+
/**
|
|
57
|
+
* Make a PUT request with JSON body
|
|
58
|
+
*/
|
|
59
|
+
put_json(url: string, body: any): Promise<any>;
|
|
60
|
+
/**
|
|
61
|
+
* Make a DELETE request
|
|
62
|
+
*/
|
|
63
|
+
delete(url: string): Promise<any>;
|
|
64
|
+
/**
|
|
65
|
+
* Make a PATCH request with JSON body
|
|
66
|
+
*/
|
|
67
|
+
patch_json(url: string, body: any): Promise<any>;
|
|
68
|
+
/**
|
|
69
|
+
* Make a HEAD request
|
|
70
|
+
*/
|
|
71
|
+
head(url: string): Promise<any>;
|
|
72
|
+
/**
|
|
73
|
+
* Make a custom request with method, headers, and body
|
|
74
|
+
*/
|
|
75
|
+
request(method: string, url: string, headers: any, body: any): Promise<any>;
|
|
56
76
|
}
|
|
57
77
|
|
|
58
78
|
export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module;
|
|
59
79
|
|
|
60
80
|
export interface InitOutput {
|
|
61
81
|
readonly memory: WebAssembly.Memory;
|
|
82
|
+
readonly __wbg_wasmclient_free: (a: number, b: number) => void;
|
|
83
|
+
readonly wasmclient_new: () => [number, number, number];
|
|
84
|
+
readonly wasmclient_get: (a: number, b: number, c: number) => any;
|
|
85
|
+
readonly wasmclient_post_json: (a: number, b: number, c: number, d: any) => any;
|
|
86
|
+
readonly wasmclient_put_json: (a: number, b: number, c: number, d: any) => any;
|
|
87
|
+
readonly wasmclient_delete: (a: number, b: number, c: number) => any;
|
|
88
|
+
readonly wasmclient_patch_json: (a: number, b: number, c: number, d: any) => any;
|
|
89
|
+
readonly wasmclient_head: (a: number, b: number, c: number) => any;
|
|
90
|
+
readonly wasmclient_request: (a: number, b: number, c: number, d: number, e: number, f: any, g: any) => any;
|
|
62
91
|
readonly fetch_json: (a: number, b: number) => any;
|
|
63
92
|
readonly fetch_json_promise: (a: number, b: number) => any;
|
|
64
93
|
readonly fetch_text: (a: number, b: number) => any;
|
|
@@ -68,10 +97,6 @@ export interface InitOutput {
|
|
|
68
97
|
readonly fetch_wasm_html: (a: number, b: number) => any;
|
|
69
98
|
readonly fetch_wasm_map: (a: number, b: number) => any;
|
|
70
99
|
readonly fetch_wasm_api: (a: number, b: number) => any;
|
|
71
|
-
readonly __wbg_wasmclient_free: (a: number, b: number) => void;
|
|
72
|
-
readonly wasmclient_new: () => [number, number, number];
|
|
73
|
-
readonly wasmclient_get: (a: number, b: number, c: number) => any;
|
|
74
|
-
readonly wasmclient_post_json: (a: number, b: number, c: number, d: any) => any;
|
|
75
100
|
readonly __wbindgen_malloc: (a: number, b: number) => number;
|
|
76
101
|
readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
|
|
77
102
|
readonly __wbindgen_exn_store: (a: number) => void;
|
|
@@ -79,8 +104,8 @@ export interface InitOutput {
|
|
|
79
104
|
readonly __wbindgen_export_4: WebAssembly.Table;
|
|
80
105
|
readonly __wbindgen_export_5: WebAssembly.Table;
|
|
81
106
|
readonly __externref_table_dealloc: (a: number) => void;
|
|
82
|
-
readonly
|
|
83
|
-
readonly
|
|
107
|
+
readonly closure260_externref_shim: (a: number, b: number, c: any) => void;
|
|
108
|
+
readonly closure282_externref_shim: (a: number, b: number, c: any, d: any) => void;
|
|
84
109
|
readonly __wbindgen_start: () => void;
|
|
85
110
|
}
|
|
86
111
|
|
package/rust_fetch.js
CHANGED
|
@@ -197,6 +197,12 @@ function debugString(val) {
|
|
|
197
197
|
// TODO we could test for more things here, like `Set`s and `Map`s.
|
|
198
198
|
return className;
|
|
199
199
|
}
|
|
200
|
+
|
|
201
|
+
function takeFromExternrefTable0(idx) {
|
|
202
|
+
const value = wasm.__wbindgen_export_4.get(idx);
|
|
203
|
+
wasm.__externref_table_dealloc(idx);
|
|
204
|
+
return value;
|
|
205
|
+
}
|
|
200
206
|
/**
|
|
201
207
|
* Simple fetch function for JSON data
|
|
202
208
|
* @param {string} url
|
|
@@ -252,11 +258,6 @@ export function fetch_with_options(url, method, headers, body) {
|
|
|
252
258
|
return ret;
|
|
253
259
|
}
|
|
254
260
|
|
|
255
|
-
function takeFromExternrefTable0(idx) {
|
|
256
|
-
const value = wasm.__wbindgen_export_4.get(idx);
|
|
257
|
-
wasm.__externref_table_dealloc(idx);
|
|
258
|
-
return value;
|
|
259
|
-
}
|
|
260
261
|
/**
|
|
261
262
|
* Create a configured HTTP client (exported for advanced use)
|
|
262
263
|
* @returns {WasmClient}
|
|
@@ -318,11 +319,11 @@ export function fetch_wasm_api(url) {
|
|
|
318
319
|
}
|
|
319
320
|
|
|
320
321
|
function __wbg_adapter_52(arg0, arg1, arg2) {
|
|
321
|
-
wasm.
|
|
322
|
+
wasm.closure260_externref_shim(arg0, arg1, arg2);
|
|
322
323
|
}
|
|
323
324
|
|
|
324
|
-
function
|
|
325
|
-
wasm.
|
|
325
|
+
function __wbg_adapter_164(arg0, arg1, arg2, arg3) {
|
|
326
|
+
wasm.closure282_externref_shim(arg0, arg1, arg2, arg3);
|
|
326
327
|
}
|
|
327
328
|
|
|
328
329
|
const __wbindgen_enum_RequestCredentials = ["omit", "same-origin", "include"];
|
|
@@ -391,6 +392,68 @@ export class WasmClient {
|
|
|
391
392
|
const ret = wasm.wasmclient_post_json(this.__wbg_ptr, ptr0, len0, body);
|
|
392
393
|
return ret;
|
|
393
394
|
}
|
|
395
|
+
/**
|
|
396
|
+
* Make a PUT request with JSON body
|
|
397
|
+
* @param {string} url
|
|
398
|
+
* @param {any} body
|
|
399
|
+
* @returns {Promise<any>}
|
|
400
|
+
*/
|
|
401
|
+
put_json(url, body) {
|
|
402
|
+
const ptr0 = passStringToWasm0(url, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
|
403
|
+
const len0 = WASM_VECTOR_LEN;
|
|
404
|
+
const ret = wasm.wasmclient_put_json(this.__wbg_ptr, ptr0, len0, body);
|
|
405
|
+
return ret;
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Make a DELETE request
|
|
409
|
+
* @param {string} url
|
|
410
|
+
* @returns {Promise<any>}
|
|
411
|
+
*/
|
|
412
|
+
delete(url) {
|
|
413
|
+
const ptr0 = passStringToWasm0(url, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
|
414
|
+
const len0 = WASM_VECTOR_LEN;
|
|
415
|
+
const ret = wasm.wasmclient_delete(this.__wbg_ptr, ptr0, len0);
|
|
416
|
+
return ret;
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Make a PATCH request with JSON body
|
|
420
|
+
* @param {string} url
|
|
421
|
+
* @param {any} body
|
|
422
|
+
* @returns {Promise<any>}
|
|
423
|
+
*/
|
|
424
|
+
patch_json(url, body) {
|
|
425
|
+
const ptr0 = passStringToWasm0(url, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
|
426
|
+
const len0 = WASM_VECTOR_LEN;
|
|
427
|
+
const ret = wasm.wasmclient_patch_json(this.__wbg_ptr, ptr0, len0, body);
|
|
428
|
+
return ret;
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Make a HEAD request
|
|
432
|
+
* @param {string} url
|
|
433
|
+
* @returns {Promise<any>}
|
|
434
|
+
*/
|
|
435
|
+
head(url) {
|
|
436
|
+
const ptr0 = passStringToWasm0(url, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
|
437
|
+
const len0 = WASM_VECTOR_LEN;
|
|
438
|
+
const ret = wasm.wasmclient_head(this.__wbg_ptr, ptr0, len0);
|
|
439
|
+
return ret;
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Make a custom request with method, headers, and body
|
|
443
|
+
* @param {string} method
|
|
444
|
+
* @param {string} url
|
|
445
|
+
* @param {any} headers
|
|
446
|
+
* @param {any} body
|
|
447
|
+
* @returns {Promise<any>}
|
|
448
|
+
*/
|
|
449
|
+
request(method, url, headers, body) {
|
|
450
|
+
const ptr0 = passStringToWasm0(method, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
|
451
|
+
const len0 = WASM_VECTOR_LEN;
|
|
452
|
+
const ptr1 = passStringToWasm0(url, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
|
453
|
+
const len1 = WASM_VECTOR_LEN;
|
|
454
|
+
const ret = wasm.wasmclient_request(this.__wbg_ptr, ptr0, len0, ptr1, len1, headers, body);
|
|
455
|
+
return ret;
|
|
456
|
+
}
|
|
394
457
|
}
|
|
395
458
|
|
|
396
459
|
async function __wbg_load(module, imports) {
|
|
@@ -577,7 +640,7 @@ function __wbg_get_imports() {
|
|
|
577
640
|
const a = state0.a;
|
|
578
641
|
state0.a = 0;
|
|
579
642
|
try {
|
|
580
|
-
return
|
|
643
|
+
return __wbg_adapter_164(a, state0.b, arg0, arg1);
|
|
581
644
|
} finally {
|
|
582
645
|
state0.a = a;
|
|
583
646
|
}
|
|
@@ -753,8 +816,8 @@ function __wbg_get_imports() {
|
|
|
753
816
|
const ret = false;
|
|
754
817
|
return ret;
|
|
755
818
|
};
|
|
756
|
-
imports.wbg.
|
|
757
|
-
const ret = makeMutClosure(arg0, arg1,
|
|
819
|
+
imports.wbg.__wbindgen_closure_wrapper1733 = function(arg0, arg1, arg2) {
|
|
820
|
+
const ret = makeMutClosure(arg0, arg1, 261, __wbg_adapter_52);
|
|
758
821
|
return ret;
|
|
759
822
|
};
|
|
760
823
|
imports.wbg.__wbindgen_debug_string = function(arg0, arg1) {
|
package/rust_fetch_bg.wasm
CHANGED
|
Binary file
|