blossom test.
This commit is contained in:
parent
861a77e2b3
commit
a2b1bf0338
3
nip46.ts
3
nip46.ts
|
@ -6,6 +6,7 @@ import { NIP05_REGEX } from './nip05.ts'
|
||||||
import { SimplePool } from './pool.ts'
|
import { SimplePool } from './pool.ts'
|
||||||
import { Handlerinformation, NostrConnect } from './kinds.ts'
|
import { Handlerinformation, NostrConnect } from './kinds.ts'
|
||||||
import type { RelayRecord } from './relay.ts'
|
import type { RelayRecord } from './relay.ts'
|
||||||
|
import { Signer } from './signer.ts'
|
||||||
|
|
||||||
var _fetch: any
|
var _fetch: any
|
||||||
|
|
||||||
|
@ -82,7 +83,7 @@ export type BunkerSignerParams = {
|
||||||
onauth?: (url: string) => void
|
onauth?: (url: string) => void
|
||||||
}
|
}
|
||||||
|
|
||||||
export class BunkerSigner {
|
export class BunkerSigner implements Signer {
|
||||||
private params: BunkerSignerParams
|
private params: BunkerSignerParams
|
||||||
private pool: AbstractSimplePool
|
private pool: AbstractSimplePool
|
||||||
private subCloser: SubCloser | undefined
|
private subCloser: SubCloser | undefined
|
||||||
|
|
|
@ -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)
|
||||||
|
})
|
17
signer.ts
17
signer.ts
|
@ -1,6 +1,23 @@
|
||||||
import { EventTemplate, VerifiedEvent } from './core.ts'
|
import { EventTemplate, VerifiedEvent } from './core.ts'
|
||||||
|
import { finalizeEvent, getPublicKey } from './pure.ts'
|
||||||
|
|
||||||
export interface Signer {
|
export interface Signer {
|
||||||
getPublicKey(): Promise<string>
|
getPublicKey(): Promise<string>
|
||||||
signEvent(event: EventTemplate): Promise<VerifiedEvent>
|
signEvent(event: EventTemplate): Promise<VerifiedEvent>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class PlainKeySigner implements Signer {
|
||||||
|
private secretKey: Uint8Array
|
||||||
|
|
||||||
|
constructor(secretKey: Uint8Array) {
|
||||||
|
this.secretKey = secretKey
|
||||||
|
}
|
||||||
|
|
||||||
|
async getPublicKey(): Promise<string> {
|
||||||
|
return getPublicKey(this.secretKey)
|
||||||
|
}
|
||||||
|
|
||||||
|
async signEvent(event: EventTemplate): Promise<VerifiedEvent> {
|
||||||
|
return finalizeEvent(event, this.secretKey)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue