mirror of
https://github.com/nbd-wtf/nostr-tools.git
synced 2025-12-08 16:28:49 +00:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
54e352d8e2 | ||
|
|
235a1c50cb | ||
|
|
dfc2107569 | ||
|
|
986b9d0cce | ||
|
|
753ff323ea | ||
|
|
f8c3e20f3d |
@@ -23,7 +23,7 @@ export type SubscribeManyParams = Omit<SubscriptionParams, 'onclose' | 'id'> & {
|
||||
}
|
||||
|
||||
export class AbstractSimplePool {
|
||||
private relays = new Map<string, AbstractRelay>()
|
||||
protected relays = new Map<string, AbstractRelay>()
|
||||
public seenOn: Map<string, Set<AbstractRelay>> = new Map()
|
||||
public trackRelays: boolean = false
|
||||
|
||||
|
||||
@@ -98,7 +98,7 @@ export class AbstractRelay {
|
||||
}
|
||||
|
||||
this.ws.onerror = ev => {
|
||||
reject((ev as any).message)
|
||||
reject((ev as any).message || 'websocket error')
|
||||
if (this._connected) {
|
||||
this._connected = false
|
||||
this.connectionPromise = undefined
|
||||
|
||||
@@ -222,5 +222,9 @@ describe('Filter', () => {
|
||||
test('should return Infinity for empty filters', () => {
|
||||
expect(getFilterLimit({})).toEqual(Infinity)
|
||||
})
|
||||
|
||||
test('empty tags return 0', () => {
|
||||
expect(getFilterLimit({ '#p': [] })).toEqual(0)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -78,6 +78,10 @@ export function getFilterLimit(filter: Filter): number {
|
||||
if (filter.kinds && !filter.kinds.length) return 0
|
||||
if (filter.authors && !filter.authors.length) return 0
|
||||
|
||||
for (const [key, value] of Object.entries(filter)) {
|
||||
if (key[0] === '#' && Array.isArray(value) && !value.length) return 0
|
||||
}
|
||||
|
||||
return Math.min(
|
||||
Math.max(0, filter.limit ?? Infinity),
|
||||
filter.ids?.length ?? Infinity,
|
||||
|
||||
12
nip11.ts
12
nip11.ts
@@ -68,7 +68,7 @@ export interface BasicRelayInformation {
|
||||
* from `[` to `]` and is after UTF-8 serialization (so some
|
||||
* unicode characters will cost 2-3 bytes). It is equal to
|
||||
* the maximum size of the WebSocket message frame.
|
||||
* @param max_subscription total number of subscriptions
|
||||
* @param max_subscriptions total number of subscriptions
|
||||
* that may be active on a single websocket connection to
|
||||
* this relay. It's possible that authenticated clients with
|
||||
* a (paid) relationship to the relay may have higher limits.
|
||||
@@ -101,12 +101,17 @@ export interface BasicRelayInformation {
|
||||
* authentication to happen before a new connection may
|
||||
* perform any other action. Even if set to False,
|
||||
* authentication may be required for specific actions.
|
||||
* @param restricted_writes: this relay requires some kind
|
||||
* of condition to be fulfilled in order to accept events
|
||||
* (not necessarily, but including
|
||||
* @param payment_required this relay requires payment
|
||||
* before a new connection may perform any action.
|
||||
* @param created_at_lower_limit: 'created_at' lower limit
|
||||
* @param created_at_upper_limit: 'created_at' upper limit
|
||||
*/
|
||||
export interface Limitations {
|
||||
max_message_length: number
|
||||
max_subscription: number
|
||||
max_subscriptions: number
|
||||
max_filters: number
|
||||
max_limit: number
|
||||
max_subid_length: number
|
||||
@@ -116,6 +121,9 @@ export interface Limitations {
|
||||
min_pow_difficulty: number
|
||||
auth_required: boolean
|
||||
payment_required: boolean
|
||||
created_at_lower_limit: number
|
||||
created_at_upper_limit: number
|
||||
restricted_writes: boolean
|
||||
}
|
||||
|
||||
interface RetentionDetails {
|
||||
|
||||
@@ -21,6 +21,7 @@ describe('generateEventTemplate', () => {
|
||||
image: 'https://example.com/image.jpg',
|
||||
summary: 'Lorem ipsum',
|
||||
alt: 'Image alt text',
|
||||
fallback: ['https://fallback1.example.com/image.jpg', 'https://fallback2.example.com/image.jpg'],
|
||||
}
|
||||
|
||||
const expectedEventTemplate: EventTemplate = {
|
||||
@@ -40,6 +41,8 @@ describe('generateEventTemplate', () => {
|
||||
['image', 'https://example.com/image.jpg'],
|
||||
['summary', 'Lorem ipsum'],
|
||||
['alt', 'Image alt text'],
|
||||
['fallback', 'https://fallback1.example.com/image.jpg'],
|
||||
['fallback', 'https://fallback2.example.com/image.jpg'],
|
||||
],
|
||||
}
|
||||
|
||||
@@ -71,6 +74,7 @@ describe('validateEvent', () => {
|
||||
['image', 'https://example.com/image.jpg'],
|
||||
['summary', 'Lorem ipsum'],
|
||||
['alt', 'Image alt text'],
|
||||
['fallback', 'https://fallback.example.com/image.jpg'],
|
||||
],
|
||||
},
|
||||
sk,
|
||||
@@ -100,6 +104,7 @@ describe('validateEvent', () => {
|
||||
['image', 'https://example.com/image.jpg'],
|
||||
['summary', 'Lorem ipsum'],
|
||||
['alt', 'Image alt text'],
|
||||
['fallback', 'https://fallback.example.com/image.jpg'],
|
||||
],
|
||||
},
|
||||
sk,
|
||||
@@ -129,6 +134,7 @@ describe('validateEvent', () => {
|
||||
['image', 'https://example.com/image.jpg'],
|
||||
['summary', 'Lorem ipsum'],
|
||||
['alt', 'Image alt text'],
|
||||
['fallback', 'https://fallback.example.com/image.jpg'],
|
||||
],
|
||||
},
|
||||
sk,
|
||||
@@ -158,6 +164,7 @@ describe('validateEvent', () => {
|
||||
['image', 'https://example.com/image.jpg'],
|
||||
['summary', 'Lorem ipsum'],
|
||||
['alt', 'Image alt text'],
|
||||
['fallback', 'https://fallback.example.com/image.jpg'],
|
||||
],
|
||||
},
|
||||
sk,
|
||||
@@ -181,6 +188,7 @@ describe('validateEvent', () => {
|
||||
['image', 'https://example.com/image.jpg'],
|
||||
['summary', 'Lorem ipsum'],
|
||||
['alt', 'Image alt text'],
|
||||
['fallback', 'https://fallback.example.com/image.jpg'],
|
||||
],
|
||||
},
|
||||
sk,
|
||||
@@ -204,6 +212,7 @@ describe('validateEvent', () => {
|
||||
['image', 'https://example.com/image.jpg'],
|
||||
['summary', 'Lorem ipsum'],
|
||||
['alt', 'Image alt text'],
|
||||
['fallback', 'https://fallback.example.com/image.jpg'],
|
||||
],
|
||||
},
|
||||
sk,
|
||||
@@ -227,6 +236,7 @@ describe('validateEvent', () => {
|
||||
['image', 'https://example.com/image.jpg'],
|
||||
['summary', 'Lorem ipsum'],
|
||||
['alt', 'Image alt text'],
|
||||
['fallback', 'https://fallback.example.com/image.jpg'],
|
||||
],
|
||||
},
|
||||
sk,
|
||||
@@ -259,6 +269,7 @@ describe('validateEvent', () => {
|
||||
['image', 'https://example.com/image.jpg'],
|
||||
['summary', 'Lorem ipsum'],
|
||||
['alt', 'Image alt text'],
|
||||
['fallback', 'https://fallback.example.com/image.jpg'],
|
||||
],
|
||||
},
|
||||
sk,
|
||||
@@ -288,6 +299,7 @@ describe('validateEvent', () => {
|
||||
['image', 'https://example.com/image.jpg'],
|
||||
['summary', 'Lorem ipsum'],
|
||||
['alt', 'Image alt text'],
|
||||
['fallback', 'https://fallback.example.com/image.jpg'],
|
||||
],
|
||||
},
|
||||
sk,
|
||||
@@ -319,6 +331,8 @@ describe('parseEvent', () => {
|
||||
['image', 'https://example.com/image.jpg'],
|
||||
['summary', 'Lorem ipsum'],
|
||||
['alt', 'Image alt text'],
|
||||
['fallback', 'https://fallback1.example.com/image.jpg'],
|
||||
['fallback', 'https://fallback2.example.com/image.jpg'],
|
||||
],
|
||||
},
|
||||
sk,
|
||||
@@ -340,6 +354,7 @@ describe('parseEvent', () => {
|
||||
image: 'https://example.com/image.jpg',
|
||||
summary: 'Lorem ipsum',
|
||||
alt: 'Image alt text',
|
||||
fallback: ['https://fallback1.example.com/image.jpg', 'https://fallback2.example.com/image.jpg'],
|
||||
})
|
||||
})
|
||||
|
||||
@@ -364,6 +379,7 @@ describe('parseEvent', () => {
|
||||
['image', 'https://example.com/image.jpg'],
|
||||
['summary', 'Lorem ipsum'],
|
||||
['alt', 'Image alt text'],
|
||||
['fallback', 'https://fallback.example.com/image.jpg'],
|
||||
],
|
||||
},
|
||||
sk,
|
||||
|
||||
10
nip94.ts
10
nip94.ts
@@ -75,6 +75,11 @@ export type FileMetadataObject = {
|
||||
* Optional: A description for accessibility, providing context or a brief description of the file.
|
||||
*/
|
||||
alt?: string
|
||||
|
||||
/**
|
||||
* Optional: fallback URLs in case url fails.
|
||||
*/
|
||||
fallback?: string[]
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -104,6 +109,7 @@ export function generateEventTemplate(fileMetadata: FileMetadataObject): EventTe
|
||||
if (fileMetadata.image) eventTemplate.tags.push(['image', fileMetadata.image])
|
||||
if (fileMetadata.summary) eventTemplate.tags.push(['summary', fileMetadata.summary])
|
||||
if (fileMetadata.alt) eventTemplate.tags.push(['alt', fileMetadata.alt])
|
||||
if (fileMetadata.fallback) fileMetadata.fallback.forEach(url => eventTemplate.tags.push(['fallback', url]))
|
||||
|
||||
return eventTemplate
|
||||
}
|
||||
@@ -194,6 +200,10 @@ export function parseEvent(event: Event): FileMetadataObject {
|
||||
case 'alt':
|
||||
fileMetadata.alt = value
|
||||
break
|
||||
case 'fallback':
|
||||
fileMetadata.fallback ??= []
|
||||
fileMetadata.fallback.push(value)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"type": "module",
|
||||
"name": "nostr-tools",
|
||||
"version": "2.7.0",
|
||||
"version": "2.7.1",
|
||||
"description": "Tools for making a Nostr client.",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
||||
Reference in New Issue
Block a user