@device-portal/react 0.0.16 → 0.0.17
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.
|
@@ -1,7 +1,24 @@
|
|
|
1
1
|
import { slicedToArray as _slicedToArray, createForOfIteratorHelper as _createForOfIteratorHelper } from '../_virtual/_rollupPluginBabelHelpers.js';
|
|
2
|
-
import { useState,
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
3
|
import { Responder } from '@device-portal/client';
|
|
4
4
|
|
|
5
|
+
/** Polyfill/helper for Promise.withResolvers */
|
|
6
|
+
var withResolvers = function withResolvers() {
|
|
7
|
+
if (Promise.withResolvers) {
|
|
8
|
+
return Promise.withResolvers();
|
|
9
|
+
}
|
|
10
|
+
var resolve;
|
|
11
|
+
var reject;
|
|
12
|
+
var promise = new Promise(function (res, rej) {
|
|
13
|
+
resolve = res;
|
|
14
|
+
reject = rej;
|
|
15
|
+
});
|
|
16
|
+
return {
|
|
17
|
+
promise: promise,
|
|
18
|
+
resolve: resolve,
|
|
19
|
+
reject: reject
|
|
20
|
+
};
|
|
21
|
+
};
|
|
5
22
|
var responders = {};
|
|
6
23
|
var useDevicePortalConsumer = function useDevicePortalConsumer(room) {
|
|
7
24
|
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
@@ -9,78 +26,81 @@ var useDevicePortalConsumer = function useDevicePortalConsumer(room) {
|
|
|
9
26
|
_useState2 = _slicedToArray(_useState, 2),
|
|
10
27
|
valueState = _useState2[0],
|
|
11
28
|
setValueState = _useState2[1];
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
reject: reject
|
|
29
|
+
// Initialize the responder synchronously if it doesn't exist
|
|
30
|
+
if (!responders[room]) {
|
|
31
|
+
var _withResolvers = withResolvers(),
|
|
32
|
+
firstValuePromise = _withResolvers.promise,
|
|
33
|
+
firstValueResolve = _withResolvers.resolve;
|
|
34
|
+
var sendMessageToProvider = function sendMessageToProvider(value) {
|
|
35
|
+
responders[room].responder.send(value);
|
|
36
|
+
};
|
|
37
|
+
var responder = new Responder(room, {
|
|
38
|
+
onMessage: function onMessage(value_0) {
|
|
39
|
+
var consumer = {
|
|
40
|
+
value: value_0,
|
|
41
|
+
sendMessageToProvider: sendMessageToProvider
|
|
26
42
|
};
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
responders[room].
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
_step;
|
|
43
|
-
try {
|
|
44
|
-
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
45
|
-
var setState = _step.value;
|
|
46
|
-
setState({
|
|
47
|
-
room: room,
|
|
48
|
-
value: value_0,
|
|
49
|
-
sendMessageToProvider: sendMessageToProvider
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
} catch (err) {
|
|
53
|
-
_iterator.e(err);
|
|
54
|
-
} finally {
|
|
55
|
-
_iterator.f();
|
|
43
|
+
responders[room].consumer = consumer;
|
|
44
|
+
// Resolve the suspension promise
|
|
45
|
+
firstValueResolve(value_0);
|
|
46
|
+
// Only trigger state updates for components that have already mounted
|
|
47
|
+
// components currently suspended will re-render when firstValuePromise resolves
|
|
48
|
+
var _iterator = _createForOfIteratorHelper(responders[room].setValueStates),
|
|
49
|
+
_step;
|
|
50
|
+
try {
|
|
51
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
52
|
+
var setState = _step.value;
|
|
53
|
+
setState({
|
|
54
|
+
room: room,
|
|
55
|
+
value: value_0,
|
|
56
|
+
sendMessageToProvider: sendMessageToProvider
|
|
57
|
+
});
|
|
56
58
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
} catch (err) {
|
|
60
|
+
_iterator.e(err);
|
|
61
|
+
} finally {
|
|
62
|
+
_iterator.f();
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
sendLastValueOnConnectAndReconnect: false,
|
|
66
|
+
websocketSignalingServer: options.websocketSignalingServer,
|
|
67
|
+
localDeviceOnly: options.localDeviceOnly
|
|
68
|
+
});
|
|
69
|
+
responders[room] = {
|
|
70
|
+
responder: responder,
|
|
71
|
+
firstValuePromise: firstValuePromise,
|
|
72
|
+
consumer: null,
|
|
73
|
+
setValueStates: new Set()
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
useEffect(function () {
|
|
77
|
+
var roomEntry = responders[room];
|
|
78
|
+
roomEntry.setValueStates.add(setValueState);
|
|
79
|
+
// If we already have a value, sync it immediately on mount
|
|
80
|
+
if (roomEntry.consumer) {
|
|
81
|
+
var consumer_0 = roomEntry.consumer;
|
|
82
|
+
setValueState({
|
|
83
|
+
room: room,
|
|
84
|
+
value: consumer_0.value,
|
|
85
|
+
sendMessageToProvider: consumer_0.sendMessageToProvider
|
|
62
86
|
});
|
|
63
|
-
responders[room] = {
|
|
64
|
-
responder: responder,
|
|
65
|
-
firstValuePromise: firstValuePromise,
|
|
66
|
-
consumer: null,
|
|
67
|
-
setValueStates: new Set()
|
|
68
|
-
};
|
|
69
87
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
//
|
|
88
|
+
return function () {
|
|
89
|
+
roomEntry.setValueStates["delete"](setValueState);
|
|
90
|
+
};
|
|
91
|
+
}, [room, setValueState]);
|
|
92
|
+
// 1. If we have local state, use it
|
|
75
93
|
if (valueState && valueState.room === room) {
|
|
76
94
|
return {
|
|
77
95
|
value: valueState.value,
|
|
78
96
|
sendMessageToProvider: valueState.sendMessageToProvider
|
|
79
97
|
};
|
|
80
98
|
}
|
|
81
|
-
|
|
82
|
-
|
|
99
|
+
// 2. If the shared responder already has a value, use it (handles re-renders after suspension)
|
|
100
|
+
if (responders[room].consumer) {
|
|
101
|
+
return responders[room].consumer;
|
|
83
102
|
}
|
|
103
|
+
// 3. Otherwise, suspend on the first value promise
|
|
84
104
|
throw responders[room].firstValuePromise;
|
|
85
105
|
};
|
|
86
106
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDevicePortalConsumer.js","sources":["../../src/consumer/useDevicePortalConsumer.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"useDevicePortalConsumer.js","sources":["../../src/consumer/useDevicePortalConsumer.ts"],"sourcesContent":["import { useEffect, useState, type Dispatch, type SetStateAction } from 'react'\nimport { Responder } from '@device-portal/client'\n\ntype State = {\n\troom: string\n\tvalue: string\n\tsendMessageToProvider: (value: string) => void\n}\n\n/** Polyfill/helper for Promise.withResolvers */\nconst withResolvers = <T>() => {\n\tif ((Promise as any).withResolvers) {\n\t\treturn (Promise as any).withResolvers() as {\n\t\t\tpromise: Promise<T>\n\t\t\tresolve: (value: T) => void\n\t\t\treject: (reason?: any) => void\n\t\t}\n\t}\n\tlet resolve: (value: T) => void\n\tlet reject: (reason?: any) => void\n\tconst promise = new Promise<T>((res, rej) => {\n\t\tresolve = res\n\t\treject = rej\n\t})\n\treturn { promise, resolve: resolve!, reject: reject! }\n}\n\nconst responders: {\n\t[room: string]: {\n\t\tresponder: Responder\n\t\tfirstValuePromise: Promise<string>\n\t\tconsumer: null | {\n\t\t\tvalue: string\n\t\t\tsendMessageToProvider: (value: string) => void\n\t\t}\n\t\tsetValueStates: Set<Dispatch<SetStateAction<State | null>>>\n\t}\n} = {}\n\nexport const useDevicePortalConsumer = (\n\troom: string,\n\toptions: {\n\t\twebsocketSignalingServer?: string\n\t\tlocalDeviceOnly?: boolean\n\t} = {},\n): Pick<State, 'value' | 'sendMessageToProvider'> => {\n\tconst [valueState, setValueState] = useState<State | null>(null)\n\n\t// Initialize the responder synchronously if it doesn't exist\n\tif (!responders[room]) {\n\t\tconsole.log(\n\t\t\t`[useDevicePortalConsumer] Creating new Responder for room: ${room}`,\n\t\t)\n\n\t\tconst { promise: firstValuePromise, resolve: firstValueResolve } =\n\t\t\twithResolvers<string>()\n\n\t\tconst sendMessageToProvider = (value: string) => {\n\t\t\tresponders[room].responder.send(value)\n\t\t}\n\n\t\tconst responder = new Responder(room, {\n\t\t\tonMessage: (value) => {\n\t\t\t\tconst consumer = { value, sendMessageToProvider }\n\t\t\t\tresponders[room].consumer = consumer\n\n\t\t\t\t// Resolve the suspension promise\n\t\t\t\tfirstValueResolve(value)\n\n\t\t\t\t// Only trigger state updates for components that have already mounted\n\t\t\t\t// components currently suspended will re-render when firstValuePromise resolves\n\t\t\t\tfor (const setState of responders[room].setValueStates) {\n\t\t\t\t\tsetState({ room, value, sendMessageToProvider })\n\t\t\t\t}\n\t\t\t},\n\t\t\tsendLastValueOnConnectAndReconnect: false,\n\t\t\twebsocketSignalingServer: options.websocketSignalingServer,\n\t\t\tlocalDeviceOnly: options.localDeviceOnly,\n\t\t})\n\n\t\tresponders[room] = {\n\t\t\tresponder,\n\t\t\tfirstValuePromise,\n\t\t\tconsumer: null,\n\t\t\tsetValueStates: new Set(),\n\t\t}\n\t}\n\n\tuseEffect(() => {\n\t\tconst roomEntry = responders[room]\n\t\troomEntry.setValueStates.add(setValueState)\n\n\t\t// If we already have a value, sync it immediately on mount\n\t\tif (roomEntry.consumer) {\n\t\t\tconst consumer = roomEntry.consumer!\n\t\t\tsetValueState({\n\t\t\t\troom,\n\t\t\t\tvalue: consumer.value,\n\t\t\t\tsendMessageToProvider: consumer.sendMessageToProvider,\n\t\t\t})\n\t\t}\n\n\t\treturn () => {\n\t\t\troomEntry.setValueStates.delete(setValueState)\n\t\t}\n\t}, [room, setValueState])\n\n\t// 1. If we have local state, use it\n\tif (valueState && valueState.room === room) {\n\t\treturn {\n\t\t\tvalue: valueState.value,\n\t\t\tsendMessageToProvider: valueState.sendMessageToProvider,\n\t\t}\n\t}\n\n\t// 2. If the shared responder already has a value, use it (handles re-renders after suspension)\n\tif (responders[room].consumer) {\n\t\treturn responders[room].consumer!\n\t}\n\n\t// 3. Otherwise, suspend on the first value promise\n\tthrow responders[room].firstValuePromise\n}\n"],"names":["withResolvers","Promise","resolve","reject","promise","res","rej","responders","useDevicePortalConsumer","room","options","arguments","length","undefined","_useState","useState","_useState2","_slicedToArray","valueState","setValueState","_withResolvers","firstValuePromise","firstValueResolve","sendMessageToProvider","value","responder","send","Responder","onMessage","consumer","_iterator","_createForOfIteratorHelper","setValueStates","_step","s","n","done","setState","err","e","f","sendLastValueOnConnectAndReconnect","websocketSignalingServer","localDeviceOnly","Set","useEffect","roomEntry","add"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,4 +3,4 @@ export * from './provider/useDevicePortalProvider';
|
|
|
3
3
|
export * from './provider/useDevicePortalPeer';
|
|
4
4
|
export * from './consumer/DevicePortalConsumer';
|
|
5
5
|
export * from './consumer/useDevicePortalConsumer';
|
|
6
|
-
export { type PeerId } from '@device-portal/client';
|
|
6
|
+
export { type PeerId, type Initiator } from '@device-portal/client';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@device-portal/react",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.17",
|
|
4
4
|
"description": "Simple WebRTC data channel for React.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"react": "18 || 19"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@device-portal/client": "^0.0.
|
|
42
|
+
"@device-portal/client": "^0.0.17"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@babel/core": "^7.24.0",
|