@sleeperhq/mini-core
Version:
Core library frameworks for developing Sleeper Mini Apps.
88 lines (69 loc) • 2.26 kB
JavaScript
import { Socket } from 'net';
import path from 'path';
import PacketParser from '../common/packet_parser.js';
const appJsonFilename = 'app.json';
const packagerConnectPort = 9092;
const refreshTimeout = 5000; //milliseconds
const socketConnect = (client, appConfig) => {
client.connect(packagerConnectPort, appConfig.remoteIP);
};
const packagerConnect = async (rootPath) => {
const appJsonPath = path.join(rootPath, appJsonFilename);
const { default: appConfig } = await import(appJsonPath, { assert: { type: "json" } });
if (!appConfig.remoteIP) {
throw new Error(appJsonFilename + ' is missing remoteIP field');
}
console.log('Attempting to connect to Sleeper App at ', appConfig.remoteIP);
const client = new Socket();
const packetParser = new PacketParser({
logsEnabled: false,
onMessageRecieved: (msg) => {
switch (msg?.type) {
case 'consoleLog':
console.log('[MiniLog]', msg.data?._consoleLog);
break;
default:
break;
}
}
});
client.on('connect', () => {
console.log('Connected to Sleeper App at ', appConfig.remoteIP);
client.setEncoding('utf8');
client.setKeepAlive(true);
const json = JSON.stringify({
_webpack: 'packager_connect',
_name: appConfig.name ?? '',
_entitlements: appConfig.entitlements,
_headerOptions: appConfig.headerOptions,
});
client.write(json, (err) => {
if (err) {
console.log('Error sending message to Sleeper App:', err);
}
});
});
client.on('error', (error) => {
if (error?.code === 'ECONNREFUSED' && error?.syscall === 'connect') {
// We don't care about this error since we will retry the connection
return;
}
console.log('Socket Error: ', error);
});
client.on('data', (data) => {
const msgString = data.toString();
packetParser.parseMessage(msgString);
});
client.on('close', (hadError) => {
if (!hadError) {
console.log('Connection to Sleeper App closed, retrying...');
}
// Retry connection
setTimeout(socketConnect, refreshTimeout, client, appConfig);
});
socketConnect(client, appConfig);
return () => {
client.destroy();
};
};
export default packagerConnect;