Skip to content

Commit 6b5ea49

Browse files
committed
squash! - checkpoint 3 - both tests work
TODO: 1. Figure out how to stop the generator from mangling the model property names into capital case (getCreatedat) 2. Figure out how to export the OpenAPI model classes and the gRPC model classes at the same time without name conflicts (they have the same names) 3. Implement streaming healthcheck endpiont with gRPC 4. Allow plugins to hook in their own gRPC service implementations. Signed-off-by: Peter Somogyvari <[email protected]>
1 parent 1ab96ef commit 6b5ea49

37 files changed

+364
-1470
lines changed

package.json

+1-5
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@
100100
"git-cz": "4.7.6",
101101
"globby": "10.0.2",
102102
"grpc-tools": "1.11.2",
103-
"grpc-web": "1.2.1",
103+
"grpc_tools_node_protoc_ts": "5.3.1",
104104
"husky": "4.2.5",
105105
"inquirer": "8.1.1",
106106
"json5": "2.2.0",
@@ -115,8 +115,6 @@
115115
"npm-run-all": "4.1.5",
116116
"npm-watch": "0.7.0",
117117
"prettier": "2.0.5",
118-
"protobufjs": "6.11.2",
119-
"protoc-gen-grpc-web": "1.2.1",
120118
"run-time-error": "1.4.0",
121119
"secp256k1": "4.0.0",
122120
"shebang-loader": "0.0.1",
@@ -127,8 +125,6 @@
127125
"tape-promise": "4.0.0",
128126
"ts-loader": "6.2.1",
129127
"ts-node": "10.1.0",
130-
"ts-proto": "1.82.5",
131-
"ts-protoc-gen": "0.15.0",
132128
"typescript": "4.2.4",
133129
"webpack": "5.36.2",
134130
"webpack-bundle-analyzer": "4.4.2",

packages/cactus-cmd-api-server/package.json

