Files
nginx-unit/test/unit/applications/lang/node.py
Oisin Canty a0c083af20 Node.js: a shim for overriding "http" and "websocket" modules.
Also added stubs for Server.address()
This was done to prevent crashes in some popular frameworks like express

Supports both CommonJS and the new ES Modules system syntax e.g:

app.js:
const http = require('http')

app.mjs:
import http from "http"

Usage on Node 14.16.x and higher:
{
    "type": "external",
    "processes": {"spare": 0},
    "working_directory": '/project',
    "executable": "/usr/bin/env",
    "arguments": [
        "node",
        "--loader",
        "unit-http/require_shim.mjs"
        "--require",
        "unit-http/require_shim",
        "app.js"
    ]
}

Usage on Node 14.15.x and lower:
{
    "type": "external",
    "processes": {"spare": 0},
    "working_directory": '/project',
    "executable": "/usr/bin/env",
    "arguments": [
        "node",
        "--require",
        "unit-http/require_shim",
        "app.js"
    ]
}
2021-05-12 09:26:55 +00:00

60 lines
1.6 KiB
Python

import shutil
from urllib.parse import quote
from unit.applications.proto import TestApplicationProto
from unit.option import option
from unit.utils import public_dir
class TestApplicationNode(TestApplicationProto):
application_type = "node"
es_modules = False
def prepare_env(self, script):
# copy application
shutil.copytree(
option.test_dir + '/node/' + script, option.temp_dir + '/node'
)
# copy modules
shutil.copytree(
option.current_dir + '/node/node_modules',
option.temp_dir + '/node/node_modules',
)
public_dir(option.temp_dir + '/node')
def load(self, script, name='app.js', **kwargs):
self.prepare_env(script)
if self.es_modules:
arguments = [
"node",
"--loader",
"unit-http/require_shim.mjs",
"--require",
"unit-http/require_shim",
name,
]
else:
arguments = ["node", "--require", "unit-http/require_shim", name]
self._load_conf(
{
"listeners": {
"*:7080": {"pass": "applications/" + quote(script, '')}
},
"applications": {
script: {
"type": "external",
"processes": {"spare": 0},
"working_directory": option.temp_dir + '/node',
"executable": '/usr/bin/env',
"arguments": arguments,
}
},
},
**kwargs
)