@expo/cli
Version:
129 lines (128 loc) • 5.17 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "createMessagesSocket", {
enumerable: true,
get: function() {
return createMessagesSocket;
}
});
function _nodeurl() {
const data = require("node:url");
_nodeurl = function() {
return data;
};
return data;
}
function _ws() {
const data = require("ws");
_ws = function() {
return data;
};
return data;
}
const _createSocketBroadcaster = require("./utils/createSocketBroadcaster");
const _createSocketMap = require("./utils/createSocketMap");
const _socketMessages = require("./utils/socketMessages");
function createMessagesSocket(options) {
const clients = (0, _createSocketMap.createSocketMap)();
const broadcast = (0, _createSocketBroadcaster.createBroadcaster)(clients.map);
const server = new (_ws()).WebSocketServer({
noServer: true
});
server.on('connection', (socket, req)=>{
const client = clients.registerSocket(socket);
// Assign the query parameters to the socket, used for `getpeers` requests
// NOTE(cedric): this looks like a legacy feature, might be able to drop it
if (req.url) {
Object.defineProperty(socket, '_upgradeQuery', {
value: (0, _nodeurl().parse)(req.url).query
});
}
// Register disconnect handlers
socket.on('close', client.terminate);
socket.on('error', client.terminate);
// Register message handler
socket.on('message', createClientMessageHandler(socket, client.id, clients, broadcast));
});
return {
endpoint: '/message',
server,
broadcast: (method, params)=>{
if (clients.map.size === 0) {
return options.logger.warn(`No apps connected. Sending "${method}" to all React Native apps failed. Make sure your app is running in the simulator or on a phone connected via USB.`);
}
broadcast(null, (0, _socketMessages.serializeMessage)({
method,
params
}));
}
};
}
function createClientMessageHandler(socket, clientId, clients, broadcast) {
function handleServerRequest(message) {
// Ignore messages without identifiers, unable to link responses
if (!message.id) return;
if (message.method === 'getid') {
return socket.send((0, _socketMessages.serializeMessage)({
id: message.id,
result: clientId
}));
}
if (message.method === 'getpeers') {
const peers = {};
clients.map.forEach((peerSocket, peerSocketId)=>{
if (peerSocketId !== clientId) {
peers[peerSocketId] = '_upgradeQuery' in peerSocket ? peerSocket._upgradeQuery : {};
}
});
return socket.send((0, _socketMessages.serializeMessage)({
id: message.id,
result: peers
}));
}
}
return (data, isBinary)=>{
const message = (0, _socketMessages.parseRawMessage)(data, isBinary);
if (!message) return;
// Handle broadcast messages
if (messageIsBroadcast(message)) {
return broadcast(null, data.toString());
}
// Handle incoming requests from clients
if (messageIsRequest(message)) {
var _clients_findSocket;
if (message.target === 'server') {
return handleServerRequest(message);
}
return (_clients_findSocket = clients.findSocket(message.target)) == null ? void 0 : _clients_findSocket.send((0, _socketMessages.serializeMessage)({
method: message.method,
params: message.params,
id: !message.id ? undefined : {
requestId: message.id,
clientId
}
}));
}
// Handle incoming responses
if (messageIsResponse(message)) {
var _clients_findSocket1;
return (_clients_findSocket1 = clients.findSocket(message.id.clientId)) == null ? void 0 : _clients_findSocket1.send((0, _socketMessages.serializeMessage)({
id: message.id.requestId,
result: message.result,
error: message.error
}));
}
};
}
function messageIsBroadcast(message) {
return 'method' in message && typeof message.method === 'string' && (!('id' in message) || message.id === undefined) && (!('target' in message) || message.target === undefined);
}
function messageIsRequest(message) {
return 'method' in message && typeof message.method === 'string' && 'target' in message && typeof message.target === 'string';
}
function messageIsResponse(message) {
return 'id' in message && typeof message.id === 'object' && typeof message.id.requestId !== 'undefined' && typeof message.id.clientId === 'string' && ('result' in message && !!message.result || 'error' in message && !!message.error);
}
//# sourceMappingURL=createMessageSocket.js.map
;