diff --git a/packages/app/src/chat/nip24.ts b/packages/app/src/chat/nip24.ts
index ac25a359..c90f63cf 100644
--- a/packages/app/src/chat/nip24.ts
+++ b/packages/app/src/chat/nip24.ts
@@ -1,17 +1,9 @@
import { ExternalStore, dedupe } from "@snort/shared";
-import {
- EventKind,
- NostrPrefix,
- encodeTLVEntries,
- TLVEntryType,
- TLVEntry,
- decodeTLV,
- PowWorker,
- NostrEvent,
-} from "@snort/system";
+import { EventKind, NostrPrefix, encodeTLVEntries, TLVEntryType, TLVEntry, decodeTLV, NostrEvent } from "@snort/system";
import { GiftWrapCache } from "Cache/GiftWrapCache";
import { UnwrappedGift } from "Db";
import { Chat, ChatSystem, ChatType, lastReadInChat } from "chat";
+import { DefaultPowWorker } from "index";
export class Nip24ChatSystem extends ExternalStore
> implements ChatSystem {
#cache: GiftWrapCache;
@@ -107,17 +99,10 @@ export class Nip24ChatSystem extends ExternalStore> implements ChatS
const messages: Array> = [];
const powTarget = 4 * 4; // 4-char zero
for (const pt of participants) {
- const recvSealedN = pub.giftWrap(
- await pub.sealRumor(gossip, pt.id),
- pt.id,
- powTarget,
- new PowWorker("/pow.js")
- );
+ const recvSealedN = pub.giftWrap(await pub.sealRumor(gossip, pt.id), pt.id, powTarget);
messages.push(recvSealedN);
}
- messages.push(
- pub.giftWrap(await pub.sealRumor(gossip, pub.pubKey), pub.pubKey, powTarget, new PowWorker("/pow.js"))
- );
+ messages.push(pub.giftWrap(await pub.sealRumor(gossip, pub.pubKey), pub.pubKey, powTarget, DefaultPowWorker));
return await Promise.all(messages);
},
sendMessage: (ev, system) => {
diff --git a/packages/app/src/index.tsx b/packages/app/src/index.tsx
index 12348382..9ec174eb 100644
--- a/packages/app/src/index.tsx
+++ b/packages/app/src/index.tsx
@@ -6,7 +6,7 @@ import { StrictMode } from "react";
import * as ReactDOM from "react-dom/client";
import { Provider } from "react-redux";
import { createBrowserRouter, RouterProvider } from "react-router-dom";
-import { EventPublisher, NostrSystem, ProfileLoaderService, Nip7Signer } from "@snort/system";
+import { EventPublisher, NostrSystem, ProfileLoaderService, Nip7Signer, PowWorker } from "@snort/system";
import * as serviceWorkerRegistration from "serviceWorkerRegistration";
import { IntlProvider } from "IntlProvider";
@@ -60,6 +60,11 @@ export const System = new NostrSystem({
*/
export const ProfileLoader = new ProfileLoaderService(System, UserCache);
+/**
+ * Singleton POW worker
+ */
+export const DefaultPowWorker = new PowWorker("/pow.js");
+
// @ts-expect-error Setting webpack nonce
window.__webpack_nonce__ = "ZmlhdGphZiBzYWlkIHNub3J0LnNvY2lhbCBpcyBwcmV0dHkgZ29vZCwgd2UgbWFkZSBpdCE=";
diff --git a/packages/app/src/service-worker.ts b/packages/app/src/service-worker.ts
index 6c2c1d91..39599ab4 100644
--- a/packages/app/src/service-worker.ts
+++ b/packages/app/src/service-worker.ts
@@ -1,5 +1,4 @@
///
-import {} from ".";
declare const self: ServiceWorkerGlobalScope;
import { clientsClaim } from "workbox-core";
diff --git a/packages/system/src/event-publisher.ts b/packages/system/src/event-publisher.ts
index af2c605f..5f8d01ef 100644
--- a/packages/system/src/event-publisher.ts
+++ b/packages/system/src/event-publisher.ts
@@ -28,6 +28,8 @@ type EventBuilderHook = (ev: EventBuilder) => EventBuilder;
export class EventPublisher {
#pubKey: string;
#signer: EventSigner;
+ #pow?: number;
+ #miner?: PowMiner;
constructor(signer: EventSigner, pubKey: string) {
this.#signer = signer;
@@ -59,14 +61,21 @@ export class EventPublisher {
return this.#pubKey;
}
+ /**
+ * Apply POW to every event
+ */
+ pow(target:number, miner?: PowMiner) {
+ this.#pow = target;
+ this.#miner = miner;
+ }
+
#eb(k: EventKind) {
const eb = new EventBuilder();
return eb.pubKey(this.#pubKey).kind(k);
}
async #sign(eb: EventBuilder) {
- const ev = eb.build();
- return await this.#signer.sign(ev);
+ return await (this.#pow ? eb.pow(this.#pow, this.#miner) : eb).buildAndSign(this.#signer);
}
async nip4Encrypt(content: string, otherKey: string) {