@adeeliore/p2p-lan-signaling 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/API_REFERENCE.md +158 -0
- package/CHANGELOG.md +9 -0
- package/LICENSE +12 -0
- package/README.md +118 -0
- package/app.plugin.js +1 -0
- package/dist/constants.d.ts +17 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +19 -0
- package/dist/discovery.d.ts +3 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +10 -0
- package/dist/errors.d.ts +16 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +16 -0
- package/dist/host.d.ts +5 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +23 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/messageValidation.d.ts +3 -0
- package/dist/messageValidation.d.ts.map +1 -0
- package/dist/messageValidation.js +90 -0
- package/dist/nativeModule.d.ts +7 -0
- package/dist/nativeModule.d.ts.map +1 -0
- package/dist/nativeModule.js +39 -0
- package/dist/provider.d.ts +20 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +91 -0
- package/dist/providerUtils.d.ts +3 -0
- package/dist/providerUtils.d.ts.map +1 -0
- package/dist/providerUtils.js +18 -0
- package/dist/roomUtils.d.ts +3 -0
- package/dist/roomUtils.d.ts.map +1 -0
- package/dist/roomUtils.js +15 -0
- package/dist/types.d.ts +99 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/package.json +54 -0
- package/plugin/templates/android/OfflineSignalingPackage.kt +609 -0
- package/plugin/templates/ios/OfflineSignalingHost.swift +703 -0
- package/plugin/templates/ios/OfflineSignalingHostBridge.m +22 -0
- package/plugin/withP2PLanSignaling.js +144 -0
package/API_REFERENCE.md
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# API Reference
|
|
2
|
+
|
|
3
|
+
## Install
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npm install @adeeliore/p2p-lan-signaling
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## 1. Check Native Availability
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
import { isLanSignalingHostAvailable } from '@adeeliore/p2p-lan-signaling';
|
|
13
|
+
|
|
14
|
+
if (!isLanSignalingHostAvailable()) {
|
|
15
|
+
throw new Error('Native LAN signaling host is not available');
|
|
16
|
+
}
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## 2. Start A Host
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
import { startLanSignalingHost } from '@adeeliore/p2p-lan-signaling';
|
|
23
|
+
|
|
24
|
+
const host = await startLanSignalingHost({
|
|
25
|
+
port: 8080,
|
|
26
|
+
roomId: 'ROOM-1234',
|
|
27
|
+
displayName: 'Workshop board',
|
|
28
|
+
roomSecret: 'shared-secret',
|
|
29
|
+
});
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### `startLanSignalingHost(options)`
|
|
33
|
+
|
|
34
|
+
Starts a native LAN/offline signaling host.
|
|
35
|
+
|
|
36
|
+
Options:
|
|
37
|
+
|
|
38
|
+
- `port?`
|
|
39
|
+
- `roomId?`
|
|
40
|
+
- `displayName?`
|
|
41
|
+
- `roomSecret?`
|
|
42
|
+
|
|
43
|
+
Returns host status:
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
{
|
|
47
|
+
running: boolean;
|
|
48
|
+
hostAddress: string | null;
|
|
49
|
+
port: number | null;
|
|
50
|
+
url: string | null;
|
|
51
|
+
roomId?: string | null;
|
|
52
|
+
serviceName?: string | null;
|
|
53
|
+
serviceType?: string | null;
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## 3. Stop Or Inspect The Host
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
import {
|
|
61
|
+
getLanSignalingHostStatus,
|
|
62
|
+
stopLanSignalingHost,
|
|
63
|
+
} from '@adeeliore/p2p-lan-signaling';
|
|
64
|
+
|
|
65
|
+
const status = await getLanSignalingHostStatus();
|
|
66
|
+
await stopLanSignalingHost();
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Methods:
|
|
70
|
+
|
|
71
|
+
- `getLanSignalingHostStatus()`
|
|
72
|
+
- `stopLanSignalingHost()`
|
|
73
|
+
- `isLanSignalingHostAvailable()`
|
|
74
|
+
|
|
75
|
+
## 4. Discover Rooms
|
|
76
|
+
|
|
77
|
+
```ts
|
|
78
|
+
import { discoverLanSignalingRooms } from '@adeeliore/p2p-lan-signaling';
|
|
79
|
+
|
|
80
|
+
const rooms = await discoverLanSignalingRooms(2500);
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### `discoverLanSignalingRooms(timeoutMs?)`
|
|
84
|
+
|
|
85
|
+
Scans for rooms advertised through `_drawin._tcp`.
|
|
86
|
+
|
|
87
|
+
Return shape:
|
|
88
|
+
|
|
89
|
+
```ts
|
|
90
|
+
Array<{
|
|
91
|
+
serviceName: string;
|
|
92
|
+
serviceType: string;
|
|
93
|
+
hostAddress: string;
|
|
94
|
+
port: number;
|
|
95
|
+
url: string;
|
|
96
|
+
roomId?: string | null;
|
|
97
|
+
displayName?: string | null;
|
|
98
|
+
}>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## 5. Create A Signaling Provider
|
|
102
|
+
|
|
103
|
+
```ts
|
|
104
|
+
import { createLanSignalingProvider } from '@adeeliore/p2p-lan-signaling';
|
|
105
|
+
|
|
106
|
+
const provider = createLanSignalingProvider('ws://192.168.0.15:8080');
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### `createLanSignalingProvider(signalBaseUrl)`
|
|
110
|
+
|
|
111
|
+
Creates a signaling-provider object compatible with `@adeeliore/p2p-core`.
|
|
112
|
+
|
|
113
|
+
Typical integration:
|
|
114
|
+
|
|
115
|
+
```ts
|
|
116
|
+
import { createP2PSession } from '@adeeliore/p2p-core';
|
|
117
|
+
import {
|
|
118
|
+
createLanSignalingProvider,
|
|
119
|
+
discoverLanSignalingRooms,
|
|
120
|
+
} from '@adeeliore/p2p-lan-signaling';
|
|
121
|
+
|
|
122
|
+
const rooms = await discoverLanSignalingRooms();
|
|
123
|
+
const selectedRoom = rooms[0];
|
|
124
|
+
|
|
125
|
+
const session = createP2PSession({
|
|
126
|
+
sessionId: selectedRoom.roomId ?? 'ROOM-1234',
|
|
127
|
+
accessToken: 'shared-secret',
|
|
128
|
+
signalingProvider: createLanSignalingProvider(selectedRoom.url),
|
|
129
|
+
});
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## 6. Expo Plugin Entry Points
|
|
133
|
+
|
|
134
|
+
Use one of these plugin references:
|
|
135
|
+
|
|
136
|
+
- `@adeeliore/p2p-lan-signaling/app.plugin`
|
|
137
|
+
- `@adeeliore/p2p-lan-signaling/plugin/withP2PLanSignaling`
|
|
138
|
+
|
|
139
|
+
Example:
|
|
140
|
+
|
|
141
|
+
```json
|
|
142
|
+
{
|
|
143
|
+
"expo": {
|
|
144
|
+
"plugins": [
|
|
145
|
+
"@adeeliore/p2p-lan-signaling/app.plugin"
|
|
146
|
+
]
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Constants
|
|
152
|
+
|
|
153
|
+
- `LAN_SIGNALING_DEFAULT_PORT`
|
|
154
|
+
- `LAN_SIGNALING_DISCOVERY_TIMEOUT_MS`
|
|
155
|
+
- `LAN_SIGNALING_SERVICE_TYPE`
|
|
156
|
+
|
|
157
|
+
Primary naming uses `Lan*`.
|
|
158
|
+
`Offline*` exports are compatibility aliases.
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.1.0
|
|
4
|
+
|
|
5
|
+
- initial public package layout;
|
|
6
|
+
- JS API for starting/stopping native LAN signaling hosts;
|
|
7
|
+
- LAN room discovery over `_drawin._tcp`;
|
|
8
|
+
- `SignalingProvider` bridge for `@adeeliore/p2p-core`;
|
|
9
|
+
- Expo config plugin with Android and iOS native templates.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
Copyright (C) 2026
|
|
2
|
+
|
|
3
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
4
|
+
purpose with or without fee is hereby granted.
|
|
5
|
+
|
|
6
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
7
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
8
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
9
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
10
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
11
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
12
|
+
PERFORMANCE OF THIS SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# `@adeeliore/p2p-lan-signaling`
|
|
2
|
+
|
|
3
|
+
LAN and offline signaling adapter for React Native apps.
|
|
4
|
+
|
|
5
|
+
This package adds two things on top of a P2P app architecture:
|
|
6
|
+
|
|
7
|
+
- native LAN signaling host on Android and iOS;
|
|
8
|
+
- room discovery over `_drawin._tcp`;
|
|
9
|
+
- a signaling-provider adapter compatible with `@adeeliore/p2p-core`;
|
|
10
|
+
- an Expo config plugin that restores native code after `expo prebuild`.
|
|
11
|
+
|
|
12
|
+
Primary public naming uses the `Lan*` prefix.
|
|
13
|
+
`Offline*` exports remain available as compatibility aliases for existing app code.
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install @adeeliore/p2p-lan-signaling
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
If the app also uses the P2P runtime:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm install @adeeliore/p2p-core
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Typical Flow
|
|
28
|
+
|
|
29
|
+
### Host device
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
import { startLanSignalingHost } from '@adeeliore/p2p-lan-signaling';
|
|
33
|
+
|
|
34
|
+
const host = await startLanSignalingHost({
|
|
35
|
+
port: 8080,
|
|
36
|
+
roomId: 'ROOM-ABCD1234',
|
|
37
|
+
displayName: 'Workshop board',
|
|
38
|
+
roomSecret: 'shared-secret',
|
|
39
|
+
});
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Participant device
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
import { discoverLanSignalingRooms } from '@adeeliore/p2p-lan-signaling';
|
|
46
|
+
|
|
47
|
+
const rooms = await discoverLanSignalingRooms();
|
|
48
|
+
const selectedRoom = rooms[0];
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Connect the P2P runtime
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
import { createP2PSession } from '@adeeliore/p2p-core';
|
|
55
|
+
import {
|
|
56
|
+
createLanSignalingProvider,
|
|
57
|
+
startLanSignalingHost,
|
|
58
|
+
} from '@adeeliore/p2p-lan-signaling';
|
|
59
|
+
|
|
60
|
+
const host = await startLanSignalingHost({
|
|
61
|
+
roomId: 'ROOM-ABCD1234',
|
|
62
|
+
displayName: 'Workshop board',
|
|
63
|
+
roomSecret: 'shared-secret',
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
const session = createP2PSession({
|
|
67
|
+
sessionId: 'ROOM-ABCD1234',
|
|
68
|
+
clientId: 'teacher',
|
|
69
|
+
accessToken: 'shared-secret',
|
|
70
|
+
signalingProvider: createLanSignalingProvider(host.url!),
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
session.connect();
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Expo Plugin
|
|
77
|
+
|
|
78
|
+
Add the package plugin to app config:
|
|
79
|
+
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"expo": {
|
|
83
|
+
"plugins": [
|
|
84
|
+
"@adeeliore/p2p-lan-signaling/app.plugin"
|
|
85
|
+
]
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Then rebuild the native app:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
npx expo prebuild -p android
|
|
94
|
+
npx expo prebuild -p ios
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Security Defaults
|
|
98
|
+
|
|
99
|
+
- room discovery advertises room metadata, not the room secret;
|
|
100
|
+
- protected rooms use `accessToken` or `roomSecret`;
|
|
101
|
+
- native hosts validate room id, client id, participant count and frame size.
|
|
102
|
+
|
|
103
|
+
## Error Model
|
|
104
|
+
|
|
105
|
+
Provider and native-boundary failures use stable error codes.
|
|
106
|
+
|
|
107
|
+
Examples:
|
|
108
|
+
|
|
109
|
+
- `ERR_UNSUPPORTED_PLATFORM`
|
|
110
|
+
- `ERR_NATIVE_MODULE_MISSING`
|
|
111
|
+
- `ERR_SIGNALING_NOT_CONNECTED`
|
|
112
|
+
- `ERR_INVALID_SIGNAL_MESSAGE`
|
|
113
|
+
- `ERR_SIGNALING_SOCKET_ERROR`
|
|
114
|
+
|
|
115
|
+
## Documentation
|
|
116
|
+
|
|
117
|
+
- usage-oriented API reference: [API_REFERENCE.md](/Users/whoami/diplom-p2p/DrawingApp/packages/p2p-lan-signaling/API_REFERENCE.md)
|
|
118
|
+
- changelog: [CHANGELOG.md](/Users/whoami/diplom-p2p/DrawingApp/packages/p2p-lan-signaling/CHANGELOG.md)
|
package/app.plugin.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = require('./plugin/withP2PLanSignaling');
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare const OFFLINE_SIGNALING_NATIVE_MODULE_NAME = "OfflineSignalingHost";
|
|
2
|
+
export declare const LAN_SIGNALING_DEFAULT_PORT = 8080;
|
|
3
|
+
export declare const LAN_SIGNALING_DISCOVERY_TIMEOUT_MS = 2500;
|
|
4
|
+
export declare const LAN_SIGNALING_SERVICE_TYPE = "_drawin._tcp";
|
|
5
|
+
export declare const LAN_SIGNALING_MESSAGE_TYPE: {
|
|
6
|
+
readonly WELCOME: "welcome";
|
|
7
|
+
readonly PEER_JOINED: "peer-joined";
|
|
8
|
+
readonly PEER_LEFT: "peer-left";
|
|
9
|
+
readonly PONG: "pong";
|
|
10
|
+
readonly OFFER: "offer";
|
|
11
|
+
readonly ANSWER: "answer";
|
|
12
|
+
readonly ICE: "ice";
|
|
13
|
+
readonly ERROR: "error";
|
|
14
|
+
};
|
|
15
|
+
export declare const UNSUPPORTED_PLATFORM_ERROR = "LAN signaling host is supported only on Android and iOS";
|
|
16
|
+
export declare const MISSING_NATIVE_MODULE_ERROR = "LAN signaling native module is not available. Rebuild the Android/iOS dev app with expo run:android or expo run:ios; Expo Go cannot load this module.";
|
|
17
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oCAAoC,yBAAyB,CAAC;AAC3E,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAC/C,eAAO,MAAM,kCAAkC,OAAO,CAAC;AACvD,eAAO,MAAM,0BAA0B,iBAAiB,CAAC;AAEzD,eAAO,MAAM,0BAA0B;;;;;;;;;CAS7B,CAAC;AAEX,eAAO,MAAM,0BAA0B,4DACsB,CAAC;AAE9D,eAAO,MAAM,2BAA2B,0JACmH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MISSING_NATIVE_MODULE_ERROR = exports.UNSUPPORTED_PLATFORM_ERROR = exports.LAN_SIGNALING_MESSAGE_TYPE = exports.LAN_SIGNALING_SERVICE_TYPE = exports.LAN_SIGNALING_DISCOVERY_TIMEOUT_MS = exports.LAN_SIGNALING_DEFAULT_PORT = exports.OFFLINE_SIGNALING_NATIVE_MODULE_NAME = void 0;
|
|
4
|
+
exports.OFFLINE_SIGNALING_NATIVE_MODULE_NAME = 'OfflineSignalingHost';
|
|
5
|
+
exports.LAN_SIGNALING_DEFAULT_PORT = 8080;
|
|
6
|
+
exports.LAN_SIGNALING_DISCOVERY_TIMEOUT_MS = 2500;
|
|
7
|
+
exports.LAN_SIGNALING_SERVICE_TYPE = '_drawin._tcp';
|
|
8
|
+
exports.LAN_SIGNALING_MESSAGE_TYPE = {
|
|
9
|
+
WELCOME: 'welcome',
|
|
10
|
+
PEER_JOINED: 'peer-joined',
|
|
11
|
+
PEER_LEFT: 'peer-left',
|
|
12
|
+
PONG: 'pong',
|
|
13
|
+
OFFER: 'offer',
|
|
14
|
+
ANSWER: 'answer',
|
|
15
|
+
ICE: 'ice',
|
|
16
|
+
ERROR: 'error',
|
|
17
|
+
};
|
|
18
|
+
exports.UNSUPPORTED_PLATFORM_ERROR = 'LAN signaling host is supported only on Android and iOS';
|
|
19
|
+
exports.MISSING_NATIVE_MODULE_ERROR = 'LAN signaling native module is not available. Rebuild the Android/iOS dev app with expo run:android or expo run:ios; Expo Go cannot load this module.';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAE5C,wBAAsB,yBAAyB,CAC3C,SAAS,SAAqC,GAC/C,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAG9B"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.discoverLanSignalingRooms = discoverLanSignalingRooms;
|
|
4
|
+
const constants_1 = require("./constants");
|
|
5
|
+
const nativeModule_1 = require("./nativeModule");
|
|
6
|
+
const roomUtils_1 = require("./roomUtils");
|
|
7
|
+
async function discoverLanSignalingRooms(timeoutMs = constants_1.LAN_SIGNALING_DISCOVERY_TIMEOUT_MS) {
|
|
8
|
+
const rooms = await (0, nativeModule_1.getNativeModule)().discoverHosts(timeoutMs);
|
|
9
|
+
return (0, roomUtils_1.dedupeRooms)(rooms);
|
|
10
|
+
}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const LAN_SIGNALING_ERROR_CODE: {
|
|
2
|
+
readonly UNSUPPORTED_PLATFORM: "ERR_UNSUPPORTED_PLATFORM";
|
|
3
|
+
readonly NATIVE_MODULE_MISSING: "ERR_NATIVE_MODULE_MISSING";
|
|
4
|
+
readonly SIGNALING_NOT_CONNECTED: "ERR_SIGNALING_NOT_CONNECTED";
|
|
5
|
+
readonly INVALID_SIGNAL_MESSAGE: "ERR_INVALID_SIGNAL_MESSAGE";
|
|
6
|
+
readonly SIGNALING_SOCKET_ERROR: "ERR_SIGNALING_SOCKET_ERROR";
|
|
7
|
+
};
|
|
8
|
+
export type LanSignalingErrorCode = typeof LAN_SIGNALING_ERROR_CODE[keyof typeof LAN_SIGNALING_ERROR_CODE];
|
|
9
|
+
export interface LanSignalingErrorPayload {
|
|
10
|
+
code: LanSignalingErrorCode;
|
|
11
|
+
message: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function createLanSignalingError(code: LanSignalingErrorCode, message: string): Error & {
|
|
14
|
+
code: LanSignalingErrorCode;
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,wBAAwB;;;;;;CAM3B,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAC7B,OAAO,wBAAwB,CAAC,MAAM,OAAO,wBAAwB,CAAC,CAAC;AAE3E,MAAM,WAAW,wBAAwB;IACrC,IAAI,EAAE,qBAAqB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,uBAAuB,CACnC,IAAI,EAAE,qBAAqB,EAC3B,OAAO,EAAE,MAAM,GAChB,KAAK,GAAG;IAAE,IAAI,EAAE,qBAAqB,CAAA;CAAE,CAIzC"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LAN_SIGNALING_ERROR_CODE = void 0;
|
|
4
|
+
exports.createLanSignalingError = createLanSignalingError;
|
|
5
|
+
exports.LAN_SIGNALING_ERROR_CODE = {
|
|
6
|
+
UNSUPPORTED_PLATFORM: 'ERR_UNSUPPORTED_PLATFORM',
|
|
7
|
+
NATIVE_MODULE_MISSING: 'ERR_NATIVE_MODULE_MISSING',
|
|
8
|
+
SIGNALING_NOT_CONNECTED: 'ERR_SIGNALING_NOT_CONNECTED',
|
|
9
|
+
INVALID_SIGNAL_MESSAGE: 'ERR_INVALID_SIGNAL_MESSAGE',
|
|
10
|
+
SIGNALING_SOCKET_ERROR: 'ERR_SIGNALING_SOCKET_ERROR',
|
|
11
|
+
};
|
|
12
|
+
function createLanSignalingError(code, message) {
|
|
13
|
+
const error = new Error(message);
|
|
14
|
+
error.code = code;
|
|
15
|
+
return error;
|
|
16
|
+
}
|
package/dist/host.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { LanSignalingHostOptions, LanSignalingHostStatus } from './types';
|
|
2
|
+
export declare function startLanSignalingHost(options?: LanSignalingHostOptions): Promise<LanSignalingHostStatus>;
|
|
3
|
+
export declare function stopLanSignalingHost(): Promise<void>;
|
|
4
|
+
export declare function getLanSignalingHostStatus(): Promise<LanSignalingHostStatus>;
|
|
5
|
+
//# sourceMappingURL=host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAE1E,wBAAsB,qBAAqB,CACvC,OAAO,GAAE,uBAA4B,GACtC,OAAO,CAAC,sBAAsB,CAAC,CASjC;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAG1D;AAED,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,sBAAsB,CAAC,CAMjF"}
|
package/dist/host.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.startLanSignalingHost = startLanSignalingHost;
|
|
4
|
+
exports.stopLanSignalingHost = stopLanSignalingHost;
|
|
5
|
+
exports.getLanSignalingHostStatus = getLanSignalingHostStatus;
|
|
6
|
+
const react_native_1 = require("react-native");
|
|
7
|
+
const constants_1 = require("./constants");
|
|
8
|
+
const nativeModule_1 = require("./nativeModule");
|
|
9
|
+
async function startLanSignalingHost(options = {}) {
|
|
10
|
+
var _a, _b, _c, _d;
|
|
11
|
+
(0, nativeModule_1.assertSupportedPlatform)();
|
|
12
|
+
return (0, nativeModule_1.getNativeModule)().startHost((_a = options.port) !== null && _a !== void 0 ? _a : constants_1.LAN_SIGNALING_DEFAULT_PORT, (_b = options.roomId) !== null && _b !== void 0 ? _b : null, (_c = options.displayName) !== null && _c !== void 0 ? _c : null, (_d = options.roomSecret) !== null && _d !== void 0 ? _d : null);
|
|
13
|
+
}
|
|
14
|
+
async function stopLanSignalingHost() {
|
|
15
|
+
(0, nativeModule_1.assertSupportedPlatform)();
|
|
16
|
+
return (0, nativeModule_1.getNativeModule)().stopHost();
|
|
17
|
+
}
|
|
18
|
+
async function getLanSignalingHostStatus() {
|
|
19
|
+
if (react_native_1.Platform.OS !== 'android' && react_native_1.Platform.OS !== 'ios') {
|
|
20
|
+
return (0, nativeModule_1.createEmptyHostStatus)();
|
|
21
|
+
}
|
|
22
|
+
return (0, nativeModule_1.getNativeModule)().getStatus();
|
|
23
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from './constants';
|
|
2
|
+
export * from './discovery';
|
|
3
|
+
export * from './errors';
|
|
4
|
+
export * from './host';
|
|
5
|
+
export * from './provider';
|
|
6
|
+
export * from './types';
|
|
7
|
+
export { discoverLanSignalingRooms as discoverOfflineSignalingHosts, } from './discovery';
|
|
8
|
+
export { getLanSignalingHostStatus as getOfflineSignalingHostStatus, startLanSignalingHost as startOfflineSignalingHost, stopLanSignalingHost as stopOfflineSignalingHost, } from './host';
|
|
9
|
+
export { isLanSignalingHostAvailable as isOfflineSignalingHostAvailable } from './nativeModule';
|
|
10
|
+
export { isLanSignalingHostAvailable } from './nativeModule';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AAIxB,OAAO,EACH,yBAAyB,IAAI,6BAA6B,GAC7D,MAAM,aAAa,CAAC;AACrB,OAAO,EACH,yBAAyB,IAAI,6BAA6B,EAC1D,qBAAqB,IAAI,yBAAyB,EAClD,oBAAoB,IAAI,wBAAwB,GACnD,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,2BAA2B,IAAI,+BAA+B,EAAE,MAAM,gBAAgB,CAAC;AAChG,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.isLanSignalingHostAvailable = exports.isOfflineSignalingHostAvailable = exports.stopOfflineSignalingHost = exports.startOfflineSignalingHost = exports.getOfflineSignalingHostStatus = exports.discoverOfflineSignalingHosts = void 0;
|
|
18
|
+
__exportStar(require("./constants"), exports);
|
|
19
|
+
__exportStar(require("./discovery"), exports);
|
|
20
|
+
__exportStar(require("./errors"), exports);
|
|
21
|
+
__exportStar(require("./host"), exports);
|
|
22
|
+
__exportStar(require("./provider"), exports);
|
|
23
|
+
__exportStar(require("./types"), exports);
|
|
24
|
+
// Primary public API uses the `Lan*` naming.
|
|
25
|
+
// `Offline*` exports remain as compatibility aliases for existing app code.
|
|
26
|
+
var discovery_1 = require("./discovery");
|
|
27
|
+
Object.defineProperty(exports, "discoverOfflineSignalingHosts", { enumerable: true, get: function () { return discovery_1.discoverLanSignalingRooms; } });
|
|
28
|
+
var host_1 = require("./host");
|
|
29
|
+
Object.defineProperty(exports, "getOfflineSignalingHostStatus", { enumerable: true, get: function () { return host_1.getLanSignalingHostStatus; } });
|
|
30
|
+
Object.defineProperty(exports, "startOfflineSignalingHost", { enumerable: true, get: function () { return host_1.startLanSignalingHost; } });
|
|
31
|
+
Object.defineProperty(exports, "stopOfflineSignalingHost", { enumerable: true, get: function () { return host_1.stopLanSignalingHost; } });
|
|
32
|
+
var nativeModule_1 = require("./nativeModule");
|
|
33
|
+
Object.defineProperty(exports, "isOfflineSignalingHostAvailable", { enumerable: true, get: function () { return nativeModule_1.isLanSignalingHostAvailable; } });
|
|
34
|
+
var nativeModule_2 = require("./nativeModule");
|
|
35
|
+
Object.defineProperty(exports, "isLanSignalingHostAvailable", { enumerable: true, get: function () { return nativeModule_2.isLanSignalingHostAvailable; } });
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messageValidation.d.ts","sourceRoot":"","sources":["../src/messageValidation.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,+BAA+B,EAKlC,MAAM,SAAS,CAAC;AAGjB,wBAAgB,0BAA0B,CACtC,UAAU,EAAE,MAAM,GACnB,+BAA+B,GAAG,IAAI,CAmCxC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseIncomingServerMessage = parseIncomingServerMessage;
|
|
4
|
+
const constants_1 = require("./constants");
|
|
5
|
+
function parseIncomingServerMessage(rawMessage) {
|
|
6
|
+
let parsed;
|
|
7
|
+
try {
|
|
8
|
+
parsed = JSON.parse(rawMessage);
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
const candidate = parsed;
|
|
17
|
+
if (typeof candidate.type !== 'string') {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
switch (candidate.type) {
|
|
21
|
+
case constants_1.LAN_SIGNALING_MESSAGE_TYPE.WELCOME:
|
|
22
|
+
return isValidWelcomeMessage(candidate) ? candidate : null;
|
|
23
|
+
case constants_1.LAN_SIGNALING_MESSAGE_TYPE.PEER_JOINED:
|
|
24
|
+
return isValidPeerJoinedMessage(candidate) ? candidate : null;
|
|
25
|
+
case constants_1.LAN_SIGNALING_MESSAGE_TYPE.PEER_LEFT:
|
|
26
|
+
return isValidPeerLeftMessage(candidate) ? candidate : null;
|
|
27
|
+
case constants_1.LAN_SIGNALING_MESSAGE_TYPE.OFFER:
|
|
28
|
+
case constants_1.LAN_SIGNALING_MESSAGE_TYPE.ANSWER:
|
|
29
|
+
case constants_1.LAN_SIGNALING_MESSAGE_TYPE.ICE:
|
|
30
|
+
return isValidRelayMessage(candidate) ? candidate : null;
|
|
31
|
+
case constants_1.LAN_SIGNALING_MESSAGE_TYPE.PONG:
|
|
32
|
+
return { type: constants_1.LAN_SIGNALING_MESSAGE_TYPE.PONG };
|
|
33
|
+
case constants_1.LAN_SIGNALING_MESSAGE_TYPE.ERROR:
|
|
34
|
+
return isValidErrorMessage(candidate) ? candidate : null;
|
|
35
|
+
default:
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function isValidWelcomeMessage(candidate) {
|
|
40
|
+
if (!candidate || typeof candidate !== 'object') {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
const value = candidate;
|
|
44
|
+
return (value.type === constants_1.LAN_SIGNALING_MESSAGE_TYPE.WELCOME &&
|
|
45
|
+
typeof value.sessionId === 'string' &&
|
|
46
|
+
typeof value.clientId === 'string' &&
|
|
47
|
+
Array.isArray(value.peers) &&
|
|
48
|
+
value.peers.every((peer) => Boolean(peer) &&
|
|
49
|
+
typeof peer === 'object' &&
|
|
50
|
+
typeof peer.clientId === 'string'));
|
|
51
|
+
}
|
|
52
|
+
function isValidPeerJoinedMessage(candidate) {
|
|
53
|
+
if (!candidate || typeof candidate !== 'object') {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
const value = candidate;
|
|
57
|
+
return (value.type === constants_1.LAN_SIGNALING_MESSAGE_TYPE.PEER_JOINED &&
|
|
58
|
+
typeof value.sessionId === 'string' &&
|
|
59
|
+
typeof value.clientId === 'string');
|
|
60
|
+
}
|
|
61
|
+
function isValidPeerLeftMessage(candidate) {
|
|
62
|
+
if (!candidate || typeof candidate !== 'object') {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
const value = candidate;
|
|
66
|
+
return (value.type === constants_1.LAN_SIGNALING_MESSAGE_TYPE.PEER_LEFT &&
|
|
67
|
+
typeof value.sessionId === 'string' &&
|
|
68
|
+
typeof value.clientId === 'string');
|
|
69
|
+
}
|
|
70
|
+
function isValidRelayMessage(candidate) {
|
|
71
|
+
if (!candidate || typeof candidate !== 'object') {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
const value = candidate;
|
|
75
|
+
return ((value.type === constants_1.LAN_SIGNALING_MESSAGE_TYPE.OFFER ||
|
|
76
|
+
value.type === constants_1.LAN_SIGNALING_MESSAGE_TYPE.ANSWER ||
|
|
77
|
+
value.type === constants_1.LAN_SIGNALING_MESSAGE_TYPE.ICE) &&
|
|
78
|
+
typeof value.sessionId === 'string' &&
|
|
79
|
+
typeof value.from === 'string' &&
|
|
80
|
+
typeof value.to === 'string');
|
|
81
|
+
}
|
|
82
|
+
function isValidErrorMessage(candidate) {
|
|
83
|
+
if (!candidate || typeof candidate !== 'object') {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
const value = candidate;
|
|
87
|
+
return (value.type === constants_1.LAN_SIGNALING_MESSAGE_TYPE.ERROR &&
|
|
88
|
+
typeof value.code === 'string' &&
|
|
89
|
+
typeof value.message === 'string');
|
|
90
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { LanSignalingHostStatus, OfflineSignalingNativeModule } from './types';
|
|
2
|
+
export declare function isLanSignalingPlatform(): boolean;
|
|
3
|
+
export declare function isLanSignalingHostAvailable(): boolean;
|
|
4
|
+
export declare function assertSupportedPlatform(): void;
|
|
5
|
+
export declare function getNativeModule(): OfflineSignalingNativeModule;
|
|
6
|
+
export declare function createEmptyHostStatus(): LanSignalingHostStatus;
|
|
7
|
+
//# sourceMappingURL=nativeModule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nativeModule.d.ts","sourceRoot":"","sources":["../src/nativeModule.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAC;AAE/E,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED,wBAAgB,2BAA2B,IAAI,OAAO,CAErD;AAED,wBAAgB,uBAAuB,IAAI,IAAI,CAO9C;AAED,wBAAgB,eAAe,IAAI,4BAA4B,CAa9D;AAED,wBAAgB,qBAAqB,IAAI,sBAAsB,CAU9D"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isLanSignalingPlatform = isLanSignalingPlatform;
|
|
4
|
+
exports.isLanSignalingHostAvailable = isLanSignalingHostAvailable;
|
|
5
|
+
exports.assertSupportedPlatform = assertSupportedPlatform;
|
|
6
|
+
exports.getNativeModule = getNativeModule;
|
|
7
|
+
exports.createEmptyHostStatus = createEmptyHostStatus;
|
|
8
|
+
const react_native_1 = require("react-native");
|
|
9
|
+
const constants_1 = require("./constants");
|
|
10
|
+
const errors_1 = require("./errors");
|
|
11
|
+
function isLanSignalingPlatform() {
|
|
12
|
+
return react_native_1.Platform.OS === 'android' || react_native_1.Platform.OS === 'ios';
|
|
13
|
+
}
|
|
14
|
+
function isLanSignalingHostAvailable() {
|
|
15
|
+
return isLanSignalingPlatform() && Boolean(react_native_1.NativeModules[constants_1.OFFLINE_SIGNALING_NATIVE_MODULE_NAME]);
|
|
16
|
+
}
|
|
17
|
+
function assertSupportedPlatform() {
|
|
18
|
+
if (!isLanSignalingPlatform()) {
|
|
19
|
+
throw (0, errors_1.createLanSignalingError)(errors_1.LAN_SIGNALING_ERROR_CODE.UNSUPPORTED_PLATFORM, constants_1.UNSUPPORTED_PLATFORM_ERROR);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function getNativeModule() {
|
|
23
|
+
const nativeModule = react_native_1.NativeModules[constants_1.OFFLINE_SIGNALING_NATIVE_MODULE_NAME];
|
|
24
|
+
if (!nativeModule) {
|
|
25
|
+
throw (0, errors_1.createLanSignalingError)(errors_1.LAN_SIGNALING_ERROR_CODE.NATIVE_MODULE_MISSING, constants_1.MISSING_NATIVE_MODULE_ERROR);
|
|
26
|
+
}
|
|
27
|
+
return nativeModule;
|
|
28
|
+
}
|
|
29
|
+
function createEmptyHostStatus() {
|
|
30
|
+
return {
|
|
31
|
+
running: false,
|
|
32
|
+
hostAddress: null,
|
|
33
|
+
port: null,
|
|
34
|
+
url: null,
|
|
35
|
+
roomId: null,
|
|
36
|
+
serviceName: null,
|
|
37
|
+
serviceType: null,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { CompatibleSignalingProvider, CompatibleSignalingProviderConnectOptions, CompatibleSignalingProviderHandlers } from './types';
|
|
2
|
+
interface LanWebSocketSignalingProviderOptions {
|
|
3
|
+
signalBaseUrl: string;
|
|
4
|
+
createWebSocket?: (url: string) => WebSocket;
|
|
5
|
+
}
|
|
6
|
+
export declare class LanWebSocketSignalingProvider implements CompatibleSignalingProvider {
|
|
7
|
+
private readonly signalBaseUrl;
|
|
8
|
+
private readonly createWebSocketInstance;
|
|
9
|
+
private socket;
|
|
10
|
+
constructor(options: LanWebSocketSignalingProviderOptions);
|
|
11
|
+
connect(options: CompatibleSignalingProviderConnectOptions, handlers: CompatibleSignalingProviderHandlers): void;
|
|
12
|
+
disconnect(code?: number, reason?: string): void;
|
|
13
|
+
sendPing(): void;
|
|
14
|
+
sendRelay(type: 'offer' | 'answer' | 'ice', to: string, payload: unknown): void;
|
|
15
|
+
isConnected(): boolean;
|
|
16
|
+
private send;
|
|
17
|
+
}
|
|
18
|
+
export declare function createLanSignalingProvider(signalBaseUrl: string): CompatibleSignalingProvider;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=provider.d.ts.map
|