@scrypted/server 0.7.72 → 0.7.74

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.

Potentially problematic release.


This version of @scrypted/server might be problematic. Click here for more details.

@@ -68,45 +68,56 @@ function startPluginRemote(mainFilename, pluginId, peerSend, startPluginRemoteOp
68
68
  },
69
69
  async onLoadZip(scrypted, params, packageJson, zipData, zipOptions) {
70
70
  const { clusterId, clusterSecret } = zipOptions;
71
+ const onProxySerialization = (value, proxyId, source) => {
72
+ const properties = rpc_1.RpcPeer.prepareProxyProperties(value) || {};
73
+ let clusterEntry = properties.__cluster;
74
+ // set the cluster identity if it does not exist.
75
+ if (!clusterEntry) {
76
+ clusterEntry = {
77
+ id: clusterId,
78
+ port: clusterPort,
79
+ proxyId,
80
+ source,
81
+ };
82
+ properties.__cluster = clusterEntry;
83
+ }
84
+ // always reassign the id and source.
85
+ // if this is already a p2p object, and is passed to a different peer,
86
+ // a future p2p object must be routed to the correct p2p peer to find the object.
87
+ // clusterEntry.proxyId = proxyId;
88
+ // clusterEntry.source = source;
89
+ return properties;
90
+ };
91
+ peer.onProxySerialization = onProxySerialization;
92
+ const resolveObject = async (id, sourcePeerPort) => {
93
+ const sourcePeer = sourcePeerPort ? await clusterPeers.get(sourcePeerPort) : peer;
94
+ return sourcePeer?.localProxyMap.get(id);
95
+ };
96
+ // all cluster clients, incoming and outgoing, connect with random ports which can be used as peer ids
97
+ // on the cluster server that is listening on the actual port/
98
+ // incoming connections: use the remote random/unique port
99
+ // outgoing connections: use the local random/unique port
100
+ const clusterPeers = new Map();
71
101
  const clusterRpcServer = net_1.default.createServer(client => {
72
102
  const clusterPeer = (0, rpc_serializer_1.createDuplexRpcPeer)(peer.selfName, 'cluster-client', client, client);
103
+ const clusterPeerPort = client.remotePort;
104
+ clusterPeer.onProxySerialization = (value, proxyId) => onProxySerialization(value, proxyId, clusterPeerPort);
105
+ clusterPeers.set(clusterPeerPort, Promise.resolve(clusterPeer));
73
106
  startPluginRemoteOptions?.onClusterPeer?.(clusterPeer);
74
107
  const portSecret = crypto_1.default.createHash('sha256').update(`${clusterPort}${clusterSecret}`).digest().toString('hex');
75
- clusterPeer.params['connectRPCObject'] = async (id, secret) => {
108
+ const connectRPCObject = async (id, secret, sourcePeerPort) => {
76
109
  if (secret !== portSecret)
77
110
  throw new Error('secret incorrect');
78
- return peer.localProxyMap.get(id);
111
+ return resolveObject(id, sourcePeerPort);
79
112
  };
80
- client.on('close', () => clusterPeer.kill('cluster socket closed'));
113
+ clusterPeer.params['connectRPCObject'] = connectRPCObject;
114
+ client.on('close', () => {
115
+ clusterPeers.delete(clusterPeerPort);
116
+ clusterPeer.kill('cluster socket closed');
117
+ });
81
118
  });
82
119
  const clusterPort = await (0, listen_zero_1.listenZero)(clusterRpcServer);
83
- const clusterEntry = {
84
- id: clusterId,
85
- port: clusterPort,
86
- };
87
- peer.onProxySerialization = (value, proxyId) => {
88
- const properties = rpc_1.RpcPeer.prepareProxyProperties(value) || {};
89
- if (!properties.__cluster) {
90
- properties.__cluster = {
91
- ...clusterEntry,
92
- proxyId,
93
- };
94
- }
95
- return properties;
96
- };
97
- const clusterPeers = new Map();
98
- scrypted.connectRPCObject = async (value) => {
99
- const clusterObject = value?.__cluster;
100
- if (clusterObject?.id !== clusterId)
101
- return value;
102
- const { port, proxyId } = clusterObject;
103
- if (port === clusterPort) {
104
- // this is a local object.
105
- const newValue = peer.localProxyMap.get(proxyId);
106
- if (!newValue)
107
- throw new Error('ipc object not found?');
108
- return newValue;
109
- }
120
+ const ensureClusterPeer = (port) => {
110
121
  let clusterPeerPromise = clusterPeers.get(port);
111
122
  if (!clusterPeerPromise) {
112
123
  clusterPeerPromise = (async () => {
@@ -114,8 +125,11 @@ function startPluginRemote(mainFilename, pluginId, peerSend, startPluginRemoteOp
114
125
  socket.on('close', () => clusterPeers.delete(port));
115
126
  try {
116
127
  await (0, events_1.once)(socket, 'connect');
117
- const ret = (0, rpc_serializer_1.createDuplexRpcPeer)(peer.selfName, 'cluster-server', socket, socket);
118
- return ret;
128
+ const clusterPeerPort = socket.address().port;
129
+ const clusterPeer = (0, rpc_serializer_1.createDuplexRpcPeer)(peer.selfName, 'cluster-server', socket, socket);
130
+ clusterPeer.tags.localPort = clusterPeerPort;
131
+ clusterPeer.onProxySerialization = (value, proxyId) => onProxySerialization(value, proxyId, clusterPeerPort);
132
+ return clusterPeer;
119
133
  }
120
134
  catch (e) {
121
135
  console.error('failure ipc connect', e);
@@ -124,19 +138,26 @@ function startPluginRemote(mainFilename, pluginId, peerSend, startPluginRemoteOp
124
138
  }
125
139
  })();
126
140
  }
141
+ return clusterPeerPromise;
142
+ };
143
+ scrypted.connectRPCObject = async (value) => {
144
+ const clusterObject = value?.__cluster;
145
+ if (clusterObject?.id !== clusterId)
146
+ return value;
147
+ const { port, proxyId, source } = clusterObject;
148
+ if (port === clusterPort)
149
+ return resolveObject(proxyId, source);
127
150
  try {
151
+ const clusterPeerPromise = ensureClusterPeer(port);
128
152
  const clusterPeer = await clusterPeerPromise;
153
+ // this object is already connected
154
+ if (clusterPeer.tags.localPort === source)
155
+ return value;
129
156
  const connectRPCObject = await clusterPeer.getParam('connectRPCObject');
130
157
  const portSecret = crypto_1.default.createHash('sha256').update(`${port}${clusterSecret}`).digest().toString('hex');
131
- const newValue = await connectRPCObject(proxyId, portSecret);
158
+ const newValue = await connectRPCObject(proxyId, portSecret, source);
132
159
  if (!newValue)
133
160
  throw new Error('ipc object not found?');
134
- // reassign the cluster identity in case this object gets passed back into the cluster.
135
- newValue.__cluster = {
136
- id: clusterId,
137
- port,
138
- proxyId,
139
- };
140
161
  return newValue;
141
162
  }
142
163
  catch (e) {
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-remote-worker.js","sourceRoot":"","sources":["../../src/plugin/plugin-remote-worker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin-remote-worker.js","sourceRoot":"","sources":["../../src/plugin/plugin-remote-worker.ts"],"names":[],"mappings":";;;;;;AACA,sDAA6B;AAC7B,mCAA8B;AAC9B,4CAAoB;AACpB,iCAA+B;AAC/B,8CAAsB;AACtB,gDAAwB;AACxB,2DAAwE;AACxE,gDAA4C;AAC5C,gCAA6C;AAC7C,sDAAwD;AACxD,mCAA2C;AAC3C,6CAAmG;AACnG,qDAAmD;AACnD,uEAA2F;AAC3F,mDAAyG;AACzG,+DAAuE;AACvE,+CAAiD;AACjD,qEAAgE;AAChE,oDAA4B;AAC5B,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEnC,MAAM,aAAa,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC;AAe5D,SAAgB,iBAAiB,CAAC,YAAoB,EAAE,QAAgB,EAAE,QAAgG,EAAE,wBAAmD;IAC3N,MAAM,IAAI,GAAG,IAAI,aAAO,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAEtD,IAAI,aAA4B,CAAC;IACjC,IAAI,aAAgC,CAAC;IACrC,IAAI,GAAc,CAAC;IAGnB,IAAI,cAA4B,CAAC;IACjC,SAAS,UAAU;QACf,IAAI,CAAC,cAAc;YACf,cAAc,GAAG,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACjD,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED,MAAM,EAAE,gBAAgB,EAAE,eAAe,EAAE,GAAG,IAAA,gCAAe,EAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IAEzI,IAAI,QAAyB,CAAC;IAE9B,IAAI,cAAuB,CAAC;IAC5B,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC1B,IAAI,CAAC,cAAc;YACf,cAAc,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACjD,OAAO,cAAc,CAAC;IAC1B,CAAC,CAAA;IAED,IAAI,2BAA+D,CAAC;IAEpE,IAAA,kCAAkB,EAAC,IAAI,EAAE;QACrB,kBAAkB,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;YACjC,aAAa,GAAG,EAAE,CAAC;YACnB,aAAa,GAAG,EAAE,CAAA;YAClB,OAAO,IAAI,wBAAgB,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;YACnC,GAAG,GAAG,IAAI,CAAC;YACX,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC7B,CAAC;QACD,gBAAgB;QAChB,gBAAgB;QAChB,eAAe;QACf,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,IAAW;YACrC,IAAI,IAAI,KAAK,MAAM,EAAE;gBACjB,IAAI,CAAC,QAAQ;oBACT,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;gBAC3D,OAAO,QAAQ,CAAC;aACnB;YACD,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,QAAwB,EAAE,MAAW,EAAE,WAAgB,EAAE,OAAwB,EAAE,UAAsC;YACrI,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,UAAU,CAAC;YAEhD,MAAM,oBAAoB,GAAG,CAAC,KAAU,EAAE,OAAe,EAAE,MAAe,EAAE,EAAE;gBAC1E,MAAM,UAAU,GAAG,aAAO,CAAC,sBAAsB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC/D,IAAI,YAAY,GAAkB,UAAU,CAAC,SAAS,CAAC;gBAEvD,iDAAiD;gBACjD,IAAI,CAAC,YAAY,EAAE;oBACf,YAAY,GAAG;wBACX,EAAE,EAAE,SAAS;wBACb,IAAI,EAAE,WAAW;wBACjB,OAAO;wBACP,MAAM;qBACT,CAAC;oBACF,UAAU,CAAC,SAAS,GAAG,YAAY,CAAC;iBACvC;gBACD,qCAAqC;gBACrC,sEAAsE;gBACtE,iFAAiF;gBACjF,kCAAkC;gBAClC,gCAAgC;gBAChC,OAAO,UAAU,CAAC;YACtB,CAAC,CAAA;YACD,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;YAEjD,MAAM,aAAa,GAAG,KAAK,EAAE,EAAU,EAAE,cAAsB,EAAE,EAAE;gBAC/D,MAAM,UAAU,GAAG,cAAc,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAClF,OAAO,UAAU,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7C,CAAC,CAAA;YAED,sGAAsG;YACtG,8DAA8D;YAC9D,0DAA0D;YAC1D,yDAAyD;YACzD,MAAM,YAAY,GAAG,IAAI,GAAG,EAA4B,CAAC;YACzD,MAAM,gBAAgB,GAAG,aAAG,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE;gBAC/C,MAAM,WAAW,GAAG,IAAA,oCAAmB,EAAC,IAAI,CAAC,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;gBACzF,MAAM,eAAe,GAAG,MAAM,CAAC,UAAU,CAAC;gBAC1C,WAAW,CAAC,oBAAoB,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;gBAC7G,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;gBAChE,wBAAwB,EAAE,aAAa,EAAE,CAAC,WAAW,CAAC,CAAC;gBACvD,MAAM,UAAU,GAAG,gBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,WAAW,GAAG,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACjH,MAAM,gBAAgB,GAAqB,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE;oBAC5E,IAAI,MAAM,KAAK,UAAU;wBACrB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;oBACxC,OAAO,aAAa,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;gBAC7C,CAAC,CAAA;gBACD,WAAW,CAAC,MAAM,CAAC,kBAAkB,CAAC,GAAG,gBAAgB,CAAC;gBAC1D,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;oBACpB,YAAY,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;oBACrC,WAAW,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;gBAC9C,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAA;YACF,MAAM,WAAW,GAAG,MAAM,IAAA,wBAAU,EAAC,gBAAgB,CAAC,CAAC;YAEvD,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAE,EAAE;gBACvC,IAAI,kBAAkB,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAChD,IAAI,CAAC,kBAAkB,EAAE;oBACrB,kBAAkB,GAAG,CAAC,KAAK,IAAI,EAAE;wBAC7B,MAAM,MAAM,GAAG,aAAG,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;wBAC9C,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;wBAEpD,IAAI;4BACA,MAAM,IAAA,aAAI,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;4BAC9B,MAAM,eAAe,GAAI,MAAM,CAAC,OAAO,EAAsB,CAAC,IAAI,CAAC;4BAEnE,MAAM,WAAW,GAAG,IAAA,oCAAmB,EAAC,IAAI,CAAC,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;4BACzF,WAAW,CAAC,IAAI,CAAC,SAAS,GAAG,eAAe,CAAC;4BAC7C,WAAW,CAAC,oBAAoB,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;4BAC7G,OAAO,WAAW,CAAC;yBACtB;wBACD,OAAO,CAAC,EAAE;4BACN,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC;4BACxC,MAAM,CAAC,OAAO,EAAE,CAAC;4BACjB,MAAM,CAAC,CAAC;yBACX;oBACL,CAAC,CAAC,EAAE,CAAC;iBACR;gBACD,OAAO,kBAAkB,CAAC;YAC9B,CAAC,CAAC;YAEF,QAAQ,CAAC,gBAAgB,GAAG,KAAK,EAAE,KAAU,EAAE,EAAE;gBAC7C,MAAM,aAAa,GAAkB,KAAK,EAAE,SAAS,CAAC;gBACtD,IAAI,aAAa,EAAE,EAAE,KAAK,SAAS;oBAC/B,OAAO,KAAK,CAAC;gBACjB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC;gBAChD,IAAI,IAAI,KAAK,WAAW;oBACpB,OAAO,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAE1C,IAAI;oBACA,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;oBACnD,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC;oBAC7C,mCAAmC;oBACnC,IAAI,WAAW,CAAC,IAAI,CAAC,SAAS,KAAK,MAAM;wBACrC,OAAO,KAAK,CAAC;oBACjB,MAAM,gBAAgB,GAAqB,MAAM,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;oBAC1F,MAAM,UAAU,GAAG,gBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;oBAC1G,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;oBACrE,IAAI,CAAC,QAAQ;wBACT,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;oBAC7C,OAAO,QAAQ,CAAC;iBACnB;gBACD,OAAO,CAAC,EAAE;oBACN,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;oBAChC,OAAO,KAAK,CAAC;iBAChB;YACL,CAAC,CAAA;YAED,IAAI,MAAW,CAAC;YAChB,IAAI,YAA0B,CAAC;YAC/B,IAAI,UAAU,EAAE,YAAY,IAAI,YAAE,CAAC,UAAU,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE;gBACrE,MAAM,GAAG,IAAI,CAAC,YAAE,EAAE,CAAC,EAAE,EAAE,cAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClE,YAAY,GAAG,IAAI,CAAC,EAAE;oBAClB,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;oBAC1D,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;wBACxB,OAAO;oBACX,OAAO,YAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;gBACrC,CAAC,CAAC;aACL;iBACI;gBACD,MAAM,MAAM,GAAG,IAAI,iBAAM,CAAC,OAAO,CAAC,CAAC;gBACnC,MAAM,GAAG,IAAI,cAAM,EAAE,CAAC;gBACtB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,UAAU,EAAE,EAAE;oBACrC,IAAI,KAAK,CAAC,WAAW;wBACjB,SAAS;oBACb,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC;wBAClC,SAAS;oBACb,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACrD,MAAM,CAAC,UAAU,CAAC,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;oBACtC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;oBAC7B,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;iBACpC;gBAED,YAAY,GAAG,IAAI,CAAC,EAAE;oBAClB,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;oBACpC,IAAI,CAAC,KAAK;wBACN,OAAO;oBACX,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC;gBAC3B,CAAC,CAAA;aACJ;YACD,OAAO,GAAG,SAAS,CAAC;YAEpB,MAAM,aAAa,GAAG,gBAAgB,EAAE,EAAE,CAAC;YAC3C,MAAM,CAAC,OAAO,GAAG,aAAa,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAA,2CAAiB,EAAC,QAAQ,CAAC,CAAC;YACxC,aAAa,EAAE,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;YACxC,MAAM,CAAC,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE;gBAC9B,IAAI,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;oBACtE,OAAO,MAAM,CAAC;iBACjB;gBACD,IAAI,IAAI,KAAK,QAAQ,EAAE;oBACnB,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;iBACxB;gBACD,IAAI;oBACA,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;oBAC7B,OAAO,MAAM,CAAC;iBACjB;gBACD,OAAO,CAAC,EAAE;oBACN,MAAM,CAAC,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;oBAC/C,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;iBACrB;YACL,CAAC,CAAC;YACF,0BAA0B;YAC1B,MAAM,OAAO,GAAQ,EAAE,CAAC;YACxB,4BAA4B;YAC5B,0BAA0B;YAC1B,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;YAEzB,MAAM,KAAK,GAAG,YAAY,CAAC,oBAAoB,CAAC,CAAA;YAChD,MAAM,GAAG,GAAG,KAAK,EAAE,QAAQ,EAAE,CAAC;YAE9B,qEAAqE;YACrE,8DAA8D;YAC9D,2BAA2B,GAAG,CAAC,QAAQ,EAAE,EAAE;gBACvC,OAAO,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,CAAC;gBAChD,OAAO,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,CAAC;gBAEjD,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE;oBAChC,gBAAgB,EAAE,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC;oBACjD,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,oBAAoB,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACzD,CAAC,CAAC,CAAC;gBACH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,CAAC,EAAE;oBACjC,gBAAgB,EAAE,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC;oBAClD,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,qBAAqB,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAC1D,CAAC,CAAC,CAAC;gBAEH,IAAA,4BAAuB,EAAC;oBACpB,WAAW,EAAE,MAAM;oBACnB,iBAAiB,CAAC,MAAM;wBACpB,IAAI,MAAM,KAAK,wBAAwB,IAAI,MAAM,KAAK,IAAI,QAAQ,iBAAiB,EAAE;4BACjF,IAAI,CAAC,GAAG;gCACJ,OAAO,IAAI,CAAC;4BAChB,OAAO;gCACH,GAAG,EAAE,wBAAwB;gCAC7B,GAAG;6BACN,CAAA;yBACJ;wBACD,OAAO,IAAI,CAAC;oBAChB,CAAC;iBACJ,CAAC,CAAC;YACP,CAAC,CAAC;YAEF,MAAM,IAAA,qDAA2B,EAAC,gBAAgB,EAAE,EAAE,WAAW,CAAC,CAAC;YAEnE,8CAA8C;YAC9C,qCAAqC;YACrC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAwC,CAAC;YACvE,gGAAgG;YAChG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,IAAA,uCAAiB,EAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC;YAEjG,MAAM,IAAI,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;YAC5C,YAAY,GAAG,SAAS,CAAC;YACzB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAE/B,QAAQ,CAAC,OAAO,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;gBACnC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAClC,CAAC,CAAA;YAED,MAAM,KAAK,GAAG,IAAI,GAAG,EAAgB,CAAC;YAEtC,QAAQ,CAAC,IAAI,GAAG,GAAG,EAAE;gBACjB,MAAM,GAAG,GAAG,IAAI,qCAAgB,CAAC,YAAY,EAAE,QAAQ,EAAE;oBACrD,GAAG,EAAE,OAAO,CAAC,GAAG;oBAChB,WAAW,EAAE,SAAS;iBACzB,CAAC,CAAC;gBAEH,MAAM,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;oBACvB,MAAM,UAAU,GAAG,IAAI,aAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;oBACjG,UAAU,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC,KAAkB,EAAE,EAAE;wBACnD,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;oBAC/C,CAAC,CAAA;oBACD,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;oBAE7B,MAAM,aAAc,SAAQ,2BAAc;wBACtC,CAAC,aAAO,CAAC,6BAA6B,CAAC,GAAI,GAAW,CAAC,aAAO,CAAC,6BAA6B,CAAC,CAAC;wBAE9F,UAAU,CAAC,QAAgB,EAAE,OAAgC;4BACzD,MAAM,EAAE,GAAG,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;4BACnD,QAAQ,CAAC,eAAgC,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;4BAC9E,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;gCACnB,IAAI,CAAC,KAAK,MAAM;oCACZ,SAAS;gCACb,CAAC,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;6BACxC;4BACD,OAAO,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;wBAC/C,CAAC;qBACJ;oBACD,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;oBAEvC,MAAM,MAAM,GAAG,MAAM,IAAA,iCAAiB,EAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,aAAa,EAAE,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC,CAAC;oBAC/H,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBAClB,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;wBACvB,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;wBACjC,OAAO,CAAC,eAAe,EAAE,CAAC;wBAC1B,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;wBACrB,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBAC/B,CAAC,CAAC,CAAC;oBAEH,KAAK,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,aAAa,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE;wBAC7D,MAAM,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;qBAC3D;oBAED,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;oBAClD,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC;oBACxB,OAAO,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,EAAE,WAAW,CAAC,CAAA;gBAC5D,CAAC,CAAC,EAAE,CAAC;gBAEL,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;gBAE/B,OAAO;oBACH,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,MAAM;iBACT,CAAA;YACL,CAAC,CAAA;YAED,IAAI;gBACA,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,IAAI,wBAAwB,EAAE,MAAM,CAAC,CAAC;gBAEjF,IAAI,UAAU,EAAE,IAAI,EAAE;oBAClB,uCAAuC;oBACvC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;oBAC1B,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;oBAC5B,MAAM,CAAC,aAAO,CAAC,mCAAmC,CAAC,GAAG,IAAI,CAAC;oBAC3D,OAAO,MAAM,CAAC;iBACjB;gBAED,aAAa,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;gBACpC,IAAI,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;gBACrC,0DAA0D;gBAC1D,uBAAuB;gBACvB,IAAI,cAAc,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;oBAC9C,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;gBAC1C,IAAI,OAAO,cAAc,KAAK,UAAU;oBACpC,cAAc,GAAG,MAAM,cAAc,EAAE,CAAC;gBAE5C,QAAQ,GAAG,IAAA,8BAAgB,EAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;gBAC9D,2BAA2B,CAAC,QAAQ,CAAC,CAAC;gBAEtC,OAAO,cAAc,CAAC;aACzB;YACD,OAAO,CAAC,EAAE;gBACN,aAAa,EAAE,KAAK,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;gBAClD,MAAM,CAAC,CAAC;aACX;QACL,CAAC;KACJ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;QACf,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC;QACvC,aAAa,GAAG,QAAQ,CAAC,aAAkC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AAChB,CAAC;AAzWD,8CAyWC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scrypted/server",
3
- "version": "0.7.72",
3
+ "version": "0.7.74",
4
4
  "description": "",
5
5
  "dependencies": {
6
6
  "@mapbox/node-pre-gyp": "^1.0.10",
@@ -286,51 +286,73 @@ class PluginRemote:
286
286
  clusterId = options['clusterId']
287
287
  clusterSecret = options['clusterSecret']
288
288
 
289
+ def onProxySerialization(value: Any, proxyId: str, source: int = None):
290
+ properties: dict = rpc.RpcPeer.prepareProxyProperties(value) or {}
291
+ clusterEntry = properties.get('__cluster', None)
292
+ if not properties.get('__cluster', None):
293
+ clusterEntry = {
294
+ 'id': clusterId,
295
+ 'proxyId': proxyId,
296
+ 'port': clusterPort,
297
+ 'source': source,
298
+ }
299
+ properties['__cluster'] = clusterEntry
300
+
301
+ # clusterEntry['proxyId'] = proxyId
302
+ # clusterEntry['source'] = source
303
+ return properties
304
+
305
+ self.peer.onProxySerialization = onProxySerialization
306
+
307
+ async def resolveObject(id: str, sourcePeerPort: int):
308
+ sourcePeer: rpc.RpcPeer = self.peer if not sourcePeerPort else await rpc.maybe_await(clusterPeers.get(sourcePeerPort))
309
+ if not sourcePeer:
310
+ return
311
+ return sourcePeer.localProxyMap.get(id, None)
312
+
313
+ clusterPeers: Mapping[int, asyncio.Future[rpc.RpcPeer]] = {}
289
314
  async def handleClusterClient(reader: asyncio.StreamReader, writer: asyncio.StreamWriter):
315
+ _, clusterPeerPort = writer.get_extra_info('peername')
290
316
  rpcTransport = rpc_reader.RpcStreamTransport(reader, writer)
291
317
  peer: rpc.RpcPeer
292
318
  peer, peerReadLoop = await rpc_reader.prepare_peer_readloop(self.loop, rpcTransport)
293
- async def connectRPCObject(id: str, secret: str):
319
+ peer.onProxySerialization = lambda value, proxyId: onProxySerialization(value, proxyId, clusterPeerPort)
320
+ future = asyncio.Future[rpc.RpcPeer]()
321
+ future.set_result(peer)
322
+ clusterPeers[clusterPeerPort] = future
323
+ async def connectRPCObject(id: str, secret: str, sourcePeerPort: int = None):
294
324
  m = hashlib.sha256()
295
325
  m.update(bytes('%s%s' % (clusterPort, clusterSecret), 'utf8'))
296
326
  portSecret = m.hexdigest()
297
327
  if secret != portSecret:
298
328
  raise Exception('secret incorrect')
299
- return self.peer.localProxyMap.get(id, None)
329
+ return await resolveObject(id, sourcePeerPort)
300
330
 
301
331
  peer.params['connectRPCObject'] = connectRPCObject
302
332
  try:
303
333
  await peerReadLoop()
304
334
  except:
335
+ pass
336
+ finally:
337
+ clusterPeers.pop(clusterPeerPort)
338
+ peer.kill('cluster client killed')
305
339
  writer.close()
306
340
 
307
341
  clusterRpcServer = await asyncio.start_server(handleClusterClient, '127.0.0.1', 0)
308
342
  clusterPort = clusterRpcServer.sockets[0].getsockname()[1]
309
343
 
310
- clusterPeers: Mapping[int, asyncio.Future[rpc.RpcPeer]] = {}
311
- async def connectRPCObject(value):
312
- clusterObject = getattr(value, '__cluster')
313
- if type(clusterObject) is not dict:
314
- return value
315
-
316
- if clusterObject.get('id', None) != clusterId:
317
- return value
318
-
319
- port = clusterObject['port']
320
- proxyId = clusterObject['proxyId']
321
- if port == clusterPort:
322
- newValue = self.peer.localProxyMap.get(id, None)
323
- if not newValue:
324
- raise Exception('ipc object not found?')
325
- return newValue
326
-
344
+ def ensureClusterPeer(port: int):
327
345
  clusterPeerPromise = clusterPeers.get(port)
328
346
  if not clusterPeerPromise:
329
347
  async def connectClusterPeer():
330
348
  reader, writer = await asyncio.open_connection(
331
349
  '127.0.0.1', port)
350
+ _, clusterPeerPort = writer.get_extra_info('sockname')
332
351
  rpcTransport = rpc_reader.RpcStreamTransport(reader, writer)
333
- peer, peerReadLoop = await rpc_reader.prepare_peer_readloop(self.loop, rpcTransport)
352
+ clusterPeer, peerReadLoop = await rpc_reader.prepare_peer_readloop(self.loop, rpcTransport)
353
+ clusterPeer.tags['localPort'] = clusterPeerPort
354
+ clusterPeer.onProxySerialization = lambda value, proxyId: onProxySerialization(value, proxyId, clusterPeerPort)
355
+
334
356
  async def run_loop():
335
357
  try:
336
358
  await peerReadLoop()
@@ -339,47 +361,44 @@ class PluginRemote:
339
361
  finally:
340
362
  clusterPeers.pop(port)
341
363
  asyncio.run_coroutine_threadsafe(run_loop(), self.loop)
342
- return peer
364
+ return clusterPeer
343
365
  clusterPeerPromise = self.loop.create_task(connectClusterPeer())
344
366
  clusterPeers[port] = clusterPeerPromise
367
+ return clusterPeerPromise
368
+
369
+ async def connectRPCObject(value):
370
+ clusterObject = getattr(value, '__cluster')
371
+ if type(clusterObject) is not dict:
372
+ return value
373
+
374
+ if clusterObject.get('id', None) != clusterId:
375
+ return value
376
+
377
+ port = clusterObject['port']
378
+ proxyId = clusterObject['proxyId']
379
+ source = clusterObject.get('source', None)
380
+ if port == clusterPort:
381
+ return await resolveObject(proxyId, source)
382
+
383
+ clusterPeerPromise = ensureClusterPeer(port)
345
384
 
346
385
  try:
347
386
  clusterPeer = await clusterPeerPromise
387
+ if clusterPeer.tags.get('localPort') == source:
388
+ return value
348
389
  c = await clusterPeer.getParam('connectRPCObject')
349
390
  m = hashlib.sha256()
350
391
  m.update(bytes('%s%s' % (port, clusterSecret), 'utf8'))
351
392
  portSecret = m.hexdigest()
352
- newValue = await c(proxyId, portSecret)
393
+ newValue = await c(proxyId, portSecret, source)
353
394
  if not newValue:
354
395
  raise Exception('ipc object not found?')
355
- properties = getattr(value, rpc.RpcPeer.PROPERTY_PROXY_PROPERTIES)
356
- if not properties:
357
- properties = {}
358
- setattr(value, rpc.RpcPeer.PROPERTY_PROXY_PROPERTIES, properties)
359
- # reassign the cluster identity in case this object gets passed back into the cluster.
360
- properties['__cluster'] = {
361
- 'id': clusterId,
362
- 'proxyId': proxyId,
363
- 'port': clusterPort,
364
- }
365
396
  return newValue
366
397
  except Exception as e:
367
398
  return value
368
399
 
369
400
  sdk.connectRPCObject = connectRPCObject
370
401
 
371
- def onProxySerialization(value: Any, proxyId: str):
372
- properties: dict = rpc.RpcPeer.prepareProxyProperties(value) or {}
373
- if not properties.get('__cluster', None):
374
- properties['__cluster'] = {
375
- 'id': clusterId,
376
- 'proxyId': proxyId,
377
- 'port': clusterPort,
378
- }
379
- return properties
380
-
381
- self.peer.onProxySerialization = onProxySerialization
382
-
383
402
  forkMain = options and options.get('fork')
384
403
 
385
404
  if not forkMain:
package/python/rpc.py CHANGED
@@ -134,6 +134,7 @@ class RpcPeer:
134
134
  self.nameDeserializerMap: Mapping[str, RpcSerializer] = {}
135
135
  self.onProxySerialization: Callable[[Any, str], Any] = None
136
136
  self.killed = False
137
+ self.tags = {}
137
138
 
138
139
  def __apply__(self, proxyId: str, oneWayMethods: List[str], method: str, args: list):
139
140
  oneway = oneWayMethods and method in oneWayMethods
@@ -26,6 +26,15 @@ export interface StartPluginRemoteOptions {
26
26
  onClusterPeer(peer: RpcPeer): void;
27
27
  }
28
28
 
29
+ interface ClusterObject {
30
+ id: string;
31
+ port: number;
32
+ proxyId: string;
33
+ source: number;
34
+ }
35
+
36
+ type ConnectRPCObject = (id: string, secret: string, sourcePeerPort: number) => Promise<any>;
37
+
29
38
  export function startPluginRemote(mainFilename: string, pluginId: string, peerSend: (message: RpcMessage, reject?: (e: Error) => void, serializationContext?: any) => void, startPluginRemoteOptions?: StartPluginRemoteOptions) {
30
39
  const peer = new RpcPeer('unknown', 'host', peerSend);
31
40
 
@@ -77,48 +86,61 @@ export function startPluginRemote(mainFilename: string, pluginId: string, peerSe
77
86
  },
78
87
  async onLoadZip(scrypted: ScryptedStatic, params: any, packageJson: any, zipData: Buffer | string, zipOptions: PluginRemoteLoadZipOptions) {
79
88
  const { clusterId, clusterSecret } = zipOptions;
80
- const clusterRpcServer = net.createServer(client => {
81
- const clusterPeer = createDuplexRpcPeer(peer.selfName, 'cluster-client', client, client);
82
- startPluginRemoteOptions?.onClusterPeer?.(clusterPeer);
83
- const portSecret = crypto.createHash('sha256').update(`${clusterPort}${clusterSecret}`).digest().toString('hex');
84
- clusterPeer.params['connectRPCObject'] = async (id: string, secret: string) => {
85
- if (secret !== portSecret)
86
- throw new Error('secret incorrect');
87
- return peer.localProxyMap.get(id);
88
- }
89
- client.on('close', () => clusterPeer.kill('cluster socket closed'));
90
- })
91
- const clusterPort = await listenZero(clusterRpcServer);
92
- const clusterEntry = {
93
- id: clusterId,
94
- port: clusterPort,
95
- };
96
89
 
97
- peer.onProxySerialization = (value, proxyId) => {
90
+ const onProxySerialization = (value: any, proxyId: string, source?: number) => {
98
91
  const properties = RpcPeer.prepareProxyProperties(value) || {};
99
- if (!properties.__cluster) {
100
- properties.__cluster = {
101
- ...clusterEntry,
92
+ let clusterEntry: ClusterObject = properties.__cluster;
93
+
94
+ // set the cluster identity if it does not exist.
95
+ if (!clusterEntry) {
96
+ clusterEntry = {
97
+ id: clusterId,
98
+ port: clusterPort,
102
99
  proxyId,
103
- }
100
+ source,
101
+ };
102
+ properties.__cluster = clusterEntry;
104
103
  }
104
+ // always reassign the id and source.
105
+ // if this is already a p2p object, and is passed to a different peer,
106
+ // a future p2p object must be routed to the correct p2p peer to find the object.
107
+ // clusterEntry.proxyId = proxyId;
108
+ // clusterEntry.source = source;
105
109
  return properties;
106
110
  }
111
+ peer.onProxySerialization = onProxySerialization;
107
112
 
113
+ const resolveObject = async (id: string, sourcePeerPort: number) => {
114
+ const sourcePeer = sourcePeerPort ? await clusterPeers.get(sourcePeerPort) : peer;
115
+ return sourcePeer?.localProxyMap.get(id);
116
+ }
117
+
118
+ // all cluster clients, incoming and outgoing, connect with random ports which can be used as peer ids
119
+ // on the cluster server that is listening on the actual port/
120
+ // incoming connections: use the remote random/unique port
121
+ // outgoing connections: use the local random/unique port
108
122
  const clusterPeers = new Map<number, Promise<RpcPeer>>();
109
- scrypted.connectRPCObject = async (value: any) => {
110
- const clusterObject = value?.__cluster;
111
- if (clusterObject?.id !== clusterId)
112
- return value;
113
- const { port, proxyId } = clusterObject;
114
- if (port === clusterPort) {
115
- // this is a local object.
116
- const newValue = peer.localProxyMap.get(proxyId);
117
- if (!newValue)
118
- throw new Error('ipc object not found?');
119
- return newValue;
123
+ const clusterRpcServer = net.createServer(client => {
124
+ const clusterPeer = createDuplexRpcPeer(peer.selfName, 'cluster-client', client, client);
125
+ const clusterPeerPort = client.remotePort;
126
+ clusterPeer.onProxySerialization = (value, proxyId) => onProxySerialization(value, proxyId, clusterPeerPort);
127
+ clusterPeers.set(clusterPeerPort, Promise.resolve(clusterPeer));
128
+ startPluginRemoteOptions?.onClusterPeer?.(clusterPeer);
129
+ const portSecret = crypto.createHash('sha256').update(`${clusterPort}${clusterSecret}`).digest().toString('hex');
130
+ const connectRPCObject: ConnectRPCObject = async (id, secret, sourcePeerPort) => {
131
+ if (secret !== portSecret)
132
+ throw new Error('secret incorrect');
133
+ return resolveObject(id, sourcePeerPort);
120
134
  }
135
+ clusterPeer.params['connectRPCObject'] = connectRPCObject;
136
+ client.on('close', () => {
137
+ clusterPeers.delete(clusterPeerPort);
138
+ clusterPeer.kill('cluster socket closed');
139
+ });
140
+ })
141
+ const clusterPort = await listenZero(clusterRpcServer);
121
142
 
143
+ const ensureClusterPeer = (port: number) => {
122
144
  let clusterPeerPromise = clusterPeers.get(port);
123
145
  if (!clusterPeerPromise) {
124
146
  clusterPeerPromise = (async () => {
@@ -127,8 +149,12 @@ export function startPluginRemote(mainFilename: string, pluginId: string, peerSe
127
149
 
128
150
  try {
129
151
  await once(socket, 'connect');
130
- const ret = createDuplexRpcPeer(peer.selfName, 'cluster-server', socket, socket);
131
- return ret;
152
+ const clusterPeerPort = (socket.address() as net.AddressInfo).port;
153
+
154
+ const clusterPeer = createDuplexRpcPeer(peer.selfName, 'cluster-server', socket, socket);
155
+ clusterPeer.tags.localPort = clusterPeerPort;
156
+ clusterPeer.onProxySerialization = (value, proxyId) => onProxySerialization(value, proxyId, clusterPeerPort);
157
+ return clusterPeer;
132
158
  }
133
159
  catch (e) {
134
160
  console.error('failure ipc connect', e);
@@ -137,20 +163,28 @@ export function startPluginRemote(mainFilename: string, pluginId: string, peerSe
137
163
  }
138
164
  })();
139
165
  }
166
+ return clusterPeerPromise;
167
+ };
168
+
169
+ scrypted.connectRPCObject = async (value: any) => {
170
+ const clusterObject: ClusterObject = value?.__cluster;
171
+ if (clusterObject?.id !== clusterId)
172
+ return value;
173
+ const { port, proxyId, source } = clusterObject;
174
+ if (port === clusterPort)
175
+ return resolveObject(proxyId, source);
140
176
 
141
177
  try {
178
+ const clusterPeerPromise = ensureClusterPeer(port);
142
179
  const clusterPeer = await clusterPeerPromise;
143
- const connectRPCObject = await clusterPeer.getParam('connectRPCObject');
180
+ // this object is already connected
181
+ if (clusterPeer.tags.localPort === source)
182
+ return value;
183
+ const connectRPCObject: ConnectRPCObject = await clusterPeer.getParam('connectRPCObject');
144
184
  const portSecret = crypto.createHash('sha256').update(`${port}${clusterSecret}`).digest().toString('hex');
145
- const newValue = await connectRPCObject(proxyId, portSecret);
185
+ const newValue = await connectRPCObject(proxyId, portSecret, source);
146
186
  if (!newValue)
147
187
  throw new Error('ipc object not found?');
148
- // reassign the cluster identity in case this object gets passed back into the cluster.
149
- newValue.__cluster = {
150
- id: clusterId,
151
- port,
152
- proxyId,
153
- };
154
188
  return newValue;
155
189
  }
156
190
  catch (e) {