Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ jobs:
node-version: 16.14.2
- name: Install dependencies
run: yarn --frozen-lockfile --non-interactive --no-progress
- name: Format check
run: yarn format:check
- name: Build Lib
run: yarn build
- name: Release
Expand Down
7 changes: 5 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,19 @@
"types": "dist/types.d.ts",
"scripts": {
"tsc": "tsc",
"build": "rm -rf dist && yarn tsc && cp src/package.json dist && cp README.md dist && cp LICENSE.md dist"
"build": "rm -rf dist && yarn tsc && cp src/package.json dist && cp README.md dist && cp LICENSE.md dist",
"format": "prettier --write src/**/*",
"format:check": "prettier --check src/**/*"
},
"dependencies": {
"@grpc/grpc-js": "1.6.10",
"@improbable-eng/grpc-web": "0.15.0",
"@playwright/test": "1.22.2",
"google-protobuf": "3.14.0",
"grpc": "1.24.11",
"playwright-core": "1.22.2"
},
"devDependencies": {
"prettier": "^2.7.1",
"semantic-release": "19.0.2",
"typescript": "4.7.2"
}
Expand Down
15 changes: 6 additions & 9 deletions src/base/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {status as Status} from 'grpc';
import { status as Status } from "@grpc/grpc-js";

export interface GrpcErrorResponse {
status: Status;
Expand All @@ -9,7 +9,7 @@ export interface GrpcSuccessResponse {
message: Uint8Array;
}

export type GrpcResponse = GrpcSuccessResponse | GrpcErrorResponse
export type GrpcResponse = GrpcSuccessResponse | GrpcErrorResponse;

function fourBytesLength(sized: { length: number }): Uint8Array {
const arr = new Uint8Array(4); // an Int32 takes 4 bytes
Expand All @@ -24,19 +24,16 @@ export class GrpcUnknownStatus extends Error {
}
}

export function grpcResponseToBuffer(
response: GrpcResponse
): Buffer {

export function grpcResponseToBuffer(response: GrpcResponse): Buffer {
// error messages need to have a zero length message field to be considered valid
const message = 'message' in response ? response.message : new Uint8Array();
const message = "message" in response ? response.message : new Uint8Array();

// all success responses have status OK
const status = 'status' in response ? response.status : Status.OK;
const status = "status" in response ? response.status : Status.OK;
// error statuses may the detail field to denote a custom error message, otherwise use the string version of the status
let grpcMessage: string | undefined;

if ('detail' in response) {
if ("detail" in response) {
grpcMessage = response.detail;
} else {
const currentStatus = Object.entries(Status).find(
Expand Down
27 changes: 14 additions & 13 deletions src/playwright/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import {expect, Page} from '@playwright/test';
import {grpc} from '@improbable-eng/grpc-web';
import {GrpcResponse, grpcResponseToBuffer,} from '../base';
import {Request} from 'playwright-core';
import { expect, Page } from "@playwright/test";
import { grpc } from "@improbable-eng/grpc-web";
import { GrpcResponse, grpcResponseToBuffer } from "../base";
import { Request } from "playwright-core";

export interface UnaryMethodDefinitionish
extends grpc.UnaryMethodDefinition<any, any> {
Expand Down Expand Up @@ -42,28 +42,29 @@ export function readGrpcRequest(request: Request): Uint8Array | null {
export function mockGrpcUnary(
page: Page,
rpc: UnaryMethodDefinitionish,
response: GrpcResponse | ((request: Uint8Array|null) => GrpcResponse)
response: GrpcResponse | ((request: Uint8Array | null) => GrpcResponse)
): MockedGrpcCall {
const url = `/${rpc.service.serviceName}/${rpc.methodName}`;

// note this wildcard route url base is done in order to match both localhost and deployed service usages.
page.route('**' + url, (route) => {
page.route("**" + url, (route) => {
expect(
route.request().method(),
'ALL gRPC requests should be a POST request'
).toBe('POST');
"ALL gRPC requests should be a POST request"
).toBe("POST");

const grpcResponse = typeof response === 'function'
? response(readGrpcRequest(route.request()))
: response;
const grpcResponse =
typeof response === "function"
? response(readGrpcRequest(route.request()))
: response;

const grpcResponseBody = grpcResponseToBuffer(grpcResponse);

return route.fulfill({
body: grpcResponseBody,
contentType: 'application/grpc-web+proto',
contentType: "application/grpc-web+proto",
headers: {
'Access-Control-Allow-Origin': '*',
"Access-Control-Allow-Origin": "*",
},
});
});
Expand Down
Loading