diff --git a/packages/system-react/package.json b/packages/system-react/package.json index d6cda72d..41276d3e 100644 --- a/packages/system-react/package.json +++ b/packages/system-react/package.json @@ -1,6 +1,6 @@ { "name": "@snort/system-react", - "version": "1.4.0", + "version": "1.4.1", "description": "React hooks for @snort/system", "main": "dist/index.js", "module": "src/index.ts", @@ -17,7 +17,7 @@ ], "dependencies": { "@snort/shared": "^1.0.16", - "@snort/system": "^1.4.0", + "@snort/system": "^1.4.1", "react": "^18.2.0" }, "devDependencies": { diff --git a/packages/system/package.json b/packages/system/package.json index 6d4c0644..6be4005d 100644 --- a/packages/system/package.json +++ b/packages/system/package.json @@ -1,6 +1,6 @@ { "name": "@snort/system", - "version": "1.4.0", + "version": "1.4.1", "description": "Snort nostr system package", "type": "module", "main": "dist/index.js", diff --git a/packages/system/src/query.ts b/packages/system/src/query.ts index e9ef7012..18152532 100644 --- a/packages/system/src/query.ts +++ b/packages/system/src/query.ts @@ -24,15 +24,17 @@ export class QueryTrace extends EventEmitter { eose?: number; close?: number; #wasForceClosed = false; + filters: Array; constructor( readonly relay: string, - readonly filters: Array, + filters: Array, readonly connId: string, ) { super(); this.id = uuid(); this.start = unixNowMs(); + this.filters = filters; } sentToRelay() { @@ -153,6 +155,11 @@ export class Query extends EventEmitter { */ #groupTimeout?: ReturnType; + /** + * If the query should only every replace a previous trace on the same connection + */ + #replaceable: boolean = false; + #log = debug("Query"); constructor(req: RequestBuilder) { @@ -162,6 +169,7 @@ export class Query extends EventEmitter { this.#leaveOpen = req.options?.leaveOpen ?? false; this.#timeout = req.options?.timeout ?? 5_000; this.#groupingDelay = req.options?.groupingDelay ?? 100; + this.#replaceable = req.options?.replaceable ?? false; this.#checkTraces(); this.requests.push(...req.buildRaw()); @@ -315,6 +323,9 @@ export class Query extends EventEmitter { this.#log("Starting emit of %s", this.id); let rawFilters = [...this.requests]; this.requests = []; + if (this.#replaceable) { + rawFilters.push(...this.filters); + } this.emit("request", this.id, rawFilters); } @@ -363,11 +374,10 @@ export class Query extends EventEmitter { return true; } - #sendQueryInternal(c: ConnectionType, q: BuiltRawReqFilter) { - let filters = q.filters; - const qt = new QueryTrace(c.address, filters, c.id); + #setupNewTrace(c: ConnectionType, q: BuiltRawReqFilter) { + const qt = new QueryTrace(c.address, q.filters, c.id); qt.on("close", x => c.closeRequest(x)); - qt.on("eose", (id, connId, forced) => { + qt.on("eose", (id, _connId, forced) => { this.emit("trace", { id, conn: c, @@ -400,6 +410,16 @@ export class Query extends EventEmitter { c.off("closed", eoseHandler); }); this.#tracing.push(qt); + return qt; + } + + #sendQueryInternal(c: ConnectionType, q: BuiltRawReqFilter) { + const qt = this.#replaceable + ? this.#tracing.find(a => a.connId === c.id) ?? this.#setupNewTrace(c, q) + : this.#setupNewTrace(c, q); + + //always replace filters array + qt.filters = [...q.filters]; if (q.syncFrom !== undefined) { c.request(["SYNC", qt.id, q.syncFrom, ...qt.filters], () => qt.sentToRelay()); diff --git a/packages/system/src/request-builder.ts b/packages/system/src/request-builder.ts index f7921bfb..bad30805 100644 --- a/packages/system/src/request-builder.ts +++ b/packages/system/src/request-builder.ts @@ -36,6 +36,13 @@ export interface RequestBuilderOptions { * How many milli-seconds to wait to allow grouping */ groupingDelay?: number; + + /** + * Replace the query every time a change in the query is detected + * + * eg. Live stream chat reactions + */ + replaceable?: boolean; } /** diff --git a/packages/wallet/package.json b/packages/wallet/package.json index 023666f2..9535bb05 100644 --- a/packages/wallet/package.json +++ b/packages/wallet/package.json @@ -1,6 +1,6 @@ { "name": "@snort/wallet", - "version": "0.1.6", + "version": "0.1.7", "description": "Snort wallet system package", "type": "module", "main": "dist/index.js", @@ -23,7 +23,7 @@ "@lightninglabs/lnc-web": "^0.3.1-alpha", "@scure/base": "^1.1.6", "@snort/shared": "^1.0.16", - "@snort/system": "^1.3.8", + "@snort/system": "^1.4.1", "debug": "^4.3.4", "eventemitter3": "^5.0.1" },