Skip to content

Commit 3415811

Browse files
maschadachingbrain
andauthored
fix: react native adjustments (#2229)
- export typed event emitter separately from setMaxListeners - update react-native overrides in module package.json files - add react-native-webrtc implementation to WebRTC transport --------- Co-authored-by: achingbrain <alex@achingbrain.net>
1 parent 6d11e82 commit 3415811

File tree

16 files changed

+142
-132
lines changed

16 files changed

+142
-132
lines changed

packages/interface/package.json

+3
Original file line numberDiff line numberDiff line change
@@ -74,5 +74,8 @@
7474
},
7575
"browser": {
7676
"events": "./dist/src/events.browser.js"
77+
},
78+
"react-native": {
79+
"./dist/src/events.js": "./dist/src/events.browser.js"
7780
}
7881
}
+116
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
export interface EventCallback<EventType> { (evt: EventType): void }
2+
export interface EventObject<EventType> { handleEvent: EventCallback<EventType> }
3+
export type EventHandler<EventType> = EventCallback<EventType> | EventObject<EventType>
4+
5+
interface Listener {
6+
once: boolean
7+
callback: any
8+
}
9+
10+
/**
11+
* Adds types to the EventTarget class. Hopefully this won't be necessary forever.
12+
*
13+
* https://github.com/microsoft/TypeScript/issues/28357
14+
* https://github.com/microsoft/TypeScript/issues/43477
15+
* https://github.com/microsoft/TypeScript/issues/299
16+
* etc
17+
*/
18+
export interface TypedEventTarget <EventMap extends Record<string, any>> extends EventTarget {
19+
addEventListener<K extends keyof EventMap>(type: K, listener: EventHandler<EventMap[K]> | null, options?: boolean | AddEventListenerOptions): void
20+
21+
listenerCount (type: string): number
22+
23+
removeEventListener<K extends keyof EventMap>(type: K, listener?: EventHandler<EventMap[K]> | null, options?: boolean | EventListenerOptions): void
24+
25+
removeEventListener (type: string, listener?: EventHandler<Event>, options?: boolean | EventListenerOptions): void
26+
27+
safeDispatchEvent<Detail>(type: keyof EventMap, detail: CustomEventInit<Detail>): boolean
28+
}
29+
30+
/**
31+
* An implementation of a typed event target
32+
* etc
33+
*/
34+
export class TypedEventEmitter<EventMap extends Record<string, any>> extends EventTarget implements TypedEventTarget<EventMap> {
35+
#listeners = new Map<any, Listener[]>()
36+
37+
listenerCount (type: string): number {
38+
const listeners = this.#listeners.get(type)
39+
40+
if (listeners == null) {
41+
return 0
42+
}
43+
44+
return listeners.length
45+
}
46+
47+
addEventListener<K extends keyof EventMap>(type: K, listener: EventHandler<EventMap[K]> | null, options?: boolean | AddEventListenerOptions): void
48+
addEventListener (type: string, listener: EventHandler<Event>, options?: boolean | AddEventListenerOptions): void {
49+
super.addEventListener(type, listener, options)
50+
51+
let list = this.#listeners.get(type)
52+
53+
if (list == null) {
54+
list = []
55+
this.#listeners.set(type, list)
56+
}
57+
58+
list.push({
59+
callback: listener,
60+
once: (options !== true && options !== false && options?.once) ?? false
61+
})
62+
}
63+
64+
removeEventListener<K extends keyof EventMap>(type: K, listener?: EventHandler<EventMap[K]> | null, options?: boolean | EventListenerOptions): void
65+
removeEventListener (type: string, listener?: EventHandler<Event>, options?: boolean | EventListenerOptions): void {
66+
super.removeEventListener(type.toString(), listener ?? null, options)
67+
68+
let list = this.#listeners.get(type)
69+
70+
if (list == null) {
71+
return
72+
}
73+
74+
list = list.filter(({ callback }) => callback !== listener)
75+
this.#listeners.set(type, list)
76+
}
77+
78+
dispatchEvent (event: Event): boolean {
79+
const result = super.dispatchEvent(event)
80+
81+
let list = this.#listeners.get(event.type)
82+
83+
if (list == null) {
84+
return result
85+
}
86+
87+
list = list.filter(({ once }) => !once)
88+
this.#listeners.set(event.type, list)
89+
90+
return result
91+
}
92+
93+
safeDispatchEvent<Detail>(type: keyof EventMap, detail: CustomEventInit<Detail>): boolean {
94+
return this.dispatchEvent(new CustomEvent<Detail>(type as string, detail))
95+
}
96+
}
97+
98+
/**
99+
* CustomEvent is a standard event but it's not supported by node.
100+
*
101+
* Remove this when https://github.com/nodejs/node/issues/40678 is closed.
102+
*
103+
* Ref: https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent
104+
*/
105+
class CustomEventPolyfill<T = any> extends Event {
106+
/** Returns any custom data event was created with. Typically used for synthetic events. */
107+
public detail: T
108+
109+
constructor (message: string, data?: EventInit & { detail: T }) {
110+
super(message, data)
111+
// @ts-expect-error could be undefined
112+
this.detail = data?.detail
113+
}
114+
}
115+
116+
export const CustomEvent = globalThis.CustomEvent ?? CustomEventPolyfill

