@push.rocks/smartdaemon 2.1.1 → 2.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.
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartdaemon',
6
- version: '2.1.1',
6
+ version: '2.2.0',
7
7
  description: 'Start scripts as long running daemons and manage them.'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx5QkFBeUI7SUFDL0IsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLHdEQUF3RDtDQUN0RSxDQUFBIn0=
@@ -7,6 +7,7 @@ export interface ISmartDaemonServiceConstructorOptions {
7
7
  version: string;
8
8
  user?: string;
9
9
  group?: string;
10
+ environment?: Record<string, string>;
10
11
  }
11
12
  /**
12
13
  * represents a service that is being spawned by SmartDaemon
@@ -22,6 +23,7 @@ export declare class SmartDaemonService implements ISmartDaemonServiceConstructo
22
23
  description: string;
23
24
  user?: string;
24
25
  group?: string;
26
+ environment?: Record<string, string>;
25
27
  smartdaemonRef: SmartDaemon;
26
28
  constructor(smartdaemonRegfArg: SmartDaemon);
27
29
  /**
@@ -53,4 +53,4 @@ export class SmartDaemonService {
53
53
  await this.smartdaemonRef.systemdManager.reload();
54
54
  }
55
55
  }
56
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRkYWVtb24uY2xhc3Nlcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRkYWVtb24uY2xhc3Nlcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sMEJBQTBCLENBQUM7QUFDcEQsT0FBTyxLQUFLLEtBQUssTUFBTSx3QkFBd0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFZbkU7O0dBRUc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBQ3RCLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQ25DLGNBQTJCLEVBQzNCLFVBQWlEO1FBRWpELE1BQU0sT0FBTyxHQUFHLElBQUksa0JBQWtCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdkQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbkMsT0FBTyxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUM7UUFDN0IsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQWVELFlBQVksa0JBQStCO1FBWnBDLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBYTNCLElBQUksQ0FBQyxjQUFjLEdBQUcsa0JBQWtCLENBQUM7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLE1BQU07UUFDakIsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLE9BQU87UUFDbEIsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLEtBQUs7UUFDaEIsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLElBQUk7UUFDZixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsa0JBQWtCO0lBQ1gsS0FBSyxDQUFDLElBQUk7UUFDZixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsTUFBTTtRQUNqQixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRU0sS0FBSyxDQUFDLE1BQU07UUFDakIsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNwRCxDQUFDO0NBQ0YifQ==
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRkYWVtb24uY2xhc3Nlcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRkYWVtb24uY2xhc3Nlcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sMEJBQTBCLENBQUM7QUFDcEQsT0FBTyxLQUFLLEtBQUssTUFBTSx3QkFBd0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFhbkU7O0dBRUc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBQ3RCLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQ25DLGNBQTJCLEVBQzNCLFVBQWlEO1FBRWpELE1BQU0sT0FBTyxHQUFHLElBQUksa0JBQWtCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdkQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbkMsT0FBTyxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUM7UUFDN0IsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQWdCRCxZQUFZLGtCQUErQjtRQWJwQyxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQWMzQixJQUFJLENBQUMsY0FBYyxHQUFHLGtCQUFrQixDQUFDO0lBQzNDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxNQUFNO1FBQ2pCLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxPQUFPO1FBQ2xCLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxJQUFJO1FBQ2YsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELGtCQUFrQjtJQUNYLEtBQUssQ0FBQyxJQUFJO1FBQ2YsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLE1BQU07UUFDakIsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVNLEtBQUssQ0FBQyxNQUFNO1FBQ2pCLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDcEQsQ0FBQztDQUNGIn0=
@@ -3,5 +3,6 @@ import { SmartDaemonService } from './smartdaemon.classes.service.js';
3
3
  export declare class SmartDaemonTemplateManager {
4
4
  smartdaemonRef: SmartDaemon;
5
5
  constructor(smartdaemonRefArg: SmartDaemon);
6
+ private generateEnvironmentLines;
6
7
  generateUnitFileForService: (serviceArg: SmartDaemonService) => string;
7
8
  }
@@ -3,6 +3,7 @@ import { SmartDaemonService } from './smartdaemon.classes.service.js';
3
3
  export class SmartDaemonTemplateManager {
4
4
  constructor(smartdaemonRefArg) {
5
5
  this.generateUnitFileForService = (serviceArg) => {
6
+ const environmentLines = this.generateEnvironmentLines(serviceArg);
6
7
  return `# ---
7
8
  # name: ${serviceArg.name}
8
9
  # version: ${serviceArg.version}
@@ -20,8 +21,8 @@ After=network.target
20
21
  [Service]
21
22
  Type=simple${serviceArg.user ? `
22
23
  User=${serviceArg.user}` : ''}${serviceArg.group ? `
23
- Group=${serviceArg.group}` : ''}
24
- Environment=NODE_OPTIONS="--max_old_space_size=100"
24
+ Group=${serviceArg.group}` : ''}${environmentLines ? `
25
+ ${environmentLines}` : ''}
25
26
  ExecStart=/bin/bash -c "cd ${serviceArg.workingDir} && ${serviceArg.command}"
26
27
  WorkingDirectory=${serviceArg.workingDir}
27
28
  Restart=on-failure
@@ -37,5 +38,17 @@ WantedBy=multi-user.target
37
38
  };
38
39
  this.smartdaemonRef = smartdaemonRefArg;
39
40
  }
41
+ generateEnvironmentLines(serviceArg) {
42
+ const environment = serviceArg.environment || {};
43
+ return Object.entries(environment)
44
+ .map(([key, value]) => {
45
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {
46
+ throw new Error(`Invalid systemd environment key: ${key}`);
47
+ }
48
+ const escapedValue = value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
49
+ return `Environment="${key}=${escapedValue}"`;
50
+ })
51
+ .join('\n');
52
+ }
40
53
  }
41
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRkYWVtb24uY2xhc3Nlcy50ZW1wbGF0ZW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGRhZW1vbi5jbGFzc2VzLnRlbXBsYXRlbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFdEUsTUFBTSxPQUFPLDBCQUEwQjtJQUdyQyxZQUFZLGlCQUE4QjtRQUluQywrQkFBMEIsR0FBRyxDQUFDLFVBQThCLEVBQUUsRUFBRTtZQUNyRSxPQUFPO1VBQ0QsVUFBVSxDQUFDLElBQUk7YUFDWixVQUFVLENBQUMsT0FBTztpQkFDZCxVQUFVLENBQUMsV0FBVzthQUMxQixVQUFVLENBQUMsT0FBTztnQkFDZixVQUFVLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1VBQ2hELFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1dBQzNDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRTs7O2NBR3BCLFVBQVUsQ0FBQyxXQUFXOzs7OzthQUt2QixVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztPQUN4QixVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMzQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7OzZCQUVGLFVBQVUsQ0FBQyxVQUFVLE9BQU8sVUFBVSxDQUFDLE9BQU87bUJBQ3hELFVBQVUsQ0FBQyxVQUFVOzs7Ozs7Ozs7O0NBVXZDLENBQUM7UUFDQSxDQUFDLENBQUM7UUFuQ0EsSUFBSSxDQUFDLGNBQWMsR0FBRyxpQkFBaUIsQ0FBQztJQUMxQyxDQUFDO0NBbUNGIn0=
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRkYWVtb24uY2xhc3Nlcy50ZW1wbGF0ZW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGRhZW1vbi5jbGFzc2VzLnRlbXBsYXRlbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFdEUsTUFBTSxPQUFPLDBCQUEwQjtJQUdyQyxZQUFZLGlCQUE4QjtRQWlCbkMsK0JBQTBCLEdBQUcsQ0FBQyxVQUE4QixFQUFFLEVBQUU7WUFDckUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbkUsT0FBTztVQUNELFVBQVUsQ0FBQyxJQUFJO2FBQ1osVUFBVSxDQUFDLE9BQU87aUJBQ2QsVUFBVSxDQUFDLFdBQVc7YUFDMUIsVUFBVSxDQUFDLE9BQU87Z0JBQ2YsVUFBVSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztVQUNoRCxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztXQUMzQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7OztjQUdwQixVQUFVLENBQUMsV0FBVzs7Ozs7YUFLdkIsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7T0FDeEIsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDM0MsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0VBQ25ELGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7NkJBQ0ksVUFBVSxDQUFDLFVBQVUsT0FBTyxVQUFVLENBQUMsT0FBTzttQkFDeEQsVUFBVSxDQUFDLFVBQVU7Ozs7Ozs7Ozs7Q0FVdkMsQ0FBQztRQUNBLENBQUMsQ0FBQztRQWpEQSxJQUFJLENBQUMsY0FBYyxHQUFHLGlCQUFpQixDQUFDO0lBQzFDLENBQUM7SUFFTyx3QkFBd0IsQ0FBQyxVQUE4QjtRQUM3RCxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQztRQUNqRCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO2FBQy9CLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7WUFDcEIsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQzdELENBQUM7WUFDRCxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3ZFLE9BQU8sZ0JBQWdCLEdBQUcsSUFBSSxZQUFZLEdBQUcsQ0FBQztRQUNoRCxDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEIsQ0FBQztDQW9DRiJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@push.rocks/smartdaemon",
3
- "version": "2.1.1",
3
+ "version": "2.2.0",
4
4
  "private": false,
5
5
  "description": "Start scripts as long running daemons and manage them.",
6
6
  "main": "dist_ts/index.js",
@@ -8,12 +8,6 @@
8
8
  "type": "module",
9
9
  "author": "Task Venture Capital GmbH <hello@task.vc>",
10
10
  "license": "MIT",
11
- "scripts": {
12
- "test": "tstest test/ --verbose --timeout 60",
13
- "build": "tsbuild --web",
14
- "format": "gitzone format",
15
- "buildDocs": "tsdoc"
16
- },
17
11
  "repository": {
18
12
  "type": "git",
19
13
  "url": "https://code.foss.global/push.rocks/smartdaemon.git"
@@ -32,10 +26,10 @@
32
26
  },
33
27
  "homepage": "https://code.foss.global/push.rocks/smartdaemon",
34
28
  "devDependencies": {
35
- "@git.zone/tsbuild": "^4.4.0",
36
- "@git.zone/tsrun": "^2.0.3",
37
- "@git.zone/tstest": "^3.6.3",
38
- "@types/node": "^25.6.0"
29
+ "@git.zone/tsbuild": "^4.4.2",
30
+ "@git.zone/tsrun": "^2.0.4",
31
+ "@git.zone/tstest": "^3.6.6",
32
+ "@types/node": "^25.9.1"
39
33
  },
40
34
  "dependencies": {
41
35
  "@push.rocks/lik": "^6.4.1",
@@ -64,5 +58,10 @@
64
58
  "browserslist": [
65
59
  "last 1 chrome versions"
66
60
  ],
67
- "packageManager": "pnpm@10.28.2"
68
- }
61
+ "scripts": {
62
+ "test": "tstest test/ --verbose --timeout 60",
63
+ "build": "tsbuild --web",
64
+ "format": "gitzone format",
65
+ "buildDocs": "tsdoc"
66
+ }
67
+ }
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartdaemon',
6
- version: '2.1.1',
6
+ version: '2.2.0',
7
7
  description: 'Start scripts as long running daemons and manage them.'
8
8
  }
@@ -10,6 +10,7 @@ export interface ISmartDaemonServiceConstructorOptions {
10
10
  version: string;
11
11
  user?: string;
12
12
  group?: string;
13
+ environment?: Record<string, string>;
13
14
  }
14
15
 
15
16
  /**
@@ -36,6 +37,7 @@ export class SmartDaemonService implements ISmartDaemonServiceConstructorOptions
36
37
  public description!: string;
37
38
  public user?: string;
38
39
  public group?: string;
40
+ public environment?: Record<string, string>;
39
41
 
40
42
  public smartdaemonRef: SmartDaemon;
41
43
 
@@ -8,7 +8,21 @@ export class SmartDaemonTemplateManager {
8
8
  this.smartdaemonRef = smartdaemonRefArg;
9
9
  }
10
10
 
11
+ private generateEnvironmentLines(serviceArg: SmartDaemonService): string {
12
+ const environment = serviceArg.environment || {};
13
+ return Object.entries(environment)
14
+ .map(([key, value]) => {
15
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {
16
+ throw new Error(`Invalid systemd environment key: ${key}`);
17
+ }
18
+ const escapedValue = value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
19
+ return `Environment="${key}=${escapedValue}"`;
20
+ })
21
+ .join('\n');
22
+ }
23
+
11
24
  public generateUnitFileForService = (serviceArg: SmartDaemonService) => {
25
+ const environmentLines = this.generateEnvironmentLines(serviceArg);
12
26
  return `# ---
13
27
  # name: ${serviceArg.name}
14
28
  # version: ${serviceArg.version}
@@ -26,8 +40,8 @@ After=network.target
26
40
  [Service]
27
41
  Type=simple${serviceArg.user ? `
28
42
  User=${serviceArg.user}` : ''}${serviceArg.group ? `
29
- Group=${serviceArg.group}` : ''}
30
- Environment=NODE_OPTIONS="--max_old_space_size=100"
43
+ Group=${serviceArg.group}` : ''}${environmentLines ? `
44
+ ${environmentLines}` : ''}
31
45
  ExecStart=/bin/bash -c "cd ${serviceArg.workingDir} && ${serviceArg.command}"
32
46
  WorkingDirectory=${serviceArg.workingDir}
33
47
  Restart=on-failure