From 4d261e31915a40143e55be7de969befc5471cd77 Mon Sep 17 00:00:00 2001 From: Christian Stewart Date: Tue, 13 Dec 2022 14:26:02 -0800 Subject: [PATCH] feat: implement abort controller support to abort RPCs Currently adds 1 patch for the following pending PR: - https://github.com/stephenh/ts-proto/issues/730 - https://github.com/stephenh/ts-proto/pull/731 Signed-off-by: Christian Stewart --- Makefile | 3 +- e2e/mock/mock.pb.ts | 14 +- e2e/mock/mock_srpc.pb.go | 2 +- echo/client-test.ts | 30 ++- echo/echo.pb.ts | 71 +++-- echo/echo_srpc.pb.go | 2 +- go.mod | 16 +- go.sum | 34 +-- integration/integration.ts | 20 +- package.json | 20 +- rpcstream/rpcstream.ts | 6 +- srpc/client.ts | 30 ++- srpc/common-rpc.ts | 7 +- srpc/errors.ts | 11 + srpc/index.ts | 1 + srpc/ts-proto-rpc.ts | 12 +- yarn.lock | 526 ++++++++++++++++++------------------- 17 files changed, 454 insertions(+), 351 deletions(-) create mode 100644 srpc/errors.ts diff --git a/Makefile b/Makefile index ac779971..c3fd0816 100644 --- a/Makefile +++ b/Makefile @@ -110,8 +110,9 @@ gents: $(PROTOWRAP) node_modules --ts_proto_opt=forceLong=long \ --ts_proto_opt=oneof=unions \ --ts_proto_opt=outputServices=default,outputServices=generic-definitions \ - --ts_proto_opt=useDate=true \ + --ts_proto_opt=useAbortSignal=true \ --ts_proto_opt=useAsyncIterable=true \ + --ts_proto_opt=useDate=true \ --proto_path $$(pwd)/vendor \ --print_structure \ --only_specified_files \ diff --git a/e2e/mock/mock.pb.ts b/e2e/mock/mock.pb.ts index 8bde5444..4f98fcb2 100644 --- a/e2e/mock/mock.pb.ts +++ b/e2e/mock/mock.pb.ts @@ -96,7 +96,7 @@ export const MockMsg = { /** Mock service mocks some RPCs for the e2e tests. */ export interface Mock { /** MockRequest runs a mock unary request. */ - MockRequest(request: MockMsg): Promise + MockRequest(request: MockMsg, abortSignal?: AbortSignal): Promise } export class MockClientImpl implements Mock { @@ -107,9 +107,14 @@ export class MockClientImpl implements Mock { this.rpc = rpc this.MockRequest = this.MockRequest.bind(this) } - MockRequest(request: MockMsg): Promise { + MockRequest(request: MockMsg, abortSignal?: AbortSignal): Promise { const data = MockMsg.encode(request).finish() - const promise = this.rpc.request(this.service, 'MockRequest', data) + const promise = this.rpc.request( + this.service, + 'MockRequest', + data, + abortSignal || undefined + ) return promise.then((data) => MockMsg.decode(new _m0.Reader(data))) } } @@ -136,7 +141,8 @@ interface Rpc { request( service: string, method: string, - data: Uint8Array + data: Uint8Array, + abortSignal?: AbortSignal ): Promise } diff --git a/e2e/mock/mock_srpc.pb.go b/e2e/mock/mock_srpc.pb.go index b6cf2dff..ec0dd88c 100644 --- a/e2e/mock/mock_srpc.pb.go +++ b/e2e/mock/mock_srpc.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-srpc. DO NOT EDIT. -// protoc-gen-srpc version: v0.15.1 +// protoc-gen-srpc version: v0.15.2 // source: github.com/aperturerobotics/starpc/e2e/mock/mock.proto package e2e_mock diff --git a/echo/client-test.ts b/echo/client-test.ts index 2f0739df..fcd0b408 100644 --- a/echo/client-test.ts +++ b/echo/client-test.ts @@ -1,4 +1,4 @@ -import { Client } from '../srpc/index.js' +import { Client, ERR_RPC_ABORT } from '../srpc/index.js' import { EchoerClientImpl, EchoMsg } from './echo.pb.js' import { pushable } from 'it-pushable' import { buildRpcStreamOpenStream } from '../rpcstream/rpcstream.js' @@ -30,6 +30,34 @@ export async function runClientTest(client: Client) { } } +// runAbortControllerTest tests aborting a RPC call. +export async function runAbortControllerTest(client: Client) { + const demoServiceClient = new EchoerClientImpl(client) + + console.log('Testing EchoClientStream with AbortController...') + let errorReturned = false + const clientAbort = new AbortController() + const clientNoopStream = pushable({ objectMode: true }) + new Promise((resolve) => setTimeout(resolve, 1000)).then(() => { + clientAbort.abort() + }) + try { + await demoServiceClient.EchoClientStream( + clientNoopStream, + clientAbort.signal + ) + } catch (err) { + const errMsg = (err as Error).message + errorReturned = true + if (errMsg !== ERR_RPC_ABORT) { + throw new Error('unexpected error: ' + errMsg) + } + } + if (!errorReturned) { + throw new Error('expected aborted rpc to throw error') + } +} + // runRpcStreamTest tests a RPCStream. export async function runRpcStreamTest(client: Client) { console.log('Calling RpcStream to open a RPC stream client...') diff --git a/echo/echo.pb.ts b/echo/echo.pb.ts index 17749a6c..a53f4c0f 100644 --- a/echo/echo.pb.ts +++ b/echo/echo.pb.ts @@ -97,16 +97,26 @@ export const EchoMsg = { /** Echoer service returns the given message. */ export interface Echoer { /** Echo returns the given message. */ - Echo(request: EchoMsg): Promise + Echo(request: EchoMsg, abortSignal?: AbortSignal): Promise /** EchoServerStream is an example of a server -> client one-way stream. */ - EchoServerStream(request: EchoMsg): AsyncIterable + EchoServerStream( + request: EchoMsg, + abortSignal?: AbortSignal + ): AsyncIterable /** EchoClientStream is an example of client->server one-way stream. */ - EchoClientStream(request: AsyncIterable): Promise + EchoClientStream( + request: AsyncIterable, + abortSignal?: AbortSignal + ): Promise /** EchoBidiStream is an example of a two-way stream. */ - EchoBidiStream(request: AsyncIterable): AsyncIterable + EchoBidiStream( + request: AsyncIterable, + abortSignal?: AbortSignal + ): AsyncIterable /** RpcStream opens a nested rpc call stream. */ RpcStream( - request: AsyncIterable + request: AsyncIterable, + abortSignal?: AbortSignal ): AsyncIterable } @@ -122,50 +132,69 @@ export class EchoerClientImpl implements Echoer { this.EchoBidiStream = this.EchoBidiStream.bind(this) this.RpcStream = this.RpcStream.bind(this) } - Echo(request: EchoMsg): Promise { + Echo(request: EchoMsg, abortSignal?: AbortSignal): Promise { const data = EchoMsg.encode(request).finish() - const promise = this.rpc.request(this.service, 'Echo', data) + const promise = this.rpc.request( + this.service, + 'Echo', + data, + abortSignal || undefined + ) return promise.then((data) => EchoMsg.decode(new _m0.Reader(data))) } - EchoServerStream(request: EchoMsg): AsyncIterable { + EchoServerStream( + request: EchoMsg, + abortSignal?: AbortSignal + ): AsyncIterable { const data = EchoMsg.encode(request).finish() const result = this.rpc.serverStreamingRequest( this.service, 'EchoServerStream', - data + data, + abortSignal || undefined ) return EchoMsg.decodeTransform(result) } - EchoClientStream(request: AsyncIterable): Promise { + EchoClientStream( + request: AsyncIterable, + abortSignal?: AbortSignal + ): Promise { const data = EchoMsg.encodeTransform(request) const promise = this.rpc.clientStreamingRequest( this.service, 'EchoClientStream', - data + data, + abortSignal || undefined ) return promise.then((data) => EchoMsg.decode(new _m0.Reader(data))) } - EchoBidiStream(request: AsyncIterable): AsyncIterable { + EchoBidiStream( + request: AsyncIterable, + abortSignal?: AbortSignal + ): AsyncIterable { const data = EchoMsg.encodeTransform(request) const result = this.rpc.bidirectionalStreamingRequest( this.service, 'EchoBidiStream', - data + data, + abortSignal || undefined ) return EchoMsg.decodeTransform(result) } RpcStream( - request: AsyncIterable + request: AsyncIterable, + abortSignal?: AbortSignal ): AsyncIterable { const data = RpcStreamPacket.encodeTransform(request) const result = this.rpc.bidirectionalStreamingRequest( this.service, 'RpcStream', - data + data, + abortSignal || undefined ) return RpcStreamPacket.decodeTransform(result) } @@ -229,22 +258,26 @@ interface Rpc { request( service: string, method: string, - data: Uint8Array + data: Uint8Array, + abortSignal?: AbortSignal ): Promise clientStreamingRequest( service: string, method: string, - data: AsyncIterable + data: AsyncIterable, + abortSignal?: AbortSignal ): Promise serverStreamingRequest( service: string, method: string, - data: Uint8Array + data: Uint8Array, + abortSignal?: AbortSignal ): AsyncIterable bidirectionalStreamingRequest( service: string, method: string, - data: AsyncIterable + data: AsyncIterable, + abortSignal?: AbortSignal ): AsyncIterable } diff --git a/echo/echo_srpc.pb.go b/echo/echo_srpc.pb.go index 7f4a3c0e..f0c4d1c6 100644 --- a/echo/echo_srpc.pb.go +++ b/echo/echo_srpc.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-srpc. DO NOT EDIT. -// protoc-gen-srpc version: v0.15.1 +// protoc-gen-srpc version: v0.15.2 // source: github.com/aperturerobotics/starpc/echo/echo.proto package echo diff --git a/go.mod b/go.mod index b63e9d2e..68694f12 100644 --- a/go.mod +++ b/go.mod @@ -9,8 +9,8 @@ require ( ) require ( - github.com/aperturerobotics/util v0.0.0-20221202094321-2fde40039383 - github.com/libp2p/go-libp2p v0.24.0-dev.0.20221202071826-2cc4de512664 + github.com/aperturerobotics/util v0.0.0-20221205090205-f776a34d2d0d + github.com/libp2p/go-libp2p v0.24.1 github.com/libp2p/go-yamux/v4 v4.0.1-0.20220919134236-1c09f2ab3ec1 github.com/sirupsen/logrus v1.9.0 ) @@ -19,23 +19,23 @@ require ( github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/ipfs/go-cid v0.3.2 // indirect - github.com/klauspost/compress v1.15.10 // indirect - github.com/klauspost/cpuid/v2 v2.1.1 // indirect + github.com/klauspost/compress v1.15.12 // indirect + github.com/klauspost/cpuid/v2 v2.2.1 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/libp2p/go-openssl v0.1.0 // indirect github.com/mattn/go-pointer v0.0.1 // indirect github.com/minio/sha256-simd v1.0.0 // indirect github.com/mr-tron/base58 v1.2.0 // indirect github.com/multiformats/go-base32 v0.1.0 // indirect - github.com/multiformats/go-base36 v0.1.1-0.20220823151017-f5af2eed4d9c // indirect + github.com/multiformats/go-base36 v0.2.0 // indirect github.com/multiformats/go-multiaddr v0.8.0 // indirect github.com/multiformats/go-multibase v0.1.2-0.20220823162309-7160a7347ed1 // indirect github.com/multiformats/go-multicodec v0.7.1-0.20221017174837-a2baec7ca709 // indirect github.com/multiformats/go-multihash v0.2.2-0.20221030163302-608669da49b6 // indirect - github.com/multiformats/go-varint v0.0.7-0.20220823162201-881f9a52d5d2 // indirect + github.com/multiformats/go-varint v0.0.7 // indirect github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 // indirect github.com/spaolacci/murmur3 v1.1.1-0.20190317074736-539464a789e9 // indirect - golang.org/x/crypto v0.2.1-0.20221109165004-21d60a152191 // indirect - golang.org/x/sys v0.2.0 // indirect + golang.org/x/crypto v0.3.0 // indirect + golang.org/x/sys v0.3.0 // indirect lukechampine.com/blake3 v1.1.8-0.20220321170924-7afca5966e5e // indirect ) diff --git a/go.sum b/go.sum index db3b0123..fd26f6a3 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/aperturerobotics/util v0.0.0-20221202094321-2fde40039383 h1:r0TEmQAFN1Ji+1iMqBW1ymiofevQaUb3uOQTje2wp3Q= -github.com/aperturerobotics/util v0.0.0-20221202094321-2fde40039383/go.mod h1:up2AYcp62UgmFVTm7QhM4USXAKGv73gpb5dHraKmzxQ= +github.com/aperturerobotics/util v0.0.0-20221205090205-f776a34d2d0d h1:nYXEY4LHTW7a7Vf+Lt+7icxoc02wIyLCa12xPbFuIxo= +github.com/aperturerobotics/util v0.0.0-20221205090205-f776a34d2d0d/go.mod h1:up2AYcp62UgmFVTm7QhM4USXAKGv73gpb5dHraKmzxQ= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -42,18 +42,18 @@ github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.15.10 h1:Ai8UzuomSCDw90e1qNMtb15msBXsNpH6gzkkENQNcJo= -github.com/klauspost/compress v1.15.10/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= +github.com/klauspost/compress v1.15.12 h1:YClS/PImqYbn+UILDnqxQCZ3RehC9N318SU3kElDUEM= +github.com/klauspost/compress v1.15.12/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.1.1 h1:t0wUqjowdm8ezddV5k0tLWVklVuvLJpoHeb4WBdydm0= -github.com/klauspost/cpuid/v2 v2.1.1/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid/v2 v2.2.1 h1:U33DW0aiEj633gHYw3LoDNfkDiYnE5Q8M/TKJn2f2jI= +github.com/klauspost/cpuid/v2 v2.2.1/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= -github.com/libp2p/go-libp2p v0.24.0-dev.0.20221202071826-2cc4de512664 h1:pv+MuIVoXKlPfxZ/dGjK+aDK3fFmfuo7ombAjrBN7z0= -github.com/libp2p/go-libp2p v0.24.0-dev.0.20221202071826-2cc4de512664/go.mod h1:WVV1V9SPcZ0uV/sBB5X3zsKZW/EikukrgTp1ABOcqWk= +github.com/libp2p/go-libp2p v0.24.1 h1:+lS4fqj7RF9egcPq9Yo3iqdRTcDMApzoBbQMhxtwOVw= +github.com/libp2p/go-libp2p v0.24.1/go.mod h1:5LJqbrqFsUzWrq70JHCYqjATlX4ey8Klpct3OEe8hSI= github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= github.com/libp2p/go-openssl v0.1.0 h1:LBkKEcUv6vtZIQLVTegAil8jbNpJErQ9AnT+bWV+Ooo= github.com/libp2p/go-openssl v0.1.0/go.mod h1:OiOxwPpL3n4xlenjx2h7AwSGaFSC/KZvf6gNdOBQMtc= @@ -73,8 +73,8 @@ github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= -github.com/multiformats/go-base36 v0.1.1-0.20220823151017-f5af2eed4d9c h1:3eLctj5+2JpWf0E8PICebevkyD0KcZUhye8ggScrnEQ= -github.com/multiformats/go-base36 v0.1.1-0.20220823151017-f5af2eed4d9c/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= +github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= +github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= github.com/multiformats/go-multiaddr v0.8.0 h1:aqjksEcqK+iD/Foe1RRFsGZh8+XFiGo7FgUCZlpv3LU= github.com/multiformats/go-multiaddr v0.8.0/go.mod h1:Fs50eBDWvZu+l3/9S6xAE7ZYj6yhxlvaVZjakWN7xRs= github.com/multiformats/go-multibase v0.1.2-0.20220823162309-7160a7347ed1 h1:fts9VGSGzcENj3XnQ3iz9LGMAJAqT46fUGyaUDGFuxQ= @@ -83,8 +83,8 @@ github.com/multiformats/go-multicodec v0.7.1-0.20221017174837-a2baec7ca709 h1:Xw github.com/multiformats/go-multicodec v0.7.1-0.20221017174837-a2baec7ca709/go.mod h1:GUC8upxSBE4oG+q3kWZRw/+6yC1BqO550bjhWsJbZlw= github.com/multiformats/go-multihash v0.2.2-0.20221030163302-608669da49b6 h1:qLF997Rz0X1WvdcZ2r5CUkLZ2rvdiXwG1JRSrJZEAuE= github.com/multiformats/go-multihash v0.2.2-0.20221030163302-608669da49b6/go.mod h1:kaHxr8TfO1cxIR/tYxgZ7e59HraJq8arEQQR8E/YNvI= -github.com/multiformats/go-varint v0.0.7-0.20220823162201-881f9a52d5d2 h1:zsa4CR/QUzyyNdyaotjJrqFzKbzCsWzhQWcUSamGWr8= -github.com/multiformats/go-varint v0.0.7-0.20220823162201-881f9a52d5d2/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= +github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= +github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -99,7 +99,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= @@ -109,8 +109,8 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.2.1-0.20221109165004-21d60a152191 h1:mPxyLskqfKMEHYEIa1kKmcNC8ZSiJLYbMaXyUpW+ooY= -golang.org/x/crypto v0.2.1-0.20221109165004-21d60a152191/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= +golang.org/x/crypto v0.3.0 h1:a06MkbcxBrEFc0w0QIZWXrH/9cCX6KJyWbBOIwAn+7A= +golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -126,8 +126,8 @@ golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= diff --git a/integration/integration.ts b/integration/integration.ts index d1397c78..71dee8fa 100644 --- a/integration/integration.ts +++ b/integration/integration.ts @@ -1,5 +1,9 @@ import { WebSocketConn } from '../srpc/websocket.js' -import { runClientTest, runRpcStreamTest } from '../echo/client-test.js' +import { + runClientTest, + runRpcStreamTest, + runAbortControllerTest, +} from '../echo/client-test.js' import WebSocket from 'isomorphic-ws' async function runRPC() { @@ -9,18 +13,26 @@ async function runRPC() { const channel = new WebSocketConn(ws, 'outbound') const client = channel.buildClient() + console.log('Running RpcStream test via WebSocket..') + await runRpcStreamTest(client) + console.log('Running client test via WebSocket..') await runClientTest(client) - console.log('Running RpcStream test via WebSocket..') - await runRpcStreamTest(client) + console.log('Running abort controller test via WebSocket..') + await runAbortControllerTest(client) } +process.on('unhandledRejection', (ev) => { + console.error('Unhandled rejection', ev) + throw ev +}) + runRPC() .then(() => { process.exit(0) }) .catch((err) => { - console.error(err) + console.error('runRPC threw error', err) process.exit(1) }) diff --git a/package.json b/package.json index 3da210cd..4a46b3ad 100644 --- a/package.json +++ b/package.json @@ -60,18 +60,18 @@ "singleQuote": true }, "devDependencies": { - "@aperturerobotics/ts-common": "^0.2.6", - "@typescript-eslint/eslint-plugin": "^5.45.0", - "@typescript-eslint/parser": "^5.45.0", + "@aperturerobotics/ts-common": "^0.2.9", + "@typescript-eslint/eslint-plugin": "^5.46.1", + "@typescript-eslint/parser": "^5.46.1", "bufferutil": "^4.0.7", "depcheck": "^1.4.3", - "esbuild": "^0.15.16", - "eslint": "^8.28.0", + "esbuild": "^0.16.5", + "eslint": "^8.29.0", "eslint-config-prettier": "^8.5.0", - "prettier": "^2.8.0", + "prettier": "^2.8.1", "rimraf": "^3.0.2", - "ts-proto": "^1.135.0", - "typescript": "^4.9.3", + "ts-proto": "^1.135.3", + "typescript": "^4.9.4", "utf-8-validate": "^5.0.10" }, "dependencies": { @@ -83,10 +83,10 @@ "isomorphic-ws": "^5.0.0", "it-first": "^2.0.0", "it-length-prefixed": "^8.0.3", - "it-pipe": "^2.0.4", + "it-pipe": "^2.0.5", "it-pushable": "^3.1.0", "it-stream-types": "^1.0.4", - "it-ws": "^5.0.3", + "it-ws": "^5.0.6", "long": "^5.2.1", "patch-package": "^6.5.0", "protobufjs": "^7.1.2", diff --git a/rpcstream/rpcstream.ts b/rpcstream/rpcstream.ts index 3d6db799..54d1d340 100644 --- a/rpcstream/rpcstream.ts +++ b/rpcstream/rpcstream.ts @@ -121,11 +121,9 @@ export async function* handleRpcStream( // build the outgoing packet sink & the packet source const packetSink: Pushable = pushable({ objectMode: true }) - // handle the stream in the next event queue tick. + // start the handler const rpcStream = new RpcStream(packetSink, packetStream) - setTimeout(() => { - handler!(rpcStream) - }, 1) + handler!(rpcStream) // process packets for await (const packet of packetSink) { diff --git a/srpc/client.ts b/srpc/client.ts index f8576682..465e3916 100644 --- a/srpc/client.ts +++ b/srpc/client.ts @@ -1,6 +1,7 @@ import { pipe } from 'it-pipe' import { pushable, Pushable } from 'it-pushable' +import { ERR_RPC_ABORT } from './errors.js' import type { TsProtoRpc } from './ts-proto-rpc.js' import type { OpenStreamFunc } from './stream.js' import { ClientRPC } from './client-rpc.js' @@ -32,9 +33,10 @@ export class Client implements TsProtoRpc { public async request( service: string, method: string, - data: Uint8Array + data: Uint8Array, + abortSignal?: AbortSignal ): Promise { - const call = await this.startRpc(service, method, data) + const call = await this.startRpc(service, method, data, abortSignal) for await (const data of call.rpcDataSource) { call.close() return data @@ -48,9 +50,10 @@ export class Client implements TsProtoRpc { public async clientStreamingRequest( service: string, method: string, - data: AsyncIterable + data: AsyncIterable, + abortSignal?: AbortSignal ): Promise { - const call = await this.startRpc(service, method, null) + const call = await this.startRpc(service, method, null, abortSignal) call.writeCallDataFromSource(data) for await (const data of call.rpcDataSource) { call.close() @@ -65,10 +68,11 @@ export class Client implements TsProtoRpc { public serverStreamingRequest( service: string, method: string, - data: Uint8Array + data: Uint8Array, + abortSignal?: AbortSignal ): AsyncIterable { const serverData: Pushable = pushable({ objectMode: true }) - this.startRpc(service, method, data) + this.startRpc(service, method, data, abortSignal) .then(async (call) => { return writeToPushable(call.rpcDataSource, serverData) }) @@ -80,10 +84,11 @@ export class Client implements TsProtoRpc { public bidirectionalStreamingRequest( service: string, method: string, - data: AsyncIterable + data: AsyncIterable, + abortSignal?: AbortSignal ): AsyncIterable { const serverData: Pushable = pushable({ objectMode: true }) - this.startRpc(service, method, null) + this.startRpc(service, method, null, abortSignal) .then(async (call) => { call.writeCallDataFromSource(data) try { @@ -105,11 +110,18 @@ export class Client implements TsProtoRpc { private async startRpc( rpcService: string, rpcMethod: string, - data: Uint8Array | null + data: Uint8Array | null, + abortSignal?: AbortSignal ): Promise { + if (abortSignal?.aborted) { + throw new Error(ERR_RPC_ABORT) + } const openStreamFn = await this.openStreamCtr.wait() const conn = await openStreamFn() const call = new ClientRPC(rpcService, rpcMethod) + abortSignal?.addEventListener('abort', () => { + call.close(new Error(ERR_RPC_ABORT)) + }) pipe( conn, parseLengthPrefixTransform(), diff --git a/srpc/common-rpc.ts b/srpc/common-rpc.ts index fe337426..ccb7a9b4 100644 --- a/srpc/common-rpc.ts +++ b/srpc/common-rpc.ts @@ -74,9 +74,9 @@ export class CommonRPC { public async writeCallDataFromSource(dataSource: AsyncIterable) { try { for await (const data of dataSource) { - this.writeCallData(data) + await this.writeCallData(data) } - this.writeCallData(undefined, true) + await this.writeCallData(undefined, true) } catch (err) { this.close(err as Error) } @@ -160,7 +160,8 @@ export class CommonRPC { await this.writeCallCancel() } finally { this._rpcDataSource.end(err) - this._source.end(err) + // note: don't pass error to _source here. + this._source.end() } } diff --git a/srpc/errors.ts b/srpc/errors.ts new file mode 100644 index 00000000..9b212af8 --- /dev/null +++ b/srpc/errors.ts @@ -0,0 +1,11 @@ +// ERR_RPC_ABORT is returned if the RPC was aborted. +export const ERR_RPC_ABORT = 'ERR_RPC_ABORT' + +// isAbortError checks if the error object is ERR_RPC_ABORT. +export function isAbortError(err: unknown): boolean { + if (typeof err !== 'object') { + return false + } + const message = (err as Error).message + return message === ERR_RPC_ABORT +} diff --git a/srpc/index.ts b/srpc/index.ts index 0720023e..a09c89d0 100644 --- a/srpc/index.ts +++ b/srpc/index.ts @@ -1,4 +1,5 @@ export type { PacketHandler, Stream, OpenStreamFunc } from './stream.js' +export { ERR_RPC_ABORT, isAbortError } from './errors.js' export { Client } from './client.js' export { Server } from './server.js' export { Conn, ConnParams } from './conn.js' diff --git a/srpc/ts-proto-rpc.ts b/srpc/ts-proto-rpc.ts index 617532f8..a640d321 100644 --- a/srpc/ts-proto-rpc.ts +++ b/srpc/ts-proto-rpc.ts @@ -4,24 +4,28 @@ export interface TsProtoRpc { request( service: string, method: string, - data: Uint8Array + data: Uint8Array, + abortSignal?: AbortSignal ): Promise // clientStreamingRequest fires a one-way client->server streaming request. clientStreamingRequest( service: string, method: string, - data: AsyncIterable + data: AsyncIterable, + abortSignal?: AbortSignal ): Promise // serverStreamingRequest fires a one-way server->client streaming request. serverStreamingRequest( service: string, method: string, - data: Uint8Array + data: Uint8Array, + abortSignal?: AbortSignal ): AsyncIterable // bidirectionalStreamingRequest implements a two-way streaming request. bidirectionalStreamingRequest( service: string, method: string, - data: AsyncIterable + data: AsyncIterable, + abortSignal?: AbortSignal ): AsyncIterable } diff --git a/yarn.lock b/yarn.lock index a6a19ab8..39f34b58 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,14 +2,14 @@ # yarn lockfile v1 -"@aperturerobotics/ts-common@^0.2.6": - version "0.2.6" - resolved "https://registry.yarnpkg.com/@aperturerobotics/ts-common/-/ts-common-0.2.6.tgz#112b93c827e11e1fad55cc921eed0926d5cd7e06" - integrity sha512-q0Btwf0b6JAiwo90dtRc+rpsGpm8szVCLd0KT11UlqHFxupL3szvPs7t7vD8Qb5yzqyTtri05Utpo4QFq2Lw2g== +"@aperturerobotics/ts-common@^0.2.9": + version "0.2.9" + resolved "https://registry.yarnpkg.com/@aperturerobotics/ts-common/-/ts-common-0.2.9.tgz#bc906052eb99fe9915f0592fb830e6e22fad3045" + integrity sha512-/0PA1hWECcB3iXPTuSYWhKSddlz4XU77q8hbeg2BWd1aRUrppIWxH+Xsak/diljDJaVaYpkza76oxquIBOntiw== dependencies: bufferutil "^4.0.7" long "^5.2.1" - starpc "^0.15.2" + starpc "^0.15.4" utf-8-validate "^5.0.10" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6": @@ -141,15 +141,115 @@ uint8arraylist "^2.3.2" uint8arrays "^4.0.2" -"@esbuild/android-arm@0.15.16": - version "0.15.16" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.16.tgz#0642926178b15e3d1545efae6eee05c4f3451d15" - integrity sha512-nyB6CH++2mSgx3GbnrJsZSxzne5K0HMyNIWafDHqYy7IwxFc4fd/CgHVZXr8Eh+Q3KbIAcAe3vGyqIPhGblvMQ== - -"@esbuild/linux-loong64@0.15.16": - version "0.15.16" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.16.tgz#284522de76abe951e4ed2bd24a467e8d49c67933" - integrity sha512-SDLfP1uoB0HZ14CdVYgagllgrG7Mdxhkt4jDJOKl/MldKrkQ6vDJMZKl2+5XsEY/Lzz37fjgLQoJBGuAw/x8kQ== +"@esbuild/android-arm64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.16.5.tgz#4d86e00dee422c76a86904d6b863d115db34f862" + integrity sha512-BCWkmAqFoW6xXzz6Up16bU0vdZqe23UxkrabbrmXXUuH27Tts3LVcHFCi/dGLYa6ZqC/txhtJm2kAJdoyOfHxg== + +"@esbuild/android-arm@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.16.5.tgz#e6dd899ab0727d31c04309b6db2fb70ca4331af1" + integrity sha512-eNkNuLSKpbZTH0BZklJ9B9Sml7fTIamhrQNBwftsEHCUuSLBVunzV3LfghryVGpE5lSkOwOfeX6gR6+3yLaEfQ== + +"@esbuild/android-x64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.16.5.tgz#c5237c582bb038a9403afe5ad7e451cc79187505" + integrity sha512-E0R7d0dy9+QlpMps8gJXXhtfn+fQFaTXbq8kV2u/HfHyyhxr4nIIuXZCcYxxA9LSKnsFBBbSQIGDUVY9FGgx0w== + +"@esbuild/darwin-arm64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.5.tgz#6e553f4be193d25a5e7cb6a73077d407a64bd6ad" + integrity sha512-4HlbUMy50cRaHGVriBjShs46WRPshtnVOqkxEGhEuDuJhgZ3regpWzaQxXOcDXFvVwue8RiqDAAcOi/QlVLE6Q== + +"@esbuild/darwin-x64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.16.5.tgz#a9c466dbeca614edb5fe1a9c1ccd97bce30301af" + integrity sha512-ZDCAxAPwbtKJ5YxRZusQKDFuywH+7YNKbilss0DCRPtXMxrKRZETcuSfcgIWGYBBc+ypdOazousx3yZss2Az0A== + +"@esbuild/freebsd-arm64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.5.tgz#e101c671b150a6e0fe06b5978f2005505afd97b8" + integrity sha512-w0dJ8om4KiagLCHURgwxXVWzi5xa0W7F5woMxzWO+LDCebrlyZUhCIbSXUKa4qD3XbdG7K4Y8N4mLDRMkZzMuw== + +"@esbuild/freebsd-x64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.5.tgz#79bf9368634f390d16f5032a9b6603f02b0d999b" + integrity sha512-qCdC0T7XUxngX8otO4nmPUE/cHZfvF8jk+GMr9qkAGP0nIMACD7t/AWoY2N5rsn5/dOJ1VKM/aMF4wCFBP5AqQ== + +"@esbuild/linux-arm64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.16.5.tgz#9025197f1d4007743d130413f7579607f943a0f2" + integrity sha512-h84QZmBhBdEclyxf9Wm/UESY6ITI7/gYLNvj/3emhDd0ILAqwHdWnMDmKqqubrMcpb1O4sWOYRm7EZ+Av8eGiQ== + +"@esbuild/linux-arm@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.16.5.tgz#4cc5ff0fc093610598f32f7fd5565326c0c4e5c6" + integrity sha512-6crdpqwFjl+DObBgwaJMtB+VWrZd87Jy05gQTERysc1ujnUJNCJzemUcRDT5hM34dzTYThlXfFW32qQy9QpPGQ== + +"@esbuild/linux-ia32@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.16.5.tgz#9d897e7fff2f31433fa2c7b00048738dc9d47a69" + integrity sha512-P1WNzGqy6ipvbt8iNoYY66+qUANCiM80D8bGJIU8jqSZ613eG0lUWBePi4xQazcNgIi9tSiCa9Ba3f4krXtQDw== + +"@esbuild/linux-loong64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.16.5.tgz#9fc800568028d1a1d5601375cd9f20f33fd91093" + integrity sha512-r8wKqs+rl4gIT/xDB6CHMaYcvvyZ7tWf5LulH9NsDvgQEy3gIXQPR4Oy9tYrjM75uKkvBv1uw15Iz4EWsvve9Q== + +"@esbuild/linux-mips64el@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.5.tgz#ef9ee33e33c13771055f3726a3350cb0a4e1e550" + integrity sha512-0WMhOlwfeeAp6KMx3E6LZKDN6INk4Me8dwIw1XMSFvmE6r31vRnwXkrQlAk5FI44KZ/rIi+yynRZqEd7UJAV2g== + +"@esbuild/linux-ppc64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.5.tgz#175d4a6f7b304c63686059861f276151d015cf26" + integrity sha512-29x+DtRGcYH0Sh3QSnoF+D2SYkHLxwx5AugoGLIlVtcVqDb4fEb654d67k9VcAR2RiTAYUZ764KXzWB+ItQfgw== + +"@esbuild/linux-riscv64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.5.tgz#69fe8bc94f49fdcead8ed6144cb40e45920c4196" + integrity sha512-ZX4SSKOJUcuqFNDydfN4yCo9je9f1T72Pj+RLsAGRiuiREVCwRkXIBp810C01+MdPqYExp322kY78ISEq5XGLQ== + +"@esbuild/linux-s390x@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.16.5.tgz#18d418673579081e7ec3c376b110cea832efadbc" + integrity sha512-pYY86RiLD1s5RN8q0aMhWD44NiHmAZxv2bSzaNlL63/ibWETld+m6F+MPh9+ZNOqGJw53E/0qHukYI5Lm+1k7A== + +"@esbuild/linux-x64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.16.5.tgz#3dadd838a89b38e0653fcd3d74455d965c6c400d" + integrity sha512-vsOwzKN+4NenUTyuoWLmg5dAuO8JKuLD9MXSeENA385XucuOZbblmOMwwgPlHsgVRtSjz38riqPJU2ALI/CWYQ== + +"@esbuild/netbsd-x64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.5.tgz#ab0ffb19dc14c0efc2317372e4e4782fdb8cbd9c" + integrity sha512-ZhfELxpZLXg7OidX9MrjgQNhjhYx3GXm59EAQVZds8GTyOOPj+Hg7ttKenlXoV8PZVkoCm0dgoWXzhasZJGfWw== + +"@esbuild/openbsd-x64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.5.tgz#0f33fb3acb8ac207cd366576030d17688acd2c60" + integrity sha512-2HY2L0afN8IUgvxCAWY04bB6mhHSnC7YNGM2hmEkyAgP+n8jpZgGjiRokuk3AQ0g0IpX8h0KnS+xaznGEr5CGw== + +"@esbuild/sunos-x64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.16.5.tgz#9f0da4e9c594bdbe92c27fe1d3d1effb8f036ad3" + integrity sha512-Q7+HbDnW52LLW8YIU5h0sYZ23TvaaC0vuwiIbJUa91Qr77NKNJCe8stfunN1TRZo+6OwGpM3MrdUcUVUfr5wuA== + +"@esbuild/win32-arm64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.16.5.tgz#5ebb50418ed224061a049a59c876283962134cee" + integrity sha512-KcegNS7IgLm/cAcjIW3kZyLiZi/p8I+A2a6OonDA77em9xHewdA2yTA+9pO4gr77MkXATcnDAFBrWw5oLHIZkQ== + +"@esbuild/win32-ia32@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.16.5.tgz#57f008d3a2b8336ab0f7bd07431619c46921dbd0" + integrity sha512-ReUCJSzLNGH6WcvwjMzpEy2SX5GTZBeRTvCdklN4DT2YrgRIe82lYVikVHwA7fdiL3xHKvmdiicMqxE8QYmxrA== + +"@esbuild/win32-x64@0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.16.5.tgz#9398d079a83b309b44021634ae6b4f7bc6a0cad0" + integrity sha512-q00Jasz6/wCOD2XxRj4GEwj27u1zfpiBniL1ip3/YGGcYtvOoGKCNSS47sufO/8ixEgrSYDlkglSd6CxcS7m0g== "@eslint/eslintrc@^1.3.3": version "1.3.3" @@ -229,9 +329,9 @@ uint8arraylist "^2.1.2" "@libp2p/interface-peer-id@^1.0.0", "@libp2p/interface-peer-id@^1.0.2": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@libp2p/interface-peer-id/-/interface-peer-id-1.0.6.tgz#fe8f81337dd3989220a4fe2c30d852d6451c37b6" - integrity sha512-3iMoAnXq/F+t/JWbNPb9UePvwgmm5rFUCEwNgAiDOUtXUZsXZO0Ko3eF9O1gpLe1KNH5wK7g2Wf46YW1vRAS8A== + version "1.1.0" + resolved "https://registry.yarnpkg.com/@libp2p/interface-peer-id/-/interface-peer-id-1.1.0.tgz#4da9e10ced076a5d2cc7a7eed58b5577b4e36772" + integrity sha512-K6LeZ5N+OJ2awfX/DyAxoQ/32Bp9vhEEEePhfPPaSnxNiDwRAvVjaFvSSP+s/xF9qUTEp5RNLIvffAeDT8DShw== dependencies: multiformats "^10.0.0" @@ -260,9 +360,9 @@ multiformats "^10.0.0" "@multiformats/multiaddr@^11.0.0": - version "11.0.7" - resolved "https://registry.yarnpkg.com/@multiformats/multiaddr/-/multiaddr-11.0.7.tgz#1151e474e4a097657e4f18fd01a64a273d178a46" - integrity sha512-rCqYS3Qz/dm4H/1Lvda11OBZf1tH8rst69GWK9jDy8AY+3n+NBBdErA/SRtdcRx6hPtQ8lAB5UhHlzIVbViv1Q== + version "11.1.1" + resolved "https://registry.yarnpkg.com/@multiformats/multiaddr/-/multiaddr-11.1.1.tgz#afda31ba14c7083c437334836a62850d933e6282" + integrity sha512-60M7Zf7mzpyDQzrE7J3rUjEvPaElBksPMksKBOqVR0h3DJSy2z9h3VOloZDWDqkrHm3WOeAHvQtdvu6CMFtzgw== dependencies: "@chainsafe/is-ip" "^2.0.1" dns-over-http-resolver "^2.1.0" @@ -361,9 +461,9 @@ integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== "@types/node@>=13.7.0": - version "18.11.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.10.tgz#4c64759f3c2343b7e6c4b9caf761c7a3a05cee34" - integrity sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ== + version "18.11.15" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.15.tgz#de0e1fbd2b22b962d45971431e2ae696643d3f5d" + integrity sha512-VkhBbVo2+2oozlkdHXLrb3zjsRkpdnaU2bXmX8Wgle3PUi569eLRaHGlgETQHR7lLL1w7GiG3h9SnePhxNDecw== "@types/object-hash@^1.3.0": version "1.3.4" @@ -380,14 +480,14 @@ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== -"@typescript-eslint/eslint-plugin@^5.45.0": - version "5.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.45.0.tgz#ffa505cf961d4844d38cfa19dcec4973a6039e41" - integrity sha512-CXXHNlf0oL+Yg021cxgOdMHNTXD17rHkq7iW6RFHoybdFgQBjU3yIXhhcPpGwr1CjZlo6ET8C6tzX5juQoXeGA== +"@typescript-eslint/eslint-plugin@^5.46.1": + version "5.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.1.tgz#098abb4c9354e19f460d57ab18bff1f676a6cff0" + integrity sha512-YpzNv3aayRBwjs4J3oz65eVLXc9xx0PDbIRisHj+dYhvBn02MjYOD96P8YGiWEIFBrojaUjxvkaUpakD82phsA== dependencies: - "@typescript-eslint/scope-manager" "5.45.0" - "@typescript-eslint/type-utils" "5.45.0" - "@typescript-eslint/utils" "5.45.0" + "@typescript-eslint/scope-manager" "5.46.1" + "@typescript-eslint/type-utils" "5.46.1" + "@typescript-eslint/utils" "5.46.1" debug "^4.3.4" ignore "^5.2.0" natural-compare-lite "^1.4.0" @@ -395,72 +495,72 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/parser@^5.45.0": - version "5.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.45.0.tgz#b18a5f6b3cf1c2b3e399e9d2df4be40d6b0ddd0e" - integrity sha512-brvs/WSM4fKUmF5Ot/gEve6qYiCMjm6w4HkHPfS6ZNmxTS0m0iNN4yOChImaCkqc1hRwFGqUyanMXuGal6oyyQ== +"@typescript-eslint/parser@^5.46.1": + version "5.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.46.1.tgz#1fc8e7102c1141eb64276c3b89d70da8c0ba5699" + integrity sha512-RelQ5cGypPh4ySAtfIMBzBGyrNerQcmfA1oJvPj5f+H4jI59rl9xxpn4bonC0tQvUKOEN7eGBFWxFLK3Xepneg== dependencies: - "@typescript-eslint/scope-manager" "5.45.0" - "@typescript-eslint/types" "5.45.0" - "@typescript-eslint/typescript-estree" "5.45.0" + "@typescript-eslint/scope-manager" "5.46.1" + "@typescript-eslint/types" "5.46.1" + "@typescript-eslint/typescript-estree" "5.46.1" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.45.0": - version "5.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.45.0.tgz#7a4ac1bfa9544bff3f620ab85947945938319a96" - integrity sha512-noDMjr87Arp/PuVrtvN3dXiJstQR1+XlQ4R1EvzG+NMgXi8CuMCXpb8JqNtFHKceVSQ985BZhfRdowJzbv4yKw== +"@typescript-eslint/scope-manager@5.46.1": + version "5.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.46.1.tgz#70af8425c79bbc1178b5a63fb51102ddf48e104a" + integrity sha512-iOChVivo4jpwUdrJZyXSMrEIM/PvsbbDOX1y3UCKjSgWn+W89skxWaYXACQfxmIGhPVpRWK/VWPYc+bad6smIA== dependencies: - "@typescript-eslint/types" "5.45.0" - "@typescript-eslint/visitor-keys" "5.45.0" + "@typescript-eslint/types" "5.46.1" + "@typescript-eslint/visitor-keys" "5.46.1" -"@typescript-eslint/type-utils@5.45.0": - version "5.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.45.0.tgz#aefbc954c40878fcebeabfb77d20d84a3da3a8b2" - integrity sha512-DY7BXVFSIGRGFZ574hTEyLPRiQIvI/9oGcN8t1A7f6zIs6ftbrU0nhyV26ZW//6f85avkwrLag424n+fkuoJ1Q== +"@typescript-eslint/type-utils@5.46.1": + version "5.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.46.1.tgz#195033e4b30b51b870dfcf2828e88d57b04a11cc" + integrity sha512-V/zMyfI+jDmL1ADxfDxjZ0EMbtiVqj8LUGPAGyBkXXStWmCUErMpW873zEHsyguWCuq2iN4BrlWUkmuVj84yng== dependencies: - "@typescript-eslint/typescript-estree" "5.45.0" - "@typescript-eslint/utils" "5.45.0" + "@typescript-eslint/typescript-estree" "5.46.1" + "@typescript-eslint/utils" "5.46.1" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.45.0": - version "5.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.45.0.tgz#794760b9037ee4154c09549ef5a96599621109c5" - integrity sha512-QQij+u/vgskA66azc9dCmx+rev79PzX8uDHpsqSjEFtfF2gBUTRCpvYMh2gw2ghkJabNkPlSUCimsyBEQZd1DA== +"@typescript-eslint/types@5.46.1": + version "5.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.46.1.tgz#4e9db2107b9a88441c4d5ecacde3bb7a5ebbd47e" + integrity sha512-Z5pvlCaZgU+93ryiYUwGwLl9AQVB/PQ1TsJ9NZ/gHzZjN7g9IAn6RSDkpCV8hqTwAiaj6fmCcKSQeBPlIpW28w== -"@typescript-eslint/typescript-estree@5.45.0": - version "5.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.45.0.tgz#f70a0d646d7f38c0dfd6936a5e171a77f1e5291d" - integrity sha512-maRhLGSzqUpFcZgXxg1qc/+H0bT36lHK4APhp0AEUVrpSwXiRAomm/JGjSG+kNUio5kAa3uekCYu/47cnGn5EQ== +"@typescript-eslint/typescript-estree@5.46.1": + version "5.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.1.tgz#5358088f98a8f9939355e0996f9c8f41c25eced2" + integrity sha512-j9W4t67QiNp90kh5Nbr1w92wzt+toiIsaVPnEblB2Ih2U9fqBTyqV9T3pYWZBRt6QoMh/zVWP59EpuCjc4VRBg== dependencies: - "@typescript-eslint/types" "5.45.0" - "@typescript-eslint/visitor-keys" "5.45.0" + "@typescript-eslint/types" "5.46.1" + "@typescript-eslint/visitor-keys" "5.46.1" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.45.0": - version "5.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.45.0.tgz#9cca2996eee1b8615485a6918a5c763629c7acf5" - integrity sha512-OUg2JvsVI1oIee/SwiejTot2OxwU8a7UfTFMOdlhD2y+Hl6memUSL4s98bpUTo8EpVEr0lmwlU7JSu/p2QpSvA== +"@typescript-eslint/utils@5.46.1": + version "5.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.46.1.tgz#7da3c934d9fd0eb4002a6bb3429f33298b469b4a" + integrity sha512-RBdBAGv3oEpFojaCYT4Ghn4775pdjvwfDOfQ2P6qzNVgQOVrnSPe5/Pb88kv7xzYQjoio0eKHKB9GJ16ieSxvA== dependencies: "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.45.0" - "@typescript-eslint/types" "5.45.0" - "@typescript-eslint/typescript-estree" "5.45.0" + "@typescript-eslint/scope-manager" "5.46.1" + "@typescript-eslint/types" "5.46.1" + "@typescript-eslint/typescript-estree" "5.46.1" eslint-scope "^5.1.1" eslint-utils "^3.0.0" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.45.0": - version "5.45.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.45.0.tgz#e0d160e9e7fdb7f8da697a5b78e7a14a22a70528" - integrity sha512-jc6Eccbn2RtQPr1s7th6jJWQHBHI6GBVQkCHoJFQ5UreaKm59Vxw+ynQUPPY2u2Amquc+7tmEoC2G52ApsGNNg== +"@typescript-eslint/visitor-keys@5.46.1": + version "5.46.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.1.tgz#126cc6fe3c0f83608b2b125c5d9daced61394242" + integrity sha512-jczZ9noovXwy59KjRTk1OftT78pwygdcmCuBf8yMoWt/8O8l+6x2LSEze0E4TeepXK4MezW3zGSyoDRZK7Y9cg== dependencies: - "@typescript-eslint/types" "5.45.0" + "@typescript-eslint/types" "5.46.1" eslint-visitor-keys "^3.3.0" "@vue/compiler-core@3.2.45": @@ -669,6 +769,11 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== +case-anything@^2.1.10: + version "2.1.10" + resolved "https://registry.yarnpkg.com/case-anything/-/case-anything-2.1.10.tgz#d18a6ca968d54ec3421df71e3e190f3bced23410" + integrity sha512-JczJwVrCP0jPKh05McyVsuOg6AYosrB9XWZKbQzXeDAm2ClE/PJE/BcrrQrVyGYH7Jg8V/LDupmyL4kFlVsVFQ== + chalk@^2.0.0: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -879,133 +984,33 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -esbuild-android-64@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.16.tgz#0d6a16fa1bea441d5183976f1633183c25a764d5" - integrity sha512-Vwkv/sT0zMSgPSVO3Jlt1pUbnZuOgtOQJkJkyyJFAlLe7BiT8e9ESzo0zQSx4c3wW4T6kGChmKDPMbWTgtliQA== - -esbuild-android-arm64@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.16.tgz#78643bbbf396d26d20ba1f2fcdff3618c7c033e9" - integrity sha512-lqfKuofMExL5niNV3gnhMUYacSXfsvzTa/58sDlBET/hCOG99Zmeh+lz6kvdgvGOsImeo6J9SW21rFCogNPLxg== - -esbuild-darwin-64@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.16.tgz#de3e91809dcd1ffb64409e2f990bb86e33e4ffd8" - integrity sha512-wo2VWk/n/9V2TmqUZ/KpzRjCEcr00n7yahEdmtzlrfQ3lfMCf3Wa+0sqHAbjk3C6CKkR3WKK/whkMq5Gj4Da9g== - -esbuild-darwin-arm64@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.16.tgz#bc9cc8d51109d8e9db4ffe2c064dd53d1eb5a2a6" - integrity sha512-fMXaUr5ou0M4WnewBKsspMtX++C1yIa3nJ5R2LSbLCfJT3uFdcRoU/NZjoM4kOMKyOD9Sa/2vlgN8G07K3SJnw== - -esbuild-freebsd-64@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.16.tgz#f8c54c679c16e9b20a1bf860ca91ba700d6c9c5d" - integrity sha512-UzIc0xlRx5x9kRuMr+E3+hlSOxa/aRqfuMfiYBXu2jJ8Mzej4lGL7+o6F5hzhLqWfWm1GWHNakIdlqg1ayaTNQ== - -esbuild-freebsd-arm64@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.16.tgz#dd28a55df0f062e2c1628266008434c32ddc7adf" - integrity sha512-8xyiYuGc0DLZphFQIiYaLHlfoP+hAN9RHbE+Ibh8EUcDNHAqbQgUrQg7pE7Bo00rXmQ5Ap6KFgcR0b4ALZls1g== - -esbuild-linux-32@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.16.tgz#41eb0b9b49b3430b9cc4577f1ad3d414ef70f806" - integrity sha512-iGijUTV+0kIMyUVoynK0v+32Oi8yyp0xwMzX69GX+5+AniNy/C/AL1MjFTsozRp/3xQPl7jVux/PLe2ds10/2w== - -esbuild-linux-64@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.16.tgz#b2fb0c7d49b7a579b2de26fbf4c7afb1835f2073" - integrity sha512-tuSOjXdLw7VzaUj89fIdAaQT7zFGbKBcz4YxbWrOiXkwscYgE7HtTxUavreBbnRkGxKwr9iT/gmeJWNm4djy/g== - -esbuild-linux-arm64@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.16.tgz#78fed3745b20251fc3bdc8db35ea0781e9b0e7c6" - integrity sha512-mPYksnfHnemNrvjrDhZyixL/AfbJN0Xn9S34ZOHYdh6/jJcNd8iTsv3JwJoEvTJqjMggjMhGUPJAdjnFBHoH8A== - -esbuild-linux-arm@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.16.tgz#6963f061a2b778aad7df2bfb6fa32d1904313f7f" - integrity sha512-XKcrxCEXDTOuoRj5l12tJnkvuxXBMKwEC5j0JISw3ziLf0j4zIwXbKbTmUrKFWbo6ZgvNpa7Y5dnbsjVvH39bQ== - -esbuild-linux-mips64le@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.16.tgz#e2aed3527e551f8182c6b0fc8a045726fd98ad87" - integrity sha512-kSJO2PXaxfm0pWY39+YX+QtpFqyyrcp0ZeI8QPTrcFVQoWEPiPVtOfTZeS3ZKedfH+Ga38c4DSzmKMQJocQv6A== - -esbuild-linux-ppc64le@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.16.tgz#fa3095b24950f63408f46f34b6d9a073ed88d53f" - integrity sha512-NimPikwkBY0yGABw6SlhKrtT35sU4O23xkhlrTT/O6lSxv3Pm5iSc6OYaqVAHWkLdVf31bF4UDVFO+D990WpAA== - -esbuild-linux-riscv64@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.16.tgz#19c012dcc55c9d6d2a3855aa77c2c5217182cd1e" - integrity sha512-ty2YUHZlwFOwp7pR+J87M4CVrXJIf5ZZtU/umpxgVJBXvWjhziSLEQxvl30SYfUPq0nzeWKBGw5i/DieiHeKfw== - -esbuild-linux-s390x@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.16.tgz#aa61f64740e5b983cc3ebb4183a03df4b435a873" - integrity sha512-VkZaGssvPDQtx4fvVdZ9czezmyWyzpQhEbSNsHZZN0BHvxRLOYAQ7sjay8nMQwYswP6O2KlZluRMNPYefFRs+w== - -esbuild-netbsd-64@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.16.tgz#dffdc104c1f2bafc42be3faa21376c0a092f5702" - integrity sha512-ElQ9rhdY51et6MJTWrCPbqOd/YuPowD7Cxx3ee8wlmXQQVW7UvQI6nSprJ9uVFQISqSF5e5EWpwWqXZsECLvXg== - -esbuild-openbsd-64@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.16.tgz#e5987f8eda55ea5f6ef6258afb1a838158f890bb" - integrity sha512-KgxMHyxMCT+NdLQE1zVJEsLSt2QQBAvJfmUGDmgEq8Fvjrf6vSKB00dVHUEDKcJwMID6CdgCpvYNt999tIYhqA== - -esbuild-sunos-64@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.16.tgz#60a085aa4b74d900e4de8c00a9fce207937320a2" - integrity sha512-exSAx8Phj7QylXHlMfIyEfNrmqnLxFqLxdQF6MBHPdHAjT7fsKaX6XIJn+aQEFiOcE4X8e7VvdMCJ+WDZxjSRQ== - -esbuild-windows-32@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.16.tgz#24f94e5fb243d211c7db9a12985fd2880ba98ca3" - integrity sha512-zQgWpY5pUCSTOwqKQ6/vOCJfRssTvxFuEkpB4f2VUGPBpdddZfdj8hbZuFRdZRPIVHvN7juGcpgCA/XCF37mAQ== - -esbuild-windows-64@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.16.tgz#71d24d68d8b652bf5a93a6c7453c334584fa2211" - integrity sha512-HjW1hHRLSncnM3MBCP7iquatHVJq9l0S2xxsHHj4yzf4nm9TU4Z7k4NkeMlD/dHQ4jPlQQhwcMvwbJiOefSuZw== - -esbuild-windows-arm64@0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.16.tgz#77e804d60dec0390fe8f21401e39b435d5d1b863" - integrity sha512-oCcUKrJaMn04Vxy9Ekd8x23O8LoU01+4NOkQ2iBToKgnGj5eo1vU9i27NQZ9qC8NFZgnQQZg5oZWAejmbsppNA== - -esbuild@^0.15.16: - version "0.15.16" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.16.tgz#59324e5667985bf6aee8a91ea576baef6872cf21" - integrity sha512-o6iS9zxdHrrojjlj6pNGC2NAg86ECZqIETswTM5KmJitq+R1YmahhWtMumeQp9lHqJaROGnsBi2RLawGnfo5ZQ== +esbuild@^0.16.5: + version "0.16.5" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.5.tgz#4e14ef61a4c906cacc5f0d997d372ff815254b23" + integrity sha512-te0zG5CDzAxhnBKeddXUtK8xDnYL6jv100ekldhtUk0ALXPXcDAtuH0fAR7rbKwUdz3bOey6HVq2N+aWCKZ1cw== optionalDependencies: - "@esbuild/android-arm" "0.15.16" - "@esbuild/linux-loong64" "0.15.16" - esbuild-android-64 "0.15.16" - esbuild-android-arm64 "0.15.16" - esbuild-darwin-64 "0.15.16" - esbuild-darwin-arm64 "0.15.16" - esbuild-freebsd-64 "0.15.16" - esbuild-freebsd-arm64 "0.15.16" - esbuild-linux-32 "0.15.16" - esbuild-linux-64 "0.15.16" - esbuild-linux-arm "0.15.16" - esbuild-linux-arm64 "0.15.16" - esbuild-linux-mips64le "0.15.16" - esbuild-linux-ppc64le "0.15.16" - esbuild-linux-riscv64 "0.15.16" - esbuild-linux-s390x "0.15.16" - esbuild-netbsd-64 "0.15.16" - esbuild-openbsd-64 "0.15.16" - esbuild-sunos-64 "0.15.16" - esbuild-windows-32 "0.15.16" - esbuild-windows-64 "0.15.16" - esbuild-windows-arm64 "0.15.16" + "@esbuild/android-arm" "0.16.5" + "@esbuild/android-arm64" "0.16.5" + "@esbuild/android-x64" "0.16.5" + "@esbuild/darwin-arm64" "0.16.5" + "@esbuild/darwin-x64" "0.16.5" + "@esbuild/freebsd-arm64" "0.16.5" + "@esbuild/freebsd-x64" "0.16.5" + "@esbuild/linux-arm" "0.16.5" + "@esbuild/linux-arm64" "0.16.5" + "@esbuild/linux-ia32" "0.16.5" + "@esbuild/linux-loong64" "0.16.5" + "@esbuild/linux-mips64el" "0.16.5" + "@esbuild/linux-ppc64" "0.16.5" + "@esbuild/linux-riscv64" "0.16.5" + "@esbuild/linux-s390x" "0.16.5" + "@esbuild/linux-x64" "0.16.5" + "@esbuild/netbsd-x64" "0.16.5" + "@esbuild/openbsd-x64" "0.16.5" + "@esbuild/sunos-x64" "0.16.5" + "@esbuild/win32-arm64" "0.16.5" + "@esbuild/win32-ia32" "0.16.5" + "@esbuild/win32-x64" "0.16.5" escalade@^3.1.1: version "3.1.1" @@ -1060,10 +1065,10 @@ eslint-visitor-keys@^3.3.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== -eslint@^8.28.0: - version "8.28.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.28.0.tgz#81a680732634677cc890134bcdd9fdfea8e63d6e" - integrity sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ== +eslint@^8.29.0: + version "8.29.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.29.0.tgz#d74a88a20fb44d59c51851625bc4ee8d0ec43f87" + integrity sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg== dependencies: "@eslint/eslintrc" "^1.3.3" "@humanwhocodes/config-array" "^0.11.6" @@ -1168,11 +1173,6 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-fifo@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.1.0.tgz#17d1a3646880b9891dfa0c54e69c5fef33cad779" - integrity sha512-Kl29QoNbNvn4nhDsLYjyIAaIqaJB6rBx5p3sL9VjaefJ+eMFBWVZiaoguaoZfzEKr5RhAti0UgM8703akGPJ6g== - fast-glob@^3.2.9: version "3.2.12" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" @@ -1195,9 +1195,9 @@ fast-levenshtein@^2.0.6: integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + version "1.14.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.14.0.tgz#107f69d7295b11e0fccc264e1fc6389f623731ce" + integrity sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg== dependencies: reusify "^1.0.4" @@ -1309,9 +1309,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.15.0: - version "13.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.18.0.tgz#fb224daeeb2bb7d254cd2c640f003528b8d0c1dc" - integrity sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A== + version "13.19.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.19.0.tgz#7a42de8e6ad4f7242fbcca27ea5b23aca367b5c8" + integrity sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ== dependencies: type-fest "^0.20.2" @@ -1520,29 +1520,22 @@ it-length-prefixed@^8.0.3: uint8arraylist "^2.0.0" uint8arrays "^4.0.2" -it-merge@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/it-merge/-/it-merge-1.0.4.tgz#81c8d427b389b1cd039c25015edb804cd1a60545" - integrity sha512-DcL6GksTD2HQ7+5/q3JznXaLNfwjyG3/bObaF98da+oHfUiPmdo64oJlT9J8R8G5sJRU7thwaY5zxoAKCn7FJw== +it-merge@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/it-merge/-/it-merge-2.0.0.tgz#adfcd33199995a503cb37ac73548f65d8a0742db" + integrity sha512-mH4bo/ZrMoU+Wlu7ZuYPNNh9oWZ/GvYbeXZ0zll97+Rp6H4jFu98iu6v9qqXDz//RUjdO9zGh8awzMfOElsjpA== dependencies: - it-pushable "^1.4.0" + it-pushable "^3.1.0" -it-pipe@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/it-pipe/-/it-pipe-2.0.4.tgz#fa72c2fdb3c7a467ff21d109e746ebfadfe9c749" - integrity sha512-lK0BV0egwfc64DFJva+0Jh1z8UxwmYBpAHDwq21s0OenRCaEDIntx/iOyWH/jg5efBU6Xa8igzmOqm2CPPNDgg== +it-pipe@^2.0.4, it-pipe@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/it-pipe/-/it-pipe-2.0.5.tgz#9caf7993dcbbc3824bc6ef64ee8b94574f65afa7" + integrity sha512-y85nW1N6zoiTnkidr2EAyC+ZVzc7Mwt2p+xt2a2ooG1ThFakSpNw1Kxm+7F13Aivru96brJhjQVRQNU+w0yozw== dependencies: - it-merge "^1.0.4" + it-merge "^2.0.0" it-pushable "^3.1.0" it-stream-types "^1.0.3" -it-pushable@^1.4.0: - version "1.4.2" - resolved "https://registry.yarnpkg.com/it-pushable/-/it-pushable-1.4.2.tgz#fb127a53ec99b35a3a455a775abc85ab193c220b" - integrity sha512-vVPu0CGRsTI8eCfhMknA7KIBqqGFolbRx+1mbQ6XuZ7YCz995Qj7L4XUviwClFunisDq96FdxzF5FnAbw15afg== - dependencies: - fast-fifo "^1.0.0" - it-pushable@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/it-pushable/-/it-pushable-3.1.0.tgz#2fba7aaca189595e64e042ac947c6748ece2eb6b" @@ -1553,10 +1546,10 @@ it-stream-types@^1.0.2, it-stream-types@^1.0.3, it-stream-types@^1.0.4: resolved "https://registry.yarnpkg.com/it-stream-types/-/it-stream-types-1.0.4.tgz#6e66a11abfd98abab4894c30da15829a0a56bb43" integrity sha512-0F3CqTIcIHwtnmIgqd03a7sw8BegAmE32N2w7anIGdALea4oAN4ltqPgDMZ7zn4XPLZifXEZlBXSzgg64L1Ebw== -it-ws@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/it-ws/-/it-ws-5.0.3.tgz#7859641a964981116c2e9a567b5d8ef6424c29e9" - integrity sha512-xdkVWNOY41Qfw3zggqQX+JoQxtb6AHmt/ns26nJfBZaDFnYno6KAeU7E+hiHyvtheuE2IXRxVaF+w63Jmfhl5g== +it-ws@^5.0.3, it-ws@^5.0.6: + version "5.0.6" + resolved "https://registry.yarnpkg.com/it-ws/-/it-ws-5.0.6.tgz#9b69ff2ef9d08fda18ef2db604acf972d0fedded" + integrity sha512-TEEJQaGtkxgP/nGVq8dq48nPT85Afu8kwwvtDFLj4rQLWRhZcb26RWdXLdn9qhXkWPiWbK5H7JWBW1Bebj/SuQ== dependencies: event-iterator "^2.0.0" iso-url "^1.1.2" @@ -1653,7 +1646,7 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@^4.17.20: +lodash@4.17.21, lodash@^4.17.20, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -1924,9 +1917,9 @@ please-upgrade-node@^3.2.0: semver-compare "^1.0.0" postcss@^8.1.10: - version "8.4.19" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.19.tgz#61178e2add236b17351897c8bcc0b4c8ecab56fc" - integrity sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA== + version "8.4.20" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.20.tgz#64c52f509644cecad8567e949f4081d98349dc56" + integrity sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g== dependencies: nanoid "^3.3.4" picocolors "^1.0.0" @@ -1937,10 +1930,10 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.0.tgz#c7df58393c9ba77d6fba3921ae01faf994fb9dc9" - integrity sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA== +prettier@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.1.tgz#4e1fd11c34e2421bc1da9aea9bd8127cd0a35efc" + integrity sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg== protobufjs@^6.11.3, protobufjs@^6.8.8: version "6.11.3" @@ -1985,11 +1978,12 @@ punycode@^2.1.0: integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== query-ast@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/query-ast/-/query-ast-1.0.4.tgz#efa832e1270cc3e0ab42291716f73a7de1928c2a" - integrity sha512-KFJFSvODCBjIH5HbHvITj9EEZKYUU6VX0T5CuB1ayvjUoUaZkKMi6eeby5Tf8DMukyZHlJQOE1+f3vevKUe6eg== + version "1.0.5" + resolved "https://registry.yarnpkg.com/query-ast/-/query-ast-1.0.5.tgz#60f60593e8ea085082aaf9f316631a5cc070074a" + integrity sha512-JK+1ma4YDuLjvKKcz9JZ70G+CM9qEOs/l1cZzstMMfwKUabTJ9sud5jvDGrUNuv03yKUgs82bLkHXJkDyhRmBw== dependencies: invariant "2.2.4" + lodash "^4.17.21" queue-microtask@^1.2.2: version "1.2.3" @@ -2080,20 +2074,21 @@ safe-buffer@~5.2.0: integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== sass@^1.29.0: - version "1.56.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.56.1.tgz#94d3910cd468fd075fa87f5bb17437a0b617d8a7" - integrity sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ== + version "1.56.2" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.56.2.tgz#9433b345ab3872996c82a53a58c014fd244fd095" + integrity sha512-ciEJhnyCRwzlBCB+h5cCPM6ie/6f8HrhZMQOf5vlU60Y1bI1rx5Zb0vlDZvaycHsg/MqFfF1Eq2eokAa32iw8w== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" scss-parser@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/scss-parser/-/scss-parser-1.0.5.tgz#2297d688a4c300e94552f72c41fd7de092d19c4b" - integrity sha512-RZOtvCmCnwkDo7kdcYBi807Y5EoTIxJ34AgEgJNDmOH1jl0/xG0FyYZFbH6Ga3Iwu7q8LSdxJ4C5UkzNXjQxKQ== + version "1.0.6" + resolved "https://registry.yarnpkg.com/scss-parser/-/scss-parser-1.0.6.tgz#cd1ba01ee32db19322c8df2badd26da8f166b1c1" + integrity sha512-SH3TaoaJFzfAtqs3eG1j5IuHJkeEW5rKUPIjIN+ZorLAyJLHItQGnsgwHk76v25GtLtpT9IqfAcqK4vFWdiw+w== dependencies: invariant "2.2.4" + lodash "4.17.21" semver-compare@^1.0.0: version "1.0.0" @@ -2166,10 +2161,10 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -starpc@^0.15.2: - version "0.15.2" - resolved "https://registry.yarnpkg.com/starpc/-/starpc-0.15.2.tgz#bfe906c32d2570ba21a9ff96119c548bef5be80a" - integrity sha512-RH2QGzEE/c+ovf4KF2isO2HLeOfmYn4JLL6Ekv4X4eYWjW3jD13AKsk7UvSHKxwOexLoWjnVOmuYte0wuqgU/Q== +starpc@^0.15.4: + version "0.15.4" + resolved "https://registry.yarnpkg.com/starpc/-/starpc-0.15.4.tgz#3dca44bc7eefd4e9d641cce5f9c13a2fdf725bc2" + integrity sha512-d/EcmDpHjATPxXLcJSrAY9M0w1X0umYXXzb7LVPWxex/18gFbGOYCRIxdU/aIXw4wrk+1L86FaHsiZmYZHed2w== dependencies: "@chainsafe/libp2p-yamux" "^3.0.3" "@libp2p/interface-connection" "^3.0.3" @@ -2280,12 +2275,13 @@ ts-proto-descriptors@1.7.1: long "^4.0.0" protobufjs "^6.8.8" -ts-proto@^1.135.0: - version "1.135.0" - resolved "https://registry.yarnpkg.com/ts-proto/-/ts-proto-1.135.0.tgz#9e6ebb8fff42325d4ae475d2cd763068a8485846" - integrity sha512-NwK+PcSiWZBzO8GFVID2Ig71vIZRCApTG8XDZIlQ3WabbJlbUx9zsrHcYNojcUENtqkiYywTp3uTP6dketiCpw== +ts-proto@^1.135.3: + version "1.135.3" + resolved "https://registry.yarnpkg.com/ts-proto/-/ts-proto-1.135.3.tgz#f2fe6e48456dae4c511809c0595e6e4ab1c90362" + integrity sha512-MQhRh018zZU4jNf7VocXih8SqFycqQGNxW5PGwWIUweH3P7j55MqrmUARr8eKWLkeU45sCZiWSp0B46LcoyDww== dependencies: "@types/object-hash" "^1.3.0" + case-anything "^2.1.10" dataloader "^1.4.0" object-hash "^1.3.1" protobufjs "^6.11.3" @@ -2316,10 +2312,10 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -typescript@^4.9.3: - version "4.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db" - integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA== +typescript@^4.9.4: + version "4.9.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" + integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== uint8-varint@^1.0.1: version "1.0.4" @@ -2346,9 +2342,9 @@ uint8arrays@^4.0.2: multiformats "^10.0.0" undici@^5.12.0: - version "5.13.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.13.0.tgz#56772fba89d8b25e39bddc8c26a438bd73ea69bb" - integrity sha512-UDZKtwb2k7KRsK4SdXWG7ErXiL7yTGgLWvk2AXO1JMjgjh404nFo6tWSCM2xMpJwMPx3J8i/vfqEh1zOqvj82Q== + version "5.14.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.14.0.tgz#1169d0cdee06a4ffdd30810f6228d57998884d00" + integrity sha512-yJlHYw6yXPPsuOH0x2Ib1Km61vu4hLiRRQoafs+WUgX1vO64vgnxiCEN9dpIrhZyHFsai3F0AEj4P9zy19enEQ== dependencies: busboy "^1.6.0"