rxdb
Version:
A local-first realtime NoSQL Database for JavaScript applications - https://rxdb.info/
55 lines (48 loc) • 1.5 kB
text/typescript
import type {
HashFunction
} from '../../types/index.d.ts';
import type {
WebRTCConnectionHandler,
WebRTCMessage,
WebRTCResponse
} from './webrtc-types.ts';
import { filter, firstValueFrom, map } from 'rxjs';
/**
* To deterministically define which peer is master and
* which peer is fork, we compare the storage tokens.
* But we have to hash them before, to ensure that
* a storageToken like 'aaaaaa' is not always the master
* for all peers.
*/
export async function isMasterInWebRTCReplication(
hashFunction: HashFunction,
ownStorageToken: string,
otherStorageToken: string
): Promise<boolean> {
const isMaster =
await hashFunction([ownStorageToken, otherStorageToken].join('|'))
>
await hashFunction([otherStorageToken, ownStorageToken].join('|'));
return isMaster;
}
/**
* Send a message to the peer and await the answer.
* @throws with an EmptyErrorImpl if the peer connection
* was closed before an answer was received.
*/
export function sendMessageAndAwaitAnswer<PeerType>(
handler: WebRTCConnectionHandler<PeerType>,
peer: PeerType,
message: WebRTCMessage
): Promise<WebRTCResponse> {
const requestId = message.id;
const answerPromise = firstValueFrom(
handler.response$.pipe(
filter(d => d.peer === peer),
filter(d => d.response.id === requestId),
map(d => d.response)
)
);
handler.send(peer, message);
return answerPromise;
}