+2-10
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,8 @@
1515
"generate-sdk": "openapi-generator-cli generate -i ./src/main/json/openapi.json -g typescript-axios -o ./src/main/typescript/generated/openapi/typescript-axios/ --reserved-words-mappings protected=protected",
1616
"codegen:openapi": "npm run generate-sdk",
1717
"proto:openapi": "openapi-generator-cli generate -i ./src/main/json/openapi.json -g protobuf-schema --additional-properties=packageName=org.hyperledger.cactus.cmd_api_server -o ./src/main/proto/generated/openapi/",
18-
"old-proto:pbjs:openapi": "yarn pbjs --es6 --target static --wrap=es6 --out ./src/main/typescript/generated/proto/pbjs.openapi.js ./src/main/proto/generated/openapi/models/watch_healthcheck_v1.proto ./src/main/proto/generated/openapi/models/memory_usage.proto ./src/main/proto/generated/openapi/models/health_check_response.proto ./src/main/proto/generated/openapi/services/default_service.proto",
19-
"old-proto:pbts:openapi": "yarn pbts --out ./src/main/typescript/generated/proto/pbjs.openapi.d.ts ./src/main/typescript/generated/proto/pbjs.openapi.js",
20-
"old-proto:grpc-web:openapi": "yarn grpc_tools_node_protoc --js_out=import_style=commonjs:./src/main/typescript/generated/proto/grpc-web/ --grpc_out=generate_package_definition:./src/main/typescript/generated/proto/grpc-web/ ./src/main/proto/generated/openapi/models/watch_healthcheck_v1.proto ./src/main/proto/generated/openapi/models/memory_usage.proto ./src/main/proto/generated/openapi/models/health_check_response.proto ./src/main/proto/generated/openapi/services/default_service.proto --proto_path ./src/main/proto/generated/openapi/",
21-
"proto:proto-ts-grpc-web:openapi": "yarn grpc_tools_node_protoc --plugin=../../node_modules/ts-proto/protoc-gen-ts_proto --plugin=../../node_modules/ts-protoc-gen/bin/protoc-gen-ts --js_out=import_style=commonjs,binary:./src/main/typescript/generated/proto/grpc-web/ --ts_out=service=grpc-node,mode=grpc-js:./src/main/typescript/generated/proto/grpc-web/ --grpc_out=generate_package_definition:./src/main/typescript/generated/proto/grpc-web/ --ts_proto_out=./src/main/typescript/generated/proto/ts-proto/ --ts_proto_opt=context=false --ts_proto_opt=esModuleInterop=true --ts_proto_opt=env=both --ts_proto_opt=lowerCaseServiceMethods=true --ts_proto_opt=outputClientImpl=grpc-web --ts_proto_opt=outputJsonMethods=true --ts_proto_opt=returnObservable=true --ts_proto_opt=addGrpcMetadata=true ./src/main/proto/generated/openapi/models/watch_healthcheck_v1.proto ./src/main/proto/generated/openapi/models/memory_usage.proto ./src/main/proto/generated/openapi/models/health_check_response.proto ./src/main/proto/generated/openapi/services/default_service.proto --proto_path ./src/main/proto/generated/openapi/",
22-
"old-proto:pbjs": "yarn pbjs --es6 --target static --wrap=es6 --out ./src/main/typescript/generated/proto/pbjs.js ./src/main/proto/healthcheck.proto",
23-
"old-proto:pbts": "yarn pbts --out ./src/main/typescript/generated/proto/pbts.d.ts ./src/main/typescript/generated/proto/pbjs.js",
24-
"old-proto:protoc": "yarn grpc_tools_node_protoc ./src/main/proto/healthcheck.proto",
25-
"codegen:proto": "run-s proto:openapi proto:proto-ts-grpc-web:openapi",
18+
"proto:protoc-gen-ts": "yarn run grpc_tools_node_protoc --plugin=protoc-gen-ts=../../node_modules/.bin/protoc-gen-ts --js_out=import_style=commonjs,binary:./src/main/typescript/generated/proto/protoc-gen-ts/ --ts_out=grpc_js:./src/main/typescript/generated/proto/protoc-gen-ts/ --grpc_out=grpc_js:./src/main/typescript/generated/proto/protoc-gen-ts/ --proto_path ./src/main/proto/generated/openapi/ --proto_path ./src/main/proto/generated/openapi/models/ --proto_path ./src/main/proto/generated/openapi/services/ ./src/main/proto/generated/openapi/models/*.proto ./src/main/proto/generated/openapi/services/*.proto",
19+
"codegen:proto": "run-s proto:openapi proto:protoc-gen-ts",
2620
"codegen": "run-p 'codegen:*'",
2721
"watch": "npm-watch",
2822
"webpack": "npm-run-all webpack:dev webpack:prod",
@@ -86,8 +80,6 @@
8680
"@hyperledger/cactus-common": "0.6.0",
8781
"@hyperledger/cactus-core": "0.6.0",
8882
"@hyperledger/cactus-core-api": "0.6.0",
89-
"@improbable-eng/grpc-web": "0.14.0",
90-
"@improbable-eng/grpc-web-node-http-transport": "0.14.0",
9183
"@thream/socketio-jwt": "2.1.0",
9284
"axios": "0.21.1",
9385
"body-parser": "1.19.0",

packages/cactus-cmd-api-server/src/main/typescript/api-server.ts

+7-38
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { RuntimeError } from "run-time-error";
88
import { gte } from "semver";
99
import npm from "npm";
1010
import expressHttpProxy from "express-http-proxy";
11-
import { Server as GrpcServer, ServerUnaryCall } from "@grpc/grpc-js";
11+
import { Server as GrpcServer } from "@grpc/grpc-js";
1212
import type { Application, Request, Response, RequestHandler } from "express";
1313
import express from "express";
1414
import { OpenApiValidator } from "express-openapi-validator";
@@ -43,9 +43,8 @@ import { PrometheusExporter } from "./prometheus-exporter/prometheus-exporter";
4343
import { AuthorizerFactory } from "./authzn/authorizer-factory";
4444
import { WatchHealthcheckV1 } from "./generated/openapi/typescript-axios";
4545
import { WatchHealthcheckV1Endpoint } from "./web-services/watch-healthcheck-v1-endpoint";
46-
import { HealthCheckResponsePb, MemoryUsagePb } from "./public-api";
47-
import { Empty } from "./generated/proto/ts-proto/google/protobuf/empty";
48-
// import { DefaultServiceService } from "./generated/proto/grpc-web/services/default_service_grpc_pb";
46+
import { DefaultServiceService } from "./generated/proto/protoc-gen-ts/services/default_service_grpc_pb";
47+
import { GrpcServerApiServer } from "./web-services/grpc/grpc-server-api-server";
4948

