{"version":3,"sources":["jsdelivr-header.js","/npm/datawire-quarkdev-node@0.4.2/quark_node_runtime.js"],"names":[],"mappings":"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","file":"/npm/datawire-quarkdev-node@0.4.2/quark_node_runtime.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/datawire-quarkdev-node@0.4.2/quark_node_runtime.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/*\n * Copyright 2015 datawire. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Quark's Node Runtime and associated\n/* jshint node: true */\n\n(function () {\n    \"use strict\";\n\n    var assert = require(\"assert\");\n\n    var WebSocket = require(\"ws\");\n\n    var runtime = require(\"datawire-quark-core\");\n\n    // CLASS QuarkWebsocket\n    function QuarkWebSocket(options, handler) {\n\n        var self = this;\n        handler.onWSInit(self);\n        if (options.socket) {\n            this.url = options.url;\n            this.socket = options.socket;\n            this.isOpen = true;\n            handler.onWSConnected(self);\n        } else {\n            this.url = options.url;\n            this.socket = new WebSocket(options.url);\n            this.isOpen = false;\n            this.socket.on(\"open\", function () {\n                self.isOpen = true;\n                handler.onWSConnected(self);\n            });\n        }\n        this.socket.on(\"message\", function (message, flags) {\n            if (flags.binary) {\n                handler.onWSBinary(self, new runtime.Buffer(message));\n            } else {\n                handler.onWSMessage(self, message);\n            }\n        });\n        this.socket.on(\"close\", function (/* code, message */) {\n            handler.onWSClosed(self);\n            self.socket.terminate();\n            handler.onWSFinal(self);\n        });\n        this.socket.on(\"error\", function (/* error */) {\n            handler.onWSError(self);\n            self.socket.terminate();\n            handler.onWSFinal(self);\n        });\n    }\n    QuarkWebSocket.prototype.send = function (message) {\n        if (this.isOpen) {\n            this.socket.send(message);\n            return true;\n        }\n        return false;\n    };\n    QuarkWebSocket.prototype.sendBinary = function(message) {\n        if (this.isOpen) {\n            this.socket.send(message.data, {binary:true});\n            return true;\n        }\n        return false;\n    };\n    QuarkWebSocket.prototype.close = function() {\n        if (this.isOpen) {\n            this.socket.close();\n            return true;\n        }\n        return false;\n    };\n\n    var http = require(\"http\");\n    var https = require(\"https\");\n    var URL = require(\"url\");\n\n    // CLASS QuarkRequest\n    function QuarkRequest(request, handler) {\n        var options = URL.parse(request.url);\n        options.method = request.method;\n\n        handler.onHTTPInit(request);\n\n        var protocol = http;\n        if (options.protocol === \"https:\") {\n            protocol = https;\n        }\n\n        options.headers = JSON.parse(JSON.stringify(request.headers));  // Make a copy\n        if (request.body) {\n            options.headers[\"Content-Length\"] = Buffer.byteLength(request.body);\n        }\n\n        var req = protocol.request(options);\n        req.on(\"response\", function (response) {\n            var body = \"\";\n            response.on(\"data\", function (data) {\n                body += data;\n            });\n            response.on(\"end\", function () {\n                handler.onHTTPResponse(\n                    request,\n                    new QuarkResponse(response.statusCode,\n                                      body,\n                                      response.headers));\n                req.abort();\n                handler.onHTTPFinal(request);\n            });\n        });\n\n        req.on(\"error\", function (/* error */) {\n            handler.onHTTPError(request);\n            req.abort();\n            handler.onHTTPFinal(request);\n        });\n\n        if (request.body) {\n            req.write(request.body);\n        }\n        req.end();\n    }\n\n    // CLASS QuarkResponse\n    function QuarkResponse(code, body, headers) {\n        this.code = code;\n        this.body = body;\n        this.headers = headers;\n    }\n    QuarkResponse.prototype.getCode = function () {\n        return this.code;\n    };\n    QuarkResponse.prototype.setCode = function(code) {\n        this.code = code;\n    };\n    QuarkResponse.prototype.getBody = function () {\n        return this.body;\n    };\n    QuarkResponse.prototype.setBody = function(body) {\n        this.body = body;\n    };\n    QuarkResponse.prototype.getHeader = function(key) {\n        return this.headers[key.toLowerCase()];\n    };\n    QuarkResponse.prototype.setHeader = function(key, value) {\n        this.headers[key.toLowerCase()] = value;\n    };\n    QuarkResponse.prototype.getHeaders = function() {\n        return Object.keys(this.headers).slice();\n    };\n\n    function IncomingRequest(request) {\n        this.request = request;\n        this.body = new runtime.Buffer(1024*1024); // XXX: nobody needs more than one megabytez\n        this.content_length = 0;\n        var self = this;\n        request.on(\"data\", function(chunk) {\n            chunk.copy(self.body.data, self.content_length);\n            self.content_length += chunk.length;\n        });\n    }\n\n    IncomingRequest.prototype.getUrl = function() {\n        return this.request.url;\n    };\n\n    IncomingRequest.prototype.getMethod = function() {\n        return this.request.method;\n    };\n\n    IncomingRequest.prototype.getBody = function() {\n        return this.body.getStringUTF8(0, this.content_length);\n    };\n\n    IncomingRequest.prototype.getHeader = function(key) {\n        return this.request.headers[key.toLowerCase()];\n    };\n\n    IncomingRequest.prototype.getHeaders = function() {\n        return Object.keys(this.request.headers);\n    };\n\n    function ServletResponse(response) {\n        this.response = response;\n        this.code = 500;\n        this.body = \"No response\";\n        this.headers = {};\n    }\n\n    ServletResponse.prototype.getCode = function() {\n        return this.code;\n    };\n    ServletResponse.prototype.setCode = function(code) {\n        this.code = code;\n    };\n    ServletResponse.prototype.getBody = function() {\n        return this.body;\n    };\n    ServletResponse.prototype.setBody = function(body) {\n        this.body = body;\n    };\n    ServletResponse.prototype.setHeader = function(key, value) {\n        this.headers[key.toLowerCase()] = value;\n    };\n    ServletResponse.prototype.getHeader = function(key) {\n        return this.headers[key.toLowerCase()];\n    };\n    ServletResponse.prototype.getHeaders = function() {\n        return Object.keys(this.headers);\n    };\n    ServletResponse.prototype.respond = function() {\n        this.setHeader(\"content-length\", Buffer.byteLength(this.body));\n        this.response.writeHead(this.code, this.headers);\n        this.response.write(this.body, \"utf-8\");\n        this.response.end();\n    };\n    ServletResponse.prototype.fail = function(code, message) {\n        this.code = code;\n        this.body = message;\n        this.headers = {};\n        this.respond();\n    };\n\n    // CLASS Runtime\n    function Runtime() {\n        this.locked = false;\n    }\n    Runtime.prototype.acquire = function () {\n        assert(!this.locked);\n        this.locked = true;\n    };\n    Runtime.prototype.release = function () {\n        assert(this.locked);\n        this.locked = false;\n    };\n    Runtime.prototype.wait = function (/* timeoutInSeconds */) {\n        assert(this.locked);\n        assert(false);\n    };\n    Runtime.prototype.open = function (url, handler) {\n        new QuarkWebSocket({url:url}, handler);\n    };\n\n    Runtime.prototype.request = function (request, handler) {\n        new QuarkRequest(request, handler);\n    };\n\n    Runtime.prototype.schedule = function (handler, delayInSeconds) {\n        var self = this;\n        setTimeout(function () { handler.onExecute(self); },\n                   delayInSeconds * 1000);\n    };\n\n    Runtime.prototype.codec = function() { return runtime.defaultCodec(); };\n\n\n    function QuarkContainer() {\n        this.servlets = {};\n    }\n\n    QuarkContainer.prototype.register = function(uri, servlet) {\n        uri.servlet = servlet;\n        this.servlets[uri.pathname] = uri;\n    };\n\n    QuarkContainer.prototype.lookup = function(url) {\n        var uri = URL.parse(url, false);\n        return this.servlets[uri.pathname];\n    };\n\n    function QuarkServer(container, runtime) {\n        this.server = http.createServer();\n        this.container = container;\n        this.runtime = runtime;\n    }\n\n    QuarkServer.prototype.bindServlet = function(uri, servlet) {\n        var self = this;\n        self.container.register(uri, servlet);\n        this.onListen(function(addr) {\n            var url = URL.format({\n                protocol: uri.protocol,\n                slashes: uri.slashes,\n                hostname: addr.address,\n                port: addr.port,\n                pathname: uri.pathname\n            });\n            servlet.onServletInit(url, self.runtime);\n        });\n        this.server.on(\"error\", function(error) {\n            servlet.onServletError(URL.format(uri), error.message);\n        });\n    };\n\n    QuarkServer.prototype.onListen = function(cb) {\n        var self = this;\n        var addr = self.server.address();\n        if (addr) {\n            cb(addr);\n        } else {\n            this.server.on(\"listening\", function() {\n                addr = self.server.address();\n                cb(addr);\n            });\n        }\n    };\n\n    var servers = {};\n\n    function make_server(port, hostname, runtime) {\n        // XXX: we should be looking at host, too\n        var server = servers[port];\n        if (server !== undefined) {\n            return server;\n        }\n        var container = new QuarkContainer();\n        server = new QuarkServer(container, runtime);\n        if (port && port !== 0 && port !== \"0\") {\n            servers[port] = server;\n        } else {\n            server.server.on(\"listening\", function() {\n                servers[server.server.address().port] = server;\n            });\n        }\n        server.server.on(\"request\", function(request, response) {\n            var rq = new IncomingRequest(request);\n            var rs = new ServletResponse(response);\n            rs.servlet_request = rq;\n            request.on(\"end\", function() {\n                var servlet = container.lookup(request.url);\n                if (servlet !== undefined) {\n                    if (servlet.protocol.startsWith(\"http\")) {\n                        try {\n                            servlet.servlet.onHTTPRequest(rq, rs);\n                        } catch (err) {\n                            var e = ((err instanceof Error) ? err.stack : err);\n                            console.log(e);\n                            rs.fail(500, \"\" + e + \"\\r\\n\");\n                        }\n                    } else {\n                        rs.fail(400, \"websockets here, move along\\r\\n\");\n                    }\n                } else {\n                    rs.fail(404, \"Not found\\r\\n\");\n                }\n            });\n        });\n        server.server.on(\"upgrade\", function(request, socket, head) {\n            var handler;\n            var wss = new WebSocket.Server(\n                {noServer: true,\n                 verifyClient : function(info, cb) {\n                     var servlet = container.lookup(info.req.url);\n                     if (servlet !== undefined) {\n                         if (servlet.protocol.startsWith(\"ws\")) {\n                             var rq = new IncomingRequest(info.req);\n                             handler = servlet.servlet.onWSConnect(rq);\n                             cb(!!handler, 403, \"not happening\");\n                         } else {\n                             cb(false, 400, \"http here, move along\");\n                         }\n                     } else {\n                         cb(false, 404, \"Not found\");\n                     }\n                 }\n                });\n            wss.handleUpgrade(request, socket, head, function(socket) {\n                new QuarkWebSocket({url: socket.upgradeReq.url, socket: socket}, handler);\n            });\n        });\n        server.server.on(\"error\", function(/* error */) {\n            delete servers[port];\n        });\n        server.server.listen(port, hostname);\n        return server;\n    }\n\n    Runtime.prototype.serveHTTP = function(url, servlet) {\n        var self = this;\n        var uri = URL.parse(url, false, true);\n        var server;\n\n        if (uri.protocol === \"http:\") {\n            if (uri.port === null ) {\n                uri.port = \"80\";\n            }\n        } else if (uri.protocol === \"https:\") {\n            // XXX: certificates...\n            if (uri.port === null ) {\n                uri.port = \"443\";\n            }\n            servlet.onHTTPError(url);\n            return;\n        } else {\n            servlet.onHTTPError(url);\n            return;\n        }\n\n        server = make_server(uri.port, uri.hostname, self);\n        server.bindServlet(uri, servlet);\n    };\n\n    Runtime.prototype.serveWS = function(url, servlet) {\n        var self = this;\n        var uri = URL.parse(url, false, true);\n        var server;\n\n        if (uri.protocol === \"ws:\") {\n            if (uri.port === null ) {\n                uri.port = \"80\";\n            }\n        } else if (uri.protocol === \"wss:\") {\n            // XXX: certificates...\n            if (uri.port === null ) {\n                uri.port = \"443\";\n            }\n            servlet.onHTTPError(url);\n            return;\n        } else {\n            servlet.onHTTPError(url);\n            return;\n        }\n        server = make_server(uri.port, uri.hostname, self);\n        server.bindServlet(uri, servlet);\n    };\n\n    Runtime.prototype.respond = function(request, response) {\n        if (response instanceof ServletResponse) {\n            if (response.servlet_request === request) {\n                response.respond();\n            } else {\n                response.fail(500, \"mismatched request and response\");\n            }\n        } else {\n            // XXX: what to do with a response from another runtime\n        }\n    };\n\n    Runtime.prototype.fail = function(message) {\n        console.log(message);\n        process.exit(1);\n    };\n\n    module.exports = new Runtime();\n\n})();\n"]}