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;
+}