Add adapter to net2
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
--ignore-dir=docs
|
||||
--ignore-dir=dist
|
||||
--ignore-dir=build
|
||||
--ignore-dir=__tests__
|
||||
--ignore-dir=.svelte-kit
|
||||
--ignore-file=match:yarn.lock
|
||||
|
||||
+3
-3
@@ -11,8 +11,8 @@ for downstream in $(./get_packages.py); do
|
||||
v=$(jq '.dependencies["'$n'"] // empty' $f)
|
||||
|
||||
if [[ ! -z $v ]]; then
|
||||
mkdir -p packages/$downstream/node_modules/@welshman
|
||||
cp -r packages/$upstream/build packages/$downstream/node_modules/@welshman/build
|
||||
cp -r packages/$upstream/build node_modules/@welshman/build
|
||||
mkdir -p packages/$downstream/node_modules/@welshman/$upstream
|
||||
cp -r packages/$upstream/build packages/$downstream/node_modules/@welshman/$upstream > /dev/null 2>&1
|
||||
cp -r packages/$upstream/build node_modules/@welshman/$upstream > /dev/null 2>&1
|
||||
fi
|
||||
done
|
||||
|
||||
Generated
+43
-12
@@ -2695,6 +2695,10 @@
|
||||
"resolved": "packages/net",
|
||||
"link": true
|
||||
},
|
||||
"node_modules/@welshman/net2": {
|
||||
"resolved": "packages/net2",
|
||||
"link": true
|
||||
},
|
||||
"node_modules/@welshman/signer": {
|
||||
"resolved": "packages/signer",
|
||||
"link": true
|
||||
@@ -6656,7 +6660,7 @@
|
||||
"version": "6.6.7",
|
||||
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
|
||||
"integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"tslib": "^1.9.0"
|
||||
@@ -7336,7 +7340,7 @@
|
||||
"version": "1.14.1",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
|
||||
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
|
||||
"dev": true,
|
||||
"devOptional": true,
|
||||
"license": "0BSD"
|
||||
},
|
||||
"node_modules/tsutils": {
|
||||
@@ -7381,6 +7385,15 @@
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/typed-emitter": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/typed-emitter/-/typed-emitter-2.1.0.tgz",
|
||||
"integrity": "sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==",
|
||||
"license": "MIT",
|
||||
"optionalDependencies": {
|
||||
"rxjs": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/typedoc": {
|
||||
"version": "0.27.9",
|
||||
"resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.27.9.tgz",
|
||||
@@ -8140,15 +8153,6 @@
|
||||
"throttle-debounce": "^5.0.2"
|
||||
}
|
||||
},
|
||||
"packages/app/node_modules/@scure/base": {
|
||||
"version": "1.2.4",
|
||||
"resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.4.tgz",
|
||||
"integrity": "sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ==",
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
"url": "https://paulmillr.com/funding/"
|
||||
}
|
||||
},
|
||||
"packages/app/node_modules/@welshman/feeds/node_modules/@welshman/lib": {
|
||||
"version": "0.0.41",
|
||||
"resolved": "https://registry.npmjs.org/@welshman/lib/-/lib-0.0.41.tgz",
|
||||
@@ -8177,6 +8181,7 @@
|
||||
"version": "0.0.41",
|
||||
"resolved": "https://registry.npmjs.org/@welshman/lib/-/lib-0.0.41.tgz",
|
||||
"integrity": "sha512-FMJVoPZw8Vi1fd2/ulwqlBS1tvjkFAm9lg+Dz5SXItXxrNC06YMRTjGjInCBEkArrvNGPUjchzSFDNmbH0fxHQ==",
|
||||
"extraneous": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@scure/base": "^1.1.6",
|
||||
@@ -8198,7 +8203,7 @@
|
||||
},
|
||||
"packages/content": {
|
||||
"name": "@welshman/content",
|
||||
"version": "0.1.0",
|
||||
"version": "0.1.1",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@braintree/sanitize-url": "^7.0.2",
|
||||
@@ -8273,6 +8278,9 @@
|
||||
"@scure/base": "^1.1.6",
|
||||
"@types/events": "^3.0.3",
|
||||
"events": "^3.3.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12.0.0"
|
||||
}
|
||||
},
|
||||
"packages/lib/node_modules/@scure/base": {
|
||||
@@ -8296,6 +8304,29 @@
|
||||
"mocha": "^10.7.3"
|
||||
}
|
||||
},
|
||||
"packages/net2": {
|
||||
"name": "@welshman/net2",
|
||||
"version": "0.0.48",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@welshman/lib": "^0.1.0",
|
||||
"@welshman/util": "^0.1.0",
|
||||
"isomorphic-ws": "^5.0.0",
|
||||
"typed-emitter": "^2.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"mocha": "^10.7.3"
|
||||
}
|
||||
},
|
||||
"packages/net2/node_modules/@scure/base": {
|
||||
"version": "1.2.4",
|
||||
"resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.4.tgz",
|
||||
"integrity": "sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ==",
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
"url": "https://paulmillr.com/funding/"
|
||||
}
|
||||
},
|
||||
"packages/signer": {
|
||||
"name": "@welshman/signer",
|
||||
"version": "0.1.0",
|
||||
|
||||
@@ -935,6 +935,13 @@ export const once = (f: (...args: any) => void) => {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls a function
|
||||
* @param f - Function to call
|
||||
* @returns Whatever f returns
|
||||
*/
|
||||
export const call = <T>(f: () => T, ...args: unknown[]) => f()
|
||||
|
||||
/**
|
||||
* Memoizes function results based on arguments
|
||||
* @param f - Function to memoize
|
||||
@@ -1110,6 +1117,30 @@ export const pushToMapKey = <K, T>(m: Map<K, T[]>, k: K, v: T) => {
|
||||
m.set(k, a)
|
||||
}
|
||||
|
||||
/**
|
||||
* A generic type-safe event listener function that auto-detects the appropriate methods
|
||||
* for adding and removing event listeners.
|
||||
*
|
||||
* @param target - The event target object with add/remove listener methods
|
||||
* @param eventName - The name of the event to listen for
|
||||
* @param callback - The callback function to execute when the event occurs
|
||||
* @returns A function that removes the event listener when called
|
||||
*/
|
||||
export const on = <EventName extends string, Args extends any[]>(
|
||||
target: {
|
||||
on: (event: EventName, handler: (...args: Args) => any, ...rest: any[]) => any
|
||||
off: (event: EventName, handler: (...args: Args) => any, ...rest: any[]) => any
|
||||
},
|
||||
eventName: EventName,
|
||||
callback: (...args: Args) => void,
|
||||
): (() => void) => {
|
||||
target.on(eventName, callback)
|
||||
|
||||
return () => {
|
||||
target.off(eventName, callback)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Switches on key in object, with default fallback
|
||||
* @param k - Key to look up
|
||||
|
||||
@@ -30,9 +30,9 @@
|
||||
"mocha": "^10.7.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"@welshman/lib": "~0.0.40",
|
||||
"@welshman/util": "~0.0.59",
|
||||
"@welshman/lib": "^0.1.0",
|
||||
"@welshman/util": "^0.1.0",
|
||||
"isomorphic-ws": "^5.0.0",
|
||||
"ws": "^8.16.0"
|
||||
"typed-emitter": "^2.1.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
import {eq, on, call} from "@welshman/lib"
|
||||
import {Relay} from "@welshman/util"
|
||||
import {RelayMessage, ClientMessage} from "./message.js"
|
||||
import {Socket} from "./socket.js"
|
||||
|
||||
type Unsubscriber = () => void
|
||||
|
||||
const trackUnsubscribers = (all: Unsubscriber[], local: Unsubscriber[]) => {
|
||||
all.push(...local)
|
||||
|
||||
return () => {
|
||||
local.forEach(call)
|
||||
|
||||
for (const f of local) {
|
||||
all.splice(all.findIndex(eq(f)), 1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
type RelayMessageSub = (message: RelayMessage) => void
|
||||
|
||||
export interface IAdapter {
|
||||
sockets: Socket[]
|
||||
send(message: ClientMessage): void
|
||||
onMessage(cb: RelayMessageSub): Unsubscriber
|
||||
}
|
||||
|
||||
export class SocketsAdapter implements IAdapter {
|
||||
_unsubscribers: Unsubscriber[] = []
|
||||
|
||||
constructor(readonly sockets: Socket[]) {}
|
||||
|
||||
send(message: ClientMessage) {
|
||||
for (const socket of this.sockets) {
|
||||
socket.send(message)
|
||||
}
|
||||
}
|
||||
|
||||
onMessage(cb: RelayMessageSub) {
|
||||
return trackUnsubscribers(
|
||||
this._unsubscribers,
|
||||
this.sockets.map(s => s.onMessage(cb)),
|
||||
)
|
||||
}
|
||||
|
||||
cleanup() {
|
||||
this._unsubscribers.splice(0).forEach(call)
|
||||
}
|
||||
}
|
||||
|
||||
export class LocalAdapter {
|
||||
_unsubscribers: Unsubscriber[] = []
|
||||
|
||||
constructor(readonly relay: Relay) {}
|
||||
|
||||
get sockets() {
|
||||
return []
|
||||
}
|
||||
|
||||
send(message: ClientMessage) {
|
||||
const [type, ...rest] = message
|
||||
|
||||
this.relay.send(type, ...rest)
|
||||
}
|
||||
|
||||
onMessage(cb: RelayMessageSub) {
|
||||
return trackUnsubscribers(this._unsubscribers, [
|
||||
on(this.relay, "*", (...args: any[]) => cb(args)),
|
||||
])
|
||||
}
|
||||
|
||||
cleanup() {
|
||||
this._unsubscribers.splice(0).forEach(call)
|
||||
}
|
||||
}
|
||||
|
||||
export class MultiAdapter {
|
||||
_unsubscribers: Unsubscriber[] = []
|
||||
|
||||
constructor(readonly adapters: IAdapter[]) {}
|
||||
|
||||
get sockets() {
|
||||
return this.adapters.flatMap(t => t.sockets)
|
||||
}
|
||||
|
||||
send(message: ClientMessage) {
|
||||
for (const adapter of this.adapters) {
|
||||
adapter.send(message)
|
||||
}
|
||||
}
|
||||
|
||||
onMessage(cb: RelayMessageSub) {
|
||||
return trackUnsubscribers(
|
||||
this._unsubscribers,
|
||||
this.adapters.map(a => a.onMessage(cb)),
|
||||
)
|
||||
}
|
||||
|
||||
cleanup() {
|
||||
this._unsubscribers.splice(0).forEach(call)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user