diff --git a/demo/react-ts-webpack/src/app.tsx b/demo/react-ts-webpack/src/app.tsx index 1ba5372..6f691eb 100644 --- a/demo/react-ts-webpack/src/app.tsx +++ b/demo/react-ts-webpack/src/app.tsx @@ -86,6 +86,31 @@ function App(): ReactElement { setProofHex(proofHex); }, [setProofHex, setProcessing]); + const onAltClick = useCallback(async () => { + setProcessing(true); + await init({ loggingLevel: 'Debug' }); + const proof = await Prover.notarize({ + id: 'test', + notaryUrl: 'http://localhost:7047', + websocketProxyUrl: 'ws://localhost:55688', + url: 'https://swapi.dev/api/people/1', + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + body: { + hello: 'world', + one: 1, + }, + commit: { + sent: [{ start: 0, end: 50 }], + recv: [{ start: 0, end: 50 }], + }, + }); + + setProofHex(proof); + }, [setProofHex, setProcessing]); + useEffect(() => { (async () => { if (proofHex) { @@ -104,9 +129,22 @@ function App(): ReactElement { return (
- +
+ +
+
+ +
Proof: {!processing && !proofHex ? ( diff --git a/package.json b/package.json index 53ac5e5..b08cfa8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tlsn-js", - "version": "v0.1.0-alpha.6.1", + "version": "v0.1.0-alpha.6.2", "description": "", "repository": "https://github.com/tlsnotary/tlsn-js", "main": "build/lib.js", @@ -8,7 +8,7 @@ "files": [ "build/", "src/", - "wasm/prover/pkg/*", + "wasm/pkg/*", "readme.md" ], "scripts": { diff --git a/src/lib.ts b/src/lib.ts index 6308344..a613e6c 100644 --- a/src/lib.ts +++ b/src/lib.ts @@ -16,7 +16,7 @@ import initWasm, { VerifierData, NotaryPublicKey, } from '../wasm/pkg/tlsn_wasm'; -import { arrayToHex, processTranscript, stringToBuffer, expect } from './utils'; +import { arrayToHex, processTranscript, expect, headerToMap } from './utils'; import type { ParsedTranscriptData, ProofData } from './types'; let LOGGING_LEVEL: LoggingLevel = 'Info'; @@ -59,6 +59,64 @@ export class Prover { #prover: WasmProver; #config: ProverConfig; + static async notarize(options: { + url: string; + notaryUrl: string; + websocketProxyUrl: string; + method?: Method; + headers?: { + [name: string]: string; + }; + body?: any; + maxSentData?: number; + maxRecvData?: number; + id: string; + commit?: Commit; + }) { + const { + url, + method = 'GET', + headers = {}, + body, + maxSentData, + maxRecvData, + notaryUrl, + websocketProxyUrl, + id, + commit: _commit, + } = options; + const hostname = new URL(url).hostname; + const notary = NotaryServer.from(notaryUrl); + const prover = new WasmProver({ + id, + server_dns: hostname, + max_sent_data: maxSentData, + max_recv_data: maxRecvData, + }); + + await prover.setup(await notary.sessionUrl(maxSentData, maxRecvData)); + + await prover.send_request(websocketProxyUrl + `?token=${hostname}`, { + uri: url, + method, + headers: headerToMap(headers), + body, + }); + + const transcript = prover.transcript(); + + const commit = _commit || { + sent: [{ start: 0, end: transcript.sent.length }], + recv: [{ start: 0, end: transcript.recv.length }], + }; + + const session = await prover.notarize(commit); + + const tlsProof = await session.proof(commit); + + return tlsProof.serialize(); + } + constructor(config: { id?: string; serverDns: string; @@ -118,12 +176,10 @@ export class Prover { }> { const { url, method = 'GET', headers = {}, body } = request; const hostname = new URL(url).hostname; - const headerMap: Map = new Map(); - - headerMap.set('Host', stringToBuffer(hostname)); - headerMap.set('Connection', stringToBuffer('close')); - Object.entries(headers).forEach(([key, value]) => { - headerMap.set(key, stringToBuffer(value)); + const headerMap = headerToMap({ + Host: hostname, + Connection: 'close', + ...headers, }); const resp = await this.#prover.send_request(wsProxyUrl, { diff --git a/src/utils.ts b/src/utils.ts index 5d718de..d5bab25 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -406,3 +406,13 @@ export function stringToBuffer(str: string): number[] { export function arrayToHex(uintArr: Uint8Array): string { return Buffer.from(uintArr).toString('hex'); } + +export function headerToMap(headers: { + [name: string]: string; +}): Map { + const headerMap: Map = new Map(); + Object.entries(headers).forEach(([key, value]) => { + headerMap.set(key, stringToBuffer(value)); + }); + return headerMap; +}