5049
export interface IApiServerConstructorOptions {
5150
readonly pluginRegistry?: PluginRegistry;
@@ -539,40 +538,10 @@ export class ApiServer {
539538
reject(new RuntimeError("Start the gRPC server failed: ", error));
540539
return;
541540
}
542-
const modulePath =
543-
"./generated/proto/grpc-web/services/default_service_grpc_pb";
544-
545-
// eslint-disable-next-line @typescript-eslint/no-var-requires
546-
const default_service_grpc_pb = require(/* webpackIgnore: true */ modulePath);
547-
548-
const svc =
549-
default_service_grpc_pb[
550-
"org.hyperledger.cactus.cmd_api_server.DefaultService"
551-
];
552-
553-
this.grpcServer.addService(svc, {
554-
getHealthCheckV1: (
555-
call: ServerUnaryCall<Empty, HealthCheckResponsePb>,
556-
callback: (
557-
err: Error | null,
558-
value: HealthCheckResponsePb,
559-
) => void,
560-
) => {
561-
this.log.debug("gRPC: GetHealthCheckV1 peer:", call.getPeer());
562-
const x = new HealthCheckResponsePb();
563-
x.setCreatedat(new Date().toJSON());
564-
x.setSuccess(true);
565-
const memoryUsage = new MemoryUsagePb();
566-
const mu = process.memoryUsage();
567-
memoryUsage.setHeaptotal(mu.heapTotal);
568-
memoryUsage.setHeapused(mu.heapUsed);
569-
memoryUsage.setRss(mu.rss);
570-
memoryUsage.setExternal(mu.external);
571-
memoryUsage.setArraybuffers(mu.arrayBuffers);
572-
x.setMemoryusage(memoryUsage);
573-
callback(null, x);
574-
},
575-
});
541+
this.grpcServer.addService(
542+
DefaultServiceService,
543+
new GrpcServerApiServer(),
544+
);
576545
this.grpcServer.start();
577546
// FIXME - ensure family is set correctly to v4 or v6 depending on
578547
// the host address' family (there must be some library to parse it)

packages/cactus-cmd-api-server/src/main/typescript/generated/proto/grpc-web/models/health_check_response_grpc_pb.d.ts

-1
This file was deleted.

packages/cactus-cmd-api-server/src/main/typescript/generated/proto/grpc-web/models/health_check_response_pb.d.ts

-36
This file was deleted.

packages/cactus-cmd-api-server/src/main/typescript/generated/proto/grpc-web/models/memory_usage_grpc_pb.d.ts

-1
This file was deleted.

packages/cactus-cmd-api-server/src/main/typescript/generated/proto/grpc-web/models/memory_usage_pb.d.ts

-41
This file was deleted.

packages/cactus-cmd-api-server/src/main/typescript/generated/proto/grpc-web/models/watch_healthcheck_v1_grpc_pb.d.ts

-1
This file was deleted.

packages/cactus-cmd-api-server/src/main/typescript/generated/proto/grpc-web/models/watch_healthcheck_v1_pb.d.ts

-21
This file was deleted.

packages/cactus-cmd-api-server/src/main/typescript/generated/proto/grpc-web/services/default_service_grpc_pb.d.ts

-31
This file was deleted.

packages/cactus-cmd-api-server/src/main/typescript/generated/proto/grpc-web/services/default_service_pb.d.ts

-27
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// package: org.hyperledger.cactus.cmd_api_server
2+
// file: models/health_check_response.proto
3+
4+
/* tslint:disable */
5+
/* eslint-disable */
6+
7+
import * as jspb from "google-protobuf";
8+
import * as models_memory_usage_pb from "../models/memory_usage_pb";
9+
10+
export class HealthCheckResponse extends jspb.Message {
11+
getSuccess(): boolean;
12+
setSuccess(value: boolean): HealthCheckResponse;
13+
getCreatedat(): string;
14+
setCreatedat(value: string): HealthCheckResponse;
15+
16+
hasMemoryusage(): boolean;
17+
clearMemoryusage(): void;
18+
getMemoryusage(): models_memory_usage_pb.MemoryUsage | undefined;
19+
setMemoryusage(value?: models_memory_usage_pb.MemoryUsage): HealthCheckResponse;
20+
21+
serializeBinary(): Uint8Array;
22+
toObject(includeInstance?: boolean): HealthCheckResponse.AsObject;
23+
static toObject(includeInstance: boolean, msg: HealthCheckResponse): HealthCheckResponse.AsObject;
24+
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
25+
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
26+
static serializeBinaryToWriter(message: HealthCheckResponse, writer: jspb.BinaryWriter): void;
27+
static deserializeBinary(bytes: Uint8Array): HealthCheckResponse;
28+
static deserializeBinaryFromReader(message: HealthCheckResponse, reader: jspb.BinaryReader): HealthCheckResponse;
29+
}
30+
31+
export namespace HealthCheckResponse {
32+
export type AsObject = {
33+
success: boolean,
34+
createdat: string,
35+
memoryusage?: models_memory_usage_pb.MemoryUsage.AsObject,
36+
}
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// package: org.hyperledger.cactus.cmd_api_server
2+
// file: models/memory_usage.proto
3+
4+
/* tslint:disable */
5+
/* eslint-disable */
6+
7+
import * as jspb from "google-protobuf";
8+
9+
export class MemoryUsage extends jspb.Message {
10+
getRss(): number;
11+
setRss(value: number): MemoryUsage;
12+
getHeaptotal(): number;
13+
setHeaptotal(value: number): MemoryUsage;
14+
getHeapused(): number;
15+
setHeapused(value: number): MemoryUsage;
16+
getExternal(): number;
17+
setExternal(value: number): MemoryUsage;
18+
getArraybuffers(): number;
19+
setArraybuffers(value: number): MemoryUsage;
20+
21+
serializeBinary(): Uint8Array;
22+
toObject(includeInstance?: boolean): MemoryUsage.AsObject;
23+
static toObject(includeInstance: boolean, msg: MemoryUsage): MemoryUsage.AsObject;
24+
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
25+
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
26+
static serializeBinaryToWriter(message: MemoryUsage, writer: jspb.BinaryWriter): void;
27+
static deserializeBinary(bytes: Uint8Array): MemoryUsage;
28+
static deserializeBinaryFromReader(message: MemoryUsage, reader: jspb.BinaryReader): MemoryUsage;
29+
}
30+
31+
export namespace MemoryUsage {
32+
export type AsObject = {
33+
rss: number,
34+
heaptotal: number,
35+
heapused: number,
36+
external: number,
37+
arraybuffers: number,
38+
}
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// package: org.hyperledger.cactus.cmd_api_server
2+
// file: models/watch_healthcheck_v1.proto
3+
4+
/* tslint:disable */
5+
/* eslint-disable */
6+
7+
import * as jspb from "google-protobuf";
8+
9+
export class WatchHealthcheckV1 extends jspb.Message {
10+
11+
serializeBinary(): Uint8Array;
12+
toObject(includeInstance?: boolean): WatchHealthcheckV1.AsObject;
13+
static toObject(includeInstance: boolean, msg: WatchHealthcheckV1): WatchHealthcheckV1.AsObject;
14+
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
15+
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
16+
static serializeBinaryToWriter(message: WatchHealthcheckV1, writer: jspb.BinaryWriter): void;
17+
static deserializeBinary(bytes: Uint8Array): WatchHealthcheckV1;
18+
static deserializeBinaryFromReader(message: WatchHealthcheckV1, reader: jspb.BinaryReader): WatchHealthcheckV1;
19+
}
20+
21+
export namespace WatchHealthcheckV1 {
22+
export type AsObject = {
23+
}
24+
}

0 commit comments

Comments
 (0)