Skip to content

Commit d011881

Browse files
Web browser API implementation
Signed-off-by: Mark S. Lewis <[email protected]>
1 parent fb0b8fb commit d011881

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1892
-2
lines changed

.github/workflows/build-docs.yml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,19 @@ jobs:
3636
with:
3737
name: java-doc
3838
path: java/target/site/apidocs/
39+
40+
web:
41+
runs-on: ubuntu-22.04
42+
name: Web documentation
43+
steps:
44+
- uses: actions/checkout@v4
45+
- uses: actions/setup-node@v4
46+
with:
47+
node-version: 20
48+
- name: Generate documentation
49+
run: make generate-docs-web
50+
- name: Upload documentation
51+
uses: actions/upload-artifact@v4
52+
with:
53+
name: web-doc
54+
path: web/apidocs/

.github/workflows/test.yml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,3 +194,20 @@ jobs:
194194
run: make pull-latest-peer
195195
- name: Run scenario tests
196196
run: make scenario-test-java
197+
198+
web_unit:
199+
needs: verify-versions
200+
runs-on: ubuntu-22.04
201+
name: Unit test Web
202+
steps:
203+
- uses: actions/checkout@v4
204+
- uses: actions/setup-node@v4
205+
with:
206+
node-version: 20
207+
- name: Run unit tests
208+
run: make unit-test-web
209+
- name: Upload bundle
210+
uses: actions/upload-artifact@v4
211+
with:
212+
name: web-bundle
213+
path: web/fabric-gateway-web.js

Makefile

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ base_dir := $(patsubst %/,%,$(dir $(realpath $(lastword $(MAKEFILE_LIST)))))
99
go_dir := $(base_dir)/pkg
1010
node_dir := $(base_dir)/node
1111
java_dir := $(base_dir)/java
12+
web_dir := $(base_dir)/web
1213
scenario_dir := $(base_dir)/scenario
1314

1415
go_bin_dir := $(shell go env GOPATH)/bin
@@ -49,6 +50,12 @@ build-java:
4950
cd "$(java_dir)" && \
5051
mvn -DskipTests install
5152

53+
.PHONEY: build-web
54+
build-web:
55+
cd "$(web_dir)" && \
56+
npm install && \
57+
npm run build
58+
5259
.PHONEY: unit-test
5360
unit-test: generate lint unit-test-go unit-test-node unit-test-java
5461

@@ -72,6 +79,11 @@ unit-test-java:
7279
cd "$(java_dir)" && \
7380
mvn test
7481

82+
.PHONEY: unit-test-web
83+
unit-test-web: build-web
84+
cd "$(web_dir)" && \
85+
npm test
86+
7587
.PHONEY: lint
7688
lint: staticcheck golangci-lint
7789

@@ -214,6 +226,12 @@ generate-docs-java:
214226
cd "$(java_dir)" && \
215227
mvn javadoc:javadoc
216228

229+
.PHONEY: generate-docs-web
230+
generate-docs-web:
231+
cd "$(web_dir)" && \
232+
npm install && \
233+
npm run generate-apidoc
234+
217235
.PHONEY: test
218236
test: shellcheck unit-test scenario-test
219237

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ The following Makefile targets are available:
5050
- `make unit-test-go-pkcs11` - run unit tests for the Go client API, including HSM tests
5151
- `make unit-test-node` - run unit tests for the Node client API
5252
- `make unit-test-java` - run unit tests for the Java client API
53+
- `make unit-test-web` - run unit tests for the Web client API
5354
- `make unit-test` - run unit tests for all client language implementations
5455
- `make pull-latest-peer` - fetch the latest peer docker image containing the gateway server
5556
- `make scenario-test-go` - run the scenario (end to end integration) tests for Go client API, including HSM tests

node/src/signingidentity.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { Signer } from './identity/signer';
1414
export const undefinedSignerMessage = 'No signing implementation';
1515

1616
const undefinedSigner: Signer = () => {
17-
throw new Error(undefinedSignerMessage);
17+
return Promise.reject(new Error(undefinedSignerMessage));
1818
};
1919

