UNPKG

crosis

Version:
3 lines (2 loc) 4.71 kB
import h from"@replit/protocol";const a=h.api;import{WebSocket as o}from"ws";import{Channel as u}from"./channel.js";import{EventEmitter as d}from"events";import{normalize as c}from"path";const p={};class f extends d{constructor(t){if(!t.url&&!t.adapter)throw new Error("Either url or adapter must be specified");super();t={...p,...t},this.adapter=t.adapter||null,this.url=t.url||void 0,this.ws=null,this.debug=t.debug||!1,this.refHandlers={},this.channels={},this.channelsByName={},this.utilFuncsChannels={},this.otStatuses={},this.bootStatus=null,this.containerState=null,this.execUtilResolve=null,this.execUtilReject=null,this.execUtilOutput=null}setAdapter(t){if(this.wsReadyState!=o.CLOSED)throw new Error("Cannot change adapter while connected");this.adapter=t}setUrl(t){if(this.wsReadyState!=o.CLOSED)throw new Error("Cannot change URL while connected");this.url=t}get wsReadyState(){var t,e;return(e=(t=this.ws)==null?void 0:t.readyState)!=null?e:o.CLOSED}async connect(){const t=this.adapter?await this.adapter():null;t!=null&&t.url&&(this.url=t.url),this.ws=new o(this.url),await new Promise(e=>{this.ws.onopen=e}),this.ws.onmessage=e=>{var r,l;if(typeof e.data=="string")return;let s;if(e.data instanceof Uint8Array)s=e.data;else if(e.data instanceof ArrayBuffer||e.data instanceof Buffer)s=new Uint8Array(e.data);else return;const n=a.Command.decode(s),i=this.channels[n.channel];this.debug&&console.log(n),typeof((r=n.bootStatus)==null?void 0:r.stage)=="number"&&(this.bootStatus=n.bootStatus.stage),typeof((l=n.containerState)==null?void 0:l.state)=="number"&&(this.containerState=n.containerState.state),n.channel==this.utilFuncsChannels.exec&&(n.output?this.execUtilOutput+=n.output:n.ok&&(this.execUtilResolve(this.execUtilOutput),this.execUtilResolve=null,this.execUtilReject=null,this.execUtilOutput=null)),(i==null?void 0:i.service)=="ot"&&n.otstatus&&(this.otStatuses[n.otstatus.linkedFile.path]=n.otstatus),n.ref&&this.refHandlers[n.ref]&&this.refHandlers[n.ref](n),this.emit("message",n),n.toast&&this.emit("toast",n.toast.text)},this.emit("connect")}generateRef(){return Math.random().toString(36).substring(2)}send(t,e=!0,s=!0){return e&&!t.ref&&(t.ref=this.generateRef()),this.ws.send(a.Command.encode(a.Command.create(t)).finish()),this.emit("messageSent",t),new Promise((n,i)=>{this.refHandlers[t.ref]=r=>{s&&r.error&&i(r.error),n(r)}})}async openChannel(t,e,s){const n=await this.send({channel:0,openChan:{service:t,name:e||"",action:s||a.OpenChannel.Action.ATTACH_OR_CREATE}}),i=new u(this,n.openChanRes,t,e);if(this.channels[n.openChanRes.id]=i,e){if(e in this.channelsByName)throw new Error(`Channel already exists with name "${e}"`);this.channelsByName[e]=n.openChanRes.id}return this.emit("openChannel",i),i}async closeChannel(t,e){const s=await this.send({channel:0,closeChan:{id:t,action:e||a.CloseChannel.Action.TRY_CLOSE}});return delete this.channels[t],this.emit("closeChannel",s.closeChanRes),s.closeChanRes}async disconnect(t=!0){var e;if(this.wsReadyState==o.CLOSED)return!1;if(t)for(const s of Object.values(this.channels))await s.close();return this.ws.close(),(e=this.execUtilReject)==null||e.call(this,"Disconnected"),this.execUtilResolve=null,this.execUtilReject=null,this.execUtilOutput=null,this.emit("disconnect"),!0}getChannelIdByName(t){return this.channelsByName[t]}async startUtil(...t){const e=t[0];if(e in this.utilFuncsChannels)return this.channels[this.utilFuncsChannels[e]];{const s=await this.openChannel(...t);return this.utilFuncsChannels[e]=s.id,s}}async readFile(t){var n;return(n=(await(await this.startUtil("gcsfiles")).send({read:{path:t}})).file)==null?void 0:n.content}async writeFile(t,e){return await(await this.startUtil("gcsfiles")).send({write:{path:t,content:e}})}async statFile(t){return(await(await this.startUtil("gcsfiles")).send({stat:{path:t}})).statRes}async readDir(t){return(await(await this.startUtil("gcsfiles")).send({readdir:{path:t}})).files.files}async createDir(t){return await(await this.startUtil("gcsfiles")).send({mkdir:{path:t}})}async exec(t,e){if(this.execUtilResolve)throw new Error("Cannot execute multiple commands at once");const s=await this.startUtil("exec");return this.execUtilOutput="",(await Promise.all([new Promise((i,r)=>{this.execUtilResolve=i,this.execUtilReject=r}),s.send({exec:{args:t,env:e}})]))[0]}async getFileHistory(t,e=1,s){var r;return t=c(t),s=s!=null?s:this.getLatestFileVersion(t),(r=(await(await this.startUtil("ot",`ot:${t}`)).send({otFetchRequest:{versionFrom:e,versionTo:s}})).otFetchResponse)==null?void 0:r.packets}getLatestFileVersion(t){var e,s;return t=c(t),(s=(e=this.otStatuses[t])==null?void 0:e.version)!=null?s:null}}export{f as Crosis}; //# sourceMappingURL=crosis.js.map