rjweb-server
Version:
Easy and Robust Way to create a Web Server with Many Easy-to-use Features in NodeJS
112 lines (111 loc) • 3.48 kB
JavaScript
import Base from "./Base";
import parseContent from "../../functions/parseContent";
export default class WsOpenContext extends Base {
constructor(context, rawContext, abort, type = 'open') {
super(context);
this.rawContext = rawContext;
this.abort = abort;
this.type = type;
}
/**
* Websocket Close (Abort) Controller (please use to decrease server load)
* @since 9.0.0
*/ $abort(callback) {
if (callback)
this.abort.addEventListener('abort', callback);
return this.abort.aborted;
}
/**
* Close the Socket and send a Code + Message to the Client (automatically Formatted)
*
* This will instantly close the socket connection with a status code and
* message of choice, after calling and successfully closing the `.onClose()`
* callback will be called to finish the task.
* @example
* ```
* ctr.close(1011, 'An Error has occured')
* ```
* @since 5.4.0
*/ close(code, reason) {
this.rawContext.close(code, reason);
return this;
}
/**
* Print a Message to the Client (automatically Formatted)
*
* This Message will instantly sent to the client, since this
* is a websocket, this also means that the message cannot be
* overriden after this function is called.
* @example
* ```
* await ctr.print({
* message: 'this is json!'
* })
*
* // content will be `{"message":"this is json!"}`
*
* /// or
*
* await ctr.print({
* message: 'this is json!'
* }, true)
* // content will be `{\n "message": "this is json!"\n}`
*
* /// or
*
* await ctr.print('this is text!')
* // content will be `this is text!`
* ```
* @since 5.4.0
*/ async print(type, content, prettify = false) {
const parsed = await parseContent(content, prettify);
this.rawContext.write(type, parsed.content, this.global.options.compression.ws.enabled && this.global.options.compression.ws.maxSize > parsed.content.byteLength);
return this;
}
/**
* Print a channels value to the client
*
* This will print when the provided channel has a new value,
* basically subscribing to the channel.
* @example
* ```
* const channel = new Channel<string>()
*
* ctr.printChannel(channel)
*
* ref.send('Ok')
* ```
* @since 9.0.0
*/ printChannel(channel) {
if (!channel['onPublish']) {
this.context.global.channels.push(channel);
channel['onPublish'] = (type, data) => {
this.context.global.implementation.wsPublish(type, channel.id, data, this.global.options.compression.ws.enabled && this.global.options.compression.ws.maxSize > data.byteLength);
};
}
this.rawContext.subscribe(channel.id);
return this;
}
/**
* Remove a channel from the client
*
* This will remove the subscription to the channel
* from the client. No more messages will be sent.
* @example
* ```
* const channel = new Channel<string>()
*
* ctr.printChannel(channel)
*
* ref.send('Ok')
*
* ctr.removeChannel(channel)
*
* ref.send('No') // will not be sent
* ```
* @since 9.0.0
*/ removeChannel(channel) {
this.rawContext.unsubscribe(channel.id);
return this;
}
}