From 631fe920fd1d2bac2291cce59ad5370ddbfb614d Mon Sep 17 00:00:00 2001 From: Teo Gebhard Date: Sat, 13 Mar 2021 12:26:27 +0200 Subject: [PATCH 01/19] Test scripts --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e15812272..d493b2a17 100644 --- a/package.json +++ b/package.json @@ -45,8 +45,8 @@ "coverage": "jest --coverage", "test-integration": "jest --forceExit test/integration", "test-exports": "cd test/exports && npm run link && npm test", - "test-integration-no-resend": "jest --forceExit --testTimeout=10000 --testPathIgnorePatterns='resend|Resend' --testNamePattern='^((?!(resend|Resend|resent|Resent|gap|Gap)).)*$' test/integration/*.test.js", - "test-integration-resend": "jest --forceExit --testTimeout=15000 --testNamePattern='(resend|Resend|resent|Resent)' test/integration/*.test.js", + "test-integration-no-resend": "jest --forceExit --testTimeout=10000 --testPathIgnorePatterns='resend|Resend' --testNamePattern='^((?!(resend|Resend|resent|Resent|gap|Gap)).)*$' test/integration/*.test.*", + "test-integration-resend": "jest --forceExit --testTimeout=15000 --testNamePattern='(resend|Resend|resent|Resent)' test/integration/*.test.*", "test-integration-dataunions": "jest --forceExit --testTimeout=15000 --runInBand test/integration/dataunion", "test-flakey": "jest --forceExit test/flakey/*", "test-browser": "node ./test/browser/server.js & node node_modules/nightwatch/bin/nightwatch ./test/browser/browser.js && pkill -f server.js", From 11724d3ef04e35699f5aeec328ad59ec57704fb5 Mon Sep 17 00:00:00 2001 From: Teo Gebhard Date: Sat, 13 Mar 2021 12:38:48 +0200 Subject: [PATCH 02/19] config.js --- test/integration/config.js | 30 ---------------- test/integration/config.ts | 37 ++++++++++++++++++++ test/integration/dataunion/adminFee.test.ts | 2 -- test/integration/dataunion/calculate.test.ts | 2 -- test/integration/dataunion/deploy.test.ts | 2 -- test/integration/dataunion/member.test.ts | 2 -- test/integration/dataunion/signature.test.ts | 1 - test/integration/dataunion/stats.test.ts | 2 -- test/integration/dataunion/withdraw.test.ts | 2 -- 9 files changed, 37 insertions(+), 43 deletions(-) delete mode 100644 test/integration/config.js create mode 100644 test/integration/config.ts diff --git a/test/integration/config.js b/test/integration/config.js deleted file mode 100644 index 72a4d7f86..000000000 --- a/test/integration/config.js +++ /dev/null @@ -1,30 +0,0 @@ -module.exports = { - clientOptions: { - // ganache 1: 0x4178baBE9E5148c6D5fd431cD72884B07Ad855a0 - auth: { - privateKey: process.env.ETHEREUM_PRIVATE_KEY || '0xe5af7834455b7239881b85be89d905d6881dcb4751063897f12be1b0dd546bdb', - }, - url: process.env.WEBSOCKET_URL || 'ws://localhost/api/v1/ws', - restUrl: process.env.REST_URL || 'http://localhost/api/v1', - streamrNodeAddress: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', - tokenAddress: process.env.TOKEN_ADDRESS || '0xbAA81A0179015bE47Ad439566374F2Bae098686F', - tokenAddressSidechain: process.env.TOKEN_ADDRESS_SIDECHAIN || '0x73Be21733CC5D08e1a14Ea9a399fb27DB3BEf8fF', - dataUnion: { - factoryMainnetAddress: process.env.DU_FACTORY_MAINNET || '0x4bbcBeFBEC587f6C4AF9AF9B48847caEa1Fe81dA', - factorySidechainAddress: process.env.DU_FACTORY_SIDECHAIN || '0x4A4c4759eb3b7ABee079f832850cD3D0dC48D927', - templateMainnetAddress: process.env.DU_TEMPLATE_MAINNET || '0x7bFBAe10AE5b5eF45e2aC396E0E605F6658eF3Bc', - templateSidechainAddress: process.env.DU_TEMPLATE_SIDECHAIN || '0x36afc8c9283CC866b8EB6a61C6e6862a83cd6ee8', - }, - sidechain: { - url: process.env.SIDECHAIN_URL || 'http://10.200.10.1:8546', - timeout: process.env.TEST_TIMEOUT, - }, - mainnet: { - url: process.env.ETHEREUM_SERVER_URL || 'http://10.200.10.1:8545', - timeout: process.env.TEST_TIMEOUT, - }, - autoConnect: false, - autoDisconnect: false, - }, - tokenAdminPrivateKey: '0x5e98cce00cff5dea6b454889f359a4ec06b9fa6b88e9d69b86de8e1c81887da0', -} diff --git a/test/integration/config.ts b/test/integration/config.ts new file mode 100644 index 000000000..e0db93d21 --- /dev/null +++ b/test/integration/config.ts @@ -0,0 +1,37 @@ +import { StreamrClientOptions } from '../../src/Config' + +const toNumber = (value: string|undefined) => (value !== undefined) ? Number(value) : undefined + +const clientOptions: Partial & { tokenAddressSidechain: string } = { + auth: { + privateKey: process.env.ETHEREUM_PRIVATE_KEY || '0xe5af7834455b7239881b85be89d905d6881dcb4751063897f12be1b0dd546bdb', + }, + url: process.env.WEBSOCKET_URL || 'ws://localhost/api/v1/ws', + restUrl: process.env.REST_URL || 'http://localhost/api/v1', + streamrNodeAddress: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', + tokenAddress: process.env.TOKEN_ADDRESS || '0xbAA81A0179015bE47Ad439566374F2Bae098686F', + tokenAddressSidechain: process.env.TOKEN_ADDRESS_SIDECHAIN || '0x73Be21733CC5D08e1a14Ea9a399fb27DB3BEf8fF', + dataUnion: { + factoryMainnetAddress: process.env.DU_FACTORY_MAINNET || '0x4bbcBeFBEC587f6C4AF9AF9B48847caEa1Fe81dA', + factorySidechainAddress: process.env.DU_FACTORY_SIDECHAIN || '0x4A4c4759eb3b7ABee079f832850cD3D0dC48D927', + templateMainnetAddress: process.env.DU_TEMPLATE_MAINNET || '0x7bFBAe10AE5b5eF45e2aC396E0E605F6658eF3Bc', + templateSidechainAddress: process.env.DU_TEMPLATE_SIDECHAIN || '0x36afc8c9283CC866b8EB6a61C6e6862a83cd6ee8', + }, + sidechain: { + url: process.env.SIDECHAIN_URL || 'http://10.200.10.1:8546', + timeout: toNumber(process.env.TEST_TIMEOUT), + }, + mainnet: { + url: process.env.ETHEREUM_SERVER_URL || 'http://10.200.10.1:8545', + timeout: toNumber(process.env.TEST_TIMEOUT), + }, + autoConnect: false, + autoDisconnect: false +} + +const tokenAdminPrivateKey = '0x5e98cce00cff5dea6b454889f359a4ec06b9fa6b88e9d69b86de8e1c81887da0' + +export default { + clientOptions, + tokenAdminPrivateKey +} diff --git a/test/integration/dataunion/adminFee.test.ts b/test/integration/dataunion/adminFee.test.ts index d4c273a0e..326ba95e6 100644 --- a/test/integration/dataunion/adminFee.test.ts +++ b/test/integration/dataunion/adminFee.test.ts @@ -8,9 +8,7 @@ import config from '../config' const log = debug('StreamrClient::DataUnion::integration-test-adminFee') -// @ts-expect-error const providerSidechain = new providers.JsonRpcProvider(config.clientOptions.sidechain) -// @ts-expect-error const providerMainnet = new providers.JsonRpcProvider(config.clientOptions.mainnet) const adminWalletMainnet = new Wallet(config.clientOptions.auth.privateKey, providerMainnet) diff --git a/test/integration/dataunion/calculate.test.ts b/test/integration/dataunion/calculate.test.ts index cba46a0e4..0a0fdc40a 100644 --- a/test/integration/dataunion/calculate.test.ts +++ b/test/integration/dataunion/calculate.test.ts @@ -7,9 +7,7 @@ import { createClient, expectInvalidAddress } from '../../utils' const log = debug('StreamrClient::DataUnion::integration-test-calculate') -// @ts-expect-error const providerSidechain = new providers.JsonRpcProvider(config.clientOptions.sidechain) -// @ts-expect-error const providerMainnet = new providers.JsonRpcProvider(config.clientOptions.mainnet) const adminWalletMainnet = new Wallet(config.clientOptions.auth.privateKey, providerMainnet) diff --git a/test/integration/dataunion/deploy.test.ts b/test/integration/dataunion/deploy.test.ts index 123f273fa..1a9627859 100644 --- a/test/integration/dataunion/deploy.test.ts +++ b/test/integration/dataunion/deploy.test.ts @@ -7,9 +7,7 @@ import { createMockAddress } from '../../utils' const log = debug('StreamrClient::DataUnion::integration-test-deploy') -// @ts-expect-error const providerSidechain = new providers.JsonRpcProvider(config.clientOptions.sidechain) -// @ts-expect-error const providerMainnet = new providers.JsonRpcProvider(config.clientOptions.mainnet) describe('DataUnion deploy', () => { diff --git a/test/integration/dataunion/member.test.ts b/test/integration/dataunion/member.test.ts index 53c445e4e..569689fa2 100644 --- a/test/integration/dataunion/member.test.ts +++ b/test/integration/dataunion/member.test.ts @@ -10,9 +10,7 @@ import { getEndpointUrl } from '../../../src/utils' const log = debug('StreamrClient::DataUnion::integration-test-member') -// @ts-expect-error const providerSidechain = new providers.JsonRpcProvider(config.clientOptions.sidechain) -// @ts-expect-error const providerMainnet = new providers.JsonRpcProvider(config.clientOptions.mainnet) const joinMember = async (memberWallet: Wallet, secret: string|undefined, dataUnionAddress: string) => { diff --git a/test/integration/dataunion/signature.test.ts b/test/integration/dataunion/signature.test.ts index 9f655e856..3545ffb6f 100644 --- a/test/integration/dataunion/signature.test.ts +++ b/test/integration/dataunion/signature.test.ts @@ -11,7 +11,6 @@ import authFetch from '../../../src/rest/authFetch' const log = debug('StreamrClient::DataUnion::integration-test-signature') -// @ts-expect-error const providerSidechain = new providers.JsonRpcProvider(config.clientOptions.sidechain) const adminWalletSidechain = new Wallet(config.clientOptions.auth.privateKey, providerSidechain) diff --git a/test/integration/dataunion/stats.test.ts b/test/integration/dataunion/stats.test.ts index 786181d35..6555c9838 100644 --- a/test/integration/dataunion/stats.test.ts +++ b/test/integration/dataunion/stats.test.ts @@ -9,9 +9,7 @@ import { BigNumber } from '@ethersproject/bignumber' const log = debug('StreamrClient::DataUnion::integration-test-stats') -// @ts-expect-error const providerSidechain = new providers.JsonRpcProvider(config.clientOptions.sidechain) -// @ts-expect-error const providerMainnet = new providers.JsonRpcProvider(config.clientOptions.mainnet) describe('DataUnion stats', () => { diff --git a/test/integration/dataunion/withdraw.test.ts b/test/integration/dataunion/withdraw.test.ts index 2b5cf0278..af704bce6 100644 --- a/test/integration/dataunion/withdraw.test.ts +++ b/test/integration/dataunion/withdraw.test.ts @@ -14,9 +14,7 @@ import { MemberStatus } from '../../../src/dataunion/DataUnion' const log = debug('StreamrClient::DataUnion::integration-test-withdraw') -// @ts-expect-error const providerSidechain = new providers.JsonRpcProvider(config.clientOptions.sidechain) -// @ts-expect-error const providerMainnet = new providers.JsonRpcProvider(config.clientOptions.mainnet) const adminWalletMainnet = new Wallet(config.clientOptions.auth.privateKey, providerMainnet) const adminWalletSidechain = new Wallet(config.clientOptions.auth.privateKey, providerSidechain) From 7fab45c19517357d1b4c1b3f729f45c4ef3222ad Mon Sep 17 00:00:00 2001 From: Teo Gebhard Date: Sat, 13 Mar 2021 12:39:59 +0200 Subject: [PATCH 03/19] Modified type annotations for Signer.AuthOption --- src/publish/Signer.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/publish/Signer.ts b/src/publish/Signer.ts index 44e5bb875..cec02d2fe 100644 --- a/src/publish/Signer.ts +++ b/src/publish/Signer.ts @@ -9,14 +9,14 @@ const { SigningUtil } = Utils const { SIGNATURE_TYPES } = StreamMessage type AuthOption = { - ethereum: undefined + ethereum?: never privateKey: string | Uint8Array } | { - privateKey: undefined + privateKey?: never ethereum: EthereumConfig } | { - ethereum: undefined - privateKey: undefined + ethereum?: never + privateKey?: never } function getSigningFunction({ From 30a05da46e2cd3d85618e64acfa218a6c8def376 Mon Sep 17 00:00:00 2001 From: Teo Gebhard Date: Sat, 13 Mar 2021 12:41:32 +0200 Subject: [PATCH 04/19] Unit tests --- src/user/{index.js => index.ts} | 8 +- ...{Encryption.test.js => Encryption.test.ts} | 8 +- .../{Scaffold.test.js => Scaffold.test.ts} | 81 ++++++++++--------- .../unit/{Session.test.js => Session.test.ts} | 17 +++- test/unit/{Signer.test.js => Signer.test.ts} | 9 ++- test/unit/{Stream.test.js => Stream.test.ts} | 5 +- ...reamrClient.js => StubbedStreamrClient.ts} | 4 +- 7 files changed, 79 insertions(+), 53 deletions(-) rename src/user/{index.js => index.ts} (85%) rename test/unit/{Encryption.test.js => Encryption.test.ts} (96%) rename test/unit/{Scaffold.test.js => Scaffold.test.ts} (91%) rename test/unit/{Session.test.js => Session.test.ts} (94%) rename test/unit/{Signer.test.js => Signer.test.ts} (94%) rename test/unit/{Stream.test.js => Stream.test.ts} (87%) rename test/unit/{StubbedStreamrClient.js => StubbedStreamrClient.ts} (85%) diff --git a/src/user/index.js b/src/user/index.ts similarity index 85% rename from src/user/index.js rename to src/user/index.ts index 925141ca0..d17d2913a 100644 --- a/src/user/index.js +++ b/src/user/index.ts @@ -2,8 +2,10 @@ import { computeAddress } from '@ethersproject/transactions' import { Web3Provider } from '@ethersproject/providers' import { hexlify } from '@ethersproject/bytes' import { sha256 } from '@ethersproject/sha2' +import StreamrClient from '../StreamrClient' +import { EthereumConfig } from '../Config' -async function getUsername(client) { +async function getUsername(client: StreamrClient) { const { options: { auth = {} } = {} } = client if (auth.username) { return auth.username } @@ -15,7 +17,7 @@ async function getUsername(client) { ) } -export async function getAddressFromOptions({ ethereum, privateKey } = {}) { +export async function getAddressFromOptions({ ethereum, privateKey }: { ethereum?: EthereumConfig, privateKey?: any} = {}) { if (privateKey) { return computeAddress(privateKey).toLowerCase() } @@ -29,7 +31,7 @@ export async function getAddressFromOptions({ ethereum, privateKey } = {}) { throw new Error('Need either "privateKey" or "ethereum".') } -export async function getUserId(client) { +export async function getUserId(client: StreamrClient) { if (client.session.isUnauthenticated()) { throw new Error('Need to be authenticated to getUserId.') } diff --git a/test/unit/Encryption.test.js b/test/unit/Encryption.test.ts similarity index 96% rename from test/unit/Encryption.test.js rename to test/unit/Encryption.test.ts index 5a52a1517..ba54f3d96 100644 --- a/test/unit/Encryption.test.js +++ b/test/unit/Encryption.test.ts @@ -13,9 +13,11 @@ function TestEncryptionUtil({ isBrowser = false } = {}) { beforeAll(() => { // this is the toggle used in EncryptionUtil to // use the webcrypto apis + // @ts-expect-error process.browser = !!isBrowser }) afterAll(() => { + // @ts-expect-error process.browser = !isBrowser }) @@ -62,10 +64,12 @@ function TestEncryptionUtil({ isBrowser = false } = {}) { const key = GroupKey.generate() const streamMessage = new StreamMessage({ messageId: new MessageID('streamId', 0, 1, 0, 'publisherId', 'msgChainId'), + // @ts-expect-error prevMesssageRef: null, content: { foo: 'bar', }, + // @ts-expect-error contentType: StreamMessage.CONTENT_TYPES.MESSAGE, encryptionType: StreamMessage.ENCRYPTION_TYPES.NONE, signatureType: StreamMessage.SIGNATURE_TYPES.NONE, @@ -80,10 +84,12 @@ function TestEncryptionUtil({ isBrowser = false } = {}) { const key = GroupKey.generate() const streamMessage = new StreamMessage({ messageId: new MessageID('streamId', 0, 1, 0, 'publisherId', 'msgChainId'), + // @ts-expect-error prevMesssageRef: null, content: { foo: 'bar', }, + // @ts-expect-error contentType: StreamMessage.CONTENT_TYPES.MESSAGE, encryptionType: StreamMessage.ENCRYPTION_TYPES.NONE, signatureType: StreamMessage.SIGNATURE_TYPES.NONE, @@ -165,7 +171,7 @@ function TestEncryptionUtil({ isBrowser = false } = {}) { it('validateGroupKey() throws if key is not a buffer', () => { expect(() => { - EncryptionUtil.validateGroupKey(ethers.utils.hexlify(GroupKey.generate())) + EncryptionUtil.validateGroupKey(ethers.utils.hexlify(GroupKey.generate() as any)) }).toThrow() }) diff --git a/test/unit/Scaffold.test.js b/test/unit/Scaffold.test.ts similarity index 91% rename from test/unit/Scaffold.test.js rename to test/unit/Scaffold.test.ts index 24a78b243..6f56c8bc3 100644 --- a/test/unit/Scaffold.test.js +++ b/test/unit/Scaffold.test.ts @@ -1,17 +1,18 @@ import Emitter from 'events' import { wait } from 'streamr-test-utils' +import { Todo } from '../../src/types' import { Defer } from '../../src/utils' import Scaffold from '../../src/utils/Scaffold' describe('Scaffold', () => { - let order - let up - let down - let emitter - let onDone - let onChange + let order: Todo + let up: Todo + let down: Todo + let emitter: Todo + let onDone: Todo + let onChange: Todo // const log = debug.extend('Scaffold') beforeEach(() => { @@ -23,30 +24,30 @@ describe('Scaffold', () => { const currentOrder = order emitter = new Emitter() - emitter.on('next', (name, v = '') => { + emitter.on('next', (name: Todo, v = '') => { const msg = `${name} ${v}`.trim() // log(msg) currentOrder.push(msg) }) const currentEmitter = emitter - up = async (...args) => { + up = async (...args: Todo[]) => { currentEmitter.emit('next', 'up start', ...args) await wait(50) currentEmitter.emit('next', 'up end', ...args) } - down = async (...args) => { + down = async (...args: Todo[]) => { currentEmitter.emit('next', 'down start', ...args) await wait(10) currentEmitter.emit('next', 'down end', ...args) } - onDone = (isUp) => { + onDone = (isUp: Todo) => { currentEmitter.emit('next', 'done', isUp ? 'up' : 'down') } - onChange = (isUp) => { + onChange = (isUp: Todo) => { currentEmitter.emit('next', 'change', isUp ? 'up' : 'down') } }) @@ -58,7 +59,7 @@ describe('Scaffold', () => { await up() return () => down() } - ], () => shouldUp, { + ], async () => shouldUp, { onDone, onChange }) @@ -98,7 +99,7 @@ describe('Scaffold', () => { shouldUp = false return () => down() } - ], () => shouldUp, { + ], async () => shouldUp, { onDone, onChange }) @@ -125,7 +126,7 @@ describe('Scaffold', () => { await up('b') throw err }, - ], () => true, { + ], async () => true, { onDone, onChange }) @@ -159,7 +160,7 @@ describe('Scaffold', () => { shouldThrow = true return () => down('b') }, - ], () => { + ], async () => { if (shouldThrow) { throw err } @@ -192,7 +193,7 @@ describe('Scaffold', () => { const err = new Error('expected') const currentEmitter = emitter - currentEmitter.on('next', (event, name) => { + currentEmitter.on('next', (event: Todo, name: Todo) => { if (event === 'down start' && name === 'c') { throw err // throw on down b } @@ -215,7 +216,7 @@ describe('Scaffold', () => { await down('c') // this should throw due to on('next' above } }, - ], () => shouldUp, { + ], async () => shouldUp, { onDone, onChange }) @@ -249,7 +250,7 @@ describe('Scaffold', () => { const err = new Error('expected') const currentEmitter = emitter - currentEmitter.on('next', (event, name) => { + currentEmitter.on('next', (event: Todo, name: Todo) => { if (event === 'down start' && name === 'a') { throw err // throw on down b } @@ -266,7 +267,7 @@ describe('Scaffold', () => { await down('b') } }, - ], () => shouldUp, { + ], async () => shouldUp, { onDone, onChange }) @@ -311,7 +312,7 @@ describe('Scaffold', () => { async () => { throw err } - ], () => shouldUp, { + ], async () => shouldUp, { onDone, onChange, onError: onErrorNoop, @@ -352,7 +353,7 @@ describe('Scaffold', () => { async () => { throw err } - ], () => shouldUp, { + ], async () => shouldUp, { onDone, onChange, onError: onErrorRethrow, @@ -385,7 +386,7 @@ describe('Scaffold', () => { await up() return () => down() } - ], () => shouldUp, { + ], async () => shouldUp, { onDone, onChange }) @@ -402,7 +403,7 @@ describe('Scaffold', () => { shouldUp = false return () => down() } - ], () => shouldUp, { + ], async () => shouldUp, { onDone, onChange }) @@ -426,7 +427,7 @@ describe('Scaffold', () => { await up() return () => down() } - ], () => true, { + ], async () => true, { onDone, onChange: () => { throw err @@ -446,7 +447,7 @@ describe('Scaffold', () => { await up() return () => down() } - ], () => shouldUp, { + ], async () => shouldUp, { onDone, onChange: (goingUp) => { onChange(goingUp) @@ -482,7 +483,7 @@ describe('Scaffold', () => { await up() return () => down() } - ], () => shouldUp, { + ], async () => shouldUp, { onDone, onChange: (goingUp) => { onChange(goingUp) @@ -517,11 +518,11 @@ describe('Scaffold', () => { await up() return () => down() } - ], () => shouldUp, { + ], async () => shouldUp, { onDone, onChange }) const done = Defer() - emitter.on('next', async (name) => { + emitter.on('next', async (name: Todo) => { if (name === 'up start') { shouldUp = false done.resolve(next()) @@ -545,8 +546,8 @@ describe('Scaffold', () => { }) describe('plays undo stack at point of state change', () => { - let shouldUp - let next + let shouldUp: Todo + let next: Todo const allUp = [ 'change up', 'up start a', @@ -606,10 +607,10 @@ describe('Scaffold', () => { it('can stop before first step', async () => { shouldUp = true const done = Defer() - emitter.on('next', async (name, v) => { + emitter.on('next', async (name: Todo, v: Todo) => { if (name === 'up start' && v === 'a') { shouldUp = false - done.resolve() + done.resolve(undefined) } }) @@ -632,10 +633,10 @@ describe('Scaffold', () => { it('can stop before second step', async () => { shouldUp = true const done = Defer() - emitter.on('next', async (name, v) => { + emitter.on('next', async (name: Todo, v: Todo) => { if (name === 'up end' && v === 'b') { shouldUp = false - done.resolve() + done.resolve(undefined) } }) @@ -662,10 +663,10 @@ describe('Scaffold', () => { it('can interrupt down while going down', async () => { const done = Defer() shouldUp = true - emitter.on('next', async (name, v) => { + emitter.on('next', async (name: Todo, v: Todo) => { if (name === 'down end' && v === 'b') { shouldUp = true - done.resolve() + done.resolve(undefined) } }) await next() @@ -694,23 +695,23 @@ describe('Scaffold', () => { const done3 = Defer() shouldUp = true let count = 0 - emitter.on('next', async (name, v) => { + emitter.on('next', async (name: Todo, v: Todo) => { if (name === 'down end' && v === 'b') { count += 1 shouldUp = true - done1.resolve() + done1.resolve(undefined) } if (name === 'change' && v === 'up' && count === 1) { count += 1 shouldUp = false - done2.resolve() + done2.resolve(undefined) } if (name === 'change' && v === 'down' && count === 2) { count += 1 shouldUp = true - done3.resolve() + done3.resolve(undefined) } }) await next() diff --git a/test/unit/Session.test.js b/test/unit/Session.test.ts similarity index 94% rename from test/unit/Session.test.js rename to test/unit/Session.test.ts index a31a7d40a..dd407b47e 100644 --- a/test/unit/Session.test.js +++ b/test/unit/Session.test.ts @@ -4,11 +4,12 @@ import { StreamrClient } from '../../src/StreamrClient' import { Defer } from '../../src/utils' import Session from '../../src/Session' import config from '../integration/config' +import { Todo } from '../../src/types' describe('Session', () => { - let session - let msg - let clientSessionToken + let session: Session + let msg: Todo + let clientSessionToken: Todo const createClient = (opts = {}) => new StreamrClient({ ...config.clientOptions, @@ -28,9 +29,11 @@ describe('Session', () => { session = new Session(clientSessionToken) session.options.unauthenticated = false session.loginFunction = sinon.stub() + // @ts-expect-error session.loginFunction.onCall(0).resolves({ token: 'session-token1', }) + // @ts-expect-error session.loginFunction.onCall(1).resolves({ token: 'session-token2', }) @@ -88,6 +91,7 @@ describe('Session', () => { describe('getSessionToken', () => { it('should set sessionToken', async () => { await session.getSessionToken() + // @ts-expect-error expect(session.loginFunction.calledOnce).toBeTruthy() expect(session.options.sessionToken === 'session-token1').toBeTruthy() }) @@ -95,12 +99,14 @@ describe('Session', () => { it('should not call loginFunction if token set', async () => { session.options.sessionToken = 'session-token1' await session.getSessionToken() + // @ts-expect-error expect(session.loginFunction.notCalled).toBeTruthy() }) it('should call loginFunction if new token required', async () => { session.options.sessionToken = 'expired-session-token' await session.getSessionToken(true) + // @ts-expect-error expect(session.loginFunction.calledOnce).toBeTruthy() expect(session.options.sessionToken === 'session-token1').toBeTruthy() }) @@ -112,6 +118,7 @@ describe('Session', () => { const p1 = session.getSessionToken() const p2 = session.getSessionToken() const [sessionToken1, sessionToken2] = await Promise.all([p1, p2]) + // @ts-expect-error expect(session.loginFunction.calledOnce).toBeTruthy() expect(sessionToken1).toEqual(sessionToken2) }) @@ -125,7 +132,7 @@ describe('Session', () => { describe('loginFunction rejects', () => { beforeEach(() => { - session = new Session() + session = new Session(undefined as any) session.options.unauthenticated = false msg = 'Error: Need either "privateKey", "ethereum", "apiKey" or "username"+"password" to login.' session.loginFunction = sinon.stub().rejects(new Error(msg)) @@ -141,6 +148,7 @@ describe('Session', () => { session.getSessionToken() )).rejects.toThrow(msg) ]) + // @ts-expect-error expect(session.loginFunction.calledOnce).toBeTruthy() }) @@ -151,6 +159,7 @@ describe('Session', () => { await expect(async () => ( session.getSessionToken() )).rejects.toThrow(msg) + // @ts-expect-error expect(session.loginFunction.calledTwice).toBeTruthy() }) }) diff --git a/test/unit/Signer.test.js b/test/unit/Signer.test.ts similarity index 94% rename from test/unit/Signer.test.js rename to test/unit/Signer.test.ts index 0751cdb20..351e33aea 100644 --- a/test/unit/Signer.test.js +++ b/test/unit/Signer.test.ts @@ -1,6 +1,7 @@ import { MessageLayer } from 'streamr-client-protocol' import Signer from '../../src/publish/Signer' +import { Todo } from '../../src/types' import { getAddressFromOptions } from '../../src/user' const { StreamMessage, MessageID, MessageRef } = MessageLayer @@ -14,6 +15,7 @@ describe('Signer', () => { const signer = Signer({ privateKey: '0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709', }) + // @ts-expect-error const signature = await signer.signData('some-data') expect(signature).toBeTruthy() }) @@ -27,11 +29,13 @@ describe('Signer', () => { it('Should noop if "never" option is set', async () => { const obj = {} + // @ts-expect-error expect(await Signer({}, 'never')(obj)).toBe(obj) }) it('Should noop when "auto" option is set with no private key or provider', async () => { const obj = {} + // @ts-expect-error expect(await Signer({}, 'auto')(obj)).toBe(obj) }) @@ -61,7 +65,7 @@ describe('Signer', () => { }) describe('signing', () => { - let signer + let signer: Todo const streamId = 'streamId' const data = { field: 'some-data', @@ -106,6 +110,7 @@ describe('Signer', () => { it('should sign StreamMessageV31 with non-null previous ref correctly', async () => { const address = await getAddressFromOptions(options) const streamMessage = new StreamMessage({ + // @ts-expect-error version: 31, messageId: new MessageID(streamId, 0, timestamp, 0, address, 'chain-id'), prevMsgRef: new MessageRef(timestamp - 10, 0), @@ -117,7 +122,7 @@ describe('Signer', () => { const payload = [ streamMessage.getStreamId(), streamMessage.getStreamPartition(), streamMessage.getTimestamp(), streamMessage.messageId.sequenceNumber, address.toLowerCase(), streamMessage.messageId.msgChainId, - streamMessage.prevMsgRef.timestamp, streamMessage.prevMsgRef.sequenceNumber, streamMessage.getSerializedContent() + streamMessage.prevMsgRef!.timestamp, streamMessage.prevMsgRef!.sequenceNumber, streamMessage.getSerializedContent() ] const expectedSignature = await signer.signData(payload.join('')) expect(payload.join('')).toEqual(streamMessage.getPayloadToSign()) diff --git a/test/unit/Stream.test.js b/test/unit/Stream.test.ts similarity index 87% rename from test/unit/Stream.test.js rename to test/unit/Stream.test.ts index 15f68dab6..2960a7d86 100644 --- a/test/unit/Stream.test.js +++ b/test/unit/Stream.test.ts @@ -1,8 +1,9 @@ import { Stream } from '../../src/stream' +import { Todo } from '../../src/types' describe('Stream', () => { - let stream - let clientMock + let stream: Stream + let clientMock: Todo beforeEach(() => { clientMock = { diff --git a/test/unit/StubbedStreamrClient.js b/test/unit/StubbedStreamrClient.ts similarity index 85% rename from test/unit/StubbedStreamrClient.js rename to test/unit/StubbedStreamrClient.ts index d1086d26f..4052044be 100644 --- a/test/unit/StubbedStreamrClient.js +++ b/test/unit/StubbedStreamrClient.ts @@ -2,6 +2,7 @@ import { StreamrClient } from '../../src/' import { Stream } from '../../src/stream' export default class StubbedStreamrClient extends StreamrClient { + // @ts-expect-error getUserInfo() { return Promise.resolve({ username: 'username', @@ -9,11 +10,12 @@ export default class StubbedStreamrClient extends StreamrClient { } async getStream () { - return new Stream(null, { + return new Stream(null as any, { id: 'streamId', partitions: 1, }) } } // publisherId is the hash of 'username' +// @ts-expect-error StubbedStreamrClient.hashedUsername = '0x16F78A7D6317F102BBD95FC9A4F3FF2E3249287690B8BDAD6B7810F82B34ACE3'.toLowerCase() From 68b3681ccc45edb53aacf68edae9c6a006172aaa Mon Sep 17 00:00:00 2001 From: Teo Gebhard Date: Thu, 11 Mar 2021 13:28:02 +0200 Subject: [PATCH 05/19] Integration tests --- .../{GapFill.test.js => GapFill.test.ts} | 36 +++++---- ...dpoints.test.js => LoginEndpoints.test.ts} | 12 ++- ...onnect.test.js => ResendReconnect.test.ts} | 19 +++-- .../{Resends.test.js => Resends.test.ts} | 42 +++++----- ...{Sequencing.test.js => Sequencing.test.ts} | 41 +++++----- .../{Session.test.js => Session.test.ts} | 0 .../{Stream.test.js => Stream.test.ts} | 5 +- ....test.js => StreamConnectionState.test.ts} | 35 +++++--- ...mrClient.test.js => StreamrClient.test.ts} | 81 +++++++++++-------- ...ends.test.js => SubscriberResends.test.ts} | 40 +++++---- ...scription.test.js => Subscription.test.ts} | 15 ++-- .../{authFetch.test.js => authFetch.test.ts} | 8 +- test/utils.ts | 2 +- 13 files changed, 195 insertions(+), 141 deletions(-) rename test/integration/{GapFill.test.js => GapFill.test.ts} (90%) rename test/integration/{LoginEndpoints.test.js => LoginEndpoints.test.ts} (92%) rename test/integration/{ResendReconnect.test.js => ResendReconnect.test.ts} (92%) rename test/integration/{Resends.test.js => Resends.test.ts} (92%) rename test/integration/{Sequencing.test.js => Sequencing.test.ts} (91%) rename test/integration/{Session.test.js => Session.test.ts} (100%) rename test/integration/{Stream.test.js => Stream.test.ts} (97%) rename test/integration/{StreamConnectionState.test.js => StreamConnectionState.test.ts} (95%) rename test/integration/{StreamrClient.test.js => StreamrClient.test.ts} (95%) rename test/integration/{SubscriberResends.test.js => SubscriberResends.test.ts} (95%) rename test/integration/{Subscription.test.js => Subscription.test.ts} (92%) rename test/integration/{authFetch.test.js => authFetch.test.ts} (88%) diff --git a/test/integration/GapFill.test.js b/test/integration/GapFill.test.ts similarity index 90% rename from test/integration/GapFill.test.js rename to test/integration/GapFill.test.ts index 7eb7dc8fa..f60d5a611 100644 --- a/test/integration/GapFill.test.js +++ b/test/integration/GapFill.test.ts @@ -5,16 +5,19 @@ import { StreamrClient } from '../../src/StreamrClient' import Connection from '../../src/Connection' import config from './config' +import Stream from '../../src/stream' +import Subscriber from '../../src/subscribe' +import { Todo } from '../../src/types' const MAX_MESSAGES = 10 describeRepeats('GapFill with resends', () => { let expectErrors = 0 // check no errors by default - let publishTestMessages + let publishTestMessages: Todo let onError = jest.fn() - let client - let stream - let subscriber + let client: StreamrClient + let stream: Stream + let subscriber: Subscriber const createClient = (opts = {}) => { const c = new StreamrClient({ @@ -23,6 +26,7 @@ describeRepeats('GapFill with resends', () => { }, autoConnect: false, autoDisconnect: false, + // @ts-expect-error maxRetries: 2, ...config.clientOptions, ...opts, @@ -32,7 +36,7 @@ describeRepeats('GapFill with resends', () => { return c } - async function setupClient(opts) { + async function setupClient(opts: Todo) { // eslint-disable-next-line require-atomic-updates client = createClient(opts) subscriber = client.subscriber @@ -61,7 +65,7 @@ describeRepeats('GapFill with resends', () => { }) afterEach(async () => { - await wait() + await wait(0) // ensure no unexpected errors expect(onError).toHaveBeenCalledTimes(expectErrors) if (client) { @@ -70,7 +74,7 @@ describeRepeats('GapFill with resends', () => { }) afterEach(async () => { - await wait() + await wait(0) if (client) { client.debug('disconnecting after test >>') await client.disconnect() @@ -84,7 +88,7 @@ describeRepeats('GapFill with resends', () => { } }) - let subs = [] + let subs: Todo[] = [] beforeEach(async () => { const existingSubs = subs @@ -108,7 +112,7 @@ describeRepeats('GapFill with resends', () => { const { parse } = client.connection let count = 0 client.connection.parse = (...args) => { - const msg = parse.call(client.connection, ...args) + const msg: Todo = parse.call(client.connection, ...args) if (!msg.streamMessage) { return msg } @@ -142,8 +146,8 @@ describeRepeats('GapFill with resends', () => { const sub = await client.subscribe(stream.id) const { parse } = client.connection let count = 0 - client.connection.parse = (...args) => { - const msg = parse.call(client.connection, ...args) + client.connection.parse = (...args): Todo => { + const msg: Todo = parse.call(client.connection, ...args) if (!msg.streamMessage) { return msg } @@ -176,7 +180,7 @@ describeRepeats('GapFill with resends', () => { const { parse } = client.connection let count = 0 client.connection.parse = (...args) => { - const msg = parse.call(client.connection, ...args) + const msg: Todo = parse.call(client.connection, ...args) if (!msg.streamMessage) { return msg } @@ -208,7 +212,7 @@ describeRepeats('GapFill with resends', () => { const { parse } = client.connection let count = 0 client.connection.parse = (...args) => { - const msg = parse.call(client.connection, ...args) + const msg: Todo = parse.call(client.connection, ...args) if (!msg.streamMessage) { return msg } @@ -242,9 +246,9 @@ describeRepeats('GapFill with resends', () => { it('can fill gaps in resends even if gap cannot be filled', async () => { const { parse } = client.connection let count = 0 - let droppedMsgRef + let droppedMsgRef: Todo client.connection.parse = (...args) => { - const msg = parse.call(client.connection, ...args) + const msg: Todo = parse.call(client.connection, ...args) if (!msg.streamMessage) { return msg } @@ -277,7 +281,7 @@ describeRepeats('GapFill with resends', () => { received.push(m.getParsedContent()) // should not need to explicitly end } - expect(received).toEqual(published.filter((_value, index) => index !== 2)) + expect(received).toEqual(published.filter((_value: Todo, index: Todo) => index !== 2)) expect(client.connection.getState()).toBe('connected') }, 60000) diff --git a/test/integration/LoginEndpoints.test.js b/test/integration/LoginEndpoints.test.ts similarity index 92% rename from test/integration/LoginEndpoints.test.js rename to test/integration/LoginEndpoints.test.ts index ce4f94610..748071e27 100644 --- a/test/integration/LoginEndpoints.test.js +++ b/test/integration/LoginEndpoints.test.ts @@ -7,11 +7,13 @@ import { StreamrClient } from '../../src/StreamrClient' import config from './config' describe('LoginEndpoints', () => { - let client + let client: StreamrClient const createClient = (opts = {}) => new StreamrClient({ ...config.clientOptions, - apiKey: 'tester1-api-key', + auth: { + apiKey: 'tester1-api-key', + }, autoConnect: false, autoDisconnect: false, ...opts, @@ -29,8 +31,10 @@ describe('LoginEndpoints', () => { it('should retrieve a challenge', async () => { const challenge = await client.getChallenge('some-address') assert(challenge) + // @ts-expect-error assert(challenge.id) assert(challenge.challenge) + // @ts-expect-error assert(challenge.expires) }) }) @@ -39,6 +43,7 @@ describe('LoginEndpoints', () => { it('should fail to get a session token', async () => { await expect(async () => { await client.sendChallengeResponse({ + // @ts-expect-error id: 'some-id', challenge: 'some-challenge', }, 'some-sig', 'some-address') @@ -53,6 +58,7 @@ describe('LoginEndpoints', () => { const sessionToken = await client.sendChallengeResponse(challenge, signature, wallet.address) assert(sessionToken) assert(sessionToken.token) + // @ts-expect-error assert(sessionToken.expires) }) @@ -61,6 +67,7 @@ describe('LoginEndpoints', () => { const sessionToken = await client.loginWithChallengeResponse((d) => wallet.signMessage(d), wallet.address) assert(sessionToken) assert(sessionToken.token) + // @ts-expect-error assert(sessionToken.expires) }) }) @@ -76,6 +83,7 @@ describe('LoginEndpoints', () => { const sessionToken = await client.loginWithApiKey('tester1-api-key') assert(sessionToken) assert(sessionToken.token) + // @ts-expect-error assert(sessionToken.expires) }) }) diff --git a/test/integration/ResendReconnect.test.js b/test/integration/ResendReconnect.test.ts similarity index 92% rename from test/integration/ResendReconnect.test.js rename to test/integration/ResendReconnect.test.ts index a777acc22..c4b451184 100644 --- a/test/integration/ResendReconnect.test.js +++ b/test/integration/ResendReconnect.test.ts @@ -5,12 +5,11 @@ import { StreamrClient } from '../../src/StreamrClient' import { Defer } from '../../src/utils' import config from './config' +import Stream from '../../src/stream' +import { Todo } from '../../src/types' const createClient = (opts = {}) => new StreamrClient({ - ...(config.clientOptions || { - url: config.websocketUrl, - restUrl: config.restUrl, - }), + ...config.clientOptions, auth: { privateKey: fakePrivateKey(), }, @@ -22,10 +21,10 @@ const createClient = (opts = {}) => new StreamrClient({ const MAX_MESSAGES = 3 describe('resend/reconnect', () => { - let client - let stream - let publishedMessages - let publishTestMessages + let client: StreamrClient + let stream: Stream + let publishedMessages: Todo + let publishTestMessages: Todo beforeEach(async () => { client = createClient() @@ -49,8 +48,8 @@ describe('resend/reconnect', () => { describe('reconnect with resend', () => { let shouldDisconnect = false - let sub - let messages = [] + let sub: Todo + let messages: Todo[] = [] beforeEach(async () => { const done = Defer() messages = [] diff --git a/test/integration/Resends.test.js b/test/integration/Resends.test.ts similarity index 92% rename from test/integration/Resends.test.js rename to test/integration/Resends.test.ts index 836632117..e49f78654 100644 --- a/test/integration/Resends.test.js +++ b/test/integration/Resends.test.ts @@ -6,6 +6,8 @@ import { Defer, pTimeout } from '../../src/utils' import Connection from '../../src/Connection' import config from './config' +import Stream from '../../src/stream' +import { Todo } from '../../src/types' const MAX_MESSAGES = 10 const WAIT_FOR_STORAGE_TIMEOUT = 6000 @@ -25,6 +27,7 @@ describe('StreamrClient resends', () => { }, autoConnect: false, autoDisconnect: false, + // @ts-expect-error maxRetries: 2, ...opts, }) @@ -33,10 +36,10 @@ describe('StreamrClient resends', () => { return c } - let client - let stream - let published - let publishTestMessages + let client: StreamrClient + let stream: Stream + let published: Todo + let publishTestMessages: Todo beforeEach(async () => { client = createClient() @@ -46,7 +49,7 @@ describe('StreamrClient resends', () => { }) afterEach(async () => { - await wait() + await wait(0) // ensure no unexpected errors expect(onError).toHaveBeenCalledTimes(expectErrors) if (client) { @@ -86,8 +89,8 @@ describe('StreamrClient resends', () => { describe('issue resend and subscribe at the same time', () => { it('works with resend -> subscribe', async () => { - const resentMessages = [] - const realtimeMessages = [] + const resentMessages: Todo[] = [] + const realtimeMessages: Todo[] = [] const realtimeMessage = { msg: uid('realtimeMessage'), @@ -118,8 +121,8 @@ describe('StreamrClient resends', () => { }, 18000) it('works with subscribe -> resend', async () => { - const resentMessages = [] - const realtimeMessages = [] + const resentMessages: Todo[] = [] + const realtimeMessages: Todo[] = [] const realtimeMessage = { msg: uid('realtimeMessage'), @@ -151,8 +154,8 @@ describe('StreamrClient resends', () => { }, 15000) it('works with subscribe+resend -> subscribe', async () => { - const resentMessages = [] - const realtimeMessages = [] + const resentMessages: Todo[] = [] + const realtimeMessages: Todo[] = [] const realtimeMessage = { msg: uid('realtimeMessage'), @@ -183,8 +186,8 @@ describe('StreamrClient resends', () => { }, 15000) it('works with subscribe -> subscribe+resend', async () => { - const resentMessages = [] - const realtimeMessages = [] + const resentMessages: Todo[] = [] + const realtimeMessages: Todo[] = [] const realtimeMessage = { msg: uid('realtimeMessage'), @@ -219,7 +222,7 @@ describe('StreamrClient resends', () => { describeRepeats('resend repeats', () => { // eslint-disable-next-line no-loop-func test('resend last using resend function', async () => { - const receivedMessages = [] + const receivedMessages: Todo[] = [] // eslint-disable-next-line no-await-in-loop const sub = await client.resend( @@ -245,7 +248,7 @@ describe('StreamrClient resends', () => { // eslint-disable-next-line no-loop-func test('resend last using subscribe function', async () => { - const receivedMessages = [] + const receivedMessages: Todo[] = [] // eslint-disable-next-line no-await-in-loop const sub = await client.subscribe({ @@ -263,7 +266,7 @@ describe('StreamrClient resends', () => { }) it('resend last using subscribe and publish messages after resend', async () => { - const receivedMessages = [] + const receivedMessages: Todo[] = [] await client.subscribe({ stream: stream.id, @@ -294,7 +297,7 @@ describe('StreamrClient resends', () => { }, 40000) it('resend last using subscribe and publish realtime messages', async () => { - const receivedMessages = [] + const receivedMessages: Todo = [] const sub = await client.subscribe({ stream: stream.id, @@ -349,7 +352,7 @@ describe('StreamrClient resends', () => { // resend from LONG_RESEND messages await client.connect() - const receivedMessages = [] + const receivedMessages: Todo[] = [] const onGotFirstMessage = Defer() const sub = await client.resend({ stream: stream.id, @@ -361,7 +364,7 @@ describe('StreamrClient resends', () => { }, (msg) => { receivedMessages.push(msg) if (receivedMessages.length === 1) { - onGotFirstMessage.resolve() + onGotFirstMessage.resolve(undefined) } }) @@ -374,6 +377,7 @@ describe('StreamrClient resends', () => { expect(receivedMessages).toEqual(published) expect(published.length).toBe(LONG_RESEND) }, 300000) + // @ts-expect-error }, 300000) }) }) diff --git a/test/integration/Sequencing.test.js b/test/integration/Sequencing.test.ts similarity index 91% rename from test/integration/Sequencing.test.js rename to test/integration/Sequencing.test.ts index f9ee621bd..6ef65b108 100644 --- a/test/integration/Sequencing.test.js +++ b/test/integration/Sequencing.test.ts @@ -5,14 +5,16 @@ import { StreamrClient } from '../../src/StreamrClient' import Connection from '../../src/Connection' import config from './config' +import { Todo } from '../../src/types' +import Stream from '../../src/stream' -const Msg = (opts) => ({ +const Msg = (opts?: Todo) => ({ value: uid('msg'), ...opts, }) -function toSeq(requests, ts = Date.now()) { - return requests.map((m) => { +function toSeq(requests: Todo, ts = Date.now()) { + return requests.map((m: Todo) => { const { prevMsgRef } = m.streamMessage return [ [m.streamMessage.getTimestamp() - ts, m.streamMessage.getSequenceNumber()], @@ -24,8 +26,8 @@ function toSeq(requests, ts = Date.now()) { describe('Sequencing', () => { let expectErrors = 0 // check no errors by default let onError = jest.fn() - let client - let stream + let client: StreamrClient + let stream: Stream const createClient = (opts = {}) => { const c = new StreamrClient({ @@ -35,6 +37,7 @@ describe('Sequencing', () => { }, autoConnect: false, autoDisconnect: false, + // @ts-expect-error maxRetries: 2, ...opts, }) @@ -55,7 +58,7 @@ describe('Sequencing', () => { }) afterEach(async () => { - await wait() + await wait(0) // ensure no unexpected errors expect(onError).toHaveBeenCalledTimes(expectErrors) if (client) { @@ -64,7 +67,7 @@ describe('Sequencing', () => { }) afterEach(async () => { - await wait() + await wait(0) if (client) { client.debug('disconnecting after test') await client.disconnect() @@ -79,8 +82,8 @@ describe('Sequencing', () => { it('should sequence in order', async () => { const ts = Date.now() - const msgsPublished = [] - const msgsReceieved = [] + const msgsPublished: Todo[] = [] + const msgsReceieved: Todo[] = [] await client.subscribe(stream.id, (m) => msgsReceieved.push(m)) @@ -115,8 +118,8 @@ describe('Sequencing', () => { it('should sequence in order even if some calls delayed', async () => { const ts = Date.now() - const msgsPublished = [] - const msgsReceieved = [] + const msgsPublished: Todo[] = [] + const msgsReceieved: Todo[] = [] let calls = 0 const getStream = client.getStream.bind(client) @@ -164,12 +167,12 @@ describe('Sequencing', () => { it.skip('should sequence in order even if publish requests backdated', async () => { const ts = Date.now() - const msgsPublished = [] - const msgsReceieved = [] + const msgsPublished: Todo[] = [] + const msgsReceieved: Todo[] = [] await client.subscribe(stream.id, (m) => msgsReceieved.push(m)) - const nextMsg = (...args) => { + const nextMsg = (...args: Todo[]) => { const msg = Msg(...args) msgsPublished.push(msg) return msg @@ -200,7 +203,7 @@ describe('Sequencing', () => { timeout: 6000, }) await waitForStorage(lastRequest) - const msgsResent = [] + const msgsResent: Todo[] = [] const sub = await client.resend({ stream: stream.id, resend: { @@ -229,12 +232,12 @@ describe('Sequencing', () => { it.skip('should sequence in order even if publish requests backdated in sequence', async () => { const ts = Date.now() - const msgsPublished = [] - const msgsReceieved = [] + const msgsPublished: Todo[] = [] + const msgsReceieved: Todo[] = [] await client.subscribe(stream.id, (m) => msgsReceieved.push(m)) - const nextMsg = (...args) => { + const nextMsg = (...args: Todo[]) => { const msg = Msg(...args) msgsPublished.push(msg) return msg @@ -270,7 +273,7 @@ describe('Sequencing', () => { }) await waitForStorage(lastRequest) - const msgsResent = [] + const msgsResent: Todo[] = [] const sub = await client.resend({ stream: stream.id, resend: { diff --git a/test/integration/Session.test.js b/test/integration/Session.test.ts similarity index 100% rename from test/integration/Session.test.js rename to test/integration/Session.test.ts diff --git a/test/integration/Stream.test.js b/test/integration/Stream.test.ts similarity index 97% rename from test/integration/Stream.test.js rename to test/integration/Stream.test.ts index 19df708a3..b3bc0de6f 100644 --- a/test/integration/Stream.test.js +++ b/test/integration/Stream.test.ts @@ -1,4 +1,5 @@ import { StreamrClient } from '../../src/StreamrClient' +import { Stream } from '../../src/stream' import { uid, fakePrivateKey, getPublishTestMessages } from '../utils' import config from './config' @@ -14,8 +15,8 @@ const createClient = (opts = {}) => new StreamrClient({ }) describe('Stream', () => { - let client - let stream + let client: StreamrClient + let stream: Stream beforeEach(async () => { client = createClient() diff --git a/test/integration/StreamConnectionState.test.js b/test/integration/StreamConnectionState.test.ts similarity index 95% rename from test/integration/StreamConnectionState.test.js rename to test/integration/StreamConnectionState.test.ts index d8fcd8c4e..6393bd29d 100644 --- a/test/integration/StreamConnectionState.test.js +++ b/test/integration/StreamConnectionState.test.ts @@ -7,17 +7,20 @@ import { Defer, pLimitFn } from '../../src/utils' import Connection from '../../src/Connection' import config from './config' +import Stream from '../../src/stream' +import Subscriber from '../../src/subscribe' +import { Todo } from '../../src/types' const { ControlMessage } = ControlLayer const MAX_MESSAGES = 5 describeRepeats('Connection State', () => { let expectErrors = 0 // check no errors by default - let publishTestMessages + let publishTestMessages: Todo let onError = jest.fn() - let client - let stream - let subscriber + let client: StreamrClient + let stream: Stream + let subscriber: Subscriber const createClient = (opts = {}) => { const c = new StreamrClient({ @@ -27,6 +30,7 @@ describeRepeats('Connection State', () => { }, autoConnect: false, autoDisconnect: false, + // @ts-expect-error publishAutoDisconnectDelay: 250, maxRetries: 2, ...opts, @@ -36,7 +40,7 @@ describeRepeats('Connection State', () => { return c } - async function setupClient(opts) { + async function setupClient(opts: Todo) { // eslint-disable-next-line require-atomic-updates client = createClient(opts) subscriber = client.subscriber @@ -65,7 +69,7 @@ describeRepeats('Connection State', () => { }) afterEach(async () => { - await wait() + await wait(0) // ensure no unexpected errors expect(onError).toHaveBeenCalledTimes(expectErrors) if (client) { @@ -74,7 +78,7 @@ describeRepeats('Connection State', () => { }) afterEach(async () => { - await wait() + await wait(0) if (client) { client.debug('disconnecting after test >>') await client.disconnect() @@ -88,7 +92,7 @@ describeRepeats('Connection State', () => { } }) - let subs = [] + let subs: Todo[] = [] beforeEach(async () => { const existingSubs = subs @@ -182,7 +186,7 @@ describeRepeats('Connection State', () => { const done = Defer() - const msgs = [] + const msgs: Todo[] = [] const sockets = new Set() await otherClient.subscribe({ stream, @@ -193,7 +197,7 @@ describeRepeats('Connection State', () => { msgs.push(msg) if (msgs.length === MAX_MESSAGES) { // should eventually get here - done.resolve() + done.resolve(undefined) } // disconnect after every message @@ -348,7 +352,7 @@ describeRepeats('Connection State', () => { }) describe('resubscribe on unexpected disconnection', () => { - let otherClient + let otherClient: StreamrClient beforeEach(async () => { otherClient = createClient({ @@ -360,7 +364,9 @@ describeRepeats('Connection State', () => { otherClient.connect(), otherClient.session.getSessionToken(), ] + // @ts-expect-error await Promise.allSettled(tasks) + // @ts-expect-error await Promise.all(tasks) // throw if there were an error }) @@ -369,6 +375,7 @@ describeRepeats('Connection State', () => { otherClient.disconnect(), client.disconnect(), ] + // @ts-expect-error await Promise.allSettled(tasks) await Promise.all(tasks) // throw if there were an error }) @@ -376,14 +383,14 @@ describeRepeats('Connection State', () => { it('should work', async () => { const done = Defer() - const msgs = [] + const msgs: Todo[] = [] await otherClient.subscribe(stream, (msg) => { msgs.push(msg) if (msgs.length === MAX_MESSAGES) { // should eventually get here - done.resolve() + done.resolve(undefined) } }) @@ -399,7 +406,9 @@ describeRepeats('Connection State', () => { disconnect() }) + // @ts-expect-error otherClient.connection.on(ControlMessage.TYPES.BroadcastMessage, onConnectionMessage) + // @ts-expect-error otherClient.connection.on(ControlMessage.TYPES.UnicastMessage, onConnectionMessage) const onConnected = jest.fn() diff --git a/test/integration/StreamrClient.test.js b/test/integration/StreamrClient.test.ts similarity index 95% rename from test/integration/StreamrClient.test.js rename to test/integration/StreamrClient.test.ts index 3f22997b8..4efa10745 100644 --- a/test/integration/StreamrClient.test.js +++ b/test/integration/StreamrClient.test.ts @@ -11,6 +11,8 @@ import { Defer, pLimitFn } from '../../src/utils' import Connection from '../../src/Connection' import config from './config' +import Stream from '../../src/stream' +import { Todo } from '../../src/types' const WebSocket = require('ws') @@ -21,14 +23,14 @@ const MAX_MESSAGES = 20 describeRepeats('StreamrClient', () => { let expectErrors = 0 // check no errors by default - let errors = [] + let errors: Todo[] = [] - const getOnError = (errs) => jest.fn((err) => { + const getOnError = (errs: Todo) => jest.fn((err) => { errs.push(err) }) let onError = jest.fn() - let client + let client: StreamrClient const createClient = (opts = {}) => { const c = new StreamrClient({ @@ -40,6 +42,7 @@ describeRepeats('StreamrClient', () => { autoDisconnect: false, // disconnectDelay: 500, // publishAutoDisconnectDelay: 250, + // @ts-expect-error maxRetries: 2, ...opts, }) @@ -65,10 +68,10 @@ describeRepeats('StreamrClient', () => { const ws = new WebSocket(c.options.url) ws.once('open', () => { c.debug('open', c.options.url) - resolve() + resolve(undefined) ws.close() }) - ws.once('error', (err) => { + ws.once('error', (err: Todo) => { c.debug('err', c.options.url, err) reject(err) ws.terminate() @@ -101,7 +104,7 @@ describeRepeats('StreamrClient', () => { }) afterEach(async () => { - await wait() + await wait(0) // ensure no unexpected errors expect(errors).toHaveLength(expectErrors) if (client) { @@ -110,7 +113,7 @@ describeRepeats('StreamrClient', () => { }) afterEach(async () => { - await wait() + await wait(0) if (client) { client.debug('disconnecting after test') await client.disconnect() @@ -307,7 +310,7 @@ describeRepeats('StreamrClient', () => { client.once('disconnected', done.wrapError(async () => { client.once('connected', done.wrapError(async () => { await client.disconnect() - done.resolve() + done.resolve(undefined) })) await expect(async () => { @@ -407,7 +410,7 @@ describeRepeats('StreamrClient', () => { it('should not subscribe to unsubscribed streams on reconnect', async () => { client = createClient() await client.connect() - const sessionToken = await client.session.getSessionToken() + const sessionToken: Todo = await client.session.getSessionToken() const stream = await client.createStream({ name: uid('stream') @@ -434,6 +437,7 @@ describeRepeats('StreamrClient', () => { expect(connectionEventSpy.mock.calls[1]).toEqual([new UnsubscribeRequest({ streamId: stream.id, streamPartition: 0, + // @ts-expect-error sessionToken, requestId: connectionEventSpy.mock.calls[1][0].requestId, })]) @@ -442,7 +446,7 @@ describeRepeats('StreamrClient', () => { it('should not subscribe after resend() on reconnect', async () => { client = createClient() await client.connect() - const sessionToken = await client.session.getSessionToken() + const sessionToken: Todo = await client.session.getSessionToken() const stream = await client.createStream({ name: uid('stream') @@ -542,7 +546,7 @@ describeRepeats('StreamrClient', () => { id1: uid('msg') } const p = client.publish(stream.id, message) - await wait() + await wait(0) await client.disconnect() // start async disconnect after publish started await expect(p).rejects.toThrow() expect(client.isDisconnected()).toBeTruthy() @@ -565,7 +569,7 @@ describeRepeats('StreamrClient', () => { id1: uid('msg') } const p = client.publish(stream.id, message) - await wait() + await wait(0) await client.disconnect() // start async disconnect after publish started await expect(p).rejects.toThrow() expect(client.isDisconnected()).toBeTruthy() @@ -620,14 +624,14 @@ describeRepeats('StreamrClient', () => { }) describe('StreamrClient', () => { - let stream - let waitForStorage - let publishTestMessages + let stream: Stream + let waitForStorage: Todo + let publishTestMessages: Todo // These tests will take time, especially on Travis const TIMEOUT = 30 * 1000 - const attachSubListeners = (sub) => { + const attachSubListeners = (sub: Todo) => { const onSubscribed = jest.fn() sub.on('subscribed', onSubscribed) const onResent = jest.fn() @@ -672,13 +676,13 @@ describeRepeats('StreamrClient', () => { }) afterEach(async () => { - await wait() + await wait(0) // ensure no unexpected errors expect(onError).toHaveBeenCalledTimes(expectErrors) }) afterEach(async () => { - await wait() + await wait(0) if (client) { client.debug('disconnecting after test') @@ -884,7 +888,7 @@ describeRepeats('StreamrClient', () => { }) it('client.subscribe with onMessage & collect', async () => { - const onMessageMsgs = [] + const onMessageMsgs: Todo[] = [] const sub = await client.subscribe({ stream: stream.id, }, async (msg) => { @@ -897,18 +901,19 @@ describeRepeats('StreamrClient', () => { }) describe('resubscribe on unexpected disconnection', () => { - let otherClient + let otherClient: StreamrClient beforeEach(async () => { otherClient = createClient({ auth: client.options.auth, }) - const tasks = [ + const tasks: Promise[] = [ client.connect(), client.session.getSessionToken(), otherClient.connect(), otherClient.session.getSessionToken(), ] + // @ts-expect-error await Promise.allSettled(tasks) await Promise.all(tasks) // throw if there were an error }) @@ -919,13 +924,14 @@ describeRepeats('StreamrClient', () => { otherClient.disconnect(), client.disconnect(), ] + // @ts-expect-error await Promise.allSettled(tasks) await Promise.all(tasks) // throw if there were an error }) it('should work', async () => { const done = Defer() - const msgs = [] + const msgs: Todo[] = [] await otherClient.subscribe(stream, (msg) => { msgs.push(msg) @@ -933,7 +939,7 @@ describeRepeats('StreamrClient', () => { otherClient.debug('got msg %d of %d', msgs.length, MAX_MESSAGES) if (msgs.length === MAX_MESSAGES) { // should eventually get here - done.resolve() + done.resolve(undefined) } }) @@ -951,7 +957,9 @@ describeRepeats('StreamrClient', () => { disconnect() }) + // @ts-expect-error otherClient.connection.on(ControlMessage.TYPES.BroadcastMessage, onConnectionMessage) + // @ts-expect-error otherClient.connection.on(ControlMessage.TYPES.UnicastMessage, onConnectionMessage) const onConnected = jest.fn() @@ -977,7 +985,7 @@ describeRepeats('StreamrClient', () => { it('publish and subscribe a sequence of messages', async () => { client.enableAutoConnect() const done = Defer() - const received = [] + const received: Todo[] = [] const sub = await client.subscribe({ stream: stream.id, }, done.wrapError((parsedContent, streamMessage) => { @@ -1007,6 +1015,7 @@ describeRepeats('StreamrClient', () => { client.on('disconnected', onDisconnected) client.on('connected', onConnected) + // @ts-expect-error client.options.publishAutoDisconnectDelay = 1000 // eslint-disable-line require-atomic-updates client.enableAutoConnect() @@ -1015,6 +1024,7 @@ describeRepeats('StreamrClient', () => { delay: 150, }) + // @ts-expect-error await wait(client.options.publishAutoDisconnectDelay * 1.5) expect(onConnected).toHaveBeenCalledTimes(1) @@ -1027,7 +1037,7 @@ describeRepeats('StreamrClient', () => { waitForLast: true, }) - const received = [] + const received: Todo[] = [] const sub = await client.subscribe({ stream: stream.id, @@ -1044,7 +1054,7 @@ describeRepeats('StreamrClient', () => { expect(streamMessage.getPublisherId()).toBeTruthy() expect(streamMessage.signature).toBeTruthy() if (received.length === published.length) { - done.resolve() + done.resolve(undefined) } })) @@ -1061,7 +1071,7 @@ describeRepeats('StreamrClient', () => { waitForLast: true, }) - const received = [] + const received: Todo[] = [] const sub = await client.subscribe({ stream: stream.id, @@ -1075,7 +1085,7 @@ describeRepeats('StreamrClient', () => { expect(streamMessage.getPublisherId()).toBeTruthy() expect(streamMessage.signature).toBeTruthy() if (received.length === 2) { - done.resolve() + done.resolve(undefined) } })) @@ -1092,7 +1102,7 @@ describeRepeats('StreamrClient', () => { waitForLast: true, }) - const received = [] + const received: Todo[] = [] const sub = await client.subscribe({ stream: stream.id, @@ -1106,7 +1116,7 @@ describeRepeats('StreamrClient', () => { expect(streamMessage.getPublisherId()).toBeTruthy() expect(streamMessage.signature).toBeTruthy() if (received.length === 3) { - done.resolve() + done.resolve(undefined) } })) @@ -1121,8 +1131,8 @@ describeRepeats('StreamrClient', () => { }) describe('resend', () => { - let timestamps = [] - let published = [] + let timestamps: Todo[] = [] + let published: Todo[] = [] beforeEach(async () => { publishTestMessages = getPublishTestMessages(client, { @@ -1132,8 +1142,8 @@ describeRepeats('StreamrClient', () => { }) const publishedRaw = await publishTestMessages.raw(5) - timestamps = publishedRaw.map(([, raw]) => raw.streamMessage.getTimestamp()) - published = publishedRaw.map(([msg]) => msg) + timestamps = publishedRaw.map(([, raw]: Todo) => raw.streamMessage.getTimestamp()) + published = publishedRaw.map(([msg]: Todo) => msg) }) it('resend last', async () => { @@ -1177,7 +1187,7 @@ describeRepeats('StreamrClient', () => { }) it('works with message handler + resent event', async () => { - const messages = [] + const messages: Todo[] = [] const sub = await client.resend({ stream: stream.id, resend: { @@ -1190,6 +1200,7 @@ describeRepeats('StreamrClient', () => { await waitForEvent(sub, 'resent') expect(messages).toEqual(published.slice(-3)) }) + // @ts-expect-error }, 10000) describe('utf-8 encoding', () => { diff --git a/test/integration/SubscriberResends.test.js b/test/integration/SubscriberResends.test.ts similarity index 95% rename from test/integration/SubscriberResends.test.js rename to test/integration/SubscriberResends.test.ts index 5193dcfe9..165978538 100644 --- a/test/integration/SubscriberResends.test.js +++ b/test/integration/SubscriberResends.test.ts @@ -7,6 +7,9 @@ import Connection from '../../src/Connection' import { Defer } from '../../src/utils' import config from './config' +import Stream from '../../src/stream' +import { Todo } from '../../src/types' +import Subscriber from '../../src/subscribe' const { ControlMessage } = ControlLayer @@ -18,13 +21,13 @@ const MAX_MESSAGES = 5 describeRepeats('resends', () => { let expectErrors = 0 // check no errors by default let onError = jest.fn() - let client - let stream - let published - let publishedRequests - let publishTestMessages - let waitForStorage - let subscriber + let client: StreamrClient + let stream: Stream + let published: Todo + let publishedRequests: Todo + let publishTestMessages: Todo + let waitForStorage: Todo + let subscriber: Subscriber const createClient = (opts = {}) => { const c = new StreamrClient({ @@ -32,6 +35,7 @@ describeRepeats('resends', () => { auth: { privateKey: fakePrivateKey(), }, + // @ts-expect-error publishAutoDisconnectDelay: 10, autoConnect: false, autoDisconnect: false, @@ -75,7 +79,7 @@ describeRepeats('resends', () => { }) afterEach(async () => { - await wait() + await wait(0) // ensure no unexpected errors expect(onError).toHaveBeenCalledTimes(expectErrors) if (client) { @@ -98,7 +102,7 @@ describeRepeats('resends', () => { }) describe('no data', () => { - let emptyStream + let emptyStream: Stream it('throws error if bad stream id', async () => { await expect(async () => { @@ -181,8 +185,8 @@ describeRepeats('resends', () => { const results = await publishTestMessages.raw(MAX_MESSAGES, { waitForLast: true, }) - published = results.map(([msg]) => msg) - publishedRequests = results.map(([, req]) => req) + published = results.map(([msg]: Todo) => msg) + publishedRequests = results.map(([, req]: Todo) => req) }, WAIT_FOR_STORAGE_TIMEOUT * 2) beforeEach(async () => { @@ -246,6 +250,7 @@ describeRepeats('resends', () => { it('closes connection with autoDisconnect', async () => { client.connection.enableAutoConnect() + // @ts-expect-error client.connection.enableAutoDisconnect(0) // set 0 delay const sub = await subscriber.resend({ streamId: stream.id, @@ -278,7 +283,7 @@ describeRepeats('resends', () => { const onResent = Defer() const publishedBefore = published.slice() - const receivedMsgs = [] + const receivedMsgs: Todo[] = [] sub.on('resent', onResent.wrap(() => { expect(receivedMsgs).toEqual(publishedBefore) @@ -289,12 +294,12 @@ describeRepeats('resends', () => { const req = await client.publish(stream.id, newMessage) // should be realtime published.push(newMessage) publishedRequests.push(req) - let t + let t: NodeJS.Timeout|undefined for await (const msg of sub) { receivedMsgs.push(msg.getParsedContent()) if (receivedMsgs.length === published.length) { await sub.return() - clearTimeout(t) + clearTimeout(t!) t = setTimeout(() => { // await wait() // give resent event a chance to fire onResent.reject(new Error('resent never called')) @@ -303,7 +308,7 @@ describeRepeats('resends', () => { } await onResent - clearTimeout(t) + clearTimeout(t!) expect(receivedMsgs).toHaveLength(published.length) expect(receivedMsgs).toEqual(published) @@ -353,7 +358,7 @@ describeRepeats('resends', () => { const onResent = Defer() const publishedBefore = published.slice() - const receivedMsgs = [] + const receivedMsgs: Todo[] = [] sub.once('resent', onResent.wrap(() => { expect(receivedMsgs).toEqual(publishedBefore) @@ -464,7 +469,8 @@ describeRepeats('resends', () => { }) it('can end inside resend', async () => { - const unsubscribeEvents = [] + const unsubscribeEvents: Todo[] = [] + // @ts-expect-error client.connection.on(ControlMessage.TYPES.UnsubscribeResponse, (m) => { unsubscribeEvents.push(m) }) diff --git a/test/integration/Subscription.test.js b/test/integration/Subscription.test.ts similarity index 92% rename from test/integration/Subscription.test.js rename to test/integration/Subscription.test.ts index bdcd8dd17..4fba12f0b 100644 --- a/test/integration/Subscription.test.js +++ b/test/integration/Subscription.test.ts @@ -4,6 +4,9 @@ import { uid, fakePrivateKey } from '../utils' import { StreamrClient } from '../../src/StreamrClient' import config from './config' +import Stream from '../../src/stream' +import { Subscription } from '../../src/subscribe' +import { Todo } from '../../src/types' const createClient = (opts = {}) => new StreamrClient({ ...config.clientOptions, @@ -22,13 +25,13 @@ const RESEND_ALL = { } describe('Subscription', () => { - let stream - let client - let subscription - let errors = [] + let stream: Stream + let client: StreamrClient + let subscription: Subscription + let errors: Todo[] = [] let expectedErrors = 0 - function onError(err) { + function onError(err: Todo) { errors.push(err) } @@ -39,7 +42,7 @@ describe('Subscription', () => { async function createMonitoredSubscription(opts = {}) { if (!client) { throw new Error('No client') } - const events = [] + const events: Todo[] = [] subscription = await client.subscribe({ stream: stream.id, resend: RESEND_ALL, diff --git a/test/integration/authFetch.test.js b/test/integration/authFetch.test.ts similarity index 88% rename from test/integration/authFetch.test.js rename to test/integration/authFetch.test.ts index bb699a7c2..24c8f2f4b 100644 --- a/test/integration/authFetch.test.js +++ b/test/integration/authFetch.test.ts @@ -8,7 +8,7 @@ import { fakePrivateKey } from '../utils' import config from './config' describe('authFetch', () => { - let client + let client: StreamrClient afterEach(async () => { if (!client) { return } await client.ensureDisconnected() @@ -20,10 +20,15 @@ describe('authFetch', () => { it('sends Streamr-Client header', async () => { const realFetch = jest.requireActual('node-fetch') + // @ts-expect-error fetch.Response = realFetch.Response + // @ts-expect-error fetch.Promise = realFetch.Promise + // @ts-expect-error fetch.Request = realFetch.Request + // @ts-expect-error fetch.Headers = realFetch.Headers + // @ts-expect-error fetch.mockImplementation(realFetch) client = new StreamrClient({ auth: { @@ -37,6 +42,7 @@ describe('authFetch', () => { expect(fetch).not.toHaveBeenCalled() // will get called in background though (questionable behaviour) await client.session.getSessionToken() // this ensures authentication completed expect(fetch).toHaveBeenCalled() + // @ts-expect-error fetch.mock.calls.forEach(([url, opts]) => { expect(typeof url).toEqual('string') expect(opts).toMatchObject({ diff --git a/test/utils.ts b/test/utils.ts index 860c5fa9b..81bca47c5 100644 --- a/test/utils.ts +++ b/test/utils.ts @@ -59,7 +59,7 @@ export function addAfterFn() { } } -export const Msg = (opts: any) => ({ +export const Msg = (opts?: any) => ({ value: uid('msg'), ...opts, }) From 15b82005ad992736c1247ea69fe0325a1ff5bb4c Mon Sep 17 00:00:00 2001 From: Teo Gebhard Date: Tue, 16 Mar 2021 19:15:42 +0200 Subject: [PATCH 06/19] Remove placeholder types --- test/integration/GapFill.test.ts | 27 ++++++++++++++------------- test/utils.ts | 4 ++-- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/test/integration/GapFill.test.ts b/test/integration/GapFill.test.ts index 52f2c1b93..389cb5900 100644 --- a/test/integration/GapFill.test.ts +++ b/test/integration/GapFill.test.ts @@ -6,14 +6,15 @@ import Connection from '../../src/Connection' import config from './config' import { Stream } from '../../src/stream' -import { Subscriber } from '../../src/subscribe' -import { Todo } from '../../src/types' +import { Subscriber, Subscription } from '../../src/subscribe' +import { MessageRef } from 'streamr-client-protocol/dist/src/protocol/message_layer' +import { StreamrClientOptions } from '../../src' const MAX_MESSAGES = 10 describeRepeats('GapFill with resends', () => { let expectErrors = 0 // check no errors by default - let publishTestMessages: Todo + let publishTestMessages: (n?: number, opts?: any) => Promise<[message: any, request: any][]> let onError = jest.fn() let client: StreamrClient let stream: Stream @@ -36,7 +37,7 @@ describeRepeats('GapFill with resends', () => { return c } - async function setupClient(opts: Todo) { + async function setupClient(opts: StreamrClientOptions) { // eslint-disable-next-line require-atomic-updates client = createClient(opts) subscriber = client.subscriber @@ -88,7 +89,7 @@ describeRepeats('GapFill with resends', () => { } }) - let subs: Todo[] = [] + let subs: Subscription[] = [] beforeEach(async () => { const existingSubs = subs @@ -112,7 +113,7 @@ describeRepeats('GapFill with resends', () => { const { parse } = client.connection let count = 0 client.connection.parse = (...args) => { - const msg: Todo = parse.call(client.connection, ...args) + const msg: any = parse.call(client.connection, ...args) if (!msg.streamMessage) { return msg } @@ -146,8 +147,8 @@ describeRepeats('GapFill with resends', () => { const sub = await client.subscribe(stream.id) const { parse } = client.connection let count = 0 - client.connection.parse = (...args): Todo => { - const msg: Todo = parse.call(client.connection, ...args) + client.connection.parse = (...args) => { + const msg: any = parse.call(client.connection, ...args) if (!msg.streamMessage) { return msg } @@ -180,7 +181,7 @@ describeRepeats('GapFill with resends', () => { const { parse } = client.connection let count = 0 client.connection.parse = (...args) => { - const msg: Todo = parse.call(client.connection, ...args) + const msg: any = parse.call(client.connection, ...args) if (!msg.streamMessage) { return msg } @@ -212,7 +213,7 @@ describeRepeats('GapFill with resends', () => { const { parse } = client.connection let count = 0 client.connection.parse = (...args) => { - const msg: Todo = parse.call(client.connection, ...args) + const msg: any = parse.call(client.connection, ...args) if (!msg.streamMessage) { return msg } @@ -246,9 +247,9 @@ describeRepeats('GapFill with resends', () => { it('can fill gaps in resends even if gap cannot be filled', async () => { const { parse } = client.connection let count = 0 - let droppedMsgRef: Todo + let droppedMsgRef: MessageRef client.connection.parse = (...args) => { - const msg: Todo = parse.call(client.connection, ...args) + const msg: any = parse.call(client.connection, ...args) if (!msg.streamMessage) { return msg } @@ -281,7 +282,7 @@ describeRepeats('GapFill with resends', () => { received.push(m.getParsedContent()) // should not need to explicitly end } - expect(received).toEqual(published.filter((_value: Todo, index: Todo) => index !== 2)) + expect(received).toEqual(published.filter((_value: any, index: number) => index !== 2)) expect(client.connection.getState()).toBe('connected') }, 60000) diff --git a/test/utils.ts b/test/utils.ts index 81bca47c5..936fdcf54 100644 --- a/test/utils.ts +++ b/test/utils.ts @@ -131,7 +131,7 @@ export function getWaitForStorage(client: StreamrClient, defaultOpts = {}) { /* eslint-enable no-await-in-loop */ } -export function getPublishTestMessages(client: StreamrClient, defaultOpts = {}) { +export function getPublishTestMessages(client: StreamrClient, defaultOpts: any = {}) { // second argument could also be streamId if (typeof defaultOpts === 'string') { // eslint-disable-next-line no-param-reassign @@ -189,7 +189,7 @@ export function getPublishTestMessages(client: StreamrClient, defaultOpts = {}) try { client.connection.once('done', onDone) - const published = [] + const published: [ message: any, request: any ][] = [] /* eslint-disable no-await-in-loop, no-loop-func */ for (let i = 0; i < n; i++) { checkDone() From 91282e06fe8969e4c64a471eb8deb0e5c480879b Mon Sep 17 00:00:00 2001 From: Teo Gebhard Date: Tue, 16 Mar 2021 19:29:06 +0200 Subject: [PATCH 07/19] Remove placeholder types --- test/integration/ResendReconnect.test.ts | 4 ++-- test/integration/Resends.test.ts | 2 +- test/integration/StreamConnectionState.test.ts | 2 +- test/integration/SubscriberResends.test.ts | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/test/integration/ResendReconnect.test.ts b/test/integration/ResendReconnect.test.ts index c4b451184..a9b7d8311 100644 --- a/test/integration/ResendReconnect.test.ts +++ b/test/integration/ResendReconnect.test.ts @@ -23,8 +23,8 @@ const MAX_MESSAGES = 3 describe('resend/reconnect', () => { let client: StreamrClient let stream: Stream - let publishedMessages: Todo - let publishTestMessages: Todo + let publishedMessages: [message: any, request: any][] + let publishTestMessages: (n?: number, opts?: any) => Promise<[message: any, request: any][]> beforeEach(async () => { client = createClient() diff --git a/test/integration/Resends.test.ts b/test/integration/Resends.test.ts index e49f78654..55b2e471f 100644 --- a/test/integration/Resends.test.ts +++ b/test/integration/Resends.test.ts @@ -39,7 +39,7 @@ describe('StreamrClient resends', () => { let client: StreamrClient let stream: Stream let published: Todo - let publishTestMessages: Todo + let publishTestMessages: (n?: number, opts?: any) => Promise<[message: any, request: any][]> beforeEach(async () => { client = createClient() diff --git a/test/integration/StreamConnectionState.test.ts b/test/integration/StreamConnectionState.test.ts index 688162598..e3f51f057 100644 --- a/test/integration/StreamConnectionState.test.ts +++ b/test/integration/StreamConnectionState.test.ts @@ -16,7 +16,7 @@ const MAX_MESSAGES = 5 describeRepeats('Connection State', () => { let expectErrors = 0 // check no errors by default - let publishTestMessages: Todo + let publishTestMessages: (n?: number, opts?: any) => Promise<[message: any, request: any][]> let onError = jest.fn() let client: StreamrClient let stream: Stream diff --git a/test/integration/SubscriberResends.test.ts b/test/integration/SubscriberResends.test.ts index cac1f3f35..a2dc9628e 100644 --- a/test/integration/SubscriberResends.test.ts +++ b/test/integration/SubscriberResends.test.ts @@ -25,7 +25,7 @@ describeRepeats('resends', () => { let stream: Stream let published: Todo let publishedRequests: Todo - let publishTestMessages: Todo + let publishTestMessages: ((n?: number, opts?: any) => Promise<[message: any, request: any][]>) & { raw: (...args: any[]) => any } let waitForStorage: Todo let subscriber: Subscriber From 70de3b8450e60cc82c7c1fe66bd6dfacf0df333f Mon Sep 17 00:00:00 2001 From: Teo Gebhard Date: Tue, 16 Mar 2021 19:31:31 +0200 Subject: [PATCH 08/19] Fix imports and and subscibe() parameters --- test/integration/ResendReconnect.test.ts | 4 ++-- test/integration/Resends.test.ts | 20 ++++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/test/integration/ResendReconnect.test.ts b/test/integration/ResendReconnect.test.ts index a9b7d8311..b60ecfc57 100644 --- a/test/integration/ResendReconnect.test.ts +++ b/test/integration/ResendReconnect.test.ts @@ -5,7 +5,7 @@ import { StreamrClient } from '../../src/StreamrClient' import { Defer } from '../../src/utils' import config from './config' -import Stream from '../../src/stream' +import { Stream } from '../../src/stream' import { Todo } from '../../src/types' const createClient = (opts = {}) => new StreamrClient({ @@ -54,7 +54,7 @@ describe('resend/reconnect', () => { const done = Defer() messages = [] sub = await client.subscribe({ - stream: stream.id, + streamId: stream.id, resend: { last: MAX_MESSAGES, }, diff --git a/test/integration/Resends.test.ts b/test/integration/Resends.test.ts index 55b2e471f..40efe0419 100644 --- a/test/integration/Resends.test.ts +++ b/test/integration/Resends.test.ts @@ -6,7 +6,7 @@ import { Defer, pTimeout } from '../../src/utils' import Connection from '../../src/Connection' import config from './config' -import Stream from '../../src/stream' +import { Stream } from '../../src/stream' import { Todo } from '../../src/types' const MAX_MESSAGES = 10 @@ -106,7 +106,7 @@ describe('StreamrClient resends', () => { }) await client.subscribe({ - stream: stream.id, + streamId: stream.id, }, (message) => { realtimeMessages.push(message) }) @@ -129,7 +129,7 @@ describe('StreamrClient resends', () => { } await client.subscribe({ - stream: stream.id, + streamId: stream.id, }, (message) => { realtimeMessages.push(message) }) @@ -162,7 +162,7 @@ describe('StreamrClient resends', () => { } client.subscribe({ - stream: stream.id, + streamId: stream.id, resend: { last: MAX_MESSAGES, }, @@ -171,7 +171,7 @@ describe('StreamrClient resends', () => { }) client.subscribe({ - stream: stream.id, + streamId: stream.id, }, (message) => { realtimeMessages.push(message) }) @@ -194,14 +194,14 @@ describe('StreamrClient resends', () => { } client.subscribe({ - stream: stream.id, + streamId: stream.id, }, (message) => { realtimeMessages.push(message) }) // subscribe with resend after realtime subscribe client.subscribe({ - stream: stream.id, + streamId: stream.id, resend: { last: MAX_MESSAGES, }, @@ -252,7 +252,7 @@ describe('StreamrClient resends', () => { // eslint-disable-next-line no-await-in-loop const sub = await client.subscribe({ - stream: stream.id, + streamId: stream.id, resend: { last: MAX_MESSAGES, }, @@ -269,7 +269,7 @@ describe('StreamrClient resends', () => { const receivedMessages: Todo[] = [] await client.subscribe({ - stream: stream.id, + streamId: stream.id, resend: { last: MAX_MESSAGES, }, @@ -300,7 +300,7 @@ describe('StreamrClient resends', () => { const receivedMessages: Todo = [] const sub = await client.subscribe({ - stream: stream.id, + streamId: stream.id, resend: { last: MAX_MESSAGES, }, From f9206c4d43a1b3e6451fa63125334b038b07d77e Mon Sep 17 00:00:00 2001 From: Teo Gebhard Date: Tue, 16 Mar 2021 19:47:06 +0200 Subject: [PATCH 09/19] Remove placeholder types --- test/integration/ResendReconnect.test.ts | 6 +-- test/integration/Resends.test.ts | 29 +++++++------- test/integration/Sequencing.test.ts | 31 +++++++------- .../integration/StreamConnectionState.test.ts | 12 +++--- test/integration/StreamrClient.test.ts | 40 +++++++++---------- test/integration/SubscriberResends.test.ts | 17 ++++---- test/integration/Subscription.test.ts | 7 ++-- 7 files changed, 69 insertions(+), 73 deletions(-) diff --git a/test/integration/ResendReconnect.test.ts b/test/integration/ResendReconnect.test.ts index b60ecfc57..8b612b429 100644 --- a/test/integration/ResendReconnect.test.ts +++ b/test/integration/ResendReconnect.test.ts @@ -6,7 +6,7 @@ import { Defer } from '../../src/utils' import config from './config' import { Stream } from '../../src/stream' -import { Todo } from '../../src/types' +import { Subscription } from '../../src' const createClient = (opts = {}) => new StreamrClient({ ...config.clientOptions, @@ -48,8 +48,8 @@ describe('resend/reconnect', () => { describe('reconnect with resend', () => { let shouldDisconnect = false - let sub: Todo - let messages: Todo[] = [] + let sub: Subscription + let messages: any[] = [] beforeEach(async () => { const done = Defer() messages = [] diff --git a/test/integration/Resends.test.ts b/test/integration/Resends.test.ts index 40efe0419..bc9f3b96f 100644 --- a/test/integration/Resends.test.ts +++ b/test/integration/Resends.test.ts @@ -7,7 +7,6 @@ import Connection from '../../src/Connection' import config from './config' import { Stream } from '../../src/stream' -import { Todo } from '../../src/types' const MAX_MESSAGES = 10 const WAIT_FOR_STORAGE_TIMEOUT = 6000 @@ -38,7 +37,7 @@ describe('StreamrClient resends', () => { let client: StreamrClient let stream: Stream - let published: Todo + let published: any[] let publishTestMessages: (n?: number, opts?: any) => Promise<[message: any, request: any][]> beforeEach(async () => { @@ -89,8 +88,8 @@ describe('StreamrClient resends', () => { describe('issue resend and subscribe at the same time', () => { it('works with resend -> subscribe', async () => { - const resentMessages: Todo[] = [] - const realtimeMessages: Todo[] = [] + const resentMessages: any[] = [] + const realtimeMessages: any[] = [] const realtimeMessage = { msg: uid('realtimeMessage'), @@ -121,8 +120,8 @@ describe('StreamrClient resends', () => { }, 18000) it('works with subscribe -> resend', async () => { - const resentMessages: Todo[] = [] - const realtimeMessages: Todo[] = [] + const resentMessages: any[] = [] + const realtimeMessages: any[] = [] const realtimeMessage = { msg: uid('realtimeMessage'), @@ -154,8 +153,8 @@ describe('StreamrClient resends', () => { }, 15000) it('works with subscribe+resend -> subscribe', async () => { - const resentMessages: Todo[] = [] - const realtimeMessages: Todo[] = [] + const resentMessages: any[] = [] + const realtimeMessages: any[] = [] const realtimeMessage = { msg: uid('realtimeMessage'), @@ -186,8 +185,8 @@ describe('StreamrClient resends', () => { }, 15000) it('works with subscribe -> subscribe+resend', async () => { - const resentMessages: Todo[] = [] - const realtimeMessages: Todo[] = [] + const resentMessages: any[] = [] + const realtimeMessages: any[] = [] const realtimeMessage = { msg: uid('realtimeMessage'), @@ -222,7 +221,7 @@ describe('StreamrClient resends', () => { describeRepeats('resend repeats', () => { // eslint-disable-next-line no-loop-func test('resend last using resend function', async () => { - const receivedMessages: Todo[] = [] + const receivedMessages: any[] = [] // eslint-disable-next-line no-await-in-loop const sub = await client.resend( @@ -248,7 +247,7 @@ describe('StreamrClient resends', () => { // eslint-disable-next-line no-loop-func test('resend last using subscribe function', async () => { - const receivedMessages: Todo[] = [] + const receivedMessages: any[] = [] // eslint-disable-next-line no-await-in-loop const sub = await client.subscribe({ @@ -266,7 +265,7 @@ describe('StreamrClient resends', () => { }) it('resend last using subscribe and publish messages after resend', async () => { - const receivedMessages: Todo[] = [] + const receivedMessages: any[] = [] await client.subscribe({ streamId: stream.id, @@ -297,7 +296,7 @@ describe('StreamrClient resends', () => { }, 40000) it('resend last using subscribe and publish realtime messages', async () => { - const receivedMessages: Todo = [] + const receivedMessages: any[] = [] const sub = await client.subscribe({ streamId: stream.id, @@ -352,7 +351,7 @@ describe('StreamrClient resends', () => { // resend from LONG_RESEND messages await client.connect() - const receivedMessages: Todo[] = [] + const receivedMessages: any[] = [] const onGotFirstMessage = Defer() const sub = await client.resend({ stream: stream.id, diff --git a/test/integration/Sequencing.test.ts b/test/integration/Sequencing.test.ts index 6c84ddf89..efaf0e54c 100644 --- a/test/integration/Sequencing.test.ts +++ b/test/integration/Sequencing.test.ts @@ -5,16 +5,15 @@ import { StreamrClient } from '../../src/StreamrClient' import Connection from '../../src/Connection' import config from './config' -import { Todo } from '../../src/types' import { Stream } from '../../src/stream' -const Msg = (opts?: Todo) => ({ +const Msg = (opts?: any) => ({ value: uid('msg'), ...opts, }) -function toSeq(requests: Todo, ts = Date.now()) { - return requests.map((m: Todo) => { +function toSeq(requests: any[], ts = Date.now()) { + return requests.map((m: any) => { const { prevMsgRef } = m.streamMessage return [ [m.streamMessage.getTimestamp() - ts, m.streamMessage.getSequenceNumber()], @@ -82,8 +81,8 @@ describe('Sequencing', () => { it('should sequence in order', async () => { const ts = Date.now() - const msgsPublished: Todo[] = [] - const msgsReceieved: Todo[] = [] + const msgsPublished: any[] = [] + const msgsReceieved: any[] = [] await client.subscribe(stream.id, (m) => msgsReceieved.push(m)) @@ -118,8 +117,8 @@ describe('Sequencing', () => { it('should sequence in order even if some calls delayed', async () => { const ts = Date.now() - const msgsPublished: Todo[] = [] - const msgsReceieved: Todo[] = [] + const msgsPublished: any[] = [] + const msgsReceieved: any[] = [] let calls = 0 const getStream = client.getStream.bind(client) @@ -167,12 +166,12 @@ describe('Sequencing', () => { it.skip('should sequence in order even if publish requests backdated', async () => { const ts = Date.now() - const msgsPublished: Todo[] = [] - const msgsReceieved: Todo[] = [] + const msgsPublished: any[] = [] + const msgsReceieved: any[] = [] await client.subscribe(stream.id, (m) => msgsReceieved.push(m)) - const nextMsg = (...args: Todo[]) => { + const nextMsg = (...args: any[]) => { const msg = Msg(...args) msgsPublished.push(msg) return msg @@ -203,7 +202,7 @@ describe('Sequencing', () => { timeout: 6000, }) await waitForStorage(lastRequest) - const msgsResent: Todo[] = [] + const msgsResent: any[] = [] const sub = await client.resend({ stream: stream.id, resend: { @@ -232,12 +231,12 @@ describe('Sequencing', () => { it.skip('should sequence in order even if publish requests backdated in sequence', async () => { const ts = Date.now() - const msgsPublished: Todo[] = [] - const msgsReceieved: Todo[] = [] + const msgsPublished: any[] = [] + const msgsReceieved: any[] = [] await client.subscribe(stream.id, (m) => msgsReceieved.push(m)) - const nextMsg = (...args: Todo[]) => { + const nextMsg = (...args: any[]) => { const msg = Msg(...args) msgsPublished.push(msg) return msg @@ -273,7 +272,7 @@ describe('Sequencing', () => { }) await waitForStorage(lastRequest) - const msgsResent: Todo[] = [] + const msgsResent: any[] = [] const sub = await client.resend({ stream: stream.id, resend: { diff --git a/test/integration/StreamConnectionState.test.ts b/test/integration/StreamConnectionState.test.ts index e3f51f057..724f46637 100644 --- a/test/integration/StreamConnectionState.test.ts +++ b/test/integration/StreamConnectionState.test.ts @@ -8,8 +8,8 @@ import Connection from '../../src/Connection' import config from './config' import { Stream } from '../../src/stream' -import { Subscriber } from '../../src/subscribe' -import { Todo } from '../../src/types' +import { Subscriber, Subscription } from '../../src/subscribe' +import { StreamrClientOptions } from '../../src' const { ControlMessage } = ControlLayer const MAX_MESSAGES = 5 @@ -40,7 +40,7 @@ describeRepeats('Connection State', () => { return c } - async function setupClient(opts: Todo) { + async function setupClient(opts: StreamrClientOptions) { // eslint-disable-next-line require-atomic-updates client = createClient(opts) subscriber = client.subscriber @@ -92,7 +92,7 @@ describeRepeats('Connection State', () => { } }) - let subs: Todo[] = [] + let subs: Subscription[] = [] beforeEach(async () => { const existingSubs = subs @@ -186,7 +186,7 @@ describeRepeats('Connection State', () => { const done = Defer() - const msgs: Todo[] = [] + const msgs: any[] = [] const sockets = new Set() await otherClient.subscribe({ stream, @@ -383,7 +383,7 @@ describeRepeats('Connection State', () => { it('should work', async () => { const done = Defer() - const msgs: Todo[] = [] + const msgs: any[] = [] await otherClient.subscribe(stream, (msg) => { msgs.push(msg) diff --git a/test/integration/StreamrClient.test.ts b/test/integration/StreamrClient.test.ts index 2db745ba0..9ec4653d2 100644 --- a/test/integration/StreamrClient.test.ts +++ b/test/integration/StreamrClient.test.ts @@ -12,7 +12,7 @@ import Connection from '../../src/Connection' import config from './config' import { Stream } from '../../src/stream' -import { Todo } from '../../src/types' +import { Subscription } from '../../src' const WebSocket = require('ws') @@ -23,9 +23,9 @@ const MAX_MESSAGES = 20 describeRepeats('StreamrClient', () => { let expectErrors = 0 // check no errors by default - let errors: Todo[] = [] + let errors: any[] = [] - const getOnError = (errs: Todo) => jest.fn((err) => { + const getOnError = (errs: any) => jest.fn((err) => { errs.push(err) }) @@ -71,7 +71,7 @@ describeRepeats('StreamrClient', () => { resolve(undefined) ws.close() }) - ws.once('error', (err: Todo) => { + ws.once('error', (err: any) => { c.debug('err', c.options.url, err) reject(err) ws.terminate() @@ -410,7 +410,7 @@ describeRepeats('StreamrClient', () => { it('should not subscribe to unsubscribed streams on reconnect', async () => { client = createClient() await client.connect() - const sessionToken: Todo = await client.session.getSessionToken() + const sessionToken: string = await client.session.getSessionToken() const stream = await client.createStream({ name: uid('stream') @@ -446,7 +446,7 @@ describeRepeats('StreamrClient', () => { it('should not subscribe after resend() on reconnect', async () => { client = createClient() await client.connect() - const sessionToken: Todo = await client.session.getSessionToken() + const sessionToken: string = await client.session.getSessionToken() const stream = await client.createStream({ name: uid('stream') @@ -625,13 +625,13 @@ describeRepeats('StreamrClient', () => { describe('StreamrClient', () => { let stream: Stream - let waitForStorage: Todo - let publishTestMessages: Todo + let waitForStorage: (...args: any[]) => Promise + let publishTestMessages: ((n?: number, opts?: any) => Promise<[message: any, request: any][]>) & { raw: (...args: any[]) => any } // These tests will take time, especially on Travis const TIMEOUT = 30 * 1000 - const attachSubListeners = (sub: Todo) => { + const attachSubListeners = (sub: Subscription) => { const onSubscribed = jest.fn() sub.on('subscribed', onSubscribed) const onResent = jest.fn() @@ -892,7 +892,7 @@ describeRepeats('StreamrClient', () => { }) it('client.subscribe with onMessage & collect', async () => { - const onMessageMsgs: Todo[] = [] + const onMessageMsgs: any[] = [] const sub = await client.subscribe({ streamId: stream.id, }, async (msg) => { @@ -935,7 +935,7 @@ describeRepeats('StreamrClient', () => { it('should work', async () => { const done = Defer() - const msgs: Todo[] = [] + const msgs: any[] = [] await otherClient.subscribe(stream, (msg) => { msgs.push(msg) @@ -989,7 +989,7 @@ describeRepeats('StreamrClient', () => { it('publish and subscribe a sequence of messages', async () => { client.enableAutoConnect() const done = Defer() - const received: Todo[] = [] + const received: any[] = [] const sub = await client.subscribe({ streamId: stream.id, }, done.wrapError((parsedContent, streamMessage) => { @@ -1041,7 +1041,7 @@ describeRepeats('StreamrClient', () => { waitForLast: true, }) - const received: Todo[] = [] + const received: any[] = [] const sub = await client.subscribe({ streamId: stream.id, @@ -1075,7 +1075,7 @@ describeRepeats('StreamrClient', () => { waitForLast: true, }) - const received: Todo[] = [] + const received: any[] = [] const sub = await client.subscribe({ streamId: stream.id, @@ -1106,7 +1106,7 @@ describeRepeats('StreamrClient', () => { waitForLast: true, }) - const received: Todo[] = [] + const received: any[] = [] const sub = await client.subscribe({ streamId: stream.id, @@ -1135,8 +1135,8 @@ describeRepeats('StreamrClient', () => { }) describe('resend', () => { - let timestamps: Todo[] = [] - let published: Todo[] = [] + let timestamps: number[] = [] + let published: any[] = [] beforeEach(async () => { publishTestMessages = getPublishTestMessages(client, { @@ -1146,8 +1146,8 @@ describeRepeats('StreamrClient', () => { }) const publishedRaw = await publishTestMessages.raw(5) - timestamps = publishedRaw.map(([, raw]: Todo) => raw.streamMessage.getTimestamp()) - published = publishedRaw.map(([msg]: Todo) => msg) + timestamps = publishedRaw.map(([, raw]: any) => raw.streamMessage.getTimestamp()) + published = publishedRaw.map(([msg]: any) => msg) }) it('resend last', async () => { @@ -1191,7 +1191,7 @@ describeRepeats('StreamrClient', () => { }) it('works with message handler + resent event', async () => { - const messages: Todo[] = [] + const messages: any[] = [] const sub = await client.resend({ stream: stream.id, resend: { diff --git a/test/integration/SubscriberResends.test.ts b/test/integration/SubscriberResends.test.ts index a2dc9628e..6241d5187 100644 --- a/test/integration/SubscriberResends.test.ts +++ b/test/integration/SubscriberResends.test.ts @@ -8,7 +8,6 @@ import { Defer } from '../../src/utils' import config from './config' import { Stream } from '../../src/stream' -import { Todo } from '../../src/types' import { Subscriber } from '../../src/subscribe' const { ControlMessage } = ControlLayer @@ -23,10 +22,10 @@ describeRepeats('resends', () => { let onError = jest.fn() let client: StreamrClient let stream: Stream - let published: Todo - let publishedRequests: Todo + let published: any[] + let publishedRequests: any[] let publishTestMessages: ((n?: number, opts?: any) => Promise<[message: any, request: any][]>) & { raw: (...args: any[]) => any } - let waitForStorage: Todo + let waitForStorage: (...args: any[]) => Promise let subscriber: Subscriber const createClient = (opts = {}) => { @@ -185,8 +184,8 @@ describeRepeats('resends', () => { const results = await publishTestMessages.raw(MAX_MESSAGES, { waitForLast: true, }) - published = results.map(([msg]: Todo) => msg) - publishedRequests = results.map(([, req]: Todo) => req) + published = results.map(([msg]: any) => msg) + publishedRequests = results.map(([, req]: any) => req) }, WAIT_FOR_STORAGE_TIMEOUT * 2) beforeEach(async () => { @@ -283,7 +282,7 @@ describeRepeats('resends', () => { const onResent = Defer() const publishedBefore = published.slice() - const receivedMsgs: Todo[] = [] + const receivedMsgs: any[] = [] sub.on('resent', onResent.wrap(() => { expect(receivedMsgs).toEqual(publishedBefore) @@ -358,7 +357,7 @@ describeRepeats('resends', () => { const onResent = Defer() const publishedBefore = published.slice() - const receivedMsgs: Todo[] = [] + const receivedMsgs: any[] = [] sub.once('resent', onResent.wrap(() => { expect(receivedMsgs).toEqual(publishedBefore) @@ -469,7 +468,7 @@ describeRepeats('resends', () => { }) it('can end inside resend', async () => { - const unsubscribeEvents: Todo[] = [] + const unsubscribeEvents: any[] = [] // @ts-expect-error client.connection.on(ControlMessage.TYPES.UnsubscribeResponse, (m) => { unsubscribeEvents.push(m) diff --git a/test/integration/Subscription.test.ts b/test/integration/Subscription.test.ts index 79f8398b1..47908faf3 100644 --- a/test/integration/Subscription.test.ts +++ b/test/integration/Subscription.test.ts @@ -6,7 +6,6 @@ import { StreamrClient } from '../../src/StreamrClient' import config from './config' import { Stream } from '../../src/stream' import { Subscription } from '../../src/subscribe' -import { Todo } from '../../src/types' const createClient = (opts = {}) => new StreamrClient({ ...config.clientOptions, @@ -28,10 +27,10 @@ describe('Subscription', () => { let stream: Stream let client: StreamrClient let subscription: Subscription - let errors: Todo[] = [] + let errors: any[] = [] let expectedErrors = 0 - function onError(err: Todo) { + function onError(err: any) { errors.push(err) } @@ -42,7 +41,7 @@ describe('Subscription', () => { async function createMonitoredSubscription(opts = {}) { if (!client) { throw new Error('No client') } - const events: Todo[] = [] + const events: any[] = [] subscription = await client.subscribe({ streamId: stream.id, resend: RESEND_ALL, From eeec191ae072e9ae40a73cbb59d9d8757500dd4d Mon Sep 17 00:00:00 2001 From: Teo Gebhard Date: Tue, 16 Mar 2021 19:52:28 +0200 Subject: [PATCH 10/19] Fix eslint --- test/integration/SubscriberResends.test.ts | 2 +- test/integration/Subscription.test.ts | 2 +- test/integration/config.ts | 6 ++++-- test/unit/StubbedStreamrClient.ts | 6 ++++-- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/test/integration/SubscriberResends.test.ts b/test/integration/SubscriberResends.test.ts index 6241d5187..cb70b6033 100644 --- a/test/integration/SubscriberResends.test.ts +++ b/test/integration/SubscriberResends.test.ts @@ -293,7 +293,7 @@ describeRepeats('resends', () => { const req = await client.publish(stream.id, newMessage) // should be realtime published.push(newMessage) publishedRequests.push(req) - let t: NodeJS.Timeout|undefined + let t: ReturnType|undefined for await (const msg of sub) { receivedMsgs.push(msg.getParsedContent()) if (receivedMsgs.length === published.length) { diff --git a/test/integration/Subscription.test.ts b/test/integration/Subscription.test.ts index 47908faf3..2c19259c9 100644 --- a/test/integration/Subscription.test.ts +++ b/test/integration/Subscription.test.ts @@ -102,7 +102,7 @@ describe('Subscription', () => { const subscriptionEvents = await createMonitoredSubscription({ resend: undefined, }) - // @ts-expect-error + // @ts-expect-error await client.unsubscribe(stream) expect(subscriptionEvents).toEqual([ 'unsubscribed', diff --git a/test/integration/config.ts b/test/integration/config.ts index 2ccde8cea..5c30c8d87 100644 --- a/test/integration/config.ts +++ b/test/integration/config.ts @@ -1,6 +1,8 @@ import { StreamrClientOptions } from '../../src/Config' -const toNumber = (value: string|undefined) => (value !== undefined) ? Number(value) : undefined +const toNumber = (value: string|undefined) => { + return (value !== undefined) ? Number(value) : undefined +} const clientOptions: StreamrClientOptions = { // ganache 1: 0x4178baBE9E5148c6D5fd431cD72884B07Ad855a0 @@ -37,4 +39,4 @@ export default { clientOptions, tokenMediator, tokenAdminPrivateKey -} \ No newline at end of file +} diff --git a/test/unit/StubbedStreamrClient.ts b/test/unit/StubbedStreamrClient.ts index 4052044be..d6ef2c6d6 100644 --- a/test/unit/StubbedStreamrClient.ts +++ b/test/unit/StubbedStreamrClient.ts @@ -1,15 +1,17 @@ -import { StreamrClient } from '../../src/' +import { StreamrClient } from '../../src/index' import { Stream } from '../../src/stream' export default class StubbedStreamrClient extends StreamrClient { // @ts-expect-error + // eslint-disable-next-line class-methods-use-this getUserInfo() { return Promise.resolve({ username: 'username', }) } - async getStream () { + // eslint-disable-next-line class-methods-use-this + async getStream() { return new Stream(null as any, { id: 'streamId', partitions: 1, From e5fd1452d3c5ad78d86fdac9eac5a491fb6e48a5 Mon Sep 17 00:00:00 2001 From: Teo Gebhard Date: Tue, 16 Mar 2021 20:39:04 +0200 Subject: [PATCH 11/19] Fix import --- src/user/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/user/index.ts b/src/user/index.ts index d17d2913a..c5c25a626 100644 --- a/src/user/index.ts +++ b/src/user/index.ts @@ -2,7 +2,7 @@ import { computeAddress } from '@ethersproject/transactions' import { Web3Provider } from '@ethersproject/providers' import { hexlify } from '@ethersproject/bytes' import { sha256 } from '@ethersproject/sha2' -import StreamrClient from '../StreamrClient' +import { StreamrClient } from '../StreamrClient' import { EthereumConfig } from '../Config' async function getUsername(client: StreamrClient) { From 9dcd9d2869ce467d0adeb8283777508b55a46230 Mon Sep 17 00:00:00 2001 From: Teo Gebhard Date: Tue, 16 Mar 2021 20:54:59 +0200 Subject: [PATCH 12/19] Fix types --- test/integration/GapFill.test.ts | 4 ++-- test/integration/Session.test.ts | 4 ++-- test/integration/StreamConnectionState.test.ts | 2 -- test/integration/StreamrClient.test.ts | 12 +++++------- test/integration/authFetch.test.ts | 6 +++--- test/integration/config.ts | 4 +--- 6 files changed, 13 insertions(+), 19 deletions(-) diff --git a/test/integration/GapFill.test.ts b/test/integration/GapFill.test.ts index 389cb5900..4fc2b12e5 100644 --- a/test/integration/GapFill.test.ts +++ b/test/integration/GapFill.test.ts @@ -22,6 +22,8 @@ describeRepeats('GapFill with resends', () => { const createClient = (opts = {}) => { const c = new StreamrClient({ + ...config.clientOptions, + ...opts, auth: { privateKey: fakePrivateKey(), }, @@ -29,8 +31,6 @@ describeRepeats('GapFill with resends', () => { autoDisconnect: false, // @ts-expect-error maxRetries: 2, - ...config.clientOptions, - ...opts, }) c.onError = jest.fn() c.on('error', onError) diff --git a/test/integration/Session.test.ts b/test/integration/Session.test.ts index bccd20182..960bb4ccc 100644 --- a/test/integration/Session.test.ts +++ b/test/integration/Session.test.ts @@ -5,10 +5,10 @@ import config from './config' describe('Session', () => { const createClient = (opts = {}) => new StreamrClient({ - autoConnect: false, - autoDisconnect: false, ...config.clientOptions, ...opts, + autoConnect: false, + autoDisconnect: false, }) describe('Token retrievals', () => { diff --git a/test/integration/StreamConnectionState.test.ts b/test/integration/StreamConnectionState.test.ts index 724f46637..f77bb78e7 100644 --- a/test/integration/StreamConnectionState.test.ts +++ b/test/integration/StreamConnectionState.test.ts @@ -364,7 +364,6 @@ describeRepeats('Connection State', () => { otherClient.connect(), otherClient.session.getSessionToken(), ] - // @ts-expect-error await Promise.allSettled(tasks) // @ts-expect-error await Promise.all(tasks) // throw if there were an error @@ -375,7 +374,6 @@ describeRepeats('Connection State', () => { otherClient.disconnect(), client.disconnect(), ] - // @ts-expect-error await Promise.allSettled(tasks) await Promise.all(tasks) // throw if there were an error }) diff --git a/test/integration/StreamrClient.test.ts b/test/integration/StreamrClient.test.ts index 9ec4653d2..80354de82 100644 --- a/test/integration/StreamrClient.test.ts +++ b/test/integration/StreamrClient.test.ts @@ -410,7 +410,7 @@ describeRepeats('StreamrClient', () => { it('should not subscribe to unsubscribed streams on reconnect', async () => { client = createClient() await client.connect() - const sessionToken: string = await client.session.getSessionToken() + const sessionToken = await client.session.getSessionToken()! const stream = await client.createStream({ name: uid('stream') @@ -430,7 +430,7 @@ describeRepeats('StreamrClient', () => { expect(connectionEventSpy.mock.calls[0]).toEqual([new SubscribeRequest({ streamId: stream.id, streamPartition: 0, - sessionToken, + sessionToken: sessionToken!, requestId: connectionEventSpy.mock.calls[0][0].requestId, })]) @@ -438,7 +438,7 @@ describeRepeats('StreamrClient', () => { streamId: stream.id, streamPartition: 0, // @ts-expect-error - sessionToken, + sessionToken: sessionToken!, requestId: connectionEventSpy.mock.calls[1][0].requestId, })]) }) @@ -446,7 +446,7 @@ describeRepeats('StreamrClient', () => { it('should not subscribe after resend() on reconnect', async () => { client = createClient() await client.connect() - const sessionToken: string = await client.session.getSessionToken() + const sessionToken = await client.session.getSessionToken()! const stream = await client.createStream({ name: uid('stream') @@ -470,7 +470,7 @@ describeRepeats('StreamrClient', () => { expect(connectionEventSpy.mock.calls[0]).toEqual([new ResendLastRequest({ streamId: stream.id, streamPartition: 0, - sessionToken, + sessionToken: sessionToken!, numberLast: 10, requestId: connectionEventSpy.mock.calls[0][0].requestId, })]) @@ -917,7 +917,6 @@ describeRepeats('StreamrClient', () => { otherClient.connect(), otherClient.session.getSessionToken(), ] - // @ts-expect-error await Promise.allSettled(tasks) await Promise.all(tasks) // throw if there were an error }) @@ -928,7 +927,6 @@ describeRepeats('StreamrClient', () => { otherClient.disconnect(), client.disconnect(), ] - // @ts-expect-error await Promise.allSettled(tasks) await Promise.all(tasks) // throw if there were an error }) diff --git a/test/integration/authFetch.test.ts b/test/integration/authFetch.test.ts index 24c8f2f4b..1ae08e867 100644 --- a/test/integration/authFetch.test.ts +++ b/test/integration/authFetch.test.ts @@ -31,12 +31,12 @@ describe('authFetch', () => { // @ts-expect-error fetch.mockImplementation(realFetch) client = new StreamrClient({ + ...config.clientOptions, + autoConnect: false, + autoDisconnect: false, auth: { privateKey: fakePrivateKey() }, - autoConnect: false, - autoDisconnect: false, - ...config.clientOptions, }) await client.connect() expect(fetch).not.toHaveBeenCalled() // will get called in background though (questionable behaviour) diff --git a/test/integration/config.ts b/test/integration/config.ts index 5c30c8d87..d6e2388d3 100644 --- a/test/integration/config.ts +++ b/test/integration/config.ts @@ -1,10 +1,8 @@ -import { StreamrClientOptions } from '../../src/Config' - const toNumber = (value: string|undefined) => { return (value !== undefined) ? Number(value) : undefined } -const clientOptions: StreamrClientOptions = { +const clientOptions = { // ganache 1: 0x4178baBE9E5148c6D5fd431cD72884B07Ad855a0 auth: { privateKey: process.env.ETHEREUM_PRIVATE_KEY || '0xe5af7834455b7239881b85be89d905d6881dcb4751063897f12be1b0dd546bdb', From c26f5ff533efc3367f10cb148db02b67b66c69e7 Mon Sep 17 00:00:00 2001 From: Teo Gebhard Date: Tue, 16 Mar 2021 21:22:23 +0200 Subject: [PATCH 13/19] Benchmarks need config.js as plain JS --- test/integration/config.js | 35 +++++++++++++++++++++++++++++++++ test/integration/config.ts | 40 -------------------------------------- 2 files changed, 35 insertions(+), 40 deletions(-) create mode 100644 test/integration/config.js delete mode 100644 test/integration/config.ts diff --git a/test/integration/config.js b/test/integration/config.js new file mode 100644 index 000000000..fa4d49998 --- /dev/null +++ b/test/integration/config.js @@ -0,0 +1,35 @@ +const toNumber = (value) => { + return (value !== undefined) ? Number(value) : undefined +} + +module.exports = { + clientOptions: { + // ganache 1: 0x4178baBE9E5148c6D5fd431cD72884B07Ad855a0 + auth: { + privateKey: process.env.ETHEREUM_PRIVATE_KEY || '0xe5af7834455b7239881b85be89d905d6881dcb4751063897f12be1b0dd546bdb', + }, + url: process.env.WEBSOCKET_URL || 'ws://localhost/api/v1/ws', + restUrl: process.env.REST_URL || 'http://localhost/api/v1', + streamrNodeAddress: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', + tokenAddress: process.env.TOKEN_ADDRESS || '0xbAA81A0179015bE47Ad439566374F2Bae098686F', + tokenSidechainAddress: process.env.TOKEN_ADDRESS_SIDECHAIN || '0x73Be21733CC5D08e1a14Ea9a399fb27DB3BEf8fF', + dataUnion: { + factoryMainnetAddress: process.env.DU_FACTORY_MAINNET || '0x4bbcBeFBEC587f6C4AF9AF9B48847caEa1Fe81dA', + factorySidechainAddress: process.env.DU_FACTORY_SIDECHAIN || '0x4A4c4759eb3b7ABee079f832850cD3D0dC48D927', + templateMainnetAddress: process.env.DU_TEMPLATE_MAINNET || '0x7bFBAe10AE5b5eF45e2aC396E0E605F6658eF3Bc', + templateSidechainAddress: process.env.DU_TEMPLATE_SIDECHAIN || '0x36afc8c9283CC866b8EB6a61C6e6862a83cd6ee8', + }, + sidechain: { + url: process.env.SIDECHAIN_URL || 'http://10.200.10.1:8546', + timeout: toNumber(process.env.TEST_TIMEOUT), + }, + mainnet: { + url: process.env.ETHEREUM_SERVER_URL || 'http://10.200.10.1:8545', + timeout: toNumber(process.env.TEST_TIMEOUT), + }, + autoConnect: false, + autoDisconnect: false, + }, + tokenMediator: '0xedD2aa644a6843F2e5133Fe3d6BD3F4080d97D9F', + tokenAdminPrivateKey: '0x5e98cce00cff5dea6b454889f359a4ec06b9fa6b88e9d69b86de8e1c81887da0', +} diff --git a/test/integration/config.ts b/test/integration/config.ts deleted file mode 100644 index d6e2388d3..000000000 --- a/test/integration/config.ts +++ /dev/null @@ -1,40 +0,0 @@ -const toNumber = (value: string|undefined) => { - return (value !== undefined) ? Number(value) : undefined -} - -const clientOptions = { - // ganache 1: 0x4178baBE9E5148c6D5fd431cD72884B07Ad855a0 - auth: { - privateKey: process.env.ETHEREUM_PRIVATE_KEY || '0xe5af7834455b7239881b85be89d905d6881dcb4751063897f12be1b0dd546bdb', - }, - url: process.env.WEBSOCKET_URL || 'ws://localhost/api/v1/ws', - restUrl: process.env.REST_URL || 'http://localhost/api/v1', - streamrNodeAddress: '0xFCAd0B19bB29D4674531d6f115237E16AfCE377c', - tokenAddress: process.env.TOKEN_ADDRESS || '0xbAA81A0179015bE47Ad439566374F2Bae098686F', - tokenSidechainAddress: process.env.TOKEN_ADDRESS_SIDECHAIN || '0x73Be21733CC5D08e1a14Ea9a399fb27DB3BEf8fF', - dataUnion: { - factoryMainnetAddress: process.env.DU_FACTORY_MAINNET || '0x4bbcBeFBEC587f6C4AF9AF9B48847caEa1Fe81dA', - factorySidechainAddress: process.env.DU_FACTORY_SIDECHAIN || '0x4A4c4759eb3b7ABee079f832850cD3D0dC48D927', - templateMainnetAddress: process.env.DU_TEMPLATE_MAINNET || '0x7bFBAe10AE5b5eF45e2aC396E0E605F6658eF3Bc', - templateSidechainAddress: process.env.DU_TEMPLATE_SIDECHAIN || '0x36afc8c9283CC866b8EB6a61C6e6862a83cd6ee8', - }, - sidechain: { - url: process.env.SIDECHAIN_URL || 'http://10.200.10.1:8546', - timeout: toNumber(process.env.TEST_TIMEOUT), - }, - mainnet: { - url: process.env.ETHEREUM_SERVER_URL || 'http://10.200.10.1:8545', - timeout: toNumber(process.env.TEST_TIMEOUT), - }, - autoConnect: false, - autoDisconnect: false, -} - -const tokenMediator = '0xedD2aa644a6843F2e5133Fe3d6BD3F4080d97D9F' -const tokenAdminPrivateKey = '0x5e98cce00cff5dea6b454889f359a4ec06b9fa6b88e9d69b86de8e1c81887da0' - -export default { - clientOptions, - tokenMediator, - tokenAdminPrivateKey -} From 15f8d25ace4f30801ed9b38a9232e2d4edcb7ee2 Mon Sep 17 00:00:00 2001 From: Teo Gebhard Date: Tue, 16 Mar 2021 21:23:08 +0200 Subject: [PATCH 14/19] Ignore Promise.allSettled warning --- test/integration/StreamConnectionState.test.ts | 4 ++-- test/integration/StreamrClient.test.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/integration/StreamConnectionState.test.ts b/test/integration/StreamConnectionState.test.ts index f77bb78e7..4c2cc9c2d 100644 --- a/test/integration/StreamConnectionState.test.ts +++ b/test/integration/StreamConnectionState.test.ts @@ -364,7 +364,7 @@ describeRepeats('Connection State', () => { otherClient.connect(), otherClient.session.getSessionToken(), ] - await Promise.allSettled(tasks) + await (Promise as any).allSettled(tasks) // @ts-expect-error await Promise.all(tasks) // throw if there were an error }) @@ -374,7 +374,7 @@ describeRepeats('Connection State', () => { otherClient.disconnect(), client.disconnect(), ] - await Promise.allSettled(tasks) + await (Promise as any).allSettled(tasks) await Promise.all(tasks) // throw if there were an error }) diff --git a/test/integration/StreamrClient.test.ts b/test/integration/StreamrClient.test.ts index 80354de82..c7781a366 100644 --- a/test/integration/StreamrClient.test.ts +++ b/test/integration/StreamrClient.test.ts @@ -917,7 +917,7 @@ describeRepeats('StreamrClient', () => { otherClient.connect(), otherClient.session.getSessionToken(), ] - await Promise.allSettled(tasks) + await (Promise as any).allSettled(tasks) await Promise.all(tasks) // throw if there were an error }) @@ -927,7 +927,7 @@ describeRepeats('StreamrClient', () => { otherClient.disconnect(), client.disconnect(), ] - await Promise.allSettled(tasks) + await (Promise as any).allSettled(tasks) await Promise.all(tasks) // throw if there were an error }) From 37c9538f86cf3d7ce270ead5942093f1afb9bfcf Mon Sep 17 00:00:00 2001 From: Teo Gebhard Date: Tue, 16 Mar 2021 21:47:19 +0200 Subject: [PATCH 15/19] publishTestMessages types --- test/integration/GapFill.test.ts | 2 +- test/integration/ResendReconnect.test.ts | 5 +++-- test/integration/Resends.test.ts | 2 +- test/integration/StreamConnectionState.test.ts | 2 +- test/integration/StreamrClient.test.ts | 2 +- test/integration/SubscriberResends.test.ts | 2 +- test/utils.ts | 4 +++- 7 files changed, 11 insertions(+), 8 deletions(-) diff --git a/test/integration/GapFill.test.ts b/test/integration/GapFill.test.ts index 4fc2b12e5..cb1b49e15 100644 --- a/test/integration/GapFill.test.ts +++ b/test/integration/GapFill.test.ts @@ -14,7 +14,7 @@ const MAX_MESSAGES = 10 describeRepeats('GapFill with resends', () => { let expectErrors = 0 // check no errors by default - let publishTestMessages: (n?: number, opts?: any) => Promise<[message: any, request: any][]> + let publishTestMessages: ReturnType let onError = jest.fn() let client: StreamrClient let stream: Stream diff --git a/test/integration/ResendReconnect.test.ts b/test/integration/ResendReconnect.test.ts index 8b612b429..794ee9810 100644 --- a/test/integration/ResendReconnect.test.ts +++ b/test/integration/ResendReconnect.test.ts @@ -7,6 +7,7 @@ import { Defer } from '../../src/utils' import config from './config' import { Stream } from '../../src/stream' import { Subscription } from '../../src' +import { PublishRequest } from 'streamr-client-protocol/dist/src/protocol/control_layer' const createClient = (opts = {}) => new StreamrClient({ ...config.clientOptions, @@ -23,8 +24,8 @@ const MAX_MESSAGES = 3 describe('resend/reconnect', () => { let client: StreamrClient let stream: Stream - let publishedMessages: [message: any, request: any][] - let publishTestMessages: (n?: number, opts?: any) => Promise<[message: any, request: any][]> + let publishedMessages: [message: any, request: PublishRequest][] + let publishTestMessages: ReturnType beforeEach(async () => { client = createClient() diff --git a/test/integration/Resends.test.ts b/test/integration/Resends.test.ts index bc9f3b96f..6161074e2 100644 --- a/test/integration/Resends.test.ts +++ b/test/integration/Resends.test.ts @@ -38,7 +38,7 @@ describe('StreamrClient resends', () => { let client: StreamrClient let stream: Stream let published: any[] - let publishTestMessages: (n?: number, opts?: any) => Promise<[message: any, request: any][]> + let publishTestMessages: ReturnType beforeEach(async () => { client = createClient() diff --git a/test/integration/StreamConnectionState.test.ts b/test/integration/StreamConnectionState.test.ts index 4c2cc9c2d..8cc88cbb8 100644 --- a/test/integration/StreamConnectionState.test.ts +++ b/test/integration/StreamConnectionState.test.ts @@ -16,7 +16,7 @@ const MAX_MESSAGES = 5 describeRepeats('Connection State', () => { let expectErrors = 0 // check no errors by default - let publishTestMessages: (n?: number, opts?: any) => Promise<[message: any, request: any][]> + let publishTestMessages: ReturnType let onError = jest.fn() let client: StreamrClient let stream: Stream diff --git a/test/integration/StreamrClient.test.ts b/test/integration/StreamrClient.test.ts index c7781a366..2d2de81e6 100644 --- a/test/integration/StreamrClient.test.ts +++ b/test/integration/StreamrClient.test.ts @@ -626,7 +626,7 @@ describeRepeats('StreamrClient', () => { describe('StreamrClient', () => { let stream: Stream let waitForStorage: (...args: any[]) => Promise - let publishTestMessages: ((n?: number, opts?: any) => Promise<[message: any, request: any][]>) & { raw: (...args: any[]) => any } + let publishTestMessages: ReturnType // These tests will take time, especially on Travis const TIMEOUT = 30 * 1000 diff --git a/test/integration/SubscriberResends.test.ts b/test/integration/SubscriberResends.test.ts index cb70b6033..ee1fff500 100644 --- a/test/integration/SubscriberResends.test.ts +++ b/test/integration/SubscriberResends.test.ts @@ -24,7 +24,7 @@ describeRepeats('resends', () => { let stream: Stream let published: any[] let publishedRequests: any[] - let publishTestMessages: ((n?: number, opts?: any) => Promise<[message: any, request: any][]>) & { raw: (...args: any[]) => any } + let publishTestMessages: ReturnType let waitForStorage: (...args: any[]) => Promise let subscriber: Subscriber diff --git a/test/utils.ts b/test/utils.ts index 936fdcf54..a77f0ce4f 100644 --- a/test/utils.ts +++ b/test/utils.ts @@ -4,6 +4,7 @@ import { providers, Wallet } from 'ethers' import { pTimeout, counterId, AggregatedError } from '../src/utils' import { validateOptions } from '../src/stream/utils' import { StreamrClient } from '../src/StreamrClient' +import { PublishRequest } from 'streamr-client-protocol/dist/src/protocol/control_layer' const crypto = require('crypto') const config = require('./integration/config') @@ -189,7 +190,7 @@ export function getPublishTestMessages(client: StreamrClient, defaultOpts: any = try { client.connection.once('done', onDone) - const published: [ message: any, request: any ][] = [] + const published: [ message: any, request: PublishRequest ][] = [] /* eslint-disable no-await-in-loop, no-loop-func */ for (let i = 0; i < n; i++) { checkDone() @@ -205,6 +206,7 @@ export function getPublishTestMessages(client: StreamrClient, defaultOpts: any = checkDone() published.push([ message, + // @ts-expect-error request, ]) From eba70846449c30577f0a5c5126cf873c36741d23 Mon Sep 17 00:00:00 2001 From: Teo Gebhard Date: Tue, 16 Mar 2021 21:50:35 +0200 Subject: [PATCH 16/19] Simplify type --- test/integration/SubscriberResends.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/SubscriberResends.test.ts b/test/integration/SubscriberResends.test.ts index ee1fff500..d362242c0 100644 --- a/test/integration/SubscriberResends.test.ts +++ b/test/integration/SubscriberResends.test.ts @@ -293,7 +293,7 @@ describeRepeats('resends', () => { const req = await client.publish(stream.id, newMessage) // should be realtime published.push(newMessage) publishedRequests.push(req) - let t: ReturnType|undefined + let t: ReturnType for await (const msg of sub) { receivedMsgs.push(msg.getParsedContent()) if (receivedMsgs.length === published.length) { From 1a4299cc9c73205f69870d9d9505880d3644f084 Mon Sep 17 00:00:00 2001 From: Teo Gebhard Date: Tue, 16 Mar 2021 22:10:38 +0200 Subject: [PATCH 17/19] Small implementation change to remove warnings and casting --- test/unit/StubbedStreamrClient.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/test/unit/StubbedStreamrClient.ts b/test/unit/StubbedStreamrClient.ts index d6ef2c6d6..2e4698184 100644 --- a/test/unit/StubbedStreamrClient.ts +++ b/test/unit/StubbedStreamrClient.ts @@ -2,17 +2,16 @@ import { StreamrClient } from '../../src/index' import { Stream } from '../../src/stream' export default class StubbedStreamrClient extends StreamrClient { - // @ts-expect-error // eslint-disable-next-line class-methods-use-this getUserInfo() { return Promise.resolve({ + name: '', username: 'username', }) } - // eslint-disable-next-line class-methods-use-this - async getStream() { - return new Stream(null as any, { + async getStream(): Promise { + return new Stream(this, { id: 'streamId', partitions: 1, }) From 2d054ffa4be4c3c7c7c12b17923df44012aaabd7 Mon Sep 17 00:00:00 2001 From: Teo Gebhard Date: Tue, 16 Mar 2021 22:32:41 +0200 Subject: [PATCH 18/19] type of onFinally for Subscriptions methods --- src/subscribe/index.ts | 10 +++++----- test/integration/SubscriberResends.test.ts | 16 ++++++++-------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/subscribe/index.ts b/src/subscribe/index.ts index 466b2c6ea..e2ae9fc8a 100644 --- a/src/subscribe/index.ts +++ b/src/subscribe/index.ts @@ -10,7 +10,7 @@ import MessagePipeline from './pipeline' import Validator from './Validator' import messageStream from './messageStream' import resendStream from './resendStream' -import { Todo } from '../types' +import { MaybeAsync, Todo } from '../types' import StreamrClient, { StreamPartDefinition, SubscribeOptions } from '..' /** @@ -377,7 +377,7 @@ class Subscriptions { this.subSessions = new Map() } - async add(opts: StreamPartDefinition, onFinally: Todo = async () => {}) { + async add(opts: StreamPartDefinition, onFinally: MaybeAsync<(err?: any) => void> = async () => {}) { const options = validateOptions(opts) const { key } = options @@ -536,7 +536,7 @@ export class Subscriber { return this.subscriptions.count(options) } - async subscribe(opts: StreamPartDefinition, onFinally?: Todo) { + async subscribe(opts: StreamPartDefinition, onFinally?: MaybeAsync<(err?: any) => void>) { return this.subscriptions.add(opts, onFinally) } @@ -571,7 +571,7 @@ export class Subscriber { return sub } - async resendSubscribe(opts: SubscribeOptions & StreamPartDefinition, onMessage: Todo) { + async resendSubscribe(opts: SubscribeOptions & StreamPartDefinition, onFinally?: MaybeAsync<(err?: any) => void>) { // This works by passing a custom message stream to a subscription // the custom message stream iterates resends, then iterates realtime const options = validateOptions(opts) @@ -667,7 +667,7 @@ export class Subscriber { } }, ], - }, onMessage) + }, onFinally) // eslint-disable-next-line semi-style ;[resendSubscribeSub] = await Promise.all([ diff --git a/test/integration/SubscriberResends.test.ts b/test/integration/SubscriberResends.test.ts index d362242c0..82805a78a 100644 --- a/test/integration/SubscriberResends.test.ts +++ b/test/integration/SubscriberResends.test.ts @@ -151,7 +151,7 @@ describeRepeats('resends', () => { const sub = await subscriber.resendSubscribe({ streamId: emptyStream.id, last: 5, - }, () => {}) + }) const onResent = jest.fn() sub.on('resent', onResent) @@ -278,7 +278,7 @@ describeRepeats('resends', () => { const sub = await subscriber.resendSubscribe({ streamId: stream.id, last: published.length, - }, () => {}) + }) const onResent = Defer() const publishedBefore = published.slice() @@ -322,7 +322,7 @@ describeRepeats('resends', () => { const sub = await subscriber.resendSubscribe({ streamId: stream.id, last: published.length, - }, () => {}) + }) const onResent = jest.fn() sub.on('resent', onResent) @@ -353,7 +353,7 @@ describeRepeats('resends', () => { const sub = await subscriber.resendSubscribe({ streamId: stream.id, last: published.length, - }, () => {}) + }) const onResent = Defer() const publishedBefore = published.slice() @@ -385,7 +385,7 @@ describeRepeats('resends', () => { const sub = await subscriber.resendSubscribe({ streamId: stream.id, last: published.length, - }, () => {}) + }) const message = Msg() // eslint-disable-next-line no-await-in-loop @@ -412,7 +412,7 @@ describeRepeats('resends', () => { const sub = await subscriber.resendSubscribe({ streamId: stream.id, last: published.length, - }, () => {}) + }) expect(subscriber.count(stream.id)).toBe(1) const message = Msg() @@ -437,7 +437,7 @@ describeRepeats('resends', () => { const sub = await subscriber.resendSubscribe({ streamId: stream.id, last: published.length, - }, () => {}) + }) const message = Msg() // eslint-disable-next-line no-await-in-loop @@ -476,7 +476,7 @@ describeRepeats('resends', () => { const sub = await subscriber.resendSubscribe({ streamId: stream.id, last: published.length, - }, () => {}) + }) const message = Msg() // eslint-disable-next-line no-await-in-loop From ecfadf4d4c65f214d6927dc98665f0cb7bef5f7b Mon Sep 17 00:00:00 2001 From: Teo Gebhard Date: Tue, 16 Mar 2021 22:34:57 +0200 Subject: [PATCH 19/19] One more format for StreamPartDefinition --- src/stream/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stream/index.ts b/src/stream/index.ts index 4476be363..4d18e1441 100644 --- a/src/stream/index.ts +++ b/src/stream/index.ts @@ -5,7 +5,7 @@ import StorageNode from './StorageNode' import { StreamrClient } from '../StreamrClient' // TODO explicit types: e.g. we never provide both streamId and id, or both streamPartition and partition -export type StreamPartDefinition = string | { streamId?: string, streamPartition?: number, id?: string, partition?: number, stream?: Stream } +export type StreamPartDefinition = string | { streamId?: string, streamPartition?: number, id?: string, partition?: number, stream?: Stream|string } export type ValidatedStreamPartDefinition = { streamId: string, streamPartition: number, key: string}