Edward Asquith
01/05/2022, 12:39 PMrequire(…) problem.
Seems like it’s probably a bundling problem specific to sst or esbuild, and it’s beyond my skill-set so far… so any help would be awesome.
I have some code running in a lambda configured using the sst.Queue construct. It is calling a library that uses proxy-agent under the hood, loaded via require('proxy-agent');. This library has a transitive dependency on vm2 (to run the PAC file, I assume).
When run with unit tests, this library call runs fine. When run under npx sst start, the require call fails like this:
Error: ENOENT: no such file or directory, open '/Users/asquithea/repos/deploy-controller/.sst/artifacts/aff14e6d/src/handlers/contextify.js'
at Object.openSync (node:fs:585:3)
at Object.readFileSync (node:fs:453:35)
at loadAndCompileScript (/Users/asquithea/repos/deploy-controller/node_modules/vm2/lib/main.js:49:18)
at node_modules/vm2/lib/main.js (/Users/asquithea/repos/deploy-controller/node_modules/vm2/lib/main.js:76:20)
at __require (/Users/asquithea/repos/deploy-controller/.sst/artifacts/aff14e6d/src/handlers/command.js:26:44)
at node_modules/vm2/index.js (/Users/asquithea/repos/deploy-controller/node_modules/vm2/index.js:3:18)
at __require (/Users/asquithea/repos/deploy-controller/.sst/artifacts/aff14e6d/src/handlers/command.js:26:44)
at node_modules/degenerator/dist/src/index.js (/Users/asquithea/repos/deploy-controller/node_modules/degenerator/src/index.ts:6:1)
at __require (/Users/asquithea/repos/deploy-controller/.sst/artifacts/aff14e6d/src/handlers/command.js:26:44)
at node_modules/pac-resolver/dist/index.js (/Users/asquithea/repos/deploy-controller/node_modules/pac-resolver/src/index.ts:3:1)
The artifacts directory contains only the compiled lambda (command.ts -> command.js).
contextify.js is part of the vm2 library, which tries to load it dynamically, like this:
contextifyScript: loadAndCompileScript(`${__dirname}/contextify.js`, '(function(require, host) { ', '\n})'),
So this looks like a bundling problem: I guess the vm2 library assumes a standard node_modules structure.
I see there are some control options for bundling in the construct, but at this point I don’t really know what I’m doing.
Is this similar enough to someone else’s problem that you can offer any advice? TIA.Omi Chowdhury
01/05/2022, 12:56 PMnodeModules bundling option will help:
https://docs.serverless-stack.com/constructs/Function#nodemodulesEdward Asquith
01/05/2022, 1:13 PMcopyFiles option initially. That appears to put the file in the desired location when running npx sst build but not with npx sst start.
However adding proxy-agent to the node_modules option does appear to have solved the problem.
Many thx. 🌟