Skip to content

Commit afb3640

Browse files
committed
feat: add upload options for fallback and custom server usage
1 parent a25c433 commit afb3640

File tree

20 files changed

+262
-42
lines changed

20 files changed

+262
-42
lines changed

ndk-blossom/CHANGELOG.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,32 @@
11
# @nostr-dev-kit/ndk-blossom
22

3+
## 0.1.17
4+
5+
### Patch Changes
6+
7+
- fallbackServer and server optiosn on ndk-blossom upload
8+
9+
## 0.1.16
10+
11+
### Patch Changes
12+
13+
- Updated dependencies
14+
- @nostr-dev-kit/ndk@2.14.18
15+
16+
## 0.1.15
17+
18+
### Patch Changes
19+
20+
- Updated dependencies
21+
- @nostr-dev-kit/ndk@2.14.17
22+
23+
## 0.1.14
24+
25+
### Patch Changes
26+
27+
- Updated dependencies
28+
- @nostr-dev-kit/ndk@2.14.16
29+
330
## 0.1.13
431

532
### Patch Changes

ndk-blossom/docs/getting-started.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,42 @@ await ndk.connect();
3838

3939
NDK-Blossom makes it easy to upload files to Blossom servers. It automatically tries the user's preferred Blossom servers until it succeeds.
4040

