From 0d169eca67fb4ea552485090c9cc70117f7afa08 Mon Sep 17 00:00:00 2001 From: Daniel Lytkin Date: Tue, 17 Oct 2023 17:25:03 +0200 Subject: [PATCH] chore: fix hanging and erroring tests (#466) - Use `127.0.0.1` instead of `localhost` to fix ipv4 vs ipv6 issues - Reduce traefik test flakiness - Fix grpcwebproxy download for arm64 - Get rid of `get-port` dependency for `nice-grpc` --- .../src/index.test.ts | 13 ++-- .../src/index.test.ts | 12 ++-- .../nice-grpc-error-details/src/index.test.ts | 4 +- .../src/__tests__/bidiStreaming.ts | 18 ++--- .../src/__tests__/clientStreaming.ts | 12 ++-- .../src/__tests__/context.ts | 4 +- .../src/__tests__/serverStreaming.ts | 18 ++--- .../src/__tests__/unary.ts | 24 +++---- .../src/__tests__/bidiStreaming.ts | 12 ++-- .../src/__tests__/clientStreaming.ts | 8 +-- .../src/__tests__/customMetrics.ts | 8 +-- .../src/__tests__/serverStreaming.ts | 12 ++-- .../src/__tests__/unary.ts | 16 ++--- .../nice-grpc-server-health/src/index.test.ts | 16 ++--- .../src/index.test.ts | 12 ++-- packages/nice-grpc-web/karma.conf.ts | 21 +++++- packages/nice-grpc-web/package.json | 4 +- packages/nice-grpc-web/run-specs-jasmine.ts | 2 +- .../scripts/download-grpcwebproxy.js | 3 +- packages/nice-grpc-web/test-server/client.ts | 2 +- .../nice-grpc-web/test-server/grpcwebproxy.ts | 2 +- packages/nice-grpc-web/test-server/traefik.ts | 14 +++- packages/nice-grpc/package.json | 2 - .../nice-grpc/src/__tests__/bidiStreaming.ts | 43 ++++------- packages/nice-grpc/src/__tests__/channel.ts | 13 ++-- .../clientMiddleware/bidiStreaming.ts | 13 ++-- .../src/__tests__/clientMiddleware/chain.ts | 13 ++-- .../clientMiddleware/clientStreaming.ts | 13 ++-- .../clientMiddleware/serverStreaming.ts | 13 ++-- .../src/__tests__/clientMiddleware/unary.ts | 13 ++-- .../src/__tests__/clientStreaming.ts | 43 ++++------- .../src/__tests__/defaultCallOptions.ts | 7 +- .../nice-grpc/src/__tests__/serverClass.ts | 7 +- .../serverMiddleware/bidiStreaming.ts | 13 ++-- .../src/__tests__/serverMiddleware/chain.ts | 7 +- .../serverMiddleware/clientStreaming.ts | 13 ++-- .../__tests__/serverMiddleware/perService.ts | 7 +- .../serverMiddleware/serverStreaming.ts | 13 ++-- .../src/__tests__/serverMiddleware/unary.ts | 13 ++-- .../src/__tests__/serverStreaming.ts | 43 ++++------- packages/nice-grpc/src/__tests__/ts-proto.ts | 13 ++-- packages/nice-grpc/src/__tests__/unary.ts | 31 +++----- yarn.lock | 71 +++---------------- 43 files changed, 250 insertions(+), 391 deletions(-) diff --git a/packages/nice-grpc-client-middleware-deadline/src/index.test.ts b/packages/nice-grpc-client-middleware-deadline/src/index.test.ts index 657adedb..14effdca 100644 --- a/packages/nice-grpc-client-middleware-deadline/src/index.test.ts +++ b/packages/nice-grpc-client-middleware-deadline/src/index.test.ts @@ -1,4 +1,3 @@ -import defer = require('defer-promise'); import {forever} from 'abort-controller-x'; import { createChannel, @@ -27,9 +26,9 @@ test('successful call', async () => { testBidiStream: throwUnimplemented, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(deadlineMiddleware) .create(TestService, channel); @@ -57,9 +56,9 @@ test('absolute deadline', async () => { testBidiStream: throwUnimplemented, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(deadlineMiddleware) .create(TestService, channel); @@ -89,9 +88,9 @@ test('relative deadline', async () => { testBidiStream: throwUnimplemented, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(deadlineMiddleware) .create(TestService, channel); diff --git a/packages/nice-grpc-client-middleware-retry/src/index.test.ts b/packages/nice-grpc-client-middleware-retry/src/index.test.ts index 35e64694..973b4537 100644 --- a/packages/nice-grpc-client-middleware-retry/src/index.test.ts +++ b/packages/nice-grpc-client-middleware-retry/src/index.test.ts @@ -31,9 +31,9 @@ test('basic', async () => { }, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(retryMiddleware) .create(TestDefinition, channel); @@ -71,9 +71,9 @@ test('retries enabled', async () => { }, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(retryMiddleware) .create(TestDefinition, channel); @@ -120,9 +120,9 @@ test('idempotent', async () => { }, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(retryMiddleware) .create(TestDefinition, channel); diff --git a/packages/nice-grpc-error-details/src/index.test.ts b/packages/nice-grpc-error-details/src/index.test.ts index 22ed0d00..c001f724 100644 --- a/packages/nice-grpc-error-details/src/index.test.ts +++ b/packages/nice-grpc-error-details/src/index.test.ts @@ -34,9 +34,9 @@ const beforeEachServerAndClientTest = async ( }, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const rawClient = createClient(TestDefinition, channel); diff --git a/packages/nice-grpc-opentelemetry/src/__tests__/bidiStreaming.ts b/packages/nice-grpc-opentelemetry/src/__tests__/bidiStreaming.ts index 2691d21b..9533f9fa 100644 --- a/packages/nice-grpc-opentelemetry/src/__tests__/bidiStreaming.ts +++ b/packages/nice-grpc-opentelemetry/src/__tests__/bidiStreaming.ts @@ -46,9 +46,9 @@ test('basic', async () => { }, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(openTelemetryClientMiddleware()) .create(TestDefinition, channel); @@ -120,7 +120,7 @@ test('basic', async () => { expect(dumpSpan(serverSpan)).toMatchInlineSnapshot(` { "attributes": { - "net.peer.ip": "::1", + "net.peer.ip": "127.0.0.1", "rpc.grpc.status_code": 0, "rpc.grpc.status_text": "OK", "rpc.method": "TestBidiStream", @@ -185,9 +185,9 @@ test('error', async () => { }, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(openTelemetryClientMiddleware()) .create(TestDefinition, channel); @@ -249,7 +249,7 @@ test('error', async () => { expect(dumpSpan(serverSpan)).toMatchInlineSnapshot(` { "attributes": { - "net.peer.ip": "::1", + "net.peer.ip": "127.0.0.1", "rpc.grpc.status_code": 5, "rpc.grpc.status_text": "NOT_FOUND", "rpc.method": "TestBidiStream", @@ -295,9 +295,9 @@ test('aborted iteration on client', async () => { }, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(openTelemetryClientMiddleware()) .create(TestDefinition, channel); @@ -365,7 +365,7 @@ test('aborted iteration on client', async () => { expect(dumpSpan(serverSpan)).toMatchInlineSnapshot(` { "attributes": { - "net.peer.ip": "::1", + "net.peer.ip": "127.0.0.1", "rpc.grpc.status_code": 1, "rpc.grpc.status_text": "CANCELLED", "rpc.method": "TestBidiStream", diff --git a/packages/nice-grpc-opentelemetry/src/__tests__/clientStreaming.ts b/packages/nice-grpc-opentelemetry/src/__tests__/clientStreaming.ts index 0339710c..e4f199c6 100644 --- a/packages/nice-grpc-opentelemetry/src/__tests__/clientStreaming.ts +++ b/packages/nice-grpc-opentelemetry/src/__tests__/clientStreaming.ts @@ -46,9 +46,9 @@ test('basic', async () => { testBidiStream: throwUnimplemented, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(openTelemetryClientMiddleware()) .create(TestDefinition, channel); @@ -105,7 +105,7 @@ test('basic', async () => { expect(dumpSpan(serverSpan)).toMatchInlineSnapshot(` { "attributes": { - "net.peer.ip": "::1", + "net.peer.ip": "127.0.0.1", "rpc.grpc.status_code": 0, "rpc.grpc.status_text": "OK", "rpc.method": "TestClientStream", @@ -157,9 +157,9 @@ test('error', async () => { testBidiStream: throwUnimplemented, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(openTelemetryClientMiddleware()) .create(TestDefinition, channel); @@ -216,7 +216,7 @@ test('error', async () => { expect(dumpSpan(serverSpan)).toMatchInlineSnapshot(` { "attributes": { - "net.peer.ip": "::1", + "net.peer.ip": "127.0.0.1", "rpc.grpc.status_code": 5, "rpc.grpc.status_text": "NOT_FOUND", "rpc.method": "TestClientStream", diff --git a/packages/nice-grpc-opentelemetry/src/__tests__/context.ts b/packages/nice-grpc-opentelemetry/src/__tests__/context.ts index f524f42b..4d7d0ec2 100644 --- a/packages/nice-grpc-opentelemetry/src/__tests__/context.ts +++ b/packages/nice-grpc-opentelemetry/src/__tests__/context.ts @@ -58,9 +58,9 @@ test('context propagation', async () => { testBidiStream: throwUnimplemented, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(async function* testClientMiddleware(call, options) { traceIdInClientMiddlewareStart = getCurrentTraceId(); diff --git a/packages/nice-grpc-opentelemetry/src/__tests__/serverStreaming.ts b/packages/nice-grpc-opentelemetry/src/__tests__/serverStreaming.ts index 2e008eef..462595e6 100644 --- a/packages/nice-grpc-opentelemetry/src/__tests__/serverStreaming.ts +++ b/packages/nice-grpc-opentelemetry/src/__tests__/serverStreaming.ts @@ -45,9 +45,9 @@ test('basic', async () => { testBidiStream: throwUnimplemented, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(openTelemetryClientMiddleware()) .create(TestDefinition, channel); @@ -100,7 +100,7 @@ test('basic', async () => { expect(dumpSpan(serverSpan)).toMatchInlineSnapshot(` { "attributes": { - "net.peer.ip": "::1", + "net.peer.ip": "127.0.0.1", "rpc.grpc.status_code": 0, "rpc.grpc.status_text": "OK", "rpc.method": "TestServerStream", @@ -150,9 +150,9 @@ test('error', async () => { testBidiStream: throwUnimplemented, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(openTelemetryClientMiddleware()) .create(TestDefinition, channel); @@ -202,7 +202,7 @@ test('error', async () => { expect(dumpSpan(serverSpan)).toMatchInlineSnapshot(` { "attributes": { - "net.peer.ip": "::1", + "net.peer.ip": "127.0.0.1", "rpc.grpc.status_code": 5, "rpc.grpc.status_text": "NOT_FOUND", "rpc.method": "TestServerStream", @@ -245,9 +245,9 @@ test('aborted iteration on client', async () => { testBidiStream: throwUnimplemented, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(openTelemetryClientMiddleware()) .create(TestDefinition, channel); @@ -296,7 +296,7 @@ test('aborted iteration on client', async () => { expect(dumpSpan(serverSpan)).toMatchInlineSnapshot(` { "attributes": { - "net.peer.ip": "::1", + "net.peer.ip": "127.0.0.1", "rpc.grpc.status_code": 1, "rpc.grpc.status_text": "CANCELLED", "rpc.method": "TestServerStream", diff --git a/packages/nice-grpc-opentelemetry/src/__tests__/unary.ts b/packages/nice-grpc-opentelemetry/src/__tests__/unary.ts index 297b39ea..b53b2a88 100644 --- a/packages/nice-grpc-opentelemetry/src/__tests__/unary.ts +++ b/packages/nice-grpc-opentelemetry/src/__tests__/unary.ts @@ -45,9 +45,9 @@ test('basic', async () => { testBidiStream: throwUnimplemented, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(openTelemetryClientMiddleware()) .create(TestDefinition, channel); @@ -84,7 +84,7 @@ test('basic', async () => { expect(dumpSpan(serverSpan)).toMatchInlineSnapshot(` { "attributes": { - "net.peer.ip": "::1", + "net.peer.ip": "127.0.0.1", "rpc.grpc.status_code": 0, "rpc.grpc.status_text": "OK", "rpc.method": "TestUnary", @@ -118,9 +118,9 @@ test('error', async () => { testBidiStream: throwUnimplemented, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(openTelemetryClientMiddleware()) .create(TestDefinition, channel); @@ -157,7 +157,7 @@ test('error', async () => { expect(dumpSpan(serverSpan)).toMatchInlineSnapshot(` { "attributes": { - "net.peer.ip": "::1", + "net.peer.ip": "127.0.0.1", "rpc.grpc.status_code": 5, "rpc.grpc.status_text": "NOT_FOUND", "rpc.method": "TestUnary", @@ -191,9 +191,9 @@ test('unknown error', async () => { testBidiStream: throwUnimplemented, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(openTelemetryClientMiddleware()) .create(TestDefinition, channel); @@ -235,7 +235,7 @@ test('unknown error', async () => { expect(dumpSpan(serverSpan)).toMatchInlineSnapshot(` { "attributes": { - "net.peer.ip": "::1", + "net.peer.ip": "127.0.0.1", "rpc.grpc.status_code": 2, "rpc.grpc.status_text": "UNKNOWN", "rpc.method": "TestUnary", @@ -281,9 +281,9 @@ test('cancel', async () => { testBidiStream: throwUnimplemented, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(openTelemetryClientMiddleware()) .create(TestDefinition, channel); @@ -328,7 +328,7 @@ test('cancel', async () => { expect(dumpSpan(serverSpan)).toMatchInlineSnapshot(` { "attributes": { - "net.peer.ip": "::1", + "net.peer.ip": "127.0.0.1", "rpc.grpc.status_code": 1, "rpc.grpc.status_text": "CANCELLED", "rpc.method": "TestUnary", diff --git a/packages/nice-grpc-prometheus/src/__tests__/bidiStreaming.ts b/packages/nice-grpc-prometheus/src/__tests__/bidiStreaming.ts index 8b311a3f..dc62525e 100644 --- a/packages/nice-grpc-prometheus/src/__tests__/bidiStreaming.ts +++ b/packages/nice-grpc-prometheus/src/__tests__/bidiStreaming.ts @@ -33,9 +33,9 @@ test('basic', async () => { }, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(prometheusClientMiddleware()) .create(TestDefinition, channel); @@ -138,9 +138,9 @@ test('error', async () => { }, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(prometheusClientMiddleware()) .create(TestDefinition, channel); @@ -247,9 +247,9 @@ test('aborted iteration on client', async () => { }, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(prometheusClientMiddleware()) .create(TestDefinition, channel); diff --git a/packages/nice-grpc-prometheus/src/__tests__/clientStreaming.ts b/packages/nice-grpc-prometheus/src/__tests__/clientStreaming.ts index 1826b2bb..4dc8d2d0 100644 --- a/packages/nice-grpc-prometheus/src/__tests__/clientStreaming.ts +++ b/packages/nice-grpc-prometheus/src/__tests__/clientStreaming.ts @@ -33,9 +33,9 @@ test('basic', async () => { testBidiStream: throwUnimplemented, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(prometheusClientMiddleware()) .create(TestDefinition, channel); @@ -136,9 +136,9 @@ test('error', async () => { testBidiStream: throwUnimplemented, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(prometheusClientMiddleware()) .create(TestDefinition, channel); diff --git a/packages/nice-grpc-prometheus/src/__tests__/customMetrics.ts b/packages/nice-grpc-prometheus/src/__tests__/customMetrics.ts index c1f079cb..12740bb6 100644 --- a/packages/nice-grpc-prometheus/src/__tests__/customMetrics.ts +++ b/packages/nice-grpc-prometheus/src/__tests__/customMetrics.ts @@ -114,9 +114,9 @@ test('basic', async () => { testBidiStream: throwUnimplemented, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use( prometheusClientMiddleware({ @@ -205,9 +205,9 @@ test('error', async () => { testBidiStream: throwUnimplemented, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use( prometheusClientMiddleware({ diff --git a/packages/nice-grpc-prometheus/src/__tests__/serverStreaming.ts b/packages/nice-grpc-prometheus/src/__tests__/serverStreaming.ts index 0be07602..986b7f28 100644 --- a/packages/nice-grpc-prometheus/src/__tests__/serverStreaming.ts +++ b/packages/nice-grpc-prometheus/src/__tests__/serverStreaming.ts @@ -32,9 +32,9 @@ test('basic', async () => { testBidiStream: throwUnimplemented, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(prometheusClientMiddleware()) .create(TestDefinition, channel); @@ -129,9 +129,9 @@ test('error', async () => { testBidiStream: throwUnimplemented, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(prometheusClientMiddleware()) .create(TestDefinition, channel); @@ -230,9 +230,9 @@ test('aborted iteration on client', async () => { testBidiStream: throwUnimplemented, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(prometheusClientMiddleware()) .create(TestDefinition, channel); diff --git a/packages/nice-grpc-prometheus/src/__tests__/unary.ts b/packages/nice-grpc-prometheus/src/__tests__/unary.ts index b4ea18a5..e98cde2f 100644 --- a/packages/nice-grpc-prometheus/src/__tests__/unary.ts +++ b/packages/nice-grpc-prometheus/src/__tests__/unary.ts @@ -32,9 +32,9 @@ test('basic', async () => { testBidiStream: throwUnimplemented, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(prometheusClientMiddleware()) .create(TestDefinition, channel); @@ -125,9 +125,9 @@ test('error', async () => { testBidiStream: throwUnimplemented, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(prometheusClientMiddleware()) .create(TestDefinition, channel); @@ -218,9 +218,9 @@ test('unknown error', async () => { testBidiStream: throwUnimplemented, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(prometheusClientMiddleware()) .create(TestDefinition, channel); @@ -315,9 +315,9 @@ test('cancel', async () => { testBidiStream: throwUnimplemented, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(prometheusClientMiddleware()) .create(TestDefinition, channel); diff --git a/packages/nice-grpc-server-health/src/index.test.ts b/packages/nice-grpc-server-health/src/index.test.ts index d646ba32..f5beda95 100644 --- a/packages/nice-grpc-server-health/src/index.test.ts +++ b/packages/nice-grpc-server-health/src/index.test.ts @@ -10,9 +10,9 @@ test('basic', async () => { server.add(HealthDefinition, HealthServiceImpl()); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(HealthDefinition, channel); await expect(client.check({service: ''})).resolves.toMatchInlineSnapshot(` @@ -36,9 +36,9 @@ test('per-service', async () => { server.add(HealthDefinition, HealthServiceImpl(healthState)); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(HealthDefinition, channel); await expect(client.check({service: ''})).resolves.toMatchInlineSnapshot(` @@ -92,9 +92,9 @@ test('watch', async () => { server.add(HealthDefinition, HealthServiceImpl(healthState)); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(HealthDefinition, channel); const it1 = client.watch({service: ''})[Symbol.asyncIterator](); @@ -171,7 +171,7 @@ test.skipWindows('grpc-health-probe', async () => { server.add(HealthDefinition, HealthServiceImpl(healthState)); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); const execProbe = (...args: string[]) => new Promise<{stderr: string; code: number | null}>(resolve => { @@ -182,7 +182,7 @@ test.skipWindows('grpc-health-probe', async () => { 'grpc-health-probe', 'grpc-health-probe', )}`, - ['-addr', `localhost:${port}`, ...args], + ['-addr', `127.0.0.1:${port}`, ...args], ); let stderr = ''; diff --git a/packages/nice-grpc-server-middleware-terminator/src/index.test.ts b/packages/nice-grpc-server-middleware-terminator/src/index.test.ts index 79408fa1..9bfc0254 100644 --- a/packages/nice-grpc-server-middleware-terminator/src/index.test.ts +++ b/packages/nice-grpc-server-middleware-terminator/src/index.test.ts @@ -30,9 +30,9 @@ test('basic', async () => { }, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestDefinition, channel); const promise = client.testUnary({}); @@ -65,9 +65,9 @@ test('terminate before call start', async () => { }, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestDefinition, channel); terminatorMiddleware.terminate(); @@ -106,9 +106,9 @@ test('cancel', async () => { }, }); - const port = await server.listen('localhost:0'); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`localhost:${port}`); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestDefinition, channel); const abortController = new AbortController(); diff --git a/packages/nice-grpc-web/karma.conf.ts b/packages/nice-grpc-web/karma.conf.ts index f46f92af..51e76f3a 100644 --- a/packages/nice-grpc-web/karma.conf.ts +++ b/packages/nice-grpc-web/karma.conf.ts @@ -50,7 +50,7 @@ export default (config: Config & Record) => { certPath = path.resolve(__dirname, './test-server/cert/tls.crt'); keyPath = path.resolve(__dirname, './test-server/cert/tls.key'); } else { - hostname = 'localhost'; + hostname = '127.0.0.1'; certPath = path.resolve(__dirname, './test-server/cert/self-signed.crt'); keyPath = path.resolve(__dirname, './test-server/cert/self-signed.key'); @@ -213,6 +213,25 @@ function WebdriverIOLauncher( this.on('kill', (done: () => void) => { Promise.resolve() .then(async () => { + const browserLogs = await browser.getLogs('browser'); + console.log( + 'browser logs:\n' + + ( + browserLogs as Array<{ + level: string; + message: string; + source: string; + timestamp: number; + }> + ) + .map( + log => + `${new Date(log.timestamp).toISOString()} ${ + log.level + } [${log.source}] ${log.message}`, + ) + .join('\n'), + ); await browser.deleteSession(); browserstackLocal?.stop(); }) diff --git a/packages/nice-grpc-web/package.json b/packages/nice-grpc-web/package.json index 17109113..ceeeeb32 100644 --- a/packages/nice-grpc-web/package.json +++ b/packages/nice-grpc-web/package.json @@ -43,6 +43,7 @@ "@babel/preset-env": "^7.20.2", "@improbable-eng/grpc-web": "^0.15.0", "@tsconfig/recommended": "^1.0.1", + "@types/get-port": "^4.2.0", "@types/google-protobuf": "^3.15.2", "@types/jasmine": "^4.3.1", "@types/karma": "^6.3.3", @@ -53,6 +54,7 @@ "chromedriver": "^113.0.0", "cpr": "^3.0.1", "detect-browser": "^5.3.0", + "get-port": "^5.1.1", "google-protobuf": "^3.17.3", "grpc-tools": "^1.11.2", "jasmine": "^4.5.0", @@ -70,7 +72,7 @@ "selfsigned": "^2.1.1", "string-env-interpolation": "^1.0.1", "tcp-port-used": "^1.0.2", - "testcontainers": "^9.0.0", + "testcontainers": "^10.2.1", "ts-proto": "^1.112.0", "ts-protoc-gen": "^0.15.0", "unzipper": "^0.10.11", diff --git a/packages/nice-grpc-web/run-specs-jasmine.ts b/packages/nice-grpc-web/run-specs-jasmine.ts index 216d80bb..f229db9b 100644 --- a/packages/nice-grpc-web/run-specs-jasmine.ts +++ b/packages/nice-grpc-web/run-specs-jasmine.ts @@ -29,7 +29,7 @@ jasmine.addReporter(new SpecReporter()); const certPath = path.resolve(__dirname, './test-server/cert/self-signed.crt'); const keyPath = path.resolve(__dirname, './test-server/cert/self-signed.key'); -const hostname = 'localhost'; +const hostname = '127.0.0.1'; const cert = selfsigned.generate([{name: 'commonName', value: hostname}], { keySize: 2048, }); diff --git a/packages/nice-grpc-web/scripts/download-grpcwebproxy.js b/packages/nice-grpc-web/scripts/download-grpcwebproxy.js index b738758c..0ceb2907 100644 --- a/packages/nice-grpc-web/scripts/download-grpcwebproxy.js +++ b/packages/nice-grpc-web/scripts/download-grpcwebproxy.js @@ -14,7 +14,8 @@ const releases = { }; const platform = process.platform; -const arch = process.arch === 'x64' ? 'x86_64' : 'x86_32'; +const arch = + process.arch === 'x64' || process.arch === 'arm64' ? 'x86_64' : 'x86_32'; const release = platform + '_' + arch; const targetPath = path.join( diff --git a/packages/nice-grpc-web/test-server/client.ts b/packages/nice-grpc-web/test-server/client.ts index 260eac21..8525b82b 100644 --- a/packages/nice-grpc-web/test-server/client.ts +++ b/packages/nice-grpc-web/test-server/client.ts @@ -26,7 +26,7 @@ export async function startRemoteTestServer( proxyType: 'grpcwebproxy' | 'envoy' | 'traefik' = 'grpcwebproxy', protocol: 'http' | 'https' = 'http', ): Promise { - const hostname = globalThis.location?.hostname ?? 'localhost'; + const hostname = globalThis.location?.hostname ?? '127.0.0.1'; const ws = new WebSocket( `ws://${hostname}:3000/mock-server?proxy=${proxyType}&protocol=${protocol}`, diff --git a/packages/nice-grpc-web/test-server/grpcwebproxy.ts b/packages/nice-grpc-web/test-server/grpcwebproxy.ts index a2ad10a8..80f4683c 100644 --- a/packages/nice-grpc-web/test-server/grpcwebproxy.ts +++ b/packages/nice-grpc-web/test-server/grpcwebproxy.ts @@ -30,7 +30,7 @@ export async function startGrpcWebProxy( : [`--server_http_debug_port=${listenPort}`, `--run_tls_server=false`]), `--server_bind_address=0.0.0.0`, - `--backend_addr=localhost:${backendPort}`, + `--backend_addr=127.0.0.1:${backendPort}`, `--use_websockets=true`, `--allow_all_origins=true`, ], diff --git a/packages/nice-grpc-web/test-server/traefik.ts b/packages/nice-grpc-web/test-server/traefik.ts index dfd08e08..6e345e9d 100644 --- a/packages/nice-grpc-web/test-server/traefik.ts +++ b/packages/nice-grpc-web/test-server/traefik.ts @@ -50,6 +50,18 @@ export async function startTraefikProxy( 'utf8', ); + // Traefik can return 404 for a while after start. + // See https://github.com/traefik/traefik/issues/7347 + // Once the gRPC server is reached it returns 415. + let waitStrategy = Wait.forHttp( + '/fake-probe', + internalListenPort, + ).forStatusCode(415); + + if (tls) { + waitStrategy = waitStrategy.usingTls().allowInsecure(); + } + const container = await new GenericContainer('traefik:v3.0.0-beta2') .withBindMounts([ ...(tls @@ -79,7 +91,7 @@ export async function startTraefikProxy( ipAddress: 'host-gateway', }, ]) - .withWaitStrategy(Wait.forLogMessage(/traefik-internal-recovery/)) + .withWaitStrategy(waitStrategy) .start(); // const logStream = await container.logs(); diff --git a/packages/nice-grpc/package.json b/packages/nice-grpc/package.json index 6d882e8b..e855fd32 100644 --- a/packages/nice-grpc/package.json +++ b/packages/nice-grpc/package.json @@ -34,11 +34,9 @@ "devDependencies": { "@tsconfig/node14": "^14.1.0", "@types/defer-promise": "^1.0.0", - "@types/get-port": "^4.2.0", "@types/google-protobuf": "^3.7.4", "@types/node": "^14.18.23", "defer-promise": "^2.0.1", - "get-port": "^5.1.1", "google-protobuf": "^3.14.0", "grpc-tools": "^1.10.0", "grpc_tools_node_protoc_ts": "^5.0.1", diff --git a/packages/nice-grpc/src/__tests__/bidiStreaming.ts b/packages/nice-grpc/src/__tests__/bidiStreaming.ts index 9158face..9a491d10 100644 --- a/packages/nice-grpc/src/__tests__/bidiStreaming.ts +++ b/packages/nice-grpc/src/__tests__/bidiStreaming.ts @@ -1,4 +1,3 @@ -import getPort = require('get-port'); import defer = require('defer-promise'); import {forever, isAbortError} from 'abort-controller-x'; import { @@ -31,11 +30,9 @@ test('basic', async () => { }, }); - const address = `localhost:${await getPort()}`; + const port = await server.listen('127.0.0.1:0'); - await server.listen(address); - - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); async function* createRequest() { @@ -91,11 +88,9 @@ test('metadata', async () => { }, }); - const address = `localhost:${await getPort()}`; - - await server.listen(address); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); const headerDeferred = defer(); @@ -205,11 +200,9 @@ test('implicit header sending', async () => { }, }); - const address = `localhost:${await getPort()}`; + const port = await server.listen('127.0.0.1:0'); - await server.listen(address); - - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); const metadata = Metadata(); @@ -260,11 +253,9 @@ test('error', async () => { }, }); - const address = `localhost:${await getPort()}`; - - await server.listen(address); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); const responses: any[] = []; @@ -350,11 +341,9 @@ test('cancel', async () => { }, }); - const address = `localhost:${await getPort()}`; + const port = await server.listen('127.0.0.1:0'); - await server.listen(address); - - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); const abortController = new AbortController(); @@ -437,11 +426,9 @@ test('early response', async () => { }, }); - const address = `localhost:${await getPort()}`; - - await server.listen(address); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); const requestIterableFinish = defer(); @@ -506,11 +493,9 @@ test('request iterable error', async () => { }, }); - const address = `localhost:${await getPort()}`; - - await server.listen(address); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); async function* createRequest() { diff --git a/packages/nice-grpc/src/__tests__/channel.ts b/packages/nice-grpc/src/__tests__/channel.ts index d6d1df16..d1110fae 100644 --- a/packages/nice-grpc/src/__tests__/channel.ts +++ b/packages/nice-grpc/src/__tests__/channel.ts @@ -1,4 +1,3 @@ -import getPort = require('get-port'); import {randomBytes} from 'crypto'; import { createChannel, @@ -9,13 +8,11 @@ import { } from '..'; test('implicit protocol', async () => { - const address = `localhost:${await getPort()}`; - const server = createServer(); - await server.listen(address); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); await waitForChannelReady(channel, new Date(Date.now() + 1000)); channel.close(); @@ -23,13 +20,11 @@ test('implicit protocol', async () => { }); test('http', async () => { - const address = `localhost:${await getPort()}`; - const server = createServer(); - await server.listen(address); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(`http://${address}`); + const channel = createChannel(`http://127.0.0.1:${port}`); await waitForChannelReady(channel, new Date(Date.now() + 1000)); channel.close(); diff --git a/packages/nice-grpc/src/__tests__/clientMiddleware/bidiStreaming.ts b/packages/nice-grpc/src/__tests__/clientMiddleware/bidiStreaming.ts index 290319fc..34135072 100644 --- a/packages/nice-grpc/src/__tests__/clientMiddleware/bidiStreaming.ts +++ b/packages/nice-grpc/src/__tests__/clientMiddleware/bidiStreaming.ts @@ -1,4 +1,3 @@ -import getPort = require('get-port'); import { createChannel, createClientFactory, @@ -31,11 +30,9 @@ test('basic', async () => { }, }); - const address = `localhost:${await getPort()}`; + const port = await server.listen('127.0.0.1:0'); - await server.listen(address); - - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(createTestClientMiddleware('testOption', actions)) .create(TestService, channel); @@ -128,11 +125,9 @@ test('error', async () => { }, }); - const address = `localhost:${await getPort()}`; - - await server.listen(address); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(createTestClientMiddleware('testOption', actions)) .create(TestService, channel); diff --git a/packages/nice-grpc/src/__tests__/clientMiddleware/chain.ts b/packages/nice-grpc/src/__tests__/clientMiddleware/chain.ts index c24be0a0..0d70b236 100644 --- a/packages/nice-grpc/src/__tests__/clientMiddleware/chain.ts +++ b/packages/nice-grpc/src/__tests__/clientMiddleware/chain.ts @@ -1,4 +1,3 @@ -import getPort = require('get-port'); import {createChannel, createClientFactory, createServer} from '../..'; import {TestService} from '../../../fixtures/grpc-js/test_grpc_pb'; import {TestRequest, TestResponse} from '../../../fixtures/grpc-js/test_pb'; @@ -19,11 +18,9 @@ test('chain', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; + const port = await server.listen('127.0.0.1:0'); - await server.listen(address); - - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(createTestClientMiddleware('testOption1', actions, 'middleware-1-')) .use(createTestClientMiddleware('testOption2', actions, 'middleware-2-')) @@ -104,11 +101,9 @@ test('set option from middleware', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; - - await server.listen(address); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use<{testOption1: string}>(async function* middleware1(call, options) { const {testOption1, ...restOptions} = options; diff --git a/packages/nice-grpc/src/__tests__/clientMiddleware/clientStreaming.ts b/packages/nice-grpc/src/__tests__/clientMiddleware/clientStreaming.ts index 368bb2f8..5b7e18c1 100644 --- a/packages/nice-grpc/src/__tests__/clientMiddleware/clientStreaming.ts +++ b/packages/nice-grpc/src/__tests__/clientMiddleware/clientStreaming.ts @@ -1,4 +1,3 @@ -import getPort = require('get-port'); import { createChannel, createClientFactory, @@ -37,11 +36,9 @@ test('basic', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; + const port = await server.listen('127.0.0.1:0'); - await server.listen(address); - - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(createTestClientMiddleware('testOption', actions)) .create(TestService, channel); @@ -121,11 +118,9 @@ test('error', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; - - await server.listen(address); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(createTestClientMiddleware('testOption', actions)) .create(TestService, channel); diff --git a/packages/nice-grpc/src/__tests__/clientMiddleware/serverStreaming.ts b/packages/nice-grpc/src/__tests__/clientMiddleware/serverStreaming.ts index 1ba5b3e5..6c2db1d8 100644 --- a/packages/nice-grpc/src/__tests__/clientMiddleware/serverStreaming.ts +++ b/packages/nice-grpc/src/__tests__/clientMiddleware/serverStreaming.ts @@ -1,4 +1,3 @@ -import getPort = require('get-port'); import { createChannel, createClientFactory, @@ -29,11 +28,9 @@ test('basic', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; + const port = await server.listen('127.0.0.1:0'); - await server.listen(address); - - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(createTestClientMiddleware('testOption', actions)) .create(TestService, channel); @@ -117,11 +114,9 @@ test('error', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; - - await server.listen(address); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(createTestClientMiddleware('testOption', actions)) .create(TestService, channel); diff --git a/packages/nice-grpc/src/__tests__/clientMiddleware/unary.ts b/packages/nice-grpc/src/__tests__/clientMiddleware/unary.ts index cd3df44d..8a679c59 100644 --- a/packages/nice-grpc/src/__tests__/clientMiddleware/unary.ts +++ b/packages/nice-grpc/src/__tests__/clientMiddleware/unary.ts @@ -1,4 +1,3 @@ -import getPort = require('get-port'); import { createChannel, createClientFactory, @@ -28,11 +27,9 @@ test('basic', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; + const port = await server.listen('127.0.0.1:0'); - await server.listen(address); - - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(createTestClientMiddleware('testOption', actions)) .create(TestService, channel); @@ -97,11 +94,9 @@ test('error', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; - - await server.listen(address); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClientFactory() .use(createTestClientMiddleware('testOption', actions)) .create(TestService, channel); diff --git a/packages/nice-grpc/src/__tests__/clientStreaming.ts b/packages/nice-grpc/src/__tests__/clientStreaming.ts index 6a2c5578..7975b62e 100644 --- a/packages/nice-grpc/src/__tests__/clientStreaming.ts +++ b/packages/nice-grpc/src/__tests__/clientStreaming.ts @@ -1,4 +1,3 @@ -import getPort = require('get-port'); import defer = require('defer-promise'); import {forever, isAbortError} from 'abort-controller-x'; import { @@ -37,11 +36,9 @@ test('basic', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; + const port = await server.listen('127.0.0.1:0'); - await server.listen(address); - - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); async function* createRequest() { @@ -90,11 +87,9 @@ test('metadata', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; - - await server.listen(address); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); const headerDeferred = defer(); @@ -198,11 +193,9 @@ test('implicit header sending', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; + const port = await server.listen('127.0.0.1:0'); - await server.listen(address); - - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); const metadata = Metadata(); @@ -253,11 +246,9 @@ test('error', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; - - await server.listen(address); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); let trailer: Metadata | undefined; @@ -330,11 +321,9 @@ test('cancel', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; + const port = await server.listen('127.0.0.1:0'); - await server.listen(address); - - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); const abortController = new AbortController(); @@ -398,11 +387,9 @@ test('early response', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; - - await server.listen(address); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); const requestIterableFinish = defer(); @@ -457,11 +444,9 @@ test('request iterable error', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; - - await server.listen(address); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); async function* createRequest() { diff --git a/packages/nice-grpc/src/__tests__/defaultCallOptions.ts b/packages/nice-grpc/src/__tests__/defaultCallOptions.ts index bbcfbbd5..d0de3a58 100644 --- a/packages/nice-grpc/src/__tests__/defaultCallOptions.ts +++ b/packages/nice-grpc/src/__tests__/defaultCallOptions.ts @@ -1,4 +1,3 @@ -import getPort = require('get-port'); import {Channel} from '@grpc/grpc-js'; import {createChannel, createClient, createServer, Metadata, Server} from '..'; import {TestService} from '../../fixtures/grpc-js/test_grpc_pb'; @@ -21,11 +20,9 @@ beforeEach(async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; + const port = await server.listen('127.0.0.1:0'); - await server.listen(address); - - channel = createChannel(address); + channel = createChannel(`127.0.0.1:${port}`); }); afterEach(async () => { diff --git a/packages/nice-grpc/src/__tests__/serverClass.ts b/packages/nice-grpc/src/__tests__/serverClass.ts index 4436c034..6363c1ed 100644 --- a/packages/nice-grpc/src/__tests__/serverClass.ts +++ b/packages/nice-grpc/src/__tests__/serverClass.ts @@ -1,4 +1,3 @@ -import getPort = require('get-port'); import { createChannel, createClient, @@ -34,11 +33,9 @@ test('server class', async () => { server.add(TestService, new TestServer()); - const address = `localhost:${await getPort()}`; + const port = await server.listen('127.0.0.1:0'); - await server.listen(address); - - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); await expect(client.testUnary(new TestRequest().setId('test'))).resolves diff --git a/packages/nice-grpc/src/__tests__/serverMiddleware/bidiStreaming.ts b/packages/nice-grpc/src/__tests__/serverMiddleware/bidiStreaming.ts index 003cd713..a3dbd2f7 100644 --- a/packages/nice-grpc/src/__tests__/serverMiddleware/bidiStreaming.ts +++ b/packages/nice-grpc/src/__tests__/serverMiddleware/bidiStreaming.ts @@ -1,4 +1,3 @@ -import getPort = require('get-port'); import { createChannel, createClient, @@ -33,11 +32,9 @@ test('basic', async () => { }, }); - const address = `localhost:${await getPort()}`; + const port = await server.listen('127.0.0.1:0'); - await server.listen(address); - - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); async function* createRequest() { @@ -120,11 +117,9 @@ test('error', async () => { }, }); - const address = `localhost:${await getPort()}`; - - await server.listen(address); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); async function* createRequest() { diff --git a/packages/nice-grpc/src/__tests__/serverMiddleware/chain.ts b/packages/nice-grpc/src/__tests__/serverMiddleware/chain.ts index 76ec775b..8aca8332 100644 --- a/packages/nice-grpc/src/__tests__/serverMiddleware/chain.ts +++ b/packages/nice-grpc/src/__tests__/serverMiddleware/chain.ts @@ -1,4 +1,3 @@ -import getPort = require('get-port'); import {createChannel, createClient, createServer} from '../..'; import {TestService} from '../../../fixtures/grpc-js/test_grpc_pb'; import {TestRequest, TestResponse} from '../../../fixtures/grpc-js/test_pb'; @@ -38,11 +37,9 @@ test('chain', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; + const port = await server.listen('127.0.0.1:0'); - await server.listen(address); - - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); await expect(client.testUnary(new TestRequest().setId('test'))).resolves diff --git a/packages/nice-grpc/src/__tests__/serverMiddleware/clientStreaming.ts b/packages/nice-grpc/src/__tests__/serverMiddleware/clientStreaming.ts index 80bf2527..7e53f3a3 100644 --- a/packages/nice-grpc/src/__tests__/serverMiddleware/clientStreaming.ts +++ b/packages/nice-grpc/src/__tests__/serverMiddleware/clientStreaming.ts @@ -1,4 +1,3 @@ -import getPort = require('get-port'); import { createChannel, createClient, @@ -39,11 +38,9 @@ test('basic', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; + const port = await server.listen('127.0.0.1:0'); - await server.listen(address); - - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); async function* createRequest() { @@ -112,11 +109,9 @@ test('error', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; - - await server.listen(address); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); async function* createRequest() { diff --git a/packages/nice-grpc/src/__tests__/serverMiddleware/perService.ts b/packages/nice-grpc/src/__tests__/serverMiddleware/perService.ts index a59bd1e4..2b04adf4 100644 --- a/packages/nice-grpc/src/__tests__/serverMiddleware/perService.ts +++ b/packages/nice-grpc/src/__tests__/serverMiddleware/perService.ts @@ -1,4 +1,3 @@ -import getPort = require('get-port'); import {createChannel, createClient, createServer} from '../..'; import { Test2Service, @@ -52,11 +51,9 @@ test('per service', async () => { }, }); - const address = `localhost:${await getPort()}`; + const port = await server.listen('127.0.0.1:0'); - await server.listen(address); - - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const testClient = createClient(TestService, channel); const test2Client = createClient(Test2Service, channel); diff --git a/packages/nice-grpc/src/__tests__/serverMiddleware/serverStreaming.ts b/packages/nice-grpc/src/__tests__/serverMiddleware/serverStreaming.ts index eb40df58..2647734b 100644 --- a/packages/nice-grpc/src/__tests__/serverMiddleware/serverStreaming.ts +++ b/packages/nice-grpc/src/__tests__/serverMiddleware/serverStreaming.ts @@ -1,4 +1,3 @@ -import getPort = require('get-port'); import { createChannel, createClient, @@ -31,11 +30,9 @@ test('basic', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; + const port = await server.listen('127.0.0.1:0'); - await server.listen(address); - - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); const responses: any[] = []; @@ -108,11 +105,9 @@ test('error', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; - - await server.listen(address); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); const responses: any[] = []; diff --git a/packages/nice-grpc/src/__tests__/serverMiddleware/unary.ts b/packages/nice-grpc/src/__tests__/serverMiddleware/unary.ts index e4b3ed47..bdedf140 100644 --- a/packages/nice-grpc/src/__tests__/serverMiddleware/unary.ts +++ b/packages/nice-grpc/src/__tests__/serverMiddleware/unary.ts @@ -1,4 +1,3 @@ -import getPort = require('get-port'); import { createChannel, createClient, @@ -30,11 +29,9 @@ test('basic', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; + const port = await server.listen('127.0.0.1:0'); - await server.listen(address); - - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); await expect(client.testUnary(new TestRequest().setId('test'))).resolves @@ -88,11 +85,9 @@ test('error', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; - - await server.listen(address); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); await expect( diff --git a/packages/nice-grpc/src/__tests__/serverStreaming.ts b/packages/nice-grpc/src/__tests__/serverStreaming.ts index a98580c3..771b8c5a 100644 --- a/packages/nice-grpc/src/__tests__/serverStreaming.ts +++ b/packages/nice-grpc/src/__tests__/serverStreaming.ts @@ -1,4 +1,3 @@ -import getPort = require('get-port'); import defer = require('defer-promise'); import {forever, isAbortError} from 'abort-controller-x'; import { @@ -30,11 +29,9 @@ test('basic', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; + const port = await server.listen('127.0.0.1:0'); - await server.listen(address); - - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); const responses: any[] = []; @@ -87,11 +84,9 @@ test('metadata', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; - - await server.listen(address); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); const headerDeferred = defer(); @@ -193,11 +188,9 @@ test('implicit header sending', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; + const port = await server.listen('127.0.0.1:0'); - await server.listen(address); - - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); const metadata = Metadata(); @@ -243,11 +236,9 @@ test('error', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; - - await server.listen(address); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); const responses: any[] = []; @@ -319,11 +310,9 @@ test('cancel', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; + const port = await server.listen('127.0.0.1:0'); - await server.listen(address); - - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); const abortController = new AbortController(); @@ -381,11 +370,9 @@ test('high rate', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; - - await server.listen(address); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); let i = 0; @@ -425,11 +412,9 @@ test('aborted iteration on client', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; - - await server.listen(address); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); const iterable = client.testServerStream(new TestRequest().setId('test')); diff --git a/packages/nice-grpc/src/__tests__/ts-proto.ts b/packages/nice-grpc/src/__tests__/ts-proto.ts index 61482262..a5629c03 100644 --- a/packages/nice-grpc/src/__tests__/ts-proto.ts +++ b/packages/nice-grpc/src/__tests__/ts-proto.ts @@ -1,4 +1,3 @@ -import getPort = require('get-port'); import {ClientMiddleware, ServerMiddleware} from 'nice-grpc-common'; import {createChannel, createClient, createServer} from '..'; import { @@ -31,11 +30,9 @@ test('basic', async () => { server.add(TestDefinition, impl); - const address = `localhost:${await getPort()}`; + const port = await server.listen('127.0.0.1:0'); - await server.listen(address); - - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client: TestClient = createClient(TestDefinition, channel); await expect(client.testUnary({id: 'test'})).resolves.toMatchInlineSnapshot(` @@ -76,9 +73,7 @@ test('middleware', async () => { server.with(serverMiddleware).add(Test2Definition, impl); - const address = `localhost:${await getPort()}`; - - await server.listen(address); + const port = await server.listen('127.0.0.1:0'); const clientMiddlewareCalls: any[] = []; @@ -92,7 +87,7 @@ test('middleware', async () => { return yield* call.next(call.request, rest); }; - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client: Test2Client<{bar: 'baz'}> = createClientFactory() .use(clientMiddleware) .create(Test2Definition, channel); diff --git a/packages/nice-grpc/src/__tests__/unary.ts b/packages/nice-grpc/src/__tests__/unary.ts index 47f851d0..07bea45a 100644 --- a/packages/nice-grpc/src/__tests__/unary.ts +++ b/packages/nice-grpc/src/__tests__/unary.ts @@ -1,4 +1,3 @@ -import getPort = require('get-port'); import defer = require('defer-promise'); import {forever, isAbortError} from 'abort-controller-x'; import { @@ -29,11 +28,9 @@ test('basic', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; + const port = await server.listen('127.0.0.1:0'); - await server.listen(address); - - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); await expect(client.testUnary(new TestRequest().setId('test'))).resolves @@ -76,11 +73,9 @@ test('metadata', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; - - await server.listen(address); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); const headerDeferred = defer(); @@ -172,11 +167,9 @@ test('implicit header sending', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; - - await server.listen(address); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); const metadata = Metadata(); @@ -218,11 +211,9 @@ test('error', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; + const port = await server.listen('127.0.0.1:0'); - await server.listen(address); - - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); let trailer: Metadata | undefined; @@ -274,11 +265,9 @@ test('cancel', async () => { testBidiStream: throwUnimplemented, }); - const address = `localhost:${await getPort()}`; - - await server.listen(address); + const port = await server.listen('127.0.0.1:0'); - const channel = createChannel(address); + const channel = createChannel(`127.0.0.1:${port}`); const client = createClient(TestService, channel); const abortController = new AbortController(); diff --git a/yarn.lock b/yarn.lock index 0b507f3c..1a7b225c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2334,13 +2334,6 @@ "@tufjs/canonical-json" "1.0.0" minimatch "^9.0.0" -"@types/archiver@^5.3.2": - version "5.3.2" - resolved "https://registry.yarnpkg.com/@types/archiver/-/archiver-5.3.2.tgz#a9f0bcb0f0b991400e7766d35f6e19d163bdadcc" - integrity sha512-IctHreBuWE5dvBDz/0WeKtyVKVRs4h75IblxOACL92wU66v+HGAfEYAOyXkOFphvRJMhuXdI9huDXpX0FC6lCw== - dependencies: - "@types/readdir-glob" "*" - "@types/babel__core@^7.1.14": version "7.1.14" resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz" @@ -2391,22 +2384,6 @@ resolved "https://registry.npmjs.org/@types/defer-promise/-/defer-promise-1.0.0.tgz" integrity sha512-NJAgn+jlo8V2TD0rj8zQy1nRzNLX73MQARTSQzWxco94lwzTOwRp7FPu7r4/Cnz715DxCWMGf3epjo7wbDBhVA== -"@types/docker-modem@*": - version "3.0.2" - resolved "https://registry.npmjs.org/@types/docker-modem/-/docker-modem-3.0.2.tgz" - integrity sha512-qC7prjoEYR2QEe6SmCVfB1x3rfcQtUr1n4x89+3e0wSTMQ/KYCyf+/RAA9n2tllkkNc6//JMUZePdFRiGIWfaQ== - dependencies: - "@types/node" "*" - "@types/ssh2" "*" - -"@types/dockerode@^3.3.19": - version "3.3.19" - resolved "https://registry.yarnpkg.com/@types/dockerode/-/dockerode-3.3.19.tgz#59eb07550a102b397a9504083a6c50d811eed04c" - integrity sha512-7CC5yIpQi+bHXwDK43b/deYXteP3Lem9gdocVVHJPSRJJLMfbiOchQV3rDmAPkMw+n3GIVj7m1six3JW+VcwwA== - dependencies: - "@types/docker-modem" "*" - "@types/node" "*" - "@types/get-port@^4.2.0": version "4.2.0" resolved "https://registry.npmjs.org/@types/get-port/-/get-port-4.2.0.tgz" @@ -2506,13 +2483,6 @@ resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== -"@types/readdir-glob@*": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/readdir-glob/-/readdir-glob-1.1.1.tgz#27ac2db283e6aa3d110b14ff9da44fcd1a5c38b1" - integrity sha512-ImM6TmoF8bgOwvehGviEj3tRdRBbQujr1N+0ypaln/GWjaerOB26jb93vsRHmdMtvVQZQebOlqt2HROark87mQ== - dependencies: - "@types/node" "*" - "@types/shimmer@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@types/shimmer/-/shimmer-1.0.2.tgz#93eb2c243c351f3f17d5c580c7467ae5d686b65f" @@ -2525,13 +2495,6 @@ dependencies: "@types/node" "*" -"@types/ssh2@*": - version "1.11.6" - resolved "https://registry.npmjs.org/@types/ssh2/-/ssh2-1.11.6.tgz" - integrity sha512-8Mf6bhzYYBLEB/G6COux7DS/F5bCWwojv/qFo2yH/e4cLzAavJnxvFXrYW59iKfXdhG6OmzJcXDasgOb/s0rxw== - dependencies: - "@types/node" "*" - "@types/ssh2@^0.5.48": version "0.5.52" resolved "https://registry.npmjs.org/@types/ssh2/-/ssh2-0.5.52.tgz" @@ -4580,10 +4543,10 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -docker-compose@^0.24.1: - version "0.24.1" - resolved "https://registry.yarnpkg.com/docker-compose/-/docker-compose-0.24.1.tgz#09f9a2408395b8adf80feaacf65f6e2a4b119866" - integrity sha512-CVphzCi0Hmw/0CHlAzgiwhLsJjFRqnvpBYMYbf63bz6MON69ElgrfrgQTmgPtEjbifjgaptu3+Gea62vI+9jiA== +docker-compose@^0.24.2: + version "0.24.2" + resolved "https://registry.yarnpkg.com/docker-compose/-/docker-compose-0.24.2.tgz#172027153b6c16239d5457fe48f56c7803f42c9d" + integrity sha512-2/WLvA7UZ6A2LDLQrYW0idKipmNBWhtfvrn2yzjC5PnHDzuFVj1zAZN6MJxVMKP0zZH8uzAK6OwVZYHGuyCmTw== dependencies: yaml "^2.2.2" @@ -10426,16 +10389,6 @@ tar-fs@3.0.4, tar-fs@^3.0.4: pump "^3.0.0" tar-stream "^3.1.5" -tar-fs@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz" - integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" - tar-fs@~2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.1.tgz" @@ -10446,7 +10399,7 @@ tar-fs@~2.0.1: pump "^3.0.0" tar-stream "^2.0.0" -tar-stream@^2.0.0, tar-stream@^2.1.4, tar-stream@^2.2.0, tar-stream@~2.2.0: +tar-stream@^2.0.0, tar-stream@^2.2.0, tar-stream@~2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz" integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== @@ -10535,26 +10488,24 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" -testcontainers@^9.0.0: - version "9.12.0" - resolved "https://registry.yarnpkg.com/testcontainers/-/testcontainers-9.12.0.tgz#f9f2492af4317f649611005b60fa0bbf6fdd7639" - integrity sha512-zmjLTAUqCiDvhDq7TCwcyhI3m/cXXKGnhyLLJ9pgh53VgG9O+P+opX1pIx28aYTUQ7Yu6b5sJf0xoIuxoiclWg== +testcontainers@^10.2.1: + version "10.2.1" + resolved "https://registry.yarnpkg.com/testcontainers/-/testcontainers-10.2.1.tgz#ca71ef1d34ae704411b48f90eae2c6228e4ebe66" + integrity sha512-R9LUMUEkKGSL2M4cP466Jah+Vi+ZLFlvrT4BENjEKJKNzubATOmDk26RHe8DHeFT+hnMD6fvVii+McXr0UTO7g== dependencies: "@balena/dockerignore" "^1.0.2" - "@types/archiver" "^5.3.2" - "@types/dockerode" "^3.3.19" archiver "^5.3.1" async-lock "^1.4.0" byline "^5.0.0" debug "^4.3.4" - docker-compose "^0.24.1" + docker-compose "^0.24.2" dockerode "^3.3.5" get-port "^5.1.1" node-fetch "^2.6.12" proper-lockfile "^4.1.2" properties-reader "^2.2.0" ssh-remote-port-forward "^1.0.4" - tar-fs "^2.1.1" + tar-fs "^3.0.4" tmp "^0.2.1" text-extensions@^1.0.0: