From 92d70032d93fba1400bd1c47e99b866b817cd6d4 Mon Sep 17 00:00:00 2001 From: 0xtsukino <0xtsukino@gmail.com> Date: Tue, 14 Nov 2023 09:41:01 +0300 Subject: [PATCH] add read me and remove comlink --- .babelrc | 3 + .eslintrc | 36 ++++++++ .prettierignore | 10 +++ .prettierrc.json | 9 ++ package.json | 21 ++++- readme.md | 56 +++++++++++++ src/index.js | 74 +++++++++++++++++ src/{app.tsx => index.ts} | 32 +++----- src/worker.js | 139 +++++++++++++++++++++++++++++++ src/worker.ts | 5 +- tsconfig.compile.json | 11 +++ utils/test.js | 67 +++++++++++++++ utils/test.ts | 11 ++- webpack.config.js | 57 +++++++++++++ webpack.test.config.js | 167 +++++++++++++++++++------------------- 15 files changed, 581 insertions(+), 117 deletions(-) create mode 100644 .babelrc create mode 100644 .eslintrc create mode 100644 .prettierignore create mode 100644 .prettierrc.json create mode 100644 readme.md create mode 100644 src/index.js rename src/{app.tsx => index.ts} (62%) create mode 100644 src/worker.js create mode 100644 tsconfig.compile.json create mode 100644 utils/test.js create mode 100644 webpack.config.js diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..18151f1 --- /dev/null +++ b/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["@babel/preset-env", "@babel/preset-react"] +} \ No newline at end of file diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..70a125c --- /dev/null +++ b/.eslintrc @@ -0,0 +1,36 @@ +{ + "root": true, + "extends": ["prettier", "plugin:@typescript-eslint/recommended"], + "plugins": ["prettier", "@typescript-eslint"], + "parser": "@typescript-eslint/parser", + "rules": { + "prettier/prettier": "error", + "@typescript-eslint/no-explicit-any": 1, + "@typescript-eslint/no-var-requires": 0, + "@typescript-eslint/ban-ts-comment": 0, + "no-undef": "error", + "padding-line-between-statements": "error" + }, + "parserOptions": { + "sourceType": "module", + "ecmaVersion": "latest" + }, + "env": { + "webextensions": true, + "es6": true, + "browser": true, + "node": true + }, + "settings": { + "import/resolver": "typescript" + }, + "ignorePatterns": [ + "node_modules", + "build", + "test-build", + "wasm", + "utils", + "webpack.config.js", + "webpack.test.config.js" + ] +} \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..61c2944 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,10 @@ +build +test-build +node_modules +wasm +postcss.config.js +webpack.config.js +webpack.test.config.js + +*.json +*.scss \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..81f804e --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,9 @@ +{ + "printWidth": 80, + "tabWidth": 2, + "semi": true, + "singleQuote": true, + "bracketSpacing": true, + "jsxBracketSameLine": false, + "arrowParens": "always" +} \ No newline at end of file diff --git a/package.json b/package.json index 7a38a82..7bcb4d5 100644 --- a/package.json +++ b/package.json @@ -2,13 +2,25 @@ "name": "tlsn-js", "version": "0.0.1", "description": "", - "main": "index.js", + "main": "build/index.js", + "types": "build/index.d.ts", + "files": [ + "build/", + "src/", + "readme.md" + ], "scripts": { + "build:src": "webpack --config webpack.config.js", + "build:types": "tsc --project tsconfig.compile.json", + "build": "NODE_ENV=production concurrently npm:build:src npm:build:types", "build:wasm": "wasm-pack build --target web wasm/prover", "build:test": "webpack --config webpack.test.config.js", "watch:test": "webpack --config webpack.test.config.js --watch", "serve:test": "serve ./test-build -l 3000", - "test": "concurrently npm:watch:test npm:serve:test" + "test": "concurrently npm:watch:test npm:serve:test", + "lint:eslint": "eslint . --fix", + "lint:tsc": "tsc --noEmit", + "lint": "concurrently npm:lint:tsc npm:lint:eslint" }, "dependencies": { "comlink": "^4.4.1" @@ -19,7 +31,10 @@ "constants-browserify": "^1.0.0", "copy-webpack-plugin": "^5.0.5", "crypto-browserify": "^3.12.0", - "eslint": "^5.16.0", + "eslint": "^8.47.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-prettier": "^5.0.0", + "prettier": "^3.0.2", "file-loader": "^5.0.2", "html-webpack-plugin": "~5.3.2", "https-browserify": "^1.0.0", diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..2e3464d --- /dev/null +++ b/readme.md @@ -0,0 +1,56 @@ +# tlsn-js + +NPM Modules for proving and verifying using TLS Notary. + +The prover requires a [notary-server](https://github.com/tlsnotary/notary-server) and websockify proxy + +## Example +```ts +import { prove, verify, NOTARY_SERVER_PUBKEY } from '../src'; + +// To create a proof +const proof = await prove('https://swapi.dev/api/people/1', { + method: 'GET', + headers: { + Connection: 'close', + Accept: 'application/json', + 'Accept-Encoding': 'identity', + }, + body: '', + maxTranscriptSize: 20000, + notaryUrl: 'https://127.0.0.1:7047', + websocketProxyUrl: 'ws://127.0.0.1:55688', +}); + +// To verify a proof +const result = await verify(proof, NOTARY_SERVER_PUBKEY); +console.log(result); +``` + +## Running a local websockify proxy for `https://swapi.dev` +``` +git clone https://github.com/novnc/websockify && cd websockify +./docker/build.sh +docker run -it --rm -p 55688:80 novnc/websockify 80 swapi.dev:443 +``` + +## Install as NPM Package + +``` +npm install tlsn-js +``` + +## Development + +``` +npm install +npm run lint +npm test +``` + +## Build + +``` +npm install +npm run build +``` \ No newline at end of file diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..6587e5f --- /dev/null +++ b/src/index.js @@ -0,0 +1,74 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +exports.__esModule = true; +exports.verify = exports.prove = exports.NOTARY_SERVER_PUBKEY = void 0; +var worker_1 = require("./worker"); +var tlsn = new worker_1["default"](); +exports.NOTARY_SERVER_PUBKEY = "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEBv36FI4ZFszJa0DQFJ3wWCXvVLFr\ncRzMG5kaTeHGoSzDu6cFqx3uEWYpFGo6C0EOUgf+mEgbktLrXocv5yHzKg==\n-----END PUBLIC KEY-----"; +var prove = function (url, options) { return __awaiter(void 0, void 0, void 0, function () { + var method, headers, body, _a, maxTranscriptSize, notaryUrl, websocketProxyUrl, secretHeaders, secretResps; + return __generator(this, function (_b) { + method = options.method, headers = options.headers, body = options.body, _a = options.maxTranscriptSize, maxTranscriptSize = _a === void 0 ? 32768 : _a, notaryUrl = options.notaryUrl, websocketProxyUrl = options.websocketProxyUrl, secretHeaders = options.secretHeaders, secretResps = options.secretResps; + return [2 /*return*/, tlsn.prover(url, { + method: method, + headers: headers, + body: body, + maxTranscriptSize: maxTranscriptSize, + notaryUrl: notaryUrl, + websocketProxyUrl: websocketProxyUrl, + secretHeaders: secretHeaders, + secretResps: secretResps + })]; + }); +}); }; +exports.prove = prove; +var verify = function (proof, pubkey) { + if (pubkey === void 0) { pubkey = exports.NOTARY_SERVER_PUBKEY; } + return __awaiter(void 0, void 0, void 0, function () { + var result; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, tlsn.verify(proof, pubkey)]; + case 1: + result = _a.sent(); + return [2 /*return*/, result]; + } + }); + }); +}; +exports.verify = verify; diff --git a/src/app.tsx b/src/index.ts similarity index 62% rename from src/app.tsx rename to src/index.ts index a928287..dfb019c 100644 --- a/src/app.tsx +++ b/src/index.ts @@ -1,16 +1,6 @@ -import * as Comlink from 'comlink'; +import TLSN from "./worker"; -const TLSN: any = Comlink.wrap( - new Worker(new URL('./worker.ts', import.meta.url)), -); - -let tlsn: any | null = null; - -async function getTLSN(): Promise { - if (tlsn) return tlsn; - tlsn = await new TLSN(); - return tlsn; -} +const tlsn = new TLSN(); export const NOTARY_SERVER_PUBKEY = `-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEBv36FI4ZFszJa0DQFJ3wWCXvVLFr\ncRzMG5kaTeHGoSzDu6cFqx3uEWYpFGo6C0EOUgf+mEgbktLrXocv5yHzKg==\n-----END PUBLIC KEY-----`; @@ -25,7 +15,7 @@ export const prove = async ( maxTranscriptSize?: number; secretHeaders?: string[]; secretResps?: string[]; - } + }, ) => { const { method, @@ -38,7 +28,6 @@ export const prove = async ( secretResps, } = options; - const tlsn = await getTLSN(); return tlsn.prover(url, { method, headers, @@ -49,13 +38,12 @@ export const prove = async ( secretHeaders, secretResps, }); -} +}; -export const verify = async (proof: { session: any; substrings: any }, pubkey = NOTARY_SERVER_PUBKEY) => { - const tlsn = await getTLSN(); - const result = await tlsn.verify( - proof, - pubkey, - ); +export const verify = async ( + proof: { session: any; substrings: any }, + pubkey = NOTARY_SERVER_PUBKEY, +) => { + const result = await tlsn.verify(proof, pubkey); return result; -} \ No newline at end of file +}; diff --git a/src/worker.js b/src/worker.js new file mode 100644 index 0000000..f0827d3 --- /dev/null +++ b/src/worker.js @@ -0,0 +1,139 @@ +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +exports.__esModule = true; +var tlsn_extension_rs_1 = require("../wasm/prover/pkg/tlsn_extension_rs"); +var TLSN = /** @class */ (function () { + function TLSN() { + var _this = this; + console.log('worker module initiated.'); + this.startPromise = new Promise(function (resolve) { + _this.resolveStart = resolve; + }); + this.start(); + } + TLSN.prototype.start = function () { + return __awaiter(this, void 0, void 0, function () { + var numConcurrency, res; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log('start'); + numConcurrency = navigator.hardwareConcurrency; + console.log('!@# navigator.hardwareConcurrency=', numConcurrency); + return [4 /*yield*/, (0, tlsn_extension_rs_1["default"])()]; + case 1: + res = _a.sent(); + console.log('!@# res.memory=', res.memory); + // 6422528 ~= 6.12 mb + console.log('!@# res.memory.buffer.length=', res.memory.buffer.byteLength); + return [4 /*yield*/, (0, tlsn_extension_rs_1.initThreadPool)(numConcurrency)]; + case 2: + _a.sent(); + this.resolveStart(); + return [2 /*return*/]; + } + }); + }); + }; + TLSN.prototype.waitForStart = function () { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, this.startPromise]; + }); + }); + }; + TLSN.prototype.prover = function (url, options) { + var _a, _b; + return __awaiter(this, void 0, void 0, function () { + var resProver, resJSON, e_1; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: + _c.trys.push([0, 3, , 4]); + return [4 /*yield*/, this.waitForStart()]; + case 1: + _c.sent(); + console.log('worker', url, __assign(__assign({}, options), { notaryUrl: options === null || options === void 0 ? void 0 : options.notaryUrl, websocketProxyUrl: options === null || options === void 0 ? void 0 : options.websocketProxyUrl })); + return [4 /*yield*/, (0, tlsn_extension_rs_1.prover)(url, __assign(__assign({}, options), { notaryUrl: options === null || options === void 0 ? void 0 : options.notaryUrl, websocketProxyUrl: options === null || options === void 0 ? void 0 : options.websocketProxyUrl }), (options === null || options === void 0 ? void 0 : options.secretHeaders) || [], (options === null || options === void 0 ? void 0 : options.secretResps) || [])]; + case 2: + resProver = _c.sent(); + resJSON = JSON.parse(resProver); + console.log('!@# resProver,resJSON=', { resProver: resProver, resJSON: resJSON }); + console.log('!@# resAfter.memory=', resJSON.memory); + // 1105920000 ~= 1.03 gb + console.log('!@# resAfter.memory.buffer.length=', (_b = (_a = resJSON.memory) === null || _a === void 0 ? void 0 : _a.buffer) === null || _b === void 0 ? void 0 : _b.byteLength); + return [2 /*return*/, resJSON]; + case 3: + e_1 = _c.sent(); + console.log(e_1); + return [2 /*return*/, e_1]; + case 4: return [2 /*return*/]; + } + }); + }); + }; + TLSN.prototype.verify = function (proof, pubkey) { + return __awaiter(this, void 0, void 0, function () { + var raw; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.waitForStart()]; + case 1: + _a.sent(); + return [4 /*yield*/, (0, tlsn_extension_rs_1.verify)(JSON.stringify(proof), pubkey)]; + case 2: + raw = _a.sent(); + return [2 /*return*/, JSON.parse(raw)]; + } + }); + }); + }; + return TLSN; +}()); +exports["default"] = TLSN; diff --git a/src/worker.ts b/src/worker.ts index cbb74d4..9fe263a 100644 --- a/src/worker.ts +++ b/src/worker.ts @@ -1,11 +1,10 @@ -import * as Comlink from 'comlink'; import init, { initThreadPool, prover, verify, } from '../wasm/prover/pkg/tlsn_extension_rs'; -class TLSN { +export default class TLSN { private startPromise: any; private resolveStart: any; @@ -85,5 +84,3 @@ class TLSN { return JSON.parse(raw); } } - -Comlink.expose(TLSN); diff --git a/tsconfig.compile.json b/tsconfig.compile.json new file mode 100644 index 0000000..cd77d83 --- /dev/null +++ b/tsconfig.compile.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": false, + "declaration": true, + "declarationMap": true, + "emitDeclarationOnly": true, + "sourceMap": true, + "outDir": "build" + } +} \ No newline at end of file diff --git a/utils/test.js b/utils/test.js new file mode 100644 index 0000000..c7d3984 --- /dev/null +++ b/utils/test.js @@ -0,0 +1,67 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +exports.__esModule = true; +var app_1 = require("../src/app"); +(function runTest() { + return __awaiter(this, void 0, void 0, function () { + var proof, result; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, (0, app_1.prove)('https://swapi.dev/api/people/1', { + method: 'GET', + headers: { + Connection: 'close', + Accept: 'application/json', + 'Accept-Encoding': 'identity' + }, + body: '', + maxTranscriptSize: 20000, + notaryUrl: 'https://127.0.0.1:7047', + websocketProxyUrl: 'ws://127.0.0.1:55688' + })]; + case 1: + proof = _a.sent(); + return [4 /*yield*/, (0, app_1.verify)(proof, app_1.NOTARY_SERVER_PUBKEY)]; + case 2: + result = _a.sent(); + console.log(result); + return [2 /*return*/]; + } + }); + }); +})(); diff --git a/utils/test.ts b/utils/test.ts index 7899a65..f867c92 100644 --- a/utils/test.ts +++ b/utils/test.ts @@ -1,18 +1,17 @@ -import {prove, verify, NOTARY_SERVER_PUBKEY} from "../src/app"; - +import { prove, verify, NOTARY_SERVER_PUBKEY } from '../src'; (async function runTest() { const proof = await prove('https://swapi.dev/api/people/1', { method: 'GET', headers: { - 'Connection': 'close', - 'Accept': 'application/json', - 'Accept-Encoding': 'identity' + Connection: 'close', + Accept: 'application/json', + 'Accept-Encoding': 'identity', }, body: '', maxTranscriptSize: 20000, notaryUrl: 'https://127.0.0.1:7047', - websocketProxyUrl: 'ws://127.0.0.1:55688' + websocketProxyUrl: 'ws://127.0.0.1:55688', }); const result = await verify(proof, NOTARY_SERVER_PUBKEY); diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..f2a065a --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,57 @@ +const webpack = require('webpack'); +const path = require('path'); +const isProd = process.env.NODE_ENV === 'production'; + +const envPlugin = new webpack.EnvironmentPlugin({ + NODE_ENV: 'development', +}); + +const rules = [ + { + test: /\.tsx?$/, + exclude: [/(node_modules|.webpack)/], + rules: [ + { + loader: 'ts-loader', + options: { + configFile: 'tsconfig.json', + transpileOnly: true, + }, + }, + ], + }, + { + test: /\.node$/, + use: 'node-loader', + }, +]; + +module.exports = [ + { + mode: isProd ? 'production' : 'development', + entry: { + index: path.join(__dirname, 'src', 'index.ts'), + }, + target: 'web', + devtool: 'source-map', + resolve: { + extensions: ['.ts', '.js'], + }, + node: { + __dirname: true, + }, + module: { + rules: [...rules], + }, + output: { + path: __dirname + '/build', + filename: `[name].js`, + libraryTarget: 'umd', + globalObject: 'this', + umdNamedDefine: true, + }, + plugins: [ + envPlugin, + ], + }, +]; diff --git a/webpack.test.config.js b/webpack.test.config.js index 5b9f424..b72136e 100644 --- a/webpack.test.config.js +++ b/webpack.test.config.js @@ -7,98 +7,101 @@ const { compilerOptions } = require('./tsconfig.json'); const isProd = process.env.NODE_ENV === 'production'; const devServerEntries = [ - // 'webpack-dev-server/client?http://localhost:8080', - // 'webpack/hot/only-dev-server', + // 'webpack-dev-server/client?http://localhost:8080', + // 'webpack/hot/only-dev-server', ]; const envPlugin = new webpack.EnvironmentPlugin({ - NODE_ENV: 'development', + NODE_ENV: 'development', }); const rules = [ - { - test: /\.node$/, - use: 'node-loader', - }, - { - test: /\.tsx?$/, - exclude: /(node_modules|.webpack)/, - use: [ - { - loader: 'ts-loader', - options: { - transpileOnly: true, - }, - }, - ], - }, + { + test: /\.node$/, + use: 'node-loader', + }, + { + test: /\.tsx?$/, + exclude: /(node_modules|.webpack)/, + use: [ + { + loader: 'ts-loader', + options: { + transpileOnly: true, + }, + }, + ], + }, ]; const rendererRules = []; module.exports = [ - { - target: 'web', - mode: isProd ? 'production' : 'development', - entry: { - test: path.join(__dirname, 'utils', 'test.ts'), - }, - output: { - path: __dirname + '/test-build', - publicPath: isProd ? '/' : 'http://localhost:8080/', - filename: `[name].js`, - }, - devtool: 'source-map', - resolve: { - extensions: ['.ts', '.tsx', '.js', '.jsx', '.png', '.svg'], - modules: [path.resolve('./node_modules'), path.resolve(__dirname, compilerOptions.baseUrl)], - fallback: { - browserify: require.resolve('browserify'), - stream: require.resolve('stream-browserify'), - path: require.resolve('path-browserify'), - crypto: require.resolve('crypto-browserify'), - os: require.resolve('os-browserify/browser'), - http: require.resolve('stream-http'), - https: require.resolve('https-browserify'), - assert: require.resolve('assert/'), - "events": require.resolve("events/"), - 'ansi-html-community': require.resolve('ansi-html-community'), - 'html-entities': require.resolve('html-entities'), - constants: false, - fs: false, - }, - }, - module: { - rules: [...rules, ...rendererRules], - }, - plugins: [ - envPlugin, - new webpack.ProvidePlugin({ - Buffer: ['buffer', 'Buffer'], - }), - new webpack.ProvidePlugin({ - process: 'process', - }), - new HtmlWebpackPlugin({ - template: './static/index.template.ejs', - filename: `index.html`, - title: process.env.APP_TITLE || 'Zkitter', - inject: true, - }), - new webpack.ContextReplacementPlugin(/gun/), - ], - stats: 'minimal', - devServer: { - historyApiFallback: true, - proxy: { - '/ns': { - target: `https://127.0.0.1:7074`, - secure: true, - }, - }, - }, - // optimization: { - // runtimeChunk: 'single' - // }, + { + target: 'web', + mode: isProd ? 'production' : 'development', + entry: { + test: path.join(__dirname, 'utils', 'test.ts'), }, + output: { + path: __dirname + '/test-build', + publicPath: isProd ? '/' : 'http://localhost:8080/', + filename: `[name].js`, + }, + devtool: 'source-map', + resolve: { + extensions: ['.ts', '.tsx', '.js', '.jsx', '.png', '.svg'], + modules: [ + path.resolve('./node_modules'), + path.resolve(__dirname, compilerOptions.baseUrl), + ], + fallback: { + browserify: require.resolve('browserify'), + stream: require.resolve('stream-browserify'), + path: require.resolve('path-browserify'), + crypto: require.resolve('crypto-browserify'), + os: require.resolve('os-browserify/browser'), + http: require.resolve('stream-http'), + https: require.resolve('https-browserify'), + assert: require.resolve('assert/'), + events: require.resolve('events/'), + 'ansi-html-community': require.resolve('ansi-html-community'), + 'html-entities': require.resolve('html-entities'), + constants: false, + fs: false, + }, + }, + module: { + rules: [...rules, ...rendererRules], + }, + plugins: [ + envPlugin, + new webpack.ProvidePlugin({ + Buffer: ['buffer', 'Buffer'], + }), + new webpack.ProvidePlugin({ + process: 'process', + }), + new HtmlWebpackPlugin({ + template: './static/index.template.ejs', + filename: `index.html`, + title: process.env.APP_TITLE || 'Zkitter', + inject: true, + }), + new webpack.ContextReplacementPlugin(/gun/), + ], + stats: 'minimal', + devServer: { + historyApiFallback: true, + proxy: { + '/ns': { + target: `https://127.0.0.1:7074`, + secure: true, + }, + }, + }, + // optimization: { + // runtimeChunk: 'single' + // }, + }, ];