41+
### Upload with Fallback and Custom Server Options
42+
43+
You can control which server(s) are used for uploads by passing options to the `upload` method:
44+
45+
#### Fallback Server
46+
47+
If the user's Blossom server list is empty or all uploads fail, you can provide a fallback server:
48+
49+
```typescript
50+
await blossom.upload(file, {
51+
fallbackServer: "https://your-fallback-blossom.example.com"
52+
});
53+
```
54+
55+
#### Custom Server (Bypass Blossom List)
56+
57+
To always use a specific server and skip the user's Blossom list entirely:
58+
59+
```typescript
60+
await blossom.upload(file, {
61+
server: "https://your-custom-blossom.example.com"
62+
});
63+
```
64+
65+
#### Option Reference
66+
67+
| Option | Type | Description |
68+
|-----------------|----------|---------------------------------------------------------------------------------------------|
69+
| `server` | string | If provided, always use this server for upload (bypasses blossom list and fallback). |
70+
| `fallbackServer`| string | If no blossom servers are available or all fail, use this server as a fallback. |
71+
| `maxRetries` | number | Maximum number of retry attempts for network requests. |
72+
| `retryDelay` | number | Delay between retry attempts in milliseconds. |
73+
| `headers` | object | Additional headers to include in the upload request. |
74+
| `onProgress` | function | Callback for upload progress. |
75+
76+
See the [API documentation](./) for more details.
4177
```typescript
4278
import { imetaTagToTag } from '@nostr-dev-kit/ndk/lib/utils/imeta';
4379

ndk-blossom/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@nostr-dev-kit/ndk-blossom",
3-
"version": "0.1.13",
3+
"version": "0.1.17",
44
"description": "Blossom protocol support for NDK (Nostr Development Kit)",
55
"main": "dist/index.js",
66
"module": "dist/index.js",
@@ -39,10 +39,10 @@
3939
},
4040
"homepage": "https://github.com/nostr-dev-kit/ndk#readme",
4141
"dependencies": {
42-
"@nostr-dev-kit/ndk": "2.14.15"
42+
"@nostr-dev-kit/ndk": "2.14.18"
4343
},
4444
"peerDependencies": {
45-
"@nostr-dev-kit/ndk": "2.14.15"
45+
"@nostr-dev-kit/ndk": "2.14.18"
4646
},
4747
"devDependencies": {
4848
"@types/node": "^20.0.0",

ndk-blossom/src/types/index.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,16 @@ export interface BlossomServerList {
2727
* Options for uploading to Blossom servers
2828
*/
2929
export interface BlossomUploadOptions {
30+
/**
31+
* If provided, always use this server for upload (bypasses blossom list and fallback).
32+
*/
33+
server?: string;
34+
35+
/**
36+
* If no blossom servers are available or all fail, use this server as a fallback.
37+
*/
38+
fallbackServer?: string;
39+
3040
/**
3141
* Maximum number of retry attempts for network requests
3242
*/

ndk-blossom/src/upload/uploader.ts

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -179,35 +179,26 @@ export async function uploadFile(
179179
): Promise<NDKImetaTag> {
180180
logger.debug(`Starting file upload`, { fileName: file.name, fileType: file.type, fileSize: file.size });
181181

182-
// Get user's Blossom server list
183-
const serverList = await ndkBlossom.getServerList();
184-
if (!serverList) {
185-
throw new NDKBlossomUploadError(
186-
"No Blossom server list found in user profile. Add servers to your profile before uploading.",
187-
ErrorCodes.SERVER_LIST_EMPTY,
188-
);
189-
}
190-
191-
let serverUrls: string[];
192-
try {
193-
serverUrls = serverList.servers;
194-
} catch (error) {
195-
if (error instanceof NDKBlossomNotFoundError) {
196-
// No server list found
182+
// If a specific server is provided, use only that server
183+
if (options.server) {
184+
try {
185+
const result = await uploadToServer(ndkBlossom.ndk, file, options.server, options);
186+
logger.debug(`Upload successful to specified server ${options.server}`);
187+
return result;
188+
} catch (error) {
189+
logger.error(`Upload to specified server ${options.server} failed:`, error);
197190
throw new NDKBlossomUploadError(
198-
"No Blossom servers found in user profile. Add servers to your profile before uploading.",
199-
ErrorCodes.SERVER_LIST_EMPTY,
191+
`Upload failed on specified server: ${options.server}: ${(error as Error).message}`,
192+
ErrorCodes.UPLOAD_FAILED,
200193
);
201194
}
202-
throw error;
203195
}
204196

205-
// Check if server list is empty
206-
if (!serverUrls.length) {
207-
throw new NDKBlossomUploadError(
208-
"No Blossom servers found in user profile. Add servers to your profile before uploading.",
209-
ErrorCodes.SERVER_LIST_EMPTY,
210-
);
197+
// Get user's Blossom server list
198+
const serverList = await ndkBlossom.getServerList();
199+
let serverUrls: string[] = [];
200+
if (serverList && Array.isArray(serverList.servers)) {
201+
serverUrls = serverList.servers;
211202
}
212203

213204
// Try each server in order
@@ -245,6 +236,18 @@ export async function uploadFile(
245236
}
246237
}
247238

239+
// If all blossom servers failed and fallbackServer is provided, try it
240+
if (options.fallbackServer) {
241+
try {
242+
const result = await uploadToServer(ndkBlossom.ndk, file, options.fallbackServer, options);
243+
logger.debug(`Upload successful to fallback server ${options.fallbackServer}`);
244+
return result;
245+
} catch (error) {
246+
logger.error(`Upload to fallback server ${options.fallbackServer} failed:`, error);
247+
errors.push({ serverUrl: options.fallbackServer, error: error as Error });
248+
}
249+
}
250+
248251
// If we get here, all servers failed
249252
throw new NDKBlossomUploadError(
250253
`Upload failed on all servers: ${errors.map((e) => `${e.serverUrl}: ${e.error.message}`).join(", ")}`,

ndk-cache-dexie/CHANGELOG.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,26 @@
11
# @nostr-dev-kit/ndk-cache-dexie
22

3+
## 2.6.19
4+
5+
### Patch Changes
6+
7+
- Updated dependencies
8+
- @nostr-dev-kit/ndk@2.14.18
9+
10+
## 2.6.18
11+
12+
### Patch Changes
13+
14+
- Updated dependencies
15+
- @nostr-dev-kit/ndk@2.14.17
16+
17+
## 2.6.17
18+
19+
### Patch Changes
20+
21+
- Updated dependencies
22+
- @nostr-dev-kit/ndk@2.14.16
23+
324
## 2.6.16
425

526
### Patch Changes

ndk-cache-dexie/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@nostr-dev-kit/ndk-cache-dexie",
3-
"version": "2.6.16",
3+
"version": "2.6.19",
44
"description": "NDK Dexie Cache Adapter",
55
"license": "MIT",
66
"docs": "typedoc",
@@ -54,7 +54,7 @@
5454
"vitest": "^1.2.0"
5555
},
5656
"dependencies": {
57-
"@nostr-dev-kit/ndk": "2.14.15",
57+
"@nostr-dev-kit/ndk": "2.14.18",
5858
"debug": "^4.3.7",
5959
"dexie": "^4.0.8",
6060
"nostr-tools": "^2.4.0",

ndk-cache-nostr/CHANGELOG.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,26 @@
11
# @nostr-dev-kit/ndk-cache-nostr
22

3+
## 0.1.30
4+
5+
### Patch Changes
6+
7+
- Updated dependencies
8+
- @nostr-dev-kit/ndk@2.14.18
9+
10+
## 0.1.29
11+
12+
### Patch Changes
13+
14+
- Updated dependencies
15+
- @nostr-dev-kit/ndk@2.14.17
16+
17+
## 0.1.28
18+
19+
### Patch Changes
20+
21+
- Updated dependencies
22+
- @nostr-dev-kit/ndk@2.14.16
23+
324
## 0.1.27
425

526
### Patch Changes

ndk-cache-nostr/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@nostr-dev-kit/ndk-cache-nostr",
3-
"version": "0.1.27",
3+
"version": "0.1.30",
44
"description": "NDK cache adapter that uses a local nostr relay.",
55
"main": "./dist/index.js",
66
"module": "./dist/index.mjs",
@@ -36,7 +36,7 @@
3636
},
3737
"homepage": "https://github.com/nostr-dev-kit/ndk",
3838
"dependencies": {
39-
"@nostr-dev-kit/ndk": "2.14.15",
39+
"@nostr-dev-kit/ndk": "2.14.18",
4040
"debug": "^4.3.4",
4141
"typescript": "^5.8.2",
4242
"websocket-polyfill": "^0.0.3"

ndk-cache-redis/CHANGELOG.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,26 @@
11
# @nostr-dev-kit/ndk-cache-redis
22

3+
## 0.1.16
4+
5+
### Patch Changes
6+
7+
- Updated dependencies
8+
- @nostr-dev-kit/ndk@2.14.18
9+
10+
## 0.1.15
11+
12+
### Patch Changes
13+
14+
- Updated dependencies
15+
- @nostr-dev-kit/ndk@2.14.17
16+
17+
## 0.1.14
18+
19+
### Patch Changes
20+
21+
- Updated dependencies
22+
- @nostr-dev-kit/ndk@2.14.16
23+
324
## 0.1.13
425

526
### Patch Changes

ndk-cache-redis/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@nostr-dev-kit/ndk-cache-redis",
3-
"version": "0.1.13",
3+
"version": "0.1.16",
44
"description": "NDK Redis Cache Adapter",
55
"type": "module",
66
"main": "./dist/index.js",
@@ -15,7 +15,7 @@
1515
"clean": "rm -rf dist"
1616
},
1717
"dependencies": {
18-
"@nostr-dev-kit/ndk": "2.14.15",
18+
"@nostr-dev-kit/ndk": "2.14.18",
1919
"ioredis": "^5.0.0"
2020
},
2121
"devDependencies": {

ndk-cache-sqlite-wasm/CHANGELOG.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,26 @@
11
# @nostr-dev-kit/ndk-cache-sqlite-wasm
22

3+
## 0.5.3
4+
5+
### Patch Changes
6+
7+
- Updated dependencies
8+
- @nostr-dev-kit/ndk@2.14.18
9+
10+
## 0.5.2
11+
12+
### Patch Changes
13+
14+
- Updated dependencies
15+
- @nostr-dev-kit/ndk@2.14.17
16+
17+
## 0.5.1
18+
19+
### Patch Changes
20+
21+
- Updated dependencies
22+
- @nostr-dev-kit/ndk@2.14.16
23+
324
## 0.5.0
425

526
### Minor Changes

ndk-cache-sqlite-wasm/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@nostr-dev-kit/ndk-cache-sqlite-wasm",
3-
"version": "0.5.0",
3+
"version": "0.5.3",
44
"description": "SQLite WASM cache adapter for NDK, compatible with browser and JS environments.",
55
"main": "dist/index.mjs",
66
"module": "dist/index.mjs",
@@ -24,7 +24,7 @@
2424
},
2525
"dependencies": {
2626
"sql.js": "^1.8.0",
27-
"@nostr-dev-kit/ndk": "2.14.15"
27+
"@nostr-dev-kit/ndk": "2.14.18"
2828
},
2929
"devDependencies": {
3030
"@types/sql.js": "^1.4.9",

ndk-core/CHANGELOG.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,23 @@
11
# @nostr-dev-kit/ndk
22

3+
## 2.14.18
4+
5+
### Patch Changes
6+
7+
- bump
8+
9+
## 2.14.17
10+
11+
### Patch Changes
12+
13+
- bump
14+
15+
## 2.14.16
16+
17+
### Patch Changes
18+
19+
- export NDKFollowPack
20+
321
## 2.14.15
422

523
### Patch Changes

ndk-core/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@nostr-dev-kit/ndk",
3-
"version": "2.14.15",
3+
"version": "2.14.18",
44
"description": "NDK - Nostr Development Kit",
55
"homepage": "https://ndk.fyi",
66
"documentation": "https://nostr-dev-kit.github.io/ndk",

0 commit comments

Comments
 (0)