gritty 10.0.2 → 10.2.0
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.
- package/ChangeLog +17 -0
- package/README.md +0 -1
- package/dist/gritty.js +22 -7
- package/dist/gritty.js.map +1 -1
- package/dist-dev/gritty.js +8 -8
- package/package.json +7 -8
- package/server/gritty.js +1 -1
package/dist-dev/gritty.js
CHANGED
|
@@ -212,7 +212,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
212
212
|
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
213
213
|
|
|
214
214
|
"use strict";
|
|
215
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ _defaultFontFamily: () => (/* binding */ _defaultFontFamily),\n/* harmony export */ _onConnect: () => (/* binding */ _onConnect),\n/* harmony export */ _onData: () => (/* binding */ _onData),\n/* harmony export */ _onDisconnect: () => (/* binding */ _onDisconnect),\n/* harmony export */ _onTermData: () => (/* binding */ _onTermData),\n/* harmony export */ _onTermResize: () => (/* binding */ _onTermResize),\n/* harmony export */ _onWindowResize: () => (/* binding */ _onWindowResize),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _xterm_xterm_css_xterm_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @xterm/xterm/css/xterm.css */ \"./node_modules/@xterm/xterm/css/xterm.css\");\n/* harmony import */ var _xterm_addon_fit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @xterm/addon-fit */ \"./node_modules/@xterm/addon-fit/lib/addon-fit.mjs\");\n/* harmony import */ var _xterm_addon_webgl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @xterm/addon-webgl */ \"./node_modules/@xterm/addon-webgl/lib/addon-webgl.mjs\");\n/* harmony import */ var currify__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! currify */ \"./node_modules/currify/lib/currify.js\");\n/* harmony import */ var try_catch__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! try-catch */ \"./node_modules/try-catch/lib/try-catch.js\");\n/* harmony import */ var wraptile__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! wraptile */ \"./node_modules/wraptile/lib/wraptile.js\");\n/* harmony import */ var socket_io_client__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! socket.io-client */ \"./node_modules/socket.io-client/build/esm/index.js\");\n/* harmony import */ var _xterm_xterm__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @xterm/xterm */ \"./node_modules/@xterm/xterm/lib/xterm.mjs\");\n/* harmony import */ var _get_el_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./get-el.js */ \"./client/get-el.js\");\n/* harmony import */ var _get_host_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./get-host.js */ \"./client/get-host.js\");\n/* harmony import */ var _get_env_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./get-env.js */ \"./client/get-env.js\");\n\n\n\n\n\n\n\n\n\n\n\n\nconst onWindowResize = wraptile__WEBPACK_IMPORTED_MODULE_5__(_onWindowResize);\nconst onTermData = currify__WEBPACK_IMPORTED_MODULE_3__(_onTermData);\nconst onTermResize = currify__WEBPACK_IMPORTED_MODULE_3__(_onTermResize);\nconst onData = currify__WEBPACK_IMPORTED_MODULE_3__(_onData);\n\nconst onDisconnect = wraptile__WEBPACK_IMPORTED_MODULE_5__(_onDisconnect);\n\nconst onConnect = wraptile__WEBPACK_IMPORTED_MODULE_5__(_onConnect);\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (gritty);\n\nconst defaultFontFamily = 'Menlo, Consolas, \"Liberation Mono\", Monaco, \"Lucida Console\", monospace';\n\nconst _defaultFontFamily = defaultFontFamily;\n\nfunction gritty(element, options = {}) {\n const el = (0,_get_el_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(element);\n \n const {\n socketPath = '',\n fontFamily = defaultFontFamily,\n prefix = '/gritty',\n command,\n autoRestart,\n cwd,\n connect,\n Terminal = _xterm_xterm__WEBPACK_IMPORTED_MODULE_7__.Terminal,\n WebglAddon = _xterm_addon_webgl__WEBPACK_IMPORTED_MODULE_2__.WebglAddon,\n } = options;\n \n const env = (0,_get_env_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(options.env || {});\n \n const socket = doConnect(prefix, socketPath, {\n connect,\n });\n \n return createTerminal(el, {\n env,\n cwd,\n command,\n autoRestart,\n socket,\n fontFamily,\n Terminal,\n WebglAddon,\n });\n}\n\nfunction createTerminal(terminalContainer, overrides) {\n const {\n env,\n cwd,\n command,\n autoRestart,\n socket,\n fontFamily,\n Terminal,\n WebglAddon,\n } = overrides;\n \n const fitAddon = new _xterm_addon_fit__WEBPACK_IMPORTED_MODULE_1__.FitAddon();\n const webglAddon = new WebglAddon();\n \n const terminal = new Terminal({\n scrollback: 1000,\n tabStopWidth: 4,\n fontFamily,\n allowProposedApi: true,\n });\n \n terminal.open(terminalContainer);\n terminal.focus();\n \n terminal.loadAddon(webglAddon);\n terminal.loadAddon(fitAddon);\n fitAddon.fit();\n \n terminal.onResize(onTermResize(socket));\n terminal.onData(onTermData(socket));\n \n globalThis.addEventListener('resize', onWindowResize(fitAddon));\n \n const {cols, rows} = terminal;\n \n socket.on('accept', onConnect(socket, fitAddon, {\n env,\n cwd,\n cols,\n rows,\n command,\n autoRestart,\n }));\n socket.on('disconnect', onDisconnect(terminal));\n socket.on('data', onData(terminal));\n \n return {\n socket,\n terminal,\n };\n}\n\nfunction _onConnect(socket, fitAddon, {env, cwd, cols, rows, command, autoRestart}) {\n socket.emit('terminal', {\n env,\n cwd,\n cols,\n rows,\n command,\n autoRestart,\n });\n socket.emit('resize', {\n cols,\n rows,\n });\n fitAddon.fit();\n}\n\nfunction _onDisconnect(terminal) {\n terminal.writeln('terminal disconnected...');\n}\n\nfunction _onData(terminal, data) {\n terminal.write(data);\n}\n\nfunction _onTermResize(socket, {cols, rows}) {\n socket.emit('resize', {\n cols,\n rows,\n });\n}\n\nfunction _onTermData(socket, data) {\n socket.emit('data', data);\n}\n\nfunction _onWindowResize(fitAddon) {\n // Uncaught Error: This API only accepts integers\n // when gritty mimized\n const fit = fitAddon.fit.bind(fitAddon);\n (0,try_catch__WEBPACK_IMPORTED_MODULE_4__.tryCatch)(fit);\n}\n\nfunction doConnect(prefix, socketPath, overrides = {}) {\n const {connect = socket_io_client__WEBPACK_IMPORTED_MODULE_6__.io.connect} = overrides;\n const href = (0,_get_host_js__WEBPACK_IMPORTED_MODULE_9__[\"default\"])();\n const FIVE_SECONDS = 5000;\n \n const path = `${socketPath}/socket.io`;\n const socket = connect(href + prefix, {\n 'max reconnection attempts': 2 ** 32,\n 'reconnection limit': FIVE_SECONDS,\n path,\n });\n \n return socket;\n}\n\n\n//# sourceURL=file://gritty/client/gritty.js\n}");
|
|
215
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ _defaultFontFamily: () => (/* binding */ _defaultFontFamily),\n/* harmony export */ _onConnect: () => (/* binding */ _onConnect),\n/* harmony export */ _onData: () => (/* binding */ _onData),\n/* harmony export */ _onDisconnect: () => (/* binding */ _onDisconnect),\n/* harmony export */ _onTermData: () => (/* binding */ _onTermData),\n/* harmony export */ _onTermResize: () => (/* binding */ _onTermResize),\n/* harmony export */ _onWindowResize: () => (/* binding */ _onWindowResize),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _xterm_xterm_css_xterm_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @xterm/xterm/css/xterm.css */ \"./node_modules/@xterm/xterm/css/xterm.css\");\n/* harmony import */ var _xterm_addon_fit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @xterm/addon-fit */ \"./node_modules/@xterm/addon-fit/lib/addon-fit.mjs\");\n/* harmony import */ var _xterm_addon_webgl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @xterm/addon-webgl */ \"./node_modules/@xterm/addon-webgl/lib/addon-webgl.mjs\");\n/* harmony import */ var currify__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! currify */ \"./node_modules/currify/lib/currify.js\");\n/* harmony import */ var try_catch__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! try-catch */ \"./node_modules/try-catch/lib/try-catch.js\");\n/* harmony import */ var wraptile__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! wraptile */ \"./node_modules/wraptile/lib/wraptile.js\");\n/* harmony import */ var socket_io_client__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! socket.io-client */ \"./node_modules/socket.io-client/build/esm/index.js\");\n/* harmony import */ var _xterm_xterm__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @xterm/xterm */ \"./node_modules/@xterm/xterm/lib/xterm.mjs\");\n/* harmony import */ var _get_el_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./get-el.js */ \"./client/get-el.js\");\n/* harmony import */ var _get_host_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./get-host.js */ \"./client/get-host.js\");\n/* harmony import */ var _get_env_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./get-env.js */ \"./client/get-env.js\");\n\n\n\n\n\n\n\n\n\n\n\n\nconst onWindowResize = wraptile__WEBPACK_IMPORTED_MODULE_5__(_onWindowResize);\nconst onTermData = currify__WEBPACK_IMPORTED_MODULE_3__(_onTermData);\nconst onTermResize = currify__WEBPACK_IMPORTED_MODULE_3__(_onTermResize);\nconst onData = currify__WEBPACK_IMPORTED_MODULE_3__(_onData);\n\nconst onDisconnect = wraptile__WEBPACK_IMPORTED_MODULE_5__(_onDisconnect);\n\nconst onConnect = wraptile__WEBPACK_IMPORTED_MODULE_5__(_onConnect);\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (gritty);\n\nconst defaultFontFamily = 'Menlo, Consolas, \"Liberation Mono\", Monaco, \"Lucida Console\", monospace';\n\nconst _defaultFontFamily = defaultFontFamily;\n\nfunction gritty(element, options = {}) {\n const el = (0,_get_el_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"])(element);\n \n const {\n socketPath = '',\n fontFamily = defaultFontFamily,\n prefix = '/gritty',\n command,\n autoRestart,\n cwd,\n connect,\n Terminal = _xterm_xterm__WEBPACK_IMPORTED_MODULE_7__.Terminal,\n WebglAddon = _xterm_addon_webgl__WEBPACK_IMPORTED_MODULE_2__.WebglAddon,\n } = options;\n \n const env = (0,_get_env_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"])(options.env || {});\n \n const socket = doConnect(prefix, socketPath, {\n connect,\n });\n \n return createTerminal(el, {\n env,\n cwd,\n command,\n autoRestart,\n socket,\n fontFamily,\n Terminal,\n WebglAddon,\n });\n}\n\nfunction createTerminal(terminalContainer, overrides) {\n const {\n env,\n cwd,\n command,\n autoRestart,\n socket,\n fontFamily,\n Terminal,\n WebglAddon,\n } = overrides;\n \n const fitAddon = new _xterm_addon_fit__WEBPACK_IMPORTED_MODULE_1__.FitAddon();\n const webglAddon = new WebglAddon();\n \n const terminal = new Terminal({\n scrollback: 1000,\n tabStopWidth: 4,\n fontFamily,\n allowProposedApi: true,\n fontWeightBold: 'normal', \n theme: {\n foreground: '#dcdcdc',\n background: '#141920',\n },\n });\n \n terminal.open(terminalContainer);\n terminal.focus();\n \n terminal.loadAddon(webglAddon);\n terminal.loadAddon(fitAddon);\n fitAddon.fit();\n \n terminal.onResize(onTermResize(socket));\n terminal.onData(onTermData(socket));\n \n globalThis.addEventListener('resize', onWindowResize(fitAddon));\n \n const {cols, rows} = terminal;\n \n socket.on('accept', onConnect(socket, fitAddon, {\n env,\n cwd,\n cols,\n rows,\n command,\n autoRestart,\n }));\n socket.on('disconnect', onDisconnect(terminal));\n socket.on('data', onData(terminal));\n \n return {\n socket,\n terminal,\n };\n}\n\nfunction _onConnect(socket, fitAddon, {env, cwd, cols, rows, command, autoRestart}) {\n socket.emit('terminal', {\n env,\n cwd,\n cols,\n rows,\n command,\n autoRestart,\n });\n socket.emit('resize', {\n cols,\n rows,\n });\n fitAddon.fit();\n}\n\nfunction _onDisconnect(terminal) {\n terminal.writeln('');\n terminal.writeln('terminal disconnected...');\n terminal.writeln('');\n}\n\nfunction _onData(terminal, data) {\n terminal.write(data);\n}\n\nfunction _onTermResize(socket, {cols, rows}) {\n socket.emit('resize', {\n cols,\n rows,\n });\n}\n\nfunction _onTermData(socket, data) {\n socket.emit('data', data);\n}\n\nfunction _onWindowResize(fitAddon) {\n // Uncaught Error: This API only accepts integers\n // when gritty mimized\n const fit = fitAddon.fit.bind(fitAddon);\n (0,try_catch__WEBPACK_IMPORTED_MODULE_4__.tryCatch)(fit);\n}\n\nfunction doConnect(prefix, socketPath, overrides = {}) {\n const {connect = socket_io_client__WEBPACK_IMPORTED_MODULE_6__.io.connect} = overrides;\n const href = (0,_get_host_js__WEBPACK_IMPORTED_MODULE_9__[\"default\"])();\n const FIVE_SECONDS = 5000;\n \n const path = `${socketPath}/socket.io`;\n const socket = connect(href + prefix, {\n 'max reconnection attempts': 2 ** 32,\n 'reconnection limit': FIVE_SECONDS,\n path,\n });\n \n return socket;\n}\n\n\n//# sourceURL=file://gritty/client/gritty.js\n}");
|
|
216
216
|
|
|
217
217
|
/***/ },
|
|
218
218
|
|
|
@@ -553,7 +553,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
553
553
|
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
554
554
|
|
|
555
555
|
"use strict";
|
|
556
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Decoder: () => (/* binding */ Decoder),\n/* harmony export */ Encoder: () => (/* binding */ Encoder),\n/* harmony export */ PacketType: () => (/* binding */ PacketType),\n/* harmony export */ isPacketValid: () => (/* binding */ isPacketValid),\n/* harmony export */ protocol: () => (/* binding */ protocol)\n/* harmony export */ });\n/* harmony import */ var _socket_io_component_emitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @socket.io/component-emitter */ \"./node_modules/@socket.io/component-emitter/lib/esm/index.js\");\n/* harmony import */ var _binary_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./binary.js */ \"./node_modules/socket.io-parser/build/esm-debug/binary.js\");\n/* harmony import */ var _is_binary_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./is-binary.js */ \"./node_modules/socket.io-parser/build/esm-debug/is-binary.js\");\n/* harmony import */ var debug__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! debug */ \"./node_modules/debug/src/browser.js\");\n\n\n\n // debug()\nconst debug = debug__WEBPACK_IMPORTED_MODULE_3__(\"socket.io-parser\"); // debug()\n/**\n * These strings must not be used as event names, as they have a special meaning.\n */\nconst RESERVED_EVENTS = [\n \"connect\", // used on the client side\n \"connect_error\", // used on the client side\n \"disconnect\", // used on both sides\n \"disconnecting\", // used on the server side\n \"newListener\", // used by the Node.js EventEmitter\n \"removeListener\", // used by the Node.js EventEmitter\n];\n/**\n * Protocol version.\n *\n * @public\n */\nconst protocol = 5;\nvar PacketType;\n(function (PacketType) {\n PacketType[PacketType[\"CONNECT\"] = 0] = \"CONNECT\";\n PacketType[PacketType[\"DISCONNECT\"] = 1] = \"DISCONNECT\";\n PacketType[PacketType[\"EVENT\"] = 2] = \"EVENT\";\n PacketType[PacketType[\"ACK\"] = 3] = \"ACK\";\n PacketType[PacketType[\"CONNECT_ERROR\"] = 4] = \"CONNECT_ERROR\";\n PacketType[PacketType[\"BINARY_EVENT\"] = 5] = \"BINARY_EVENT\";\n PacketType[PacketType[\"BINARY_ACK\"] = 6] = \"BINARY_ACK\";\n})(PacketType || (PacketType = {}));\n/**\n * A socket.io Encoder instance\n */\nclass Encoder {\n /**\n * Encoder constructor\n *\n * @param {function} replacer - custom replacer to pass down to JSON.parse\n */\n constructor(replacer) {\n this.replacer = replacer;\n }\n /**\n * Encode a packet as a single string if non-binary, or as a\n * buffer sequence, depending on packet type.\n *\n * @param {Object} obj - packet object\n */\n encode(obj) {\n debug(\"encoding packet %j\", obj);\n if (obj.type === PacketType.EVENT || obj.type === PacketType.ACK) {\n if ((0,_is_binary_js__WEBPACK_IMPORTED_MODULE_2__.hasBinary)(obj)) {\n return this.encodeAsBinary({\n type: obj.type === PacketType.EVENT\n ? PacketType.BINARY_EVENT\n : PacketType.BINARY_ACK,\n nsp: obj.nsp,\n data: obj.data,\n id: obj.id,\n });\n }\n }\n return [this.encodeAsString(obj)];\n }\n /**\n * Encode packet as string.\n */\n encodeAsString(obj) {\n // first is type\n let str = \"\" + obj.type;\n // attachments if we have them\n if (obj.type === PacketType.BINARY_EVENT ||\n obj.type === PacketType.BINARY_ACK) {\n str += obj.attachments + \"-\";\n }\n // if we have a namespace other than `/`\n // we append it followed by a comma `,`\n if (obj.nsp && \"/\" !== obj.nsp) {\n str += obj.nsp + \",\";\n }\n // immediately followed by the id\n if (null != obj.id) {\n str += obj.id;\n }\n // json data\n if (null != obj.data) {\n str += JSON.stringify(obj.data, this.replacer);\n }\n debug(\"encoded %j as %s\", obj, str);\n return str;\n }\n /**\n * Encode packet as 'buffer sequence' by removing blobs, and\n * deconstructing packet into object with placeholders and\n * a list of buffers.\n */\n encodeAsBinary(obj) {\n const deconstruction = (0,_binary_js__WEBPACK_IMPORTED_MODULE_1__.deconstructPacket)(obj);\n const pack = this.encodeAsString(deconstruction.packet);\n const buffers = deconstruction.buffers;\n buffers.unshift(pack); // add packet info to beginning of data list\n return buffers; // write all the buffers\n }\n}\n/**\n * A socket.io Decoder instance\n *\n * @return {Object} decoder\n */\nclass Decoder extends _socket_io_component_emitter__WEBPACK_IMPORTED_MODULE_0__.Emitter {\n /**\n * Decoder constructor\n *\n * @param {function} reviver - custom reviver to pass down to JSON.stringify\n */\n constructor(reviver) {\n super();\n this.reviver = reviver;\n }\n /**\n * Decodes an encoded packet string into packet JSON.\n *\n * @param {String} obj - encoded packet\n */\n add(obj) {\n let packet;\n if (typeof obj === \"string\") {\n if (this.reconstructor) {\n throw new Error(\"got plaintext data when reconstructing a packet\");\n }\n packet = this.decodeString(obj);\n const isBinaryEvent = packet.type === PacketType.BINARY_EVENT;\n if (isBinaryEvent || packet.type === PacketType.BINARY_ACK) {\n packet.type = isBinaryEvent ? PacketType.EVENT : PacketType.ACK;\n // binary packet's json\n this.reconstructor = new BinaryReconstructor(packet);\n // no attachments, labeled binary but no binary data to follow\n if (packet.attachments === 0) {\n super.emitReserved(\"decoded\", packet);\n }\n }\n else {\n // non-binary full packet\n super.emitReserved(\"decoded\", packet);\n }\n }\n else if ((0,_is_binary_js__WEBPACK_IMPORTED_MODULE_2__.isBinary)(obj) || obj.base64) {\n // raw binary data\n if (!this.reconstructor) {\n throw new Error(\"got binary data when not reconstructing a packet\");\n }\n else {\n packet = this.reconstructor.takeBinaryData(obj);\n if (packet) {\n // received final buffer\n this.reconstructor = null;\n super.emitReserved(\"decoded\", packet);\n }\n }\n }\n else {\n throw new Error(\"Unknown type: \" + obj);\n }\n }\n /**\n * Decode a packet String (JSON data)\n *\n * @param {String} str\n * @return {Object} packet\n */\n decodeString(str) {\n let i = 0;\n // look up type\n const p = {\n type: Number(str.charAt(0)),\n };\n if (PacketType[p.type] === undefined) {\n throw new Error(\"unknown packet type \" + p.type);\n }\n // look up attachments if type binary\n if (p.type === PacketType.BINARY_EVENT ||\n p.type === PacketType.BINARY_ACK) {\n const start = i + 1;\n while (str.charAt(++i) !== \"-\" && i != str.length) { }\n const buf = str.substring(start, i);\n if (buf != Number(buf) || str.charAt(i) !== \"-\") {\n throw new Error(\"Illegal attachments\");\n }\n p.attachments = Number(buf);\n }\n // look up namespace (if any)\n if (\"/\" === str.charAt(i + 1)) {\n const start = i + 1;\n while (++i) {\n const c = str.charAt(i);\n if (\",\" === c)\n break;\n if (i === str.length)\n break;\n }\n p.nsp = str.substring(start, i);\n }\n else {\n p.nsp = \"/\";\n }\n // look up id\n const next = str.charAt(i + 1);\n if (\"\" !== next && Number(next) == next) {\n const start = i + 1;\n while (++i) {\n const c = str.charAt(i);\n if (null == c || Number(c) != c) {\n --i;\n break;\n }\n if (i === str.length)\n break;\n }\n p.id = Number(str.substring(start, i + 1));\n }\n // look up json data\n if (str.charAt(++i)) {\n const payload = this.tryParse(str.substr(i));\n if (Decoder.isPayloadValid(p.type, payload)) {\n p.data = payload;\n }\n else {\n throw new Error(\"invalid payload\");\n }\n }\n debug(\"decoded %s as %j\", str, p);\n return p;\n }\n tryParse(str) {\n try {\n return JSON.parse(str, this.reviver);\n }\n catch (e) {\n return false;\n }\n }\n static isPayloadValid(type, payload) {\n switch (type) {\n case PacketType.CONNECT:\n return isObject(payload);\n case PacketType.DISCONNECT:\n return payload === undefined;\n case PacketType.CONNECT_ERROR:\n return typeof payload === \"string\" || isObject(payload);\n case PacketType.EVENT:\n case PacketType.BINARY_EVENT:\n return (Array.isArray(payload) &&\n (typeof payload[0] === \"number\" ||\n (typeof payload[0] === \"string\" &&\n RESERVED_EVENTS.indexOf(payload[0]) === -1)));\n case PacketType.ACK:\n case PacketType.BINARY_ACK:\n return Array.isArray(payload);\n }\n }\n /**\n * Deallocates a parser's resources\n */\n destroy() {\n if (this.reconstructor) {\n this.reconstructor.finishedReconstruction();\n this.reconstructor = null;\n }\n }\n}\n/**\n * A manager of a binary event's 'buffer sequence'. Should\n * be constructed whenever a packet of type BINARY_EVENT is\n * decoded.\n *\n * @param {Object} packet\n * @return {BinaryReconstructor} initialized reconstructor\n */\nclass BinaryReconstructor {\n constructor(packet) {\n this.packet = packet;\n this.buffers = [];\n this.reconPack = packet;\n }\n /**\n * Method to be called when binary data received from connection\n * after a BINARY_EVENT packet.\n *\n * @param {Buffer | ArrayBuffer} binData - the raw binary data received\n * @return {null | Object} returns null if more binary data is expected or\n * a reconstructed packet object if all buffers have been received.\n */\n takeBinaryData(binData) {\n this.buffers.push(binData);\n if (this.buffers.length === this.reconPack.attachments) {\n // done with buffer list\n const packet = (0,_binary_js__WEBPACK_IMPORTED_MODULE_1__.reconstructPacket)(this.reconPack, this.buffers);\n this.finishedReconstruction();\n return packet;\n }\n return null;\n }\n /**\n * Cleans up binary packet reconstruction variables.\n */\n finishedReconstruction() {\n this.reconPack = null;\n this.buffers = [];\n }\n}\nfunction isNamespaceValid(nsp) {\n return typeof nsp === \"string\";\n}\n// see https://caniuse.com/mdn-javascript_builtins_number_isinteger\nconst isInteger = Number.isInteger ||\n function (value) {\n return (typeof value === \"number\" &&\n isFinite(value) &&\n Math.floor(value) === value);\n };\nfunction isAckIdValid(id) {\n return id === undefined || isInteger(id);\n}\n// see https://stackoverflow.com/questions/8511281/check-if-a-value-is-an-object-in-javascript\nfunction isObject(value) {\n return Object.prototype.toString.call(value) === \"[object Object]\";\n}\nfunction isDataValid(type, payload) {\n switch (type) {\n case PacketType.CONNECT:\n return payload === undefined || isObject(payload);\n case PacketType.DISCONNECT:\n return payload === undefined;\n case PacketType.EVENT:\n return (Array.isArray(payload) &&\n (typeof payload[0] === \"number\" ||\n (typeof payload[0] === \"string\" &&\n RESERVED_EVENTS.indexOf(payload[0]) === -1)));\n case PacketType.ACK:\n return Array.isArray(payload);\n case PacketType.CONNECT_ERROR:\n return typeof payload === \"string\" || isObject(payload);\n default:\n return false;\n }\n}\nfunction isPacketValid(packet) {\n return (isNamespaceValid(packet.nsp) &&\n isAckIdValid(packet.id) &&\n isDataValid(packet.type, packet.data));\n}\n\n\n//# sourceURL=file://gritty/node_modules/socket.io-parser/build/esm-debug/index.js\n}");
|
|
556
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Decoder: () => (/* binding */ Decoder),\n/* harmony export */ Encoder: () => (/* binding */ Encoder),\n/* harmony export */ PacketType: () => (/* binding */ PacketType),\n/* harmony export */ isPacketValid: () => (/* binding */ isPacketValid),\n/* harmony export */ protocol: () => (/* binding */ protocol)\n/* harmony export */ });\n/* harmony import */ var _socket_io_component_emitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @socket.io/component-emitter */ \"./node_modules/@socket.io/component-emitter/lib/esm/index.js\");\n/* harmony import */ var _binary_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./binary.js */ \"./node_modules/socket.io-parser/build/esm-debug/binary.js\");\n/* harmony import */ var _is_binary_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./is-binary.js */ \"./node_modules/socket.io-parser/build/esm-debug/is-binary.js\");\n/* harmony import */ var debug__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! debug */ \"./node_modules/debug/src/browser.js\");\n\n\n\n // debug()\nconst debug = debug__WEBPACK_IMPORTED_MODULE_3__(\"socket.io-parser\"); // debug()\n/**\n * These strings must not be used as event names, as they have a special meaning.\n */\nconst RESERVED_EVENTS = [\n \"connect\", // used on the client side\n \"connect_error\", // used on the client side\n \"disconnect\", // used on both sides\n \"disconnecting\", // used on the server side\n \"newListener\", // used by the Node.js EventEmitter\n \"removeListener\", // used by the Node.js EventEmitter\n];\n/**\n * Protocol version.\n *\n * @public\n */\nconst protocol = 5;\nvar PacketType;\n(function (PacketType) {\n PacketType[PacketType[\"CONNECT\"] = 0] = \"CONNECT\";\n PacketType[PacketType[\"DISCONNECT\"] = 1] = \"DISCONNECT\";\n PacketType[PacketType[\"EVENT\"] = 2] = \"EVENT\";\n PacketType[PacketType[\"ACK\"] = 3] = \"ACK\";\n PacketType[PacketType[\"CONNECT_ERROR\"] = 4] = \"CONNECT_ERROR\";\n PacketType[PacketType[\"BINARY_EVENT\"] = 5] = \"BINARY_EVENT\";\n PacketType[PacketType[\"BINARY_ACK\"] = 6] = \"BINARY_ACK\";\n})(PacketType || (PacketType = {}));\n/**\n * A socket.io Encoder instance\n */\nclass Encoder {\n /**\n * Encoder constructor\n *\n * @param {function} replacer - custom replacer to pass down to JSON.parse\n */\n constructor(replacer) {\n this.replacer = replacer;\n }\n /**\n * Encode a packet as a single string if non-binary, or as a\n * buffer sequence, depending on packet type.\n *\n * @param {Object} obj - packet object\n */\n encode(obj) {\n debug(\"encoding packet %j\", obj);\n if (obj.type === PacketType.EVENT || obj.type === PacketType.ACK) {\n if ((0,_is_binary_js__WEBPACK_IMPORTED_MODULE_2__.hasBinary)(obj)) {\n return this.encodeAsBinary({\n type: obj.type === PacketType.EVENT\n ? PacketType.BINARY_EVENT\n : PacketType.BINARY_ACK,\n nsp: obj.nsp,\n data: obj.data,\n id: obj.id,\n });\n }\n }\n return [this.encodeAsString(obj)];\n }\n /**\n * Encode packet as string.\n */\n encodeAsString(obj) {\n // first is type\n let str = \"\" + obj.type;\n // attachments if we have them\n if (obj.type === PacketType.BINARY_EVENT ||\n obj.type === PacketType.BINARY_ACK) {\n str += obj.attachments + \"-\";\n }\n // if we have a namespace other than `/`\n // we append it followed by a comma `,`\n if (obj.nsp && \"/\" !== obj.nsp) {\n str += obj.nsp + \",\";\n }\n // immediately followed by the id\n if (null != obj.id) {\n str += obj.id;\n }\n // json data\n if (null != obj.data) {\n str += JSON.stringify(obj.data, this.replacer);\n }\n debug(\"encoded %j as %s\", obj, str);\n return str;\n }\n /**\n * Encode packet as 'buffer sequence' by removing blobs, and\n * deconstructing packet into object with placeholders and\n * a list of buffers.\n */\n encodeAsBinary(obj) {\n const deconstruction = (0,_binary_js__WEBPACK_IMPORTED_MODULE_1__.deconstructPacket)(obj);\n const pack = this.encodeAsString(deconstruction.packet);\n const buffers = deconstruction.buffers;\n buffers.unshift(pack); // add packet info to beginning of data list\n return buffers; // write all the buffers\n }\n}\n/**\n * A socket.io Decoder instance\n *\n * @return {Object} decoder\n */\nclass Decoder extends _socket_io_component_emitter__WEBPACK_IMPORTED_MODULE_0__.Emitter {\n /**\n * Decoder constructor\n */\n constructor(opts) {\n super();\n this.opts = Object.assign({\n reviver: undefined,\n maxAttachments: 10,\n }, typeof opts === \"function\" ? { reviver: opts } : opts);\n }\n /**\n * Decodes an encoded packet string into packet JSON.\n *\n * @param {String} obj - encoded packet\n */\n add(obj) {\n let packet;\n if (typeof obj === \"string\") {\n if (this.reconstructor) {\n throw new Error(\"got plaintext data when reconstructing a packet\");\n }\n packet = this.decodeString(obj);\n const isBinaryEvent = packet.type === PacketType.BINARY_EVENT;\n if (isBinaryEvent || packet.type === PacketType.BINARY_ACK) {\n packet.type = isBinaryEvent ? PacketType.EVENT : PacketType.ACK;\n // binary packet's json\n this.reconstructor = new BinaryReconstructor(packet);\n // no attachments, labeled binary but no binary data to follow\n if (packet.attachments === 0) {\n super.emitReserved(\"decoded\", packet);\n }\n }\n else {\n // non-binary full packet\n super.emitReserved(\"decoded\", packet);\n }\n }\n else if ((0,_is_binary_js__WEBPACK_IMPORTED_MODULE_2__.isBinary)(obj) || obj.base64) {\n // raw binary data\n if (!this.reconstructor) {\n throw new Error(\"got binary data when not reconstructing a packet\");\n }\n else {\n packet = this.reconstructor.takeBinaryData(obj);\n if (packet) {\n // received final buffer\n this.reconstructor = null;\n super.emitReserved(\"decoded\", packet);\n }\n }\n }\n else {\n throw new Error(\"Unknown type: \" + obj);\n }\n }\n /**\n * Decode a packet String (JSON data)\n *\n * @param {String} str\n * @return {Object} packet\n */\n decodeString(str) {\n let i = 0;\n // look up type\n const p = {\n type: Number(str.charAt(0)),\n };\n if (PacketType[p.type] === undefined) {\n throw new Error(\"unknown packet type \" + p.type);\n }\n // look up attachments if type binary\n if (p.type === PacketType.BINARY_EVENT ||\n p.type === PacketType.BINARY_ACK) {\n const start = i + 1;\n while (str.charAt(++i) !== \"-\" && i != str.length) { }\n const buf = str.substring(start, i);\n if (buf != Number(buf) || str.charAt(i) !== \"-\") {\n throw new Error(\"Illegal attachments\");\n }\n const n = Number(buf);\n if (!isInteger(n) || n < 0) {\n throw new Error(\"Illegal attachments\");\n }\n else if (n > this.opts.maxAttachments) {\n throw new Error(\"too many attachments\");\n }\n p.attachments = n;\n }\n // look up namespace (if any)\n if (\"/\" === str.charAt(i + 1)) {\n const start = i + 1;\n while (++i) {\n const c = str.charAt(i);\n if (\",\" === c)\n break;\n if (i === str.length)\n break;\n }\n p.nsp = str.substring(start, i);\n }\n else {\n p.nsp = \"/\";\n }\n // look up id\n const next = str.charAt(i + 1);\n if (\"\" !== next && Number(next) == next) {\n const start = i + 1;\n while (++i) {\n const c = str.charAt(i);\n if (null == c || Number(c) != c) {\n --i;\n break;\n }\n if (i === str.length)\n break;\n }\n p.id = Number(str.substring(start, i + 1));\n }\n // look up json data\n if (str.charAt(++i)) {\n const payload = this.tryParse(str.substr(i));\n if (Decoder.isPayloadValid(p.type, payload)) {\n p.data = payload;\n }\n else {\n throw new Error(\"invalid payload\");\n }\n }\n debug(\"decoded %s as %j\", str, p);\n return p;\n }\n tryParse(str) {\n try {\n return JSON.parse(str, this.opts.reviver);\n }\n catch (e) {\n return false;\n }\n }\n static isPayloadValid(type, payload) {\n switch (type) {\n case PacketType.CONNECT:\n return isObject(payload);\n case PacketType.DISCONNECT:\n return payload === undefined;\n case PacketType.CONNECT_ERROR:\n return typeof payload === \"string\" || isObject(payload);\n case PacketType.EVENT:\n case PacketType.BINARY_EVENT:\n return (Array.isArray(payload) &&\n (typeof payload[0] === \"number\" ||\n (typeof payload[0] === \"string\" &&\n RESERVED_EVENTS.indexOf(payload[0]) === -1)));\n case PacketType.ACK:\n case PacketType.BINARY_ACK:\n return Array.isArray(payload);\n }\n }\n /**\n * Deallocates a parser's resources\n */\n destroy() {\n if (this.reconstructor) {\n this.reconstructor.finishedReconstruction();\n this.reconstructor = null;\n }\n }\n}\n/**\n * A manager of a binary event's 'buffer sequence'. Should\n * be constructed whenever a packet of type BINARY_EVENT is\n * decoded.\n *\n * @param {Object} packet\n * @return {BinaryReconstructor} initialized reconstructor\n */\nclass BinaryReconstructor {\n constructor(packet) {\n this.packet = packet;\n this.buffers = [];\n this.reconPack = packet;\n }\n /**\n * Method to be called when binary data received from connection\n * after a BINARY_EVENT packet.\n *\n * @param {Buffer | ArrayBuffer} binData - the raw binary data received\n * @return {null | Object} returns null if more binary data is expected or\n * a reconstructed packet object if all buffers have been received.\n */\n takeBinaryData(binData) {\n this.buffers.push(binData);\n if (this.buffers.length === this.reconPack.attachments) {\n // done with buffer list\n const packet = (0,_binary_js__WEBPACK_IMPORTED_MODULE_1__.reconstructPacket)(this.reconPack, this.buffers);\n this.finishedReconstruction();\n return packet;\n }\n return null;\n }\n /**\n * Cleans up binary packet reconstruction variables.\n */\n finishedReconstruction() {\n this.reconPack = null;\n this.buffers = [];\n }\n}\nfunction isNamespaceValid(nsp) {\n return typeof nsp === \"string\";\n}\n// see https://caniuse.com/mdn-javascript_builtins_number_isinteger\nconst isInteger = Number.isInteger ||\n function (value) {\n return (typeof value === \"number\" &&\n isFinite(value) &&\n Math.floor(value) === value);\n };\nfunction isAckIdValid(id) {\n return id === undefined || isInteger(id);\n}\n// see https://stackoverflow.com/questions/8511281/check-if-a-value-is-an-object-in-javascript\nfunction isObject(value) {\n return Object.prototype.toString.call(value) === \"[object Object]\";\n}\nfunction isDataValid(type, payload) {\n switch (type) {\n case PacketType.CONNECT:\n return payload === undefined || isObject(payload);\n case PacketType.DISCONNECT:\n return payload === undefined;\n case PacketType.EVENT:\n return (Array.isArray(payload) &&\n (typeof payload[0] === \"number\" ||\n (typeof payload[0] === \"string\" &&\n RESERVED_EVENTS.indexOf(payload[0]) === -1)));\n case PacketType.ACK:\n return Array.isArray(payload);\n case PacketType.CONNECT_ERROR:\n return typeof payload === \"string\" || isObject(payload);\n default:\n return false;\n }\n}\nfunction isPacketValid(packet) {\n return (isNamespaceValid(packet.nsp) &&\n isAckIdValid(packet.id) &&\n isDataValid(packet.type, packet.data));\n}\n\n\n//# sourceURL=file://gritty/node_modules/socket.io-parser/build/esm-debug/index.js\n}");
|
|
557
557
|
|
|
558
558
|
/***/ },
|
|
559
559
|
|
|
@@ -591,12 +591,6 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
591
591
|
/******/ if (cachedModule !== undefined) {
|
|
592
592
|
/******/ return cachedModule.exports;
|
|
593
593
|
/******/ }
|
|
594
|
-
/******/ // Check if module exists (development only)
|
|
595
|
-
/******/ if (__webpack_modules__[moduleId] === undefined) {
|
|
596
|
-
/******/ var e = new Error("Cannot find module '" + moduleId + "'");
|
|
597
|
-
/******/ e.code = 'MODULE_NOT_FOUND';
|
|
598
|
-
/******/ throw e;
|
|
599
|
-
/******/ }
|
|
600
594
|
/******/ // Create a new module (and put it into the cache)
|
|
601
595
|
/******/ var module = __webpack_module_cache__[moduleId] = {
|
|
602
596
|
/******/ id: moduleId,
|
|
@@ -605,6 +599,12 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
605
599
|
/******/ };
|
|
606
600
|
/******/
|
|
607
601
|
/******/ // Execute the module function
|
|
602
|
+
/******/ if (!(moduleId in __webpack_modules__)) {
|
|
603
|
+
/******/ delete __webpack_module_cache__[moduleId];
|
|
604
|
+
/******/ var e = new Error("Cannot find module '" + moduleId + "'");
|
|
605
|
+
/******/ e.code = 'MODULE_NOT_FOUND';
|
|
606
|
+
/******/ throw e;
|
|
607
|
+
/******/ }
|
|
608
608
|
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
|
609
609
|
/******/
|
|
610
610
|
/******/ // Return the exports of the module
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gritty",
|
|
3
|
-
"version": "10.0
|
|
3
|
+
"version": "10.2.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"author": "coderaiser <mnemonic.enemy@gmail.com> (https://github.com/coderaiser)",
|
|
6
6
|
"description": "Web terminal emulator",
|
|
@@ -65,27 +65,26 @@
|
|
|
65
65
|
"@xterm/addon-webgl": "^0.19.0",
|
|
66
66
|
"@xterm/xterm": "^6.0.0",
|
|
67
67
|
"babel-loader": "^10.0.0",
|
|
68
|
-
"c8": "^10.1.3",
|
|
69
68
|
"clean-css-loader": "^4.1.1",
|
|
70
69
|
"css-loader": "^7.1.2",
|
|
71
|
-
"css-minimizer-webpack-plugin": "^
|
|
70
|
+
"css-minimizer-webpack-plugin": "^8.0.0",
|
|
72
71
|
"css-modules-require-hook": "^4.0.6",
|
|
73
72
|
"es6-promisify": "^7.0.0",
|
|
74
73
|
"eslint": "^10.0.0",
|
|
75
|
-
"eslint-plugin-
|
|
76
|
-
"eslint-plugin-putout": "^30.0.2",
|
|
74
|
+
"eslint-plugin-putout": "^31.1.2",
|
|
77
75
|
"json-loader": "^0.5.4",
|
|
78
|
-
"madrun": "^
|
|
76
|
+
"madrun": "^13.0.1",
|
|
79
77
|
"nodemon": "^3.0.1",
|
|
80
78
|
"optimize-css-assets-webpack-plugin": "^6.0.1",
|
|
81
|
-
"putout": "^
|
|
79
|
+
"putout": "^42.4.2",
|
|
82
80
|
"request": "^2.81.0",
|
|
83
81
|
"serve-once": "^3.0.0",
|
|
84
82
|
"socket.io-client": "^4.0.0",
|
|
85
83
|
"style-loader": "^4.0.0",
|
|
84
|
+
"superc8": "^12.3.1",
|
|
86
85
|
"supertape": "^12.0.0",
|
|
87
86
|
"webpack": "^5.1.3",
|
|
88
|
-
"webpack-cli": "^
|
|
87
|
+
"webpack-cli": "^7.0.2"
|
|
89
88
|
},
|
|
90
89
|
"engines": {
|
|
91
90
|
"node": ">=22"
|
package/server/gritty.js
CHANGED
|
@@ -57,7 +57,6 @@ export function gritty(options = {}) {
|
|
|
57
57
|
|
|
58
58
|
return router;
|
|
59
59
|
};
|
|
60
|
-
|
|
61
60
|
function _terminalFn(options, req, res, next) {
|
|
62
61
|
const {prefix = '/gritty'} = options;
|
|
63
62
|
|
|
@@ -88,6 +87,7 @@ function createTerminal(overrides = {}) {
|
|
|
88
87
|
} = overrides;
|
|
89
88
|
|
|
90
89
|
const [cmd, ...args] = stringArgv(command);
|
|
90
|
+
|
|
91
91
|
const term = pty.spawn(cmd, args, {
|
|
92
92
|
name: 'xterm-color',
|
|
93
93
|
cols,
|