parent
98bb74d8b1
commit
5094ec4b26
79
index.js
79
index.js
|
@ -148,8 +148,12 @@ class Channel {
|
||||||
if (this.closed === true) return;
|
if (this.closed === true) return;
|
||||||
this.closed = true;
|
this.closed = true;
|
||||||
|
|
||||||
|
await this._mux.pullInfos();
|
||||||
|
|
||||||
this._info.opened--;
|
this._info.opened--;
|
||||||
|
|
||||||
|
await this._mux.pushInfos();
|
||||||
|
|
||||||
if (this._remoteId > 0) {
|
if (this._remoteId > 0) {
|
||||||
this._mux._remote[this._remoteId - 1] = null;
|
this._mux._remote[this._remoteId - 1] = null;
|
||||||
this._remoteId = 0;
|
this._remoteId = 0;
|
||||||
|
@ -168,7 +172,7 @@ class Channel {
|
||||||
this._mux._local[this._localId - 1] = null;
|
this._mux._local[this._localId - 1] = null;
|
||||||
this._localId = 0;
|
this._localId = 0;
|
||||||
|
|
||||||
this._mux._gc(this._info);
|
await this._mux._gc(this._info);
|
||||||
this._track(this.onclose(isRemote, this));
|
this._track(this.onclose(isRemote, this));
|
||||||
|
|
||||||
if (this._active === 0) this._destroy();
|
if (this._active === 0) this._destroy();
|
||||||
|
@ -361,7 +365,7 @@ module.exports = class Protomux {
|
||||||
return info ? info.opened > 0 : false;
|
return info ? info.opened > 0 : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
createChannel({
|
async createChannel({
|
||||||
userData = null,
|
userData = null,
|
||||||
protocol,
|
protocol,
|
||||||
aliases = [],
|
aliases = [],
|
||||||
|
@ -375,7 +379,7 @@ module.exports = class Protomux {
|
||||||
}) {
|
}) {
|
||||||
if (this.stream.destroyed) return null;
|
if (this.stream.destroyed) return null;
|
||||||
|
|
||||||
const info = this._get(protocol, id, aliases);
|
const info = await this._get(protocol, id, aliases);
|
||||||
if (unique && info.opened > 0) return null;
|
if (unique && info.opened > 0) return null;
|
||||||
|
|
||||||
if (info.incoming.length === 0) {
|
if (info.incoming.length === 0) {
|
||||||
|
@ -396,7 +400,12 @@ module.exports = class Protomux {
|
||||||
|
|
||||||
this._remoteBacklog--;
|
this._remoteBacklog--;
|
||||||
|
|
||||||
|
await this.pullInfos();
|
||||||
|
|
||||||
const remoteId = info.incoming.shift();
|
const remoteId = info.incoming.shift();
|
||||||
|
|
||||||
|
await this.pushInfos();
|
||||||
|
|
||||||
const r = this._remote[remoteId - 1];
|
const r = this._remote[remoteId - 1];
|
||||||
if (r === null) return null;
|
if (r === null) return null;
|
||||||
|
|
||||||
|
@ -461,9 +470,11 @@ module.exports = class Protomux {
|
||||||
this.stream.write(state.buffer);
|
this.stream.write(state.buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
_get(protocol, id, aliases = []) {
|
async _get(protocol, id, aliases = []) {
|
||||||
const key = toKey(protocol, id);
|
const key = toKey(protocol, id);
|
||||||
|
|
||||||
|
await this.pullInfos();
|
||||||
|
|
||||||
let info = this._infos.get(key);
|
let info = this._infos.get(key);
|
||||||
if (info) return info;
|
if (info) return info;
|
||||||
|
|
||||||
|
@ -486,18 +497,22 @@ module.exports = class Protomux {
|
||||||
this._infos.set(key, info);
|
this._infos.set(key, info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await this.pushInfos();
|
||||||
|
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
_gc(info) {
|
async _gc(info) {
|
||||||
if (
|
if (
|
||||||
info.opened === 0 &&
|
info.opened === 0 &&
|
||||||
info.outgoing.length === 0 &&
|
info.outgoing.length === 0 &&
|
||||||
info.incoming.length === 0
|
info.incoming.length === 0
|
||||||
) {
|
) {
|
||||||
|
await this.pullInfos();
|
||||||
this._infos.delete(info.key);
|
this._infos.delete(info.key);
|
||||||
|
|
||||||
for (const alias of info.aliases) this._infos.delete(alias);
|
for (const alias of info.aliases) this._infos.delete(alias);
|
||||||
|
await this.pullInfos();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -606,7 +621,7 @@ module.exports = class Protomux {
|
||||||
}
|
}
|
||||||
|
|
||||||
const rid = remoteId - 1;
|
const rid = remoteId - 1;
|
||||||
const info = this._get(protocol, id);
|
const info = await this._get(protocol, id);
|
||||||
|
|
||||||
if (this._slave) {
|
if (this._slave) {
|
||||||
await this.pullRemote();
|
await this.pullRemote();
|
||||||
|
@ -625,9 +640,12 @@ module.exports = class Protomux {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (info.outgoing.length > 0) {
|
if (info.outgoing.length > 0) {
|
||||||
|
await this.pullInfos();
|
||||||
const localId = info.outgoing.shift();
|
const localId = info.outgoing.shift();
|
||||||
const session = this._local[localId - 1];
|
const session = this._local[localId - 1];
|
||||||
|
|
||||||
|
await this.pushInfos();
|
||||||
|
|
||||||
if (session === null) {
|
if (session === null) {
|
||||||
if (this._slave) {
|
if (this._slave) {
|
||||||
await this.pullFree();
|
await this.pullFree();
|
||||||
|
@ -662,9 +680,13 @@ module.exports = class Protomux {
|
||||||
throw new Error("Remote exceeded backlog");
|
throw new Error("Remote exceeded backlog");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await this.pullInfos();
|
||||||
|
|
||||||
info.pairing++;
|
info.pairing++;
|
||||||
info.incoming.push(remoteId);
|
info.incoming.push(remoteId);
|
||||||
|
|
||||||
|
await this.pushInfos();
|
||||||
|
|
||||||
if (this._slave) {
|
if (this._slave) {
|
||||||
await this.pushRemote(remoteId);
|
await this.pushRemote(remoteId);
|
||||||
}
|
}
|
||||||
|
@ -680,8 +702,12 @@ module.exports = class Protomux {
|
||||||
const i = info.outgoing.indexOf(localId);
|
const i = info.outgoing.indexOf(localId);
|
||||||
if (i === -1) continue;
|
if (i === -1) continue;
|
||||||
|
|
||||||
|
await this.pullInfos();
|
||||||
|
|
||||||
info.outgoing.splice(i, 1);
|
info.outgoing.splice(i, 1);
|
||||||
|
|
||||||
|
await this.pushInfos();
|
||||||
|
|
||||||
const session = this._local[localId - 1];
|
const session = this._local[localId - 1];
|
||||||
|
|
||||||
if (this._slave) {
|
if (this._slave) {
|
||||||
|
@ -695,7 +721,7 @@ module.exports = class Protomux {
|
||||||
|
|
||||||
if (session !== null) session._close(true);
|
if (session !== null) session._close(true);
|
||||||
|
|
||||||
this._gc(info);
|
await this._gc(info);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -722,13 +748,25 @@ module.exports = class Protomux {
|
||||||
|
|
||||||
if (notify) await notify(id);
|
if (notify) await notify(id);
|
||||||
|
|
||||||
if (--info.pairing > 0) return;
|
await this.pullInfos();
|
||||||
|
|
||||||
|
let p = --info.pairing;
|
||||||
|
|
||||||
|
await this.pushInfos();
|
||||||
|
|
||||||
|
if (p > 0) return;
|
||||||
|
|
||||||
while (info.incoming.length > 0) {
|
while (info.incoming.length > 0) {
|
||||||
this._rejectSession(info, info.incoming.shift());
|
await this.pullInfos();
|
||||||
|
|
||||||
|
const id = info.incoming.shift();
|
||||||
|
|
||||||
|
await this.pushInfos();
|
||||||
|
|
||||||
|
this._rejectSession(info, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._gc(info);
|
await this._gc(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
_rejectSession(info, remoteId) {
|
_rejectSession(info, remoteId) {
|
||||||
|
@ -794,6 +832,15 @@ module.exports = class Protomux {
|
||||||
async pushRemote(id) {
|
async pushRemote(id) {
|
||||||
await this.stream.syncProtomux("pushRemote", id);
|
await this.stream.syncProtomux("pushRemote", id);
|
||||||
}
|
}
|
||||||
|
async pushInfos() {
|
||||||
|
if (!this._slave) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
await this.stream.syncProtomux(
|
||||||
|
"pushInfos",
|
||||||
|
Array.from(this._infos.entries())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
async pullLocal() {
|
async pullLocal() {
|
||||||
const ids = await this.stream.syncProtomux("pullLocal");
|
const ids = await this.stream.syncProtomux("pullLocal");
|
||||||
|
@ -821,6 +868,18 @@ module.exports = class Protomux {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
async pullInfos() {
|
||||||
|
if (!this._slave) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const info = await this.stream.syncProtomux(
|
||||||
|
"infos",
|
||||||
|
Array.from(this._infos.entries())
|
||||||
|
);
|
||||||
|
|
||||||
|
this._infos = new Map(info);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
function noop() {}
|
function noop() {}
|
||||||
|
|
Reference in New Issue