mirror of
https://github.com/cerc-io/watcher-ts
synced 2025-01-24 03:59:06 +00:00
Nabarun Gogoi
cd29b47ecc
* Initial implementation of class and discoving other peers * Implement peer connection and sending messages between peers * Add react app and use peer package for broadcasting * Maintain stream for each remote peer * Refactor code in peer package * Add serve package for react-app * Add readme for running react app * Add peer package readme * Add logs for events with details * Add a chat CLI using peer package (#280) * Add a flag to instantiate Peer for nodejs * Add a basic chat CLI using peer * Add a signal server arg to chat CLI * Add instructions for chat CLI * Fix typescript and ESM issues after adding peer package (#282) * Fix build issues in util package * Update eslint TS plugins * Scope react app package name * Convert cli package back to CJS and dynamically import ESM * Upgrade ts-node version * Fix tests * Setup a relay node and pubsub based discovery (#284) * Add a script to setup a relay node * Use pubsub based peer discovery * Add peer multiaddr to connection log * Catch relay node dial errors * Increase discovery interval and dial all mutiaddr * Add UI to display self peer ID and multiaddrs * Add UI for displaying live remote connections * Send js objects in peer broadcast messages * Add react-peer package for using peer in react app * Reduce disconnect frequency between peers (#287) * Restrict number of max concurrent dials per peer * Increase hop relay timeout to 1 day * Self review changes * Review changes * Increase pubsub discovery interval and add steps to create a peer id (#290) * Increase pubsub discovery interval * Disable autodial to avoid peer dials without protocol on a reconnect * Add steps to create a peer id and use for relay node * Add back dependency to run signalling server * Avoid bootstrapping and dial to relay node directly Co-authored-by: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Co-authored-by: prathamesh0 <prathamesh.musale0@gmail.com>
89 lines
1.8 KiB
TypeScript
89 lines
1.8 KiB
TypeScript
//
|
|
// Copyright 2021 Vulcanize, Inc.
|
|
//
|
|
|
|
import assert from 'assert';
|
|
import canonicalStringify from 'canonical-json';
|
|
import { ethers } from 'ethers';
|
|
import level from 'level';
|
|
import fs from 'fs-extra';
|
|
import path from 'path';
|
|
import debug from 'debug';
|
|
|
|
const log = debug('vulcanize:cache');
|
|
|
|
export interface Config {
|
|
name: string;
|
|
enabled: boolean;
|
|
deleteOnStart: boolean;
|
|
}
|
|
|
|
export const getCache = async (config: Config): Promise<undefined | Cache> => {
|
|
let cache;
|
|
|
|
// Cache is optional.
|
|
if (config) {
|
|
const { name, enabled, deleteOnStart } = config;
|
|
|
|
assert(name);
|
|
|
|
const cacheDirPath = path.join(process.cwd(), 'out', `${name}.db`);
|
|
await fs.ensureDir(cacheDirPath);
|
|
|
|
// Delete cache on start.
|
|
if (deleteOnStart) {
|
|
await fs.emptyDir(cacheDirPath);
|
|
}
|
|
|
|
// Enable/disable flag for the cache.
|
|
if (enabled) {
|
|
cache = new Cache(name, cacheDirPath);
|
|
}
|
|
}
|
|
|
|
return cache;
|
|
};
|
|
|
|
export class Cache {
|
|
_db: any;
|
|
_name: string;
|
|
|
|
constructor (name: string, dirPath: string) {
|
|
assert(name);
|
|
assert(dirPath);
|
|
|
|
this._name = name;
|
|
this._db = level(dirPath, { valueEncoding: 'json' });
|
|
}
|
|
|
|
key (obj: any): string {
|
|
return this._cacheKey(obj);
|
|
}
|
|
|
|
async get (obj: any): Promise<[any, boolean] | undefined> {
|
|
const key = this._cacheKey(obj);
|
|
|
|
try {
|
|
const value = await this._db.get(key);
|
|
|
|
log(`${this._name}: cache hit ${key}`);
|
|
|
|
return [value, true];
|
|
} catch (err: any) {
|
|
log(`${this._name}: cache miss ${key}`);
|
|
|
|
if (err.notFound) {
|
|
return [undefined, false];
|
|
}
|
|
}
|
|
}
|
|
|
|
async put (obj: any, value: any): Promise<void> {
|
|
await this._db.put(this._cacheKey(obj), value);
|
|
}
|
|
|
|
_cacheKey (obj: any): string {
|
|
return ethers.utils.keccak256(Buffer.from(canonicalStringify(obj)));
|
|
}
|
|
}
|