UNPKG

@servant/servant-discovery

Version:

Servant discovery library that can communicate with other servant processes.

1 lines 5.39 kB
!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n(require("dgram")):"function"==typeof define&&define.amd?define("@servant/servant-discovery",["dgram"],n):"object"==typeof exports?exports["@servant/servant-discovery"]=n(require("dgram")):e["@servant/servant-discovery"]=n(e.dgram)}(this,(e=>(()=>{"use strict";var n={725:(e,n)=>{var t;Object.defineProperty(n,"__esModule",{value:!0}),n.CommandType=void 0,(t=n.CommandType||(n.CommandType={})).Hello="SERVANT-CMD-HELLO",t.Ping="SERVANT-CMD-PING",t.Data="SERVANT-CMD-DATA",t.Close="SERVANT-CMD-CLOSE"},158:(e,n,t)=>{Object.defineProperty(n,"__esModule",{value:!0}),n.commandClose=void 0;const o=t(725);n.commandClose=function(e,n){return{type:o.CommandType.Close,from:e,port:n}}},238:(e,n,t)=>{Object.defineProperty(n,"__esModule",{value:!0}),n.commandData=void 0;const o=t(725);n.commandData=function(e,n,t,r){return{type:o.CommandType.Data,from:e,port:n,to:r,data:t}}},789:(e,n,t)=>{Object.defineProperty(n,"__esModule",{value:!0}),n.commandHello=void 0;const o=t(725);n.commandHello=function(e,n){return{type:o.CommandType.Hello,from:e,port:n}}},622:(e,n,t)=>{Object.defineProperty(n,"__esModule",{value:!0}),n.commandClose=n.commandData=n.commandPing=n.commandHello=n.CommandType=void 0;const o=t(725);Object.defineProperty(n,"CommandType",{enumerable:!0,get:function(){return o.CommandType}});const r=t(238);Object.defineProperty(n,"commandData",{enumerable:!0,get:function(){return r.commandData}});const a=t(789);Object.defineProperty(n,"commandHello",{enumerable:!0,get:function(){return a.commandHello}});const c=t(841);Object.defineProperty(n,"commandPing",{enumerable:!0,get:function(){return c.commandPing}});const i=t(158);Object.defineProperty(n,"commandClose",{enumerable:!0,get:function(){return i.commandClose}})},841:(e,n,t)=>{Object.defineProperty(n,"__esModule",{value:!0}),n.commandPing=void 0;const o=t(725);n.commandPing=function(e,n){return{type:o.CommandType.Ping,from:e,port:n}}},984:(e,n,t)=>{Object.defineProperty(n,"__esModule",{value:!0}),n.createDiscoveryServer=void 0;const o=t(308),r=t(4),a=t(622);function c(){const e=Math.random();return Math.round(1e3+1e3*e)}function i(e,{onError:n}){if(!n)throw e;n(e)}function d(e,n){const{from:t}=n;return e.instances[t]?e.instances[t]:null}function s(){return(new Date).getTime()}function m(e,n,{onDisconnect:t=(()=>{})}){const{tfl:o,id:r,port:a}=e.instances[n];delete e.instances[n],t({id:r,port:a,tfl:o})}function u(e,n,t,o){const a=JSON.stringify(t),c=Buffer.from(a);if(!n.running)return;let i=0,d=0;function s(){d++,i===d&&o&&o()}for(let t=r.PORT_FROM;t<=r.PORT_TO;t++)t!==n.port&&(e.send(c,0,c.length,t,"127.0.0.1",s),i++)}n.createDiscoveryServer=function(e={}){const n={id:Math.random().toString(36).slice(2),port:r.PORT_FROM,running:!1,instances:{},heartbeat:{frame:c(),ping:null,live:null}},t=o.createSocket("udp4");return function(e,n,t){const{onStart:o=(()=>{})}=t;e.on("listening",(()=>{n.running=!0,u(e,n,(0,a.commandHello)(n.id,n.port)),function(e,n){const{heartbeat:t}=n,{frame:o}=t;t.ping=setInterval((()=>u(e,n,(0,a.commandPing)(n.id,n.port))),o)}(e,n),function(e,n){const{heartbeat:t}=e,{frame:o}=t;t.live=setInterval((()=>{const t=s();Object.keys(e.instances).forEach((o=>{const{tfl:r}=e.instances[o];t-r>2e4&&m(e,o,n)}))}),o)}(n,t),o({id:n.id,port:n.port,tfl:s()})})),e.on("message",(o=>{!function(e,n,t,o){const r=function(e){try{const n=JSON.parse(e.toString());return n&&n.type?n:null}catch(e){return null}}(t);switch(function(e,n,t,{onConnect:o=(()=>{})}){if(d(n,t))return;const{id:r,port:c}=function(e,n){const{port:t,from:o}=n,r={id:o,port:t,tfl:s()};return e.instances[o]=r,r}(n,t);o({id:r,port:c,tfl:s()}),u(e,n,(0,a.commandHello)(n.id,n.port))}(e,n,r,o),r&&r.type){case a.CommandType.Ping:!function(e,n,t){const o=d(n,t);o&&(o.tfl=s())}(0,n,r);break;case a.CommandType.Data:!function(e,n,t,{onData:o=(()=>{})}){const r=d(n,t);r&&(r.tfl=s(),o(r,t.data))}(0,n,r,o);break;case a.CommandType.Close:!function(e,n,t,o){const r=d(n,t);r&&m(n,r.id,o)}(0,n,r,o)}}(e,n,o,t)}))}(t,n,e),function(e,n,t){const{onClose:o=(()=>{})}=t;e.on("close",(()=>{n.running=!1,n.heartbeat.ping&&clearInterval(n.heartbeat.ping),n.heartbeat.live&&clearInterval(n.heartbeat.live),o({id:n.id,port:n.port,tfl:s()})}))}(t,n,e),function(e,n,t){e.on("error",(o=>{"EADDRINUSE"===o.code?n.port>=r.PORT_TO?i(new Error("Can not found available port for Servant discovery server."),t):(n.port++,e.bind(n.port)):i(o,t)})),e.bind(n.port)}(t,n,e),{id:n.id,port:()=>n.port,send:(e,o=[])=>u(t,n,(0,a.commandData)(n.id,n.port,e,o.map((e=>e.id)))),close:()=>{u(t,n,(0,a.commandClose)(n.id,n.port),(()=>{t.close()}))}}}},741:(e,n,t)=>{Object.defineProperty(n,"__esModule",{value:!0}),n.createDiscoveryServer=void 0;const o=t(984);Object.defineProperty(n,"createDiscoveryServer",{enumerable:!0,get:function(){return o.createDiscoveryServer}})},4:(e,n)=>{Object.defineProperty(n,"__esModule",{value:!0}),n.PORT_TO=n.PORT_FROM=void 0,n.PORT_FROM=5e3,n.PORT_TO=5999},308:n=>{n.exports=e}},t={};function o(e){var r=t[e];if(void 0!==r)return r.exports;var a=t[e]={exports:{}};return n[e](a,a.exports,o),a.exports}var r={};return(()=>{var e=r;Object.defineProperty(e,"__esModule",{value:!0}),e.createDiscoveryServer=void 0;const n=o(741);Object.defineProperty(e,"createDiscoveryServer",{enumerable:!0,get:function(){return n.createDiscoveryServer}})})(),r})()));