Compare commits

..

7 Commits

Author SHA1 Message Date
Igor Klopov
26849422ff Publish
- @now/build-utils@0.4.31-canary.0
 - @now/node-server@0.4.25-canary.0
 - @now/node@0.4.27-canary.0
2018-11-28 02:18:45 +03:00
Igor Klopov
31dd1ca491 build-utils: inject memory-fs for yarn cache (#91)
* build-utils: inject memory-fs for yarn cache

* ditch shelljs dependency

* try to cover circle ci odd yarn installation

* Revert "try to cover circle ci odd yarn installation"

This reverts commit 751949a5dd209bab34934042eba3be1904a86ac9.

* use in-memory cache for aws only

* separate isInsideCachePath function

* print 'using memory-fs for yarn cache'

* wrong name. isInsideCachePath -> isOutsideCachePath
2018-11-27 22:12:37 +03:00
Igor Klopov
04a1ce89b3 bump ncc in node-server and node 2018-11-27 22:00:56 +03:00
Igor Klopov
3e247fd16d Tests for ncc assets (#82)
* [wip] added a test for ncc assets

* bump ncc, add 08-assets test to node-server as well

* builder-utils: don't run all fixtures, just some
2018-11-27 05:58:26 +03:00
Nathan Rajlich
9e127421ad Publish
- @now/php@0.4.12-canary.0
2018-11-26 16:51:13 -08:00
Nathan Rajlich
337d0cb1ed [now-php] set the proper response status code (#84)
1. The initial status code should be 200 (so that the first PHP call to `http_status_code` returns 200, as per the PHP documentation).
1. Extract the resulting status code and return it in the response.
2018-11-26 16:47:44 -08:00
Nathan Rajlich
ad3cdf46f4 [now-php] always send the response as base64 (#83)
This should address https://spectrum.chat/zeit/general/corrupted-image-using-php~9fbb8cc5-b210-49d1-8934-b393a628219f
2018-11-26 16:34:21 -08:00
23 changed files with 178 additions and 15 deletions

View File

@@ -0,0 +1,83 @@
const MemoryFileSystem = require('memory-fs');
const fs = require('fs');
const path = require('path');
const { spawnSync } = require('child_process');
const yarnPath = spawnSync('which', ['yarn'])
.stdout.toString()
.trim();
const cachePath = spawnSync(yarnPath, ['cache', 'dir'])
.stdout.toString()
.trim();
spawnSync(yarnPath, ['cache', 'clean']);
const vfs = new MemoryFileSystem();
function isOutsideCachePath(filename) {
const relative = path.relative(cachePath, filename);
return relative.startsWith('..');
}
const saveCreateWriteStream = fs.createWriteStream;
fs.createWriteStream = (...args) => {
const filename = args[0];
if (isOutsideCachePath(filename)) {
return saveCreateWriteStream.call(fs, ...args);
}
vfs.mkdirpSync(path.dirname(filename));
fs.writeFileSync(filename, Buffer.alloc(0));
const stream = vfs.createWriteStream(...args);
stream.on('finish', () => {
setTimeout(() => {
stream.emit('close');
});
});
return stream;
};
const saveReadFile = fs.readFile;
fs.readFile = (...args) => {
const filename = args[0];
if (isOutsideCachePath(filename)) {
return saveReadFile.call(fs, ...args);
}
const callback = args[args.length - 1];
return vfs.readFile(...args.slice(0, -1), (error, result) => {
if (error) {
saveReadFile.call(fs, ...args);
return;
}
callback(error, result);
});
};
const saveCopyFile = fs.copyFile;
fs.copyFile = (...args) => {
const src = args[0];
if (isOutsideCachePath(src)) {
return saveCopyFile.call(fs, ...args);
}
const dest = args[1];
const callback = args[args.length - 1];
const buffer = vfs.readFileSync(src);
return fs.writeFile(dest, buffer, callback);
};
const saveWriteFile = fs.writeFile;
fs.writeFile = (...args) => {
const filename = args[0];
if (isOutsideCachePath(filename)) {
return saveWriteFile.call(fs, ...args);
}
return vfs.writeFile(...args);
};
require(yarnPath);

View File

@@ -63,6 +63,15 @@ async function runNpmInstall(destPath, args = []) {
commandArgs = args.filter(a => a !== '--prefer-offline');
await spawnAsync('npm', ['install'].concat(commandArgs), destPath);
await spawnAsync('npm', ['cache', 'clean', '--force'], destPath);
} else if (process.env.AWS_EXECUTION_ENV) {
console.log('using memory-fs for yarn cache');
await spawnAsync(
'node',
[path.join(__dirname, 'bootstrap-yarn.js'), '--cwd', destPath].concat(
commandArgs,
),
destPath,
);
} else {
await spawnAsync('yarn', ['--cwd', destPath].concat(commandArgs), destPath);
await spawnAsync('yarn', ['cache', 'clean'], destPath);

View File

@@ -1,6 +1,6 @@
{
"name": "@now/build-utils",
"version": "0.4.30",
"version": "0.4.31-canary.0",
"dependencies": {
"async-retry": "1.2.3",
"async-sema": "2.1.4",
@@ -8,6 +8,7 @@
"fs-extra": "7.0.0",
"glob": "7.1.3",
"into-stream": "4.0.0",
"memory-fs": "0.4.1",
"multistream": "2.1.1",
"node-fetch": "2.2.0",
"yazl": "2.4.3"

View File

@@ -43,11 +43,14 @@ for (const builder of buildersToTestWith) {
// eslint-disable-next-line no-restricted-syntax
for (const fixture of fs.readdirSync(fixturesPath2)) {
// eslint-disable-next-line no-loop-func
it(`should build ${builder}/${fixture}`, async () => {
await expect(
testDeployment({ buildUtilsUrl }, path.join(fixturesPath2, fixture)),
).resolves.toBe(undefined);
});
// don't run all foreign fixtures, just some
if (['01-cowsay', '03-env-vars'].includes(fixture)) {
// eslint-disable-next-line no-loop-func
it(`should build ${builder}/${fixture}`, async () => {
await expect(
testDeployment({ buildUtilsUrl }, path.join(fixturesPath2, fixture)),
).resolves.toBe(undefined);
});
}
}
}

View File

@@ -47,7 +47,7 @@ async function downloadInstallAndBundle(
'package.json': new FileBlob({
data: JSON.stringify({
dependencies: {
'@zeit/ncc': '0.1.12',
'@zeit/ncc': '0.1.15',
},
}),
}),

View File

@@ -1,6 +1,6 @@
{
"name": "@now/node-server",
"version": "0.4.24",
"version": "0.4.25-canary.0",
"dependencies": {
"@now/node-bridge": "^0.1.9",
"fs-extra": "7.0.1"

View File

@@ -0,0 +1,15 @@
const fs = require('fs');
const http = require('http');
const path = require('path');
const server = http.createServer((req, resp) => {
const asset1 = fs.readFileSync(
path.join(__dirname, 'subdirectory1/asset.txt'),
);
const asset2 = fs.readFileSync(
path.join(__dirname, 'subdirectory2/asset.txt'),
);
resp.end(`${asset1},${asset2}`);
});
server.listen();

View File

@@ -0,0 +1,9 @@
{
"version": 2,
"builds": [
{ "src": "index.js", "use": "@now/node-server" }
],
"probes": [
{ "path": "/", "mustContain": "asset1:RANDOMNESS_PLACEHOLDER,asset2:RANDOMNESS_PLACEHOLDER" }
]
}

View File

@@ -0,0 +1 @@
asset1:RANDOMNESS_PLACEHOLDER

View File

@@ -0,0 +1 @@
asset2:RANDOMNESS_PLACEHOLDER

View File

@@ -45,7 +45,7 @@ async function downloadInstallAndBundle(
'package.json': new FileBlob({
data: JSON.stringify({
dependencies: {
'@zeit/ncc': '0.1.12',
'@zeit/ncc': '0.1.15',
},
}),
}),

View File

@@ -1,6 +1,6 @@
{
"name": "@now/node",
"version": "0.4.26",
"version": "0.4.27-canary.0",
"dependencies": {
"@now/node-bridge": "^0.1.9",
"fs-extra": "7.0.1"

View File

@@ -0,0 +1,12 @@
const fs = require('fs');
const path = require('path');
module.exports = (req, resp) => {
const asset1 = fs.readFileSync(
path.join(__dirname, 'subdirectory1/asset.txt'),
);
const asset2 = fs.readFileSync(
path.join(__dirname, 'subdirectory2/asset.txt'),
);
resp.end(`${asset1},${asset2}`);
};

View File

@@ -0,0 +1,9 @@
{
"version": 2,
"builds": [
{ "src": "index.js", "use": "@now/node" }
],
"probes": [
{ "path": "/", "mustContain": "asset1:RANDOMNESS_PLACEHOLDER,asset2:RANDOMNESS_PLACEHOLDER" }
]
}

View File

@@ -0,0 +1 @@
asset1:RANDOMNESS_PLACEHOLDER

View File

@@ -0,0 +1 @@
asset2:RANDOMNESS_PLACEHOLDER

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -25,10 +25,17 @@ type Request struct {
Body string `json:"body"`
}
type Response struct {
StatusCode int `json:"statusCode"`
Headers map[string]string `json:"headers"`
Encoding string `json:"encoding,omitemtpy"`
Body string `json:"body"`
}
var phpScript = ""
var phpScriptFull = ""
func handler(ctx context.Context, event events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
func handler(ctx context.Context, event events.APIGatewayProxyRequest) (Response, error) {
engine, _ := php.New()
context, _ := engine.NewContext()
@@ -78,11 +85,15 @@ func handler(ctx context.Context, event events.APIGatewayProxyRequest) (events.A
context.Eval("$_SERVER[\"SERVER_NAME\"]=\"" + req.Host + "\";")
context.Eval("$_SERVER[\"SERVER_PORT\"]=\"443\";")
context.Eval("$_SERVER[\"HTTPS\"]=\"on\";")
context.Eval("http_response_code(200);")
var stdout bytes.Buffer
context.Output = &stdout
context.Exec(phpScriptFull)
statusCodeVal, _ := context.Eval("return http_response_code();")
statusCode := int(statusCodeVal.Int())
headers := make(map[string]string)
headers["content-type"] = "text/html"
for k, v := range context.Header {
@@ -91,8 +102,15 @@ func handler(ctx context.Context, event events.APIGatewayProxyRequest) (events.A
}
}
resBody := base64.StdEncoding.EncodeToString(stdout.Bytes())
engine.Destroy()
return events.APIGatewayProxyResponse{StatusCode: 200, Headers: headers, Body: stdout.String()}, nil
return Response{
StatusCode: statusCode,
Headers: headers,
Encoding: "base64",
Body: resBody,
}, nil
}
func main() {

View File

@@ -1,6 +1,6 @@
{
"name": "@now/php",
"version": "0.4.11",
"version": "0.4.12-canary.0",
"peerDependencies": {
"@now/build-utils": ">=0.0.1"
},

View File

@@ -30,7 +30,7 @@ async function testDeployment ({ builderUrl, buildUtilsUrl }, fixturePath) {
const randomness = Math.floor(Math.random() * 0x7fffffff).toString(16);
for (const file of Object.keys(bodies)) {
if ([ '.js', '.json', '.php', '.sh' ].includes(path.extname(file))) {
if ([ '.js', '.json', '.php', '.sh', '.txt' ].includes(path.extname(file))) {
bodies[file] = Buffer.from(
bodies[file].toString().replace(/RANDOMNESS_PLACEHOLDER/g, randomness)
);