1import shutil 2from urllib.parse import quote 3 4from unit.applications.proto import ApplicationProto 5from unit.option import option 6from unit.utils import public_dir 7 8 9class ApplicationNode(ApplicationProto): 10 def __init__(self, application_type='node', es_modules=False): 11 self.application_type = application_type 12 self.es_modules = es_modules 13 14 def prepare_env(self, script): 15 # copy application 16 shutil.copytree( 17 f'{option.test_dir}/node/{script}', f'{option.temp_dir}/node' 18 ) 19 20 # copy modules 21 shutil.copytree( 22 f'{option.current_dir}/node/node_modules', 23 f'{option.temp_dir}/node/node_modules', 24 ) 25 26 public_dir(f'{option.temp_dir}/node') 27 28 def load(self, script, name='app.js', **kwargs): 29 self.prepare_env(script) 30 31 if self.es_modules: 32 arguments = [ 33 "node", 34 "--loader", 35 "unit-http/loader.mjs", 36 "--require", 37 "unit-http/loader", 38 name, 39 ] 40 41 else: 42 arguments = ["node", "--require", "unit-http/loader", name] 43 44 self._load_conf( 45 { 46 "listeners": { 47 "*:8080": {"pass": f"applications/{quote(script, '')}"} 48 }, 49 "applications": { 50 script: { 51 "type": "external", 52 "processes": {"spare": 0}, 53 "working_directory": f'{option.temp_dir}/node', 54 "executable": '/usr/bin/env', 55 "arguments": arguments, 56 } 57 }, 58 }, 59 **kwargs, 60 ) 61