packages/interface/src/events.ts

-117
Original file line numberDiff line numberDiff line change
@@ -1,122 +1,5 @@
11
import { setMaxListeners as nodeSetMaxListeners } from 'events'
22

3-
export interface EventCallback<EventType> { (evt: EventType): void }
4-
export interface EventObject<EventType> { handleEvent: EventCallback<EventType> }
5-
export type EventHandler<EventType> = EventCallback<EventType> | EventObject<EventType>
6-
7-
interface Listener {
8-
once: boolean
9-
callback: any
10-
}
11-
12-
/**
13-
* Adds types to the EventTarget class. Hopefully this won't be necessary forever.
14-
*
15-
* https://github.com/microsoft/TypeScript/issues/28357
16-
* https://github.com/microsoft/TypeScript/issues/43477
17-
* https://github.com/microsoft/TypeScript/issues/299
18-
* etc
19-
*/
20-
export interface TypedEventTarget <EventMap extends Record<string, any>> extends EventTarget {
21-
addEventListener<K extends keyof EventMap>(type: K, listener: EventHandler<EventMap[K]> | null, options?: boolean | AddEventListenerOptions): void
22-
23-
listenerCount (type: string): number
24-
25-
removeEventListener<K extends keyof EventMap>(type: K, listener?: EventHandler<EventMap[K]> | null, options?: boolean | EventListenerOptions): void
26-
27-
removeEventListener (type: string, listener?: EventHandler<Event>, options?: boolean | EventListenerOptions): void
28-
29-
safeDispatchEvent<Detail>(type: keyof EventMap, detail: CustomEventInit<Detail>): boolean
30-
}
31-
32-
/**
33-
* An implementation of a typed event target
34-
* etc
35-
*/
36-
export class TypedEventEmitter<EventMap extends Record<string, any>> extends EventTarget implements TypedEventTarget<EventMap> {
37-
#listeners = new Map<any, Listener[]>()
38-
39-
listenerCount (type: string): number {
40-
const listeners = this.#listeners.get(type)
41-
42-
if (listeners == null) {
43-
return 0
44-
}
45-
46-
return listeners.length
47-
}
48-
49-
addEventListener<K extends keyof EventMap>(type: K, listener: EventHandler<EventMap[K]> | null, options?: boolean | AddEventListenerOptions): void
50-
addEventListener (type: string, listener: EventHandler<Event>, options?: boolean | AddEventListenerOptions): void {
51-
super.addEventListener(type, listener, options)
52-
53-
let list = this.#listeners.get(type)
54-
55-
if (list == null) {
56-
list = []
57-
this.#listeners.set(type, list)
58-
}
59-
60-
list.push({
61-
callback: listener,
62-
once: (options !== true && options !== false && options?.once) ?? false
63-
})
64-
}
65-
66-
removeEventListener<K extends keyof EventMap>(type: K, listener?: EventHandler<EventMap[K]> | null, options?: boolean | EventListenerOptions): void
67-
removeEventListener (type: string, listener?: EventHandler<Event>, options?: boolean | EventListenerOptions): void {
68-
super.removeEventListener(type.toString(), listener ?? null, options)
69-
70-
let list = this.#listeners.get(type)
71-
72-
if (list == null) {
73-
return
74-
}
75-
76-
list = list.filter(({ callback }) => callback !== listener)
77-
this.#listeners.set(type, list)
78-
}
79-
80-
dispatchEvent (event: Event): boolean {
81-
const result = super.dispatchEvent(event)
82-
83-
let list = this.#listeners.get(event.type)
84-
85-
if (list == null) {
86-
return result
87-
}
88-
89-
list = list.filter(({ once }) => !once)
90-
this.#listeners.set(event.type, list)
91-
92-
return result
93-
}
94-
95-
safeDispatchEvent<Detail>(type: keyof EventMap, detail: CustomEventInit<Detail>): boolean {
96-
return this.dispatchEvent(new CustomEvent<Detail>(type as string, detail))
97-
}
98-
}
99-
100-
/**
101-
* CustomEvent is a standard event but it's not supported by node.
102-
*
103-
* Remove this when https://github.com/nodejs/node/issues/40678 is closed.
104-
*
105-
* Ref: https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent
106-
*/
107-
class CustomEventPolyfill<T = any> extends Event {
108-
/** Returns any custom data event was created with. Typically used for synthetic events. */
109-
public detail: T
110-
111-
constructor (message: string, data?: EventInit & { detail: T }) {
112-
super(message, data)
113-
// @ts-expect-error could be undefined
114-
this.detail = data?.detail
115-
}
116-
}
117-
118-
export const CustomEvent = globalThis.CustomEvent ?? CustomEventPolyfill
119-
1203
// create a setMaxListeners that doesn't break browser usage
1214
export const setMaxListeners: typeof nodeSetMaxListeners = (n, ...eventTargets) => {
1225
try {

packages/interface/src/index.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
import type { Connection, NewStreamOptions, Stream } from './connection/index.js'
1818
import type { ContentRouting } from './content-routing/index.js'
19-
import type { TypedEventTarget } from './events.js'
19+
import type { TypedEventTarget } from './event-target.js'
2020
import type { Metrics } from './metrics/index.js'
2121
import type { PeerId } from './peer-id/index.js'
2222
import type { PeerInfo } from './peer-info/index.js'
@@ -690,5 +690,6 @@ export * from './stream-muxer/index.js'
690690
export * from './topology/index.js'
691691
export * from './transport/index.js'
692692
export * from './errors.js'
693+
export * from './event-target.js'
693694
export * from './events.js'
694695
export * from './startable.js'

packages/interface/src/peer-discovery/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { TypedEventTarget } from '../events.js'
1+
import type { TypedEventTarget } from '../event-target.js'
22
import type { PeerInfo } from '../peer-info/index.js'
33

44
/**

packages/interface/src/pubsub/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { Stream } from '../connection/index.js'
2-
import type { TypedEventTarget } from '../events.js'
2+
import type { TypedEventTarget } from '../event-target.js'
33
import type { PeerId } from '../peer-id/index.js'
44
import type { Pushable } from 'it-pushable'
55
import type { Uint8ArrayList } from 'uint8arraylist'

packages/interface/src/transport/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { Connection, MultiaddrConnection } from '../connection/index.js'
2-
import type { TypedEventTarget } from '../events.js'
2+
import type { TypedEventTarget } from '../event-target.js'
33
import type { AbortOptions } from '../index.js'
44
import type { StreamMuxerFactory } from '../stream-muxer/index.js'
55
import type { Multiaddr } from '@multiformats/multiaddr'

packages/libp2p/package.json

+4
Original file line numberDiff line numberDiff line change
@@ -142,5 +142,9 @@
142142
"browser": {
143143
"./dist/src/connection-manager/constants.js": "./dist/src/connection-manager/constants.browser.js",
144144
"./dist/src/config/connection-gater.js": "./dist/src/config/connection-gater.browser.js"
145+
},
146+
"react-native": {
147+
"./dist/src/connection-manager/constants.js": "./dist/src/connection-manager/constants.browser.js",
148+
"./dist/src/config/connection-gater.js": "./dist/src/config/connection-gater.browser.js"
145149
}
146150
}

packages/stream-multiplexer-mplex/package.json

-3
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,5 @@
8686
"it-pipe": "^3.0.1",
8787
"p-defer": "^4.0.0",
8888
"random-int": "^3.0.0"
89-
},
90-
"browser": {
91-
"./dist/src/alloc-unsafe.js": "./dist/src/alloc-unsafe-browser.js"
9289
}
9390
}

packages/stream-multiplexer-mplex/src/alloc-unsafe-browser.ts

-3
This file was deleted.

packages/stream-multiplexer-mplex/src/alloc-unsafe.ts

-3
This file was deleted.

packages/stream-multiplexer-mplex/src/encode.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as varint from 'uint8-varint'
22
import { Uint8ArrayList } from 'uint8arraylist'
3-
import { allocUnsafe } from './alloc-unsafe.js'
3+
import { allocUnsafe } from 'uint8arrays/alloc'
44
import { type Message, MessageTypes } from './message-types.js'
55
import type { Source } from 'it-stream-types'
66

packages/transport-webrtc/package.json

+4
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
"p-timeout": "^6.1.2",
7474
"protons-runtime": "^5.0.0",
7575
"race-signal": "^1.0.0",
76+
"react-native-webrtc": "^118.0.0",
7677
"uint8arraylist": "^2.4.3",
7778
"uint8arrays": "^5.0.0"
7879
},
@@ -97,5 +98,8 @@
9798
},
9899
"browser": {
99100
"./dist/src/webrtc/index.js": "./dist/src/webrtc/index.browser.js"
101+
},
102+
"react-native": {
103+
"./dist/src/webrtc/index.js": "./dist/src/webrtc/index.react-native.js"
100104
}
101105
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export {
2+
RTCIceCandidate,
3+
RTCPeerConnection,
4+
RTCSessionDescription
5+
} from 'react-native-webrtc'

packages/transport-websockets/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@
7979
"@multiformats/multiaddr": "^12.1.10",
8080
"@multiformats/multiaddr-to-uri": "^9.0.2",
8181
"@types/ws": "^8.5.4",
82-
"it-ws": "^6.0.0",
82+
"it-ws": "^6.1.0",
8383
"p-defer": "^4.0.0",
8484
"wherearewe": "^2.0.1",
8585
"ws": "^8.12.1"

packages/transport-webtransport/package.json

+3
Original file line numberDiff line numberDiff line change
@@ -68,5 +68,8 @@
6868
},
6969
"browser": {
7070
"./dist/src/listener.js": "./dist/src/listener.browser.js"
71+
},
72+
"react-native": {
73+
"./dist/src/listener.js": "./dist/src/listener.browser.js"
7174
}
7275
}

0 commit comments

Comments
 (0)