2020
type SigningIdentityOptions = Pick<ConnectOptions, 'identity' | 'signer' | 'hash'>;
@@ -55,7 +55,7 @@ export class SigningIdentity {
5555
return this.#hash(message);
5656
}
5757

58-
async sign(digest: Uint8Array): Promise<Uint8Array> {
58+
sign(digest: Uint8Array): Promise<Uint8Array> {
5959
return this.#sign(digest);
6060
}
6161
}

scenario/fixtures/rest/.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
node_modules/
2+
dist/
3+
coverage/
4+
package-lock.json
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
{
2+
"name": "fabric-gateway-rest",
3+
"version": "0.0.1",
4+
"description": "REST server for fabric-gateway-web clients",
5+
"main": "dist/index.js",
6+
"engines": {
7+
"node": ">=18.12.0"
8+
},
9+
"scripts": {
10+
"format": "prettier '**/*.{ts,js}' --check",
11+
"format:fix": "prettier '**/*.{ts,js}' --write",
12+
"lint": "eslint .",
13+
"postinstall": "tsc",
14+
"test": "echo \"Error: no test specified\" && exit 1"
15+
},
16+
"license": "Apache-2.0",
17+
"dependencies": {
18+
"@grpc/grpc-js": "^1.10.4",
19+
"@hyperledger/fabric-gateway": "file:../../../node/fabric-gateway-dev.tgz",
20+
"express": "^4.19.2"
21+
},
22+
"devDependencies": {
23+
"@tsconfig/node18": "^18.2.2",
24+
"@types/express": "^4.17.21",
25+
"@types/node": "^18.19.22",
26+
"@typescript-eslint/eslint-plugin": "~7.3.1",
27+
"@typescript-eslint/parser": "~7.3.1",
28+
"eslint": "^8.57.0",
29+
"eslint-config-prettier": "^9.1.0",
30+
"prettier": "^3.2.5",
31+
"typescript": "~5.4.2"
32+
}
33+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { Gateway } from '@hyperledger/fabric-gateway';
2+
import express, { Express } from 'express';
3+
import { Server } from './server';
4+
5+
const REST_PORT = 3000;
6+
7+
export interface GatewayServerOptions {
8+
port: number;
9+
gateway: Gateway;
10+
}
11+
12+
export class GatewayServer {
13+
#gateway: Gateway;
14+
#server: Server;
15+
16+
constructor(options: GatewayServerOptions) {
17+
this.#gateway = options.gateway;
18+
this.#server = new Server({
19+
port: options.port,
20+
handlers: [this.#evaluate],
21+
});
22+
}
23+
24+
start(): Promise<void> {
25+
return this.#server.start();
26+
}
27+
28+
stop(): Promise<void> {
29+
return this.#server.stop();
30+
}
31+
32+
#evaluate(app: Express): void {
33+
app.post('/evaluate', express.json(), (request, response) => {
34+
request.body.proposal;
35+
});
36+
}
37+
}

scenario/fixtures/rest/src/index.ts

Whitespace-only changes.
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import express, { Express } from 'express';
2+
import * as http from 'node:http';
3+
4+
export interface ServerOptions {
5+
port: number;
6+
handlers: ((app: Express) => void)[];
7+
}
8+
9+
export class Server {
10+
readonly #app = express();
11+
readonly #port: number;
12+
#server?: http.Server;
13+
14+
constructor(options: ServerOptions) {
15+
this.#port = options.port;
16+
options.handlers.forEach((handler) => handler(this.#app));
17+
}
18+
19+
start(): Promise<void> {
20+
return new Promise((resolve) => {
21+
this.#server = this.#app.listen(this.#port, resolve);
22+
});
23+
}
24+
25+
stop(): Promise<void> {
26+
return new Promise((resolve, reject) => this.#server?.close((err) => (err ? resolve() : reject(err))));
27+
}
28+
}

0 commit comments

Comments
 (0)