From a2b1bf033841c7d2fc809b955848854edc5740d7 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Wed, 4 Jun 2025 21:45:43 -0300 Subject: [PATCH] blossom test. --- nip46.ts | 3 ++- nipb7.test.ts | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++ signer.ts | 17 ++++++++++++++++ 3 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 nipb7.test.ts diff --git a/nip46.ts b/nip46.ts index 0df7af1..02172fc 100644 --- a/nip46.ts +++ b/nip46.ts @@ -6,6 +6,7 @@ import { NIP05_REGEX } from './nip05.ts' import { SimplePool } from './pool.ts' import { Handlerinformation, NostrConnect } from './kinds.ts' import type { RelayRecord } from './relay.ts' +import { Signer } from './signer.ts' var _fetch: any @@ -82,7 +83,7 @@ export type BunkerSignerParams = { onauth?: (url: string) => void } -export class BunkerSigner { +export class BunkerSigner implements Signer { private params: BunkerSignerParams private pool: AbstractSimplePool private subCloser: SubCloser | undefined diff --git a/nipb7.test.ts b/nipb7.test.ts new file mode 100644 index 0000000..2088cd7 --- /dev/null +++ b/nipb7.test.ts @@ -0,0 +1,55 @@ +import { test, expect } from 'bun:test' +import { BlossomClient } from './nipb7.ts' +import { sha256 } from '@noble/hashes/sha256' +import { bytesToHex } from './utils.ts' +import { PlainKeySigner } from './signer.ts' +import { generateSecretKey } from './pure.ts' + +test('blossom', async () => { + const BLOSSOM_SERVER = 'blossom.primal.net' + const TEST_CONTENT = 'hello world' + const TEST_BLOB = new Blob([TEST_CONTENT], { type: 'text/plain' }) + + const expectedHash = bytesToHex(sha256(new TextEncoder().encode(TEST_CONTENT))) + + const signer = new PlainKeySigner(generateSecretKey()) + const client = new BlossomClient(BLOSSOM_SERVER, signer) + expect(client).toBeDefined() + + // check for non-existent file should throw + const invalidHash = expectedHash.slice(0, 62) + 'ba' + let hasThrown = false + try { + await client.check(invalidHash) + } catch (err) { + hasThrown = true + } + expect(hasThrown).toBeTrue() + + // upload hello world blob + const descriptor = await client.uploadBlob(TEST_BLOB, 'text/plain') + expect(descriptor).toBeDefined() + expect(descriptor.sha256).toBe(expectedHash) + expect(descriptor.size).toBe(TEST_CONTENT.length) + expect(descriptor.type).toBe('text/plain') + expect(descriptor.url).toContain(expectedHash) + expect(descriptor.uploaded).toBeGreaterThan(0) + await client.check(expectedHash) + + // download and verify + const downloadedBuffer = await client.download(expectedHash) + const downloadedContent = new TextDecoder().decode(downloadedBuffer) + expect(downloadedContent).toBe(TEST_CONTENT) + + // list blobs should include our uploaded file + const blobs = await client.list() + + expect(Array.isArray(blobs)).toBe(true) + const ourBlob = blobs.find(blob => blob.sha256 === expectedHash) + expect(ourBlob).toBeDefined() + expect(ourBlob?.type).toBe('text/plain') + expect(ourBlob?.size).toBe(TEST_CONTENT.length) + + // delete + await client.delete(expectedHash) +}) diff --git a/signer.ts b/signer.ts index 4691192..8c8d876 100644 --- a/signer.ts +++ b/signer.ts @@ -1,6 +1,23 @@ import { EventTemplate, VerifiedEvent } from './core.ts' +import { finalizeEvent, getPublicKey } from './pure.ts' export interface Signer { getPublicKey(): Promise signEvent(event: EventTemplate): Promise } + +export class PlainKeySigner implements Signer { + private secretKey: Uint8Array + + constructor(secretKey: Uint8Array) { + this.secretKey = secretKey + } + + async getPublicKey(): Promise { + return getPublicKey(this.secretKey) + } + + async signEvent(event: EventTemplate): Promise { + return finalizeEvent(event, this.secretKey) + } +}