Skip to content

Commit

Permalink
fix: websocket reconnection every 2 min
Browse files Browse the repository at this point in the history
  • Loading branch information
xstelea committed May 31, 2023
1 parent 7f616ec commit 2a01539
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 11 deletions.
5 changes: 3 additions & 2 deletions src/connector/connector-client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import { errAsync, ResultAsync } from 'neverthrow'
import { errorIdentity } from 'utils/error-identity'
import { sendMessageOverDataChannelAndWaitForConfirmation } from './webrtc/helpers/send-message-over-data-channel-and-wait-for-confirmation'
import { ConnectorClientSubjects } from './subjects'
import { MessageErrorReasons } from './_types'
import { MessageErrorReasons, Secrets } from './_types'

export type ConnectorClient = ReturnType<typeof ConnectorClient>

Expand Down Expand Up @@ -72,6 +72,7 @@ export const ConnectorClient = (input: {
const subscriptions = new Subscription()

const connection$ = secretsClient.secrets$.pipe(
filter((secrets): secrets is Secrets => !!secrets),
switchMap((secrets) => {
const signalingClient = SignalingClient({
baseUrl: input.signalingServerBaseUrl,
Expand Down Expand Up @@ -131,7 +132,7 @@ export const ConnectorClient = (input: {
setConnectionPassword: (password: Buffer) =>
secretsClient.deriveSecretsFromPassword(password),
connectionPassword$: secretsClient.secrets$.pipe(
map((secrets) => secrets.encryptionKey)
map((secrets) => secrets?.encryptionKey)
),
generateConnectionPassword: () => secretsClient.generateConnectionSecrets(),
connect: () => shouldConnectSubject.next(true),
Expand Down
19 changes: 11 additions & 8 deletions src/connector/secrets-client.ts
Original file line number Diff line number Diff line change
@@ -1,28 +1,31 @@
import { Logger } from 'tslog'
import { ReplaySubject } from 'rxjs'
import { deriveSecretsFromPassword } from './helpers/derive-secrets-from-connection-password'
import { BehaviorSubject } from 'rxjs'
import { deriveSecretsFromPassword as deriveSecretsFromPasswordFn } from './helpers/derive-secrets-from-connection-password'
import { generateConnectionPassword } from './helpers/generate-connection-password'
import { Secrets } from './_types'

export const SecretsClient = (input: { logger?: Logger<unknown> }) => {
const logger = input.logger
const secretsSubject = new ReplaySubject<Secrets>(1)
const secretsSubject = new BehaviorSubject<Secrets | undefined>(undefined)

const generateConnectionSecrets = () =>
generateConnectionPassword().asyncAndThen((password) =>
deriveSecretsFromPassword(password).map((secrets) => {
deriveSecretsFromPasswordFn(password).map((secrets) => {
logger?.debug(`🔐🔄 connection password generated`)
secretsSubject.next(secrets)
return password
})
)

const deriveSecretsFromPassword = (password: Buffer) =>
deriveSecretsFromPasswordFn(password).map((secrets) => {
if (!secretsSubject.value?.encryptionKey.equals(secrets.encryptionKey))
secretsSubject.next(secrets)
})

return {
generateConnectionSecrets,
deriveSecretsFromPassword: (password: Buffer) =>
deriveSecretsFromPassword(password).map((secrets) => {
secretsSubject.next(secrets)
}),
deriveSecretsFromPassword,
secrets$: secretsSubject,
}
}
2 changes: 1 addition & 1 deletion src/pairing/pairing.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export const Paring = () => {

const subscription = connectorClient.connectionPassword$.subscribe(
(password) => {
setConnectionPassword(password.toString('hex'))
setConnectionPassword(password?.toString('hex'))
}
)

Expand Down

0 comments on commit 2a01539

Please sign in to comment.