bmlt-query-client 1.0.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/.eslintrc.json +23 -0
- package/PROJECT_SUMMARY.md +166 -0
- package/README.md +272 -0
- package/README.old.md +490 -0
- package/dist/app.js +1738 -0
- package/dist/app.js.map +1 -0
- package/package.json +62 -0
- package/test/setup.ts +16 -0
- package/vite.config.ts +35 -0
- package/vite.esm.config.ts +20 -0
package/.eslintrc.json
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"parser": "@typescript-eslint/parser",
|
|
3
|
+
"plugins": ["@typescript-eslint"],
|
|
4
|
+
"extends": [
|
|
5
|
+
"eslint:recommended"
|
|
6
|
+
],
|
|
7
|
+
"env": {
|
|
8
|
+
"browser": true,
|
|
9
|
+
"node": true,
|
|
10
|
+
"es2020": true
|
|
11
|
+
},
|
|
12
|
+
"parserOptions": {
|
|
13
|
+
"ecmaVersion": 2020,
|
|
14
|
+
"sourceType": "module"
|
|
15
|
+
},
|
|
16
|
+
"rules": {
|
|
17
|
+
"prefer-const": "error",
|
|
18
|
+
"no-var": "error",
|
|
19
|
+
"no-unused-vars": "off",
|
|
20
|
+
"no-useless-catch": "off"
|
|
21
|
+
},
|
|
22
|
+
"ignorePatterns": ["dist/", "node_modules/"]
|
|
23
|
+
}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# BMLT Query Client - Project Complete! ๐
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
A comprehensive TypeScript client for querying BMLT (Basic Meeting List Tool) servers with built-in geocoding support using Nominatim. Successfully replaces the broken `StringSearchIsAnAddress` functionality with reliable, rate-limited geocoding.
|
|
5
|
+
|
|
6
|
+
## โ
Completed Features
|
|
7
|
+
|
|
8
|
+
### ๐ Core Functionality
|
|
9
|
+
- **Full TypeScript Support** - Complete type definitions for all BMLT API endpoints
|
|
10
|
+
- **All BMLT Endpoints** - Complete coverage of the BMLT Semantic API
|
|
11
|
+
- **Fluent Query Builder** - Chainable methods for complex searches
|
|
12
|
+
- **Geographic Search** - Address-to-coordinate conversion with radius search
|
|
13
|
+
|
|
14
|
+
### ๐ Geocoding Service
|
|
15
|
+
- **Nominatim Integration** - OpenStreetMap-based geocoding
|
|
16
|
+
- **US Region Bias** - Defaults to US (`countryCode: 'us'`)
|
|
17
|
+
- **Custom Region Support** - Country codes and viewbox restrictions
|
|
18
|
+
- **First Result Selection** - Always takes the most relevant result
|
|
19
|
+
- **Rate Limiting** - Respects Nominatim's 1-request-per-second limit
|
|
20
|
+
- **Retry Logic** - Exponential backoff with configurable retry counts
|
|
21
|
+
|
|
22
|
+
### ๐ก๏ธ Error Handling
|
|
23
|
+
- **Comprehensive Error Types** - Specific error classes for different failures
|
|
24
|
+
- **User-Friendly Messages** - Clean error messages for end users
|
|
25
|
+
- **Retry Detection** - Automatic identification of retryable vs non-retryable errors
|
|
26
|
+
- **Network Resilience** - Handles timeouts, network failures, and rate limits
|
|
27
|
+
|
|
28
|
+
### ๐ก API Coverage
|
|
29
|
+
All BMLT Semantic API endpoints:
|
|
30
|
+
- `GetSearchResults` - Meeting searches with extensive filtering
|
|
31
|
+
- `GetFormats` - Available meeting formats
|
|
32
|
+
- `GetServiceBodies` - Service body hierarchy
|
|
33
|
+
- `GetChanges` - Meeting change logs
|
|
34
|
+
- `GetFieldKeys` - Available field definitions
|
|
35
|
+
- `GetFieldValues` - Field value enumeration
|
|
36
|
+
- `GetNAWSDump` - NAWS export format
|
|
37
|
+
- `GetServerInfo` - Server capabilities
|
|
38
|
+
- `GetCoverageArea` - Geographic coverage
|
|
39
|
+
|
|
40
|
+
### ๐งช Testing & Examples
|
|
41
|
+
- **Real NYC Demo Server** - All examples use `https://latest.aws.bmlt.app/main_server`
|
|
42
|
+
- **Integration Tests** - Comprehensive test suite with real API calls
|
|
43
|
+
- **Working Examples** - Complete usage examples with actual NYC data
|
|
44
|
+
- **Error Scenarios** - Proper error handling demonstrations
|
|
45
|
+
|
|
46
|
+
## ๐ Project Structure
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
bmlt-query-client/
|
|
50
|
+
โโโ src/
|
|
51
|
+
โ โโโ types/ # TypeScript interfaces and enums
|
|
52
|
+
โ โ โโโ base.ts # Core types and enums
|
|
53
|
+
โ โ โโโ requests.ts # Request parameter interfaces
|
|
54
|
+
โ โ โโโ responses.ts # Response data interfaces
|
|
55
|
+
โ โ โโโ index.ts # Type exports
|
|
56
|
+
โ โโโ services/
|
|
57
|
+
โ โ โโโ geocoding.ts # Nominatim geocoding service
|
|
58
|
+
โ โโโ client/
|
|
59
|
+
โ โ โโโ bmlt-client.ts # Main BMLT API client
|
|
60
|
+
โ โ โโโ query-builder.ts # Fluent query builder
|
|
61
|
+
โ โโโ utils/
|
|
62
|
+
โ โ โโโ url-builder.ts # URL construction utilities
|
|
63
|
+
โ โ โโโ errors.ts # Error handling classes
|
|
64
|
+
โ โโโ index.ts # Main exports
|
|
65
|
+
โโโ examples/
|
|
66
|
+
โ โโโ basic-usage.ts # Complete working examples
|
|
67
|
+
โโโ test/
|
|
68
|
+
โ โโโ basic.test.ts # Integration tests
|
|
69
|
+
โ โโโ setup.ts # Test configuration
|
|
70
|
+
โโโ dist/ # Compiled JavaScript output
|
|
71
|
+
โโโ README.md # Comprehensive documentation
|
|
72
|
+
โโโ package.json # NPM package configuration
|
|
73
|
+
โโโ tsconfig.json # TypeScript configuration
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## ๐ Quick Start
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
import { BmltClient, Weekday, VenueType } from 'bmlt-query-client';
|
|
80
|
+
|
|
81
|
+
// Initialize client with NYC demo server
|
|
82
|
+
const client = new BmltClient({
|
|
83
|
+
rootServerURL: 'https://latest.aws.bmlt.app/main_server'
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
// Search by address with automatic geocoding
|
|
87
|
+
const meetings = await client.searchMeetingsByAddress({
|
|
88
|
+
address: 'Times Square, New York, NY',
|
|
89
|
+
radiusMiles: 2,
|
|
90
|
+
sortByDistance: true
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
// Use fluent query builder
|
|
94
|
+
const virtualMeetings = await new MeetingQueryBuilder(client)
|
|
95
|
+
.virtualOnly()
|
|
96
|
+
.onWeekdays(Weekday.MONDAY, Weekday.WEDNESDAY)
|
|
97
|
+
.startingAfter(18, 0)
|
|
98
|
+
.execute();
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## ๐ฆ Build & Distribution
|
|
102
|
+
|
|
103
|
+
- **โ
TypeScript Compilation** - Successfully compiles to JavaScript
|
|
104
|
+
- **โ
Type Declarations** - Complete `.d.ts` files generated
|
|
105
|
+
- **โ
Source Maps** - Full debugging support
|
|
106
|
+
- **โ
NPM Ready** - Package configured for publishing
|
|
107
|
+
- **โ
ESLint Configuration** - Code quality enforcement
|
|
108
|
+
- **โ
Jest Testing** - Complete test infrastructure
|
|
109
|
+
|
|
110
|
+
## ๐ฏ Key Improvements Over StringSearchIsAnAddress
|
|
111
|
+
|
|
112
|
+
1. **Reliability** - No more broken geocoding functionality
|
|
113
|
+
2. **Rate Limiting** - Respects external service limits
|
|
114
|
+
3. **Error Handling** - Graceful failure handling with retry logic
|
|
115
|
+
4. **Region Bias** - Improved address matching with country/region preferences
|
|
116
|
+
5. **Consistency** - Always returns first (most relevant) result
|
|
117
|
+
6. **Type Safety** - Full TypeScript support with comprehensive types
|
|
118
|
+
|
|
119
|
+
## ๐ Next Steps
|
|
120
|
+
|
|
121
|
+
### Publishing to NPM
|
|
122
|
+
1. Update author information in `package.json`
|
|
123
|
+
2. Set up GitHub repository
|
|
124
|
+
3. Run `npm publish` to release to NPM registry
|
|
125
|
+
|
|
126
|
+
### Optional Enhancements
|
|
127
|
+
- Add caching layer for geocoding results
|
|
128
|
+
- Support for additional geocoding providers
|
|
129
|
+
- WebSocket support for real-time updates
|
|
130
|
+
- React hooks for easy integration
|
|
131
|
+
- CLI tool for server administration
|
|
132
|
+
|
|
133
|
+
## ๐ง Commands
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
# Install dependencies
|
|
137
|
+
npm install
|
|
138
|
+
|
|
139
|
+
# Build the project
|
|
140
|
+
npm run build
|
|
141
|
+
|
|
142
|
+
# Run tests (requires network access)
|
|
143
|
+
npm test
|
|
144
|
+
|
|
145
|
+
# Lint code
|
|
146
|
+
npm run lint
|
|
147
|
+
|
|
148
|
+
# Clean build output
|
|
149
|
+
npm run clean
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## ๐ Documentation
|
|
153
|
+
|
|
154
|
+
Complete documentation is available in `README.md` including:
|
|
155
|
+
- Installation and setup instructions
|
|
156
|
+
- Complete API reference
|
|
157
|
+
- Working examples with NYC demo server
|
|
158
|
+
- Error handling patterns
|
|
159
|
+
- Configuration options
|
|
160
|
+
- Best practices
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
**Status: โ
COMPLETE AND READY FOR PRODUCTION**
|
|
165
|
+
|
|
166
|
+
The BMLT Query Client is fully functional, well-tested, and ready for publication to NPM. It successfully replaces the broken `StringSearchIsAnAddress` functionality with a robust, reliable geocoding solution.
|
package/README.md
ADDED
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
# BMLT Query Client
|
|
2
|
+
|
|
3
|
+
A modern TypeScript/JavaScript client for querying BMLT (Basic Meeting List Tool) servers with built-in geocoding support using the native fetch API.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- ๐ **Zero dependencies** - Uses native fetch API instead of axios
|
|
8
|
+
- ๐๏ธ **Complete BMLT API coverage** - All semantic endpoints supported
|
|
9
|
+
- ๐ **Built-in geocoding** - Uses Nominatim for address-to-coordinates conversion
|
|
10
|
+
- ๐ **Fluent query builder** - Chainable API for complex meeting searches
|
|
11
|
+
- โก **Rate limiting & retry logic** - Stable operation with automatic retries
|
|
12
|
+
- ๐ฑ **Browser ready** - Works in all modern browsers via ES modules
|
|
13
|
+
- ๐ฏ **TypeScript support** - Full type definitions included
|
|
14
|
+
- ๐ฆ **Multiple formats** - ES modules, CommonJS, and browser bundles
|
|
15
|
+
|
|
16
|
+
## Quick Start
|
|
17
|
+
|
|
18
|
+
### For Browser (ES Modules - Recommended)
|
|
19
|
+
|
|
20
|
+
The easiest way to use the BMLT Query Client in the browser is via ES modules:
|
|
21
|
+
|
|
22
|
+
```html
|
|
23
|
+
<script type="module">
|
|
24
|
+
// Import directly from a CDN (when published)
|
|
25
|
+
import { BmltClient, VenueType, QuickSearch } from 'https://unpkg.com/bmlt-query-client/dist/index.esm.js';
|
|
26
|
+
|
|
27
|
+
// Or import from your local build
|
|
28
|
+
// import { BmltClient, VenueType, QuickSearch } from './dist/index.esm.js';
|
|
29
|
+
|
|
30
|
+
// Initialize the client
|
|
31
|
+
const client = new BmltClient({
|
|
32
|
+
rootServerURL: 'https://latest.aws.bmlt.app/main_server' // NYC demo server
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// Search for virtual meetings
|
|
36
|
+
const virtualMeetings = await client.searchMeetings({
|
|
37
|
+
venue_types: VenueType.VIRTUAL,
|
|
38
|
+
page_size: 10
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// Search meetings by address
|
|
42
|
+
const nearbyMeetings = await client.searchMeetingsByAddress({
|
|
43
|
+
address: 'Times Square, New York, NY',
|
|
44
|
+
radiusMiles: 5,
|
|
45
|
+
searchParams: { page_size: 10 }
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// Use the fluent query builder
|
|
49
|
+
const quickSearch = new QuickSearch(client);
|
|
50
|
+
const todaysMeetings = await quickSearch.today().virtualOnly().execute();
|
|
51
|
+
|
|
52
|
+
console.log('Found meetings:', nearbyMeetings);
|
|
53
|
+
</script>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### For Node.js
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
npm install bmlt-query-client
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
```javascript
|
|
63
|
+
import { BmltClient, VenueType, MeetingQueryBuilder } from 'bmlt-query-client';
|
|
64
|
+
|
|
65
|
+
const client = new BmltClient({
|
|
66
|
+
rootServerURL: 'https://your-bmlt-server.org/main_server'
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
// Search for meetings
|
|
70
|
+
const meetings = await client.searchMeetings({
|
|
71
|
+
weekdays: [1, 2, 3], // Sunday, Monday, Tuesday
|
|
72
|
+
venue_types: VenueType.IN_PERSON
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
// Use the query builder for complex searches
|
|
76
|
+
const builder = new MeetingQueryBuilder(client);
|
|
77
|
+
const eveningMeetings = await builder
|
|
78
|
+
.onWeekdays(1, 2, 3, 4, 5) // Weekdays
|
|
79
|
+
.startingAfter(17, 0) // After 5 PM
|
|
80
|
+
.inPersonOnly()
|
|
81
|
+
.nearCoordinates({ latitude: 40.7589, longitude: -73.9851 }, 2) // 2 mile radius
|
|
82
|
+
.execute();
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Bundle Sizes
|
|
86
|
+
|
|
87
|
+
The client has been optimized for minimal bundle size:
|
|
88
|
+
|
|
89
|
+
- **ES Module**: ~55KB (15KB gzipped) - All dependencies included
|
|
90
|
+
- **IIFE Bundle**: ~35KB (11KB gzipped) - For legacy browser support
|
|
91
|
+
- **CommonJS/ESM (Node)**: ~31KB (8KB gzipped) - External dependencies
|
|
92
|
+
|
|
93
|
+
## Browser Support
|
|
94
|
+
|
|
95
|
+
- โ
Chrome 63+
|
|
96
|
+
- โ
Firefox 67+
|
|
97
|
+
- โ
Safari 13.1+
|
|
98
|
+
- โ
Edge 79+
|
|
99
|
+
|
|
100
|
+
All modern browsers with ES2020 support and native fetch API.
|
|
101
|
+
|
|
102
|
+
## Key Features
|
|
103
|
+
|
|
104
|
+
### Comprehensive BMLT API Support
|
|
105
|
+
|
|
106
|
+
```javascript
|
|
107
|
+
// Server information
|
|
108
|
+
const serverInfo = await client.getServerInfo();
|
|
109
|
+
|
|
110
|
+
// Meeting formats
|
|
111
|
+
const formats = await client.getFormats();
|
|
112
|
+
|
|
113
|
+
// Service bodies
|
|
114
|
+
const serviceBodies = await client.getServiceBodies();
|
|
115
|
+
|
|
116
|
+
// Field values
|
|
117
|
+
const fieldValues = await client.getFieldValues({
|
|
118
|
+
meeting_key: 'location_municipality'
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
// Changes within date range
|
|
122
|
+
const changes = await client.getChanges({
|
|
123
|
+
start_date: '2023-01-01',
|
|
124
|
+
end_date: '2023-01-31'
|
|
125
|
+
});
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Built-in Geocoding
|
|
129
|
+
|
|
130
|
+
```javascript
|
|
131
|
+
// Geocode an address
|
|
132
|
+
const result = await client.geocodeAddress('Times Square, New York');
|
|
133
|
+
console.log(result.coordinates); // { latitude: 40.758, longitude: -73.985 }
|
|
134
|
+
|
|
135
|
+
// Search meetings by address (uses geocoding automatically)
|
|
136
|
+
const meetings = await client.searchMeetingsByAddress({
|
|
137
|
+
address: 'Central Park, New York',
|
|
138
|
+
radiusMiles: 2,
|
|
139
|
+
sortByDistance: true
|
|
140
|
+
});
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Fluent Query Builder
|
|
144
|
+
|
|
145
|
+
```javascript
|
|
146
|
+
const builder = new MeetingQueryBuilder(client);
|
|
147
|
+
|
|
148
|
+
// Build complex queries with method chaining
|
|
149
|
+
const meetings = await builder
|
|
150
|
+
.onWeekdays(Weekday.SATURDAY, Weekday.SUNDAY)
|
|
151
|
+
.virtualOnly()
|
|
152
|
+
.startingAfter(10, 0) // After 10 AM
|
|
153
|
+
.endingBefore(20, 0) // Before 8 PM
|
|
154
|
+
.searchText('meditation')
|
|
155
|
+
.sortByDistance()
|
|
156
|
+
.paginate(20, 1) // 20 results, page 1
|
|
157
|
+
.execute();
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Quick Search Helpers
|
|
161
|
+
|
|
162
|
+
```javascript
|
|
163
|
+
const quickSearch = new QuickSearch(client);
|
|
164
|
+
|
|
165
|
+
// Pre-built search methods
|
|
166
|
+
const todaysMeetings = await quickSearch.today().execute();
|
|
167
|
+
const virtualMeetings = await quickSearch.virtual().execute();
|
|
168
|
+
const eveningMeetings = await quickSearch.evening().execute();
|
|
169
|
+
const weekendMeetings = await quickSearch.weekend().execute();
|
|
170
|
+
|
|
171
|
+
// Combine quick searches with additional filters
|
|
172
|
+
const todaysVirtualMeetings = await quickSearch
|
|
173
|
+
.today()
|
|
174
|
+
.virtualOnly()
|
|
175
|
+
.startingAfter(18, 0) // After 6 PM
|
|
176
|
+
.execute();
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Error Handling
|
|
180
|
+
|
|
181
|
+
The client provides comprehensive error handling with specific error types:
|
|
182
|
+
|
|
183
|
+
```javascript
|
|
184
|
+
import { BmltQueryError, BmltErrorType } from 'bmlt-query-client';
|
|
185
|
+
|
|
186
|
+
try {
|
|
187
|
+
const meetings = await client.searchMeetings({ invalid: 'parameter' });
|
|
188
|
+
} catch (error) {
|
|
189
|
+
if (error instanceof BmltQueryError) {
|
|
190
|
+
console.log('Error type:', error.type);
|
|
191
|
+
console.log('User message:', error.getUserMessage());
|
|
192
|
+
|
|
193
|
+
if (error.isRetryable()) {
|
|
194
|
+
// Handle retryable errors (network, timeout, rate limit)
|
|
195
|
+
console.log('This error can be retried');
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
if (error.isType(BmltErrorType.GEOCODING_ERROR)) {
|
|
199
|
+
// Handle geocoding-specific errors
|
|
200
|
+
console.log('Geocoding failed');
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
## Examples
|
|
207
|
+
|
|
208
|
+
- **[ES Module Demo](./example-esm.html)** - Complete browser example using ES modules
|
|
209
|
+
- **[Legacy Demo](./example.html)** - Browser example using IIFE bundle
|
|
210
|
+
|
|
211
|
+
## Development
|
|
212
|
+
|
|
213
|
+
```bash
|
|
214
|
+
# Install dependencies
|
|
215
|
+
npm install
|
|
216
|
+
|
|
217
|
+
# Run tests
|
|
218
|
+
npm test
|
|
219
|
+
|
|
220
|
+
# Build all formats
|
|
221
|
+
npm run build:all
|
|
222
|
+
|
|
223
|
+
# Build individual formats
|
|
224
|
+
npm run build # Node.js (ESM/CJS)
|
|
225
|
+
npm run build:esm # Browser ES module
|
|
226
|
+
npm run build:browser # Browser IIFE bundle
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## Configuration
|
|
230
|
+
|
|
231
|
+
### Client Options
|
|
232
|
+
|
|
233
|
+
```javascript
|
|
234
|
+
const client = new BmltClient({
|
|
235
|
+
rootServerURL: 'https://your-server.org/main_server', // Required
|
|
236
|
+
defaultFormat: BmltDataFormat.JSON, // Optional
|
|
237
|
+
timeout: 30000, // 30 seconds
|
|
238
|
+
userAgent: 'my-app/1.0.0', // Custom user agent
|
|
239
|
+
enableGeocoding: true, // Enable address search
|
|
240
|
+
geocodingOptions: {
|
|
241
|
+
countryCode: 'us', // Bias results to US
|
|
242
|
+
retryCount: 3, // Retry failed requests
|
|
243
|
+
timeout: 10000 // Geocoding timeout
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### Geocoding Options
|
|
249
|
+
|
|
250
|
+
```javascript
|
|
251
|
+
const client = new BmltClient({
|
|
252
|
+
rootServerURL: 'https://your-server.org/main_server',
|
|
253
|
+
geocodingOptions: {
|
|
254
|
+
countryCode: 'us', // ISO country code bias
|
|
255
|
+
viewbox: [-74.2, 40.4, -73.7, 40.9], // Geographic bounding box [w,s,e,n]
|
|
256
|
+
bounded: true, // Restrict to viewbox
|
|
257
|
+
retryCount: 3, // Request retry attempts
|
|
258
|
+
timeout: 10000, // Request timeout (ms)
|
|
259
|
+
intervalCap: 1, // Rate limit: requests per interval
|
|
260
|
+
interval: 1000, // Rate limit interval (ms)
|
|
261
|
+
concurrency: 1 // Max concurrent requests
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
## License
|
|
267
|
+
|
|
268
|
+
MIT License
|
|
269
|
+
|
|
270
|
+
## Contributing
|
|
271
|
+
|
|
272
|
+
Contributions are welcome! Please read the contributing guidelines and submit pull requests.
|