vercel-deno-dev
Advanced tools
Comparing version 0.1.0-e096756f5f3f3015955582e994e1d40a030c2f53 to 0.1.0-e1385c1f5802c9360d69d06995b2c051c4a68629
import { NowRequest, NowRequestCookies, NowRequestQuery } from "./nowHandler.ts"; | ||
import { getCookies } from "https://deno.land/std@0.55.0/http/cookie.ts"; | ||
import { getCookies } from "https://deno.land/std/http/cookie.ts"; | ||
@@ -4,0 +4,0 @@ export function setLazyProp<T>(req: NowRequest, prop: string, getter: () => T) { |
@@ -1,3 +0,3 @@ | ||
import { ServerRequest, Response } from 'https://deno.land/std@0.55.0/http/server.ts'; | ||
import { Cookies } from 'https://deno.land/std@0.55.0/http/cookie.ts'; | ||
import { ServerRequest, Response } from 'https://deno.land/std/http/server.ts'; | ||
import { Cookies } from 'https://deno.land/std/http/cookie.ts'; | ||
export type NowRequestCookies = Cookies; | ||
@@ -4,0 +4,0 @@ |
import * as base64 from 'https://deno.land/x/base64/mod.ts'; | ||
import { ServerRequest } from 'https://deno.land/std@0.55.0/http/server.ts'; | ||
import { BufReader, BufWriter } from 'https://deno.land/std@0.55.0/io/bufio.ts'; | ||
import { TextProtoReader } from 'https://deno.land/std@0.55.0/textproto/mod.ts'; | ||
import { ServerRequest } from 'https://deno.land/std/http/server.ts'; | ||
import { BufReader, BufWriter } from 'https://deno.land/std/io/bufio.ts'; | ||
import { TextProtoReader } from 'https://deno.land/std/textproto/mod.ts'; | ||
import { Context, APIGatewayProxyEvent } from 'https://deno.land/x/lambda/mod.ts'; | ||
@@ -51,3 +51,4 @@ import { NowApiHandler, NowRequest, NowResponse, NowRequestCookies, NowRequestQuery } from './nowHandler.ts'; | ||
const input = new Deno.Buffer(base64.toUint8Array(data.body || '')); | ||
const output = new Deno.Buffer(); | ||
const output = new Deno.Buffer(new Uint8Array(6000000)); // maximum lambda file size | ||
const req:NowRequest = new ServerRequest(); | ||
@@ -59,5 +60,5 @@ req.r = new BufReader(input); | ||
req.url = data.path; | ||
req.proto = 'HTTP/1.1'; | ||
req.protoMinor = 1; | ||
req.protoMajor = 1; | ||
req.proto = 'HTTP/2.0'; | ||
req.protoMinor = 0; | ||
req.protoMajor = 2; | ||
@@ -89,11 +90,10 @@ for (const [name, value] of Object.entries(data.headers)) { | ||
// The actual output is raw HTTP message, | ||
// so we will parse it | ||
// - Headers ( statuscode default to 200 ) | ||
// - Message | ||
const bufr = new BufReader(output); | ||
// TODO: dynamically determine buffer size. | ||
// output.length has a mismatch size of a few hundret bytes compared to boy.bytlength. | ||
// not including size argument will make bufReader use default size 4096 Bytes. | ||
// console.log({outlen:output.length}) | ||
const bufr = new BufReader(output,output.length); | ||
const tp = new TextProtoReader(bufr); | ||
const firstLine = await tp.readLine() || 'HTTP/1.1 200 OK'; // e.g. "HTTP/1.1 200 OK" | ||
const firstLine = await tp.readLine() || 'HTTP/2.0 200 OK'; // e.g. "HTTP/1.1 200 OK" | ||
const statuscode = res ? res.status || 200 : parseInt(firstLine.split(' ', 2)[1], 10); // get statuscode either from res or req. | ||
@@ -106,5 +106,10 @@ const headers = await tp.readMIMEHeader() || new Headers(); | ||
const body = await bufr.readFull(new Uint8Array(bufr.buffered())); | ||
let buff = new Uint8Array(bufr.size()); | ||
const size = await bufr.read(buff)||bufr.size(); | ||
const body = buff.slice(0,size); | ||
if (!body) throw new Deno.errors.UnexpectedEof(); | ||
// console.log({ | ||
// outlen:output.length, | ||
// bodylen:body.byteLength, | ||
// }) | ||
await req.finalize(); | ||
@@ -128,3 +133,3 @@ | ||
console.log("invoke Response") | ||
console.log({result,context}) | ||
console.log({result}) | ||
const res = await LambdaFetch(`invocation/${context.awsRequestId}/response`, { | ||
@@ -131,0 +136,0 @@ method: 'POST', |
@@ -8,3 +8,2 @@ "use strict"; | ||
const fs_extra_1 = __importDefault(require("fs-extra")); | ||
const path_1 = __importDefault(require("path")); | ||
const util_1 = require("./util"); | ||
@@ -15,7 +14,8 @@ async function build(opts) { | ||
console.log("downloading source files"); | ||
const downloadedFiles = await build_utils_1.download(files, path_1.default.join(workPath, "src"), meta); | ||
const downloadedFiles = await build_utils_1.download(files, workPath, meta); | ||
console.log(meta); | ||
// configure environment variable | ||
const denoFiles = await util_1.getdenoFiles(workPath, meta.isDev || false); | ||
const bootFiles = await util_1.getbootFiles(workPath); | ||
const genFiles = await util_1.getgenFiles(opts, downloadedFiles, bootFiles, denoFiles); | ||
const bootFiles = await util_1.getbootFiles(); | ||
const cacheFiles = await util_1.CacheEntryPoint(opts, downloadedFiles, denoFiles, bootFiles); | ||
// console.log({downloadedFiles, denoFiles,bootFiles,genFiles}) | ||
@@ -26,14 +26,14 @@ // Files directory: | ||
// - /gen | ||
// - /bin/deno | ||
// - src | ||
// - bootstrap | ||
// - runtime.ts | ||
// - nowHandler.ts | ||
// - helpers.ts | ||
// - /bin/deno | ||
// - *.d.ts | ||
// - boot/ | ||
// - runtime.ts | ||
// - nowHandler.ts | ||
// - helpers.ts | ||
const lambda = await build_utils_1.createLambda({ | ||
files: { | ||
...downloadedFiles, | ||
...genFiles, | ||
...cacheFiles, | ||
...bootFiles, | ||
...denoFiles, | ||
...denoFiles | ||
}, | ||
@@ -40,0 +40,0 @@ environment: { |
@@ -6,3 +6,3 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.getgenFiles = exports.getbootFiles = exports.getdenoFiles = exports.parseDenoVersion = void 0; | ||
exports.CacheEntryPoint = exports.getbootFiles = exports.getdenoFiles = exports.parseDenoVersion = void 0; | ||
const dist_1 = require("@vercel/build-utils/dist"); | ||
@@ -12,3 +12,2 @@ const fs_extra_1 = require("fs-extra"); | ||
const execa_1 = __importDefault(require("execa")); | ||
const which_1 = __importDefault(require("which")); | ||
function parseDenoVersion(version) { | ||
@@ -26,3 +25,3 @@ if (version === "latest") | ||
exports.parseDenoVersion = parseDenoVersion; | ||
async function getdenoFiles(workPath, isdev) { | ||
async function getdenoFiles(workPath, isDev) { | ||
console.log("get deno binary files"); | ||
@@ -36,5 +35,14 @@ const DENO_LATEST = "latest"; | ||
const denozipPath = path_1.join(denobinDir, 'deno.zip'); | ||
let denoPath = path_1.join(denobinDir, 'deno'); | ||
if (!isdev) { | ||
let denoPath = ''; | ||
// check if local deno binary exists | ||
if (isDev) { | ||
try { | ||
const checklocalDeno = await execa_1.default('which', ['deno'], { stderr: 'ignore' }); | ||
denoPath = checklocalDeno.stdout; | ||
} | ||
catch (e) { } | ||
; | ||
} | ||
if (!denoPath) { | ||
try { | ||
console.log(`downloading deno ${DENO_VERSION}`); | ||
@@ -49,2 +57,3 @@ await execa_1.default("curl", ['--location', '--create-dirs', '--output', denozipPath, DOWNLOAD_URL], { stdio: 'pipe' }); | ||
await execa_1.default("rm", [denozipPath], { stdio: 'pipe' }); | ||
denoPath = path_1.join(denobinDir, 'deno'); | ||
} | ||
@@ -56,7 +65,4 @@ catch (err) { | ||
} | ||
else { | ||
// assume it is dev build | ||
else | ||
console.log('using local deno binary'); | ||
denoPath = await which_1.default("deno"); | ||
} | ||
return { | ||
@@ -70,11 +76,8 @@ ".deno/bin/deno": new dist_1.FileFsRef({ | ||
exports.getdenoFiles = getdenoFiles; | ||
async function getbootFiles(workPath) { | ||
async function getbootFiles() { | ||
console.log('get bootstrap'); | ||
const bootstrapPath = path_1.join(__dirname, "../boot/bootstrap"); | ||
let globrunfiles = await dist_1.glob("**/*.ts", { cwd: path_1.join(__dirname, '../boot') }, "boot"); | ||
// we need to move boot library to the work directory so that | ||
// we can cache the runtime on the same working directory. | ||
let runtimeFiles = await dist_1.download(globrunfiles, path_1.join(workPath, 'boot')); | ||
const runtimeGlobs = await dist_1.glob("boot/*.ts", { cwd: path_1.join(__dirname, "../") }); | ||
return { | ||
...runtimeFiles, | ||
...runtimeGlobs, | ||
bootstrap: new dist_1.FileFsRef({ | ||
@@ -90,9 +93,9 @@ mode: 0o755, | ||
*/ | ||
async function getgenFiles(opts, downloadedFiles, bootFiles, denoFiles) { | ||
async function CacheEntryPoint(opts, downloadedFiles, denoFiles, bootFiles) { | ||
console.log(`Caching imports for ${opts.entrypoint}`); | ||
// TODO: create separate function to parse user ENV values | ||
const tsconfig = process.env.DENO_CONFIG ? [`-c`, `${downloadedFiles[process.env.DENO_CONFIG].fsPath}`] : []; | ||
const { workPath, entrypoint } = opts; | ||
const { workPath, entrypoint, meta = {} } = opts; | ||
const denobinPath = '.deno/bin/deno'; | ||
const runtimePath = 'boot/runtime.ts'; | ||
const denobinPath = '.deno/bin/deno'; | ||
const denobin = denoFiles[denobinPath].fsPath; | ||
@@ -102,3 +105,3 @@ const runtime = bootFiles[runtimePath].fsPath; | ||
if (denobin && runtime) { | ||
await execa_1.default(denobin, ['cache', ...tsconfig, entry, runtime], { | ||
await execa_1.default(denobin, ['cache', ...tsconfig, runtime, entry], { | ||
env: { DENO_DIR: path_1.join(workPath, '.deno/') }, | ||
@@ -108,33 +111,109 @@ stdio: 'ignore', | ||
} | ||
// patch .graph files to use file paths beginning with /var/task | ||
// reference : https://github.com/TooTallNate/vercel-deno/blob/5a236aab30eeb4a6e68216a80f637e687bc59d2b/src/index.ts#L98-L118 | ||
const workPathUri = `file://${workPath}`; | ||
for await (const file of getGraphFiles(path_1.join(workPath, '.deno/gen/file'))) { | ||
let needsWrite = false; | ||
const graph = JSON.parse(await fs_extra_1.readFile(file, 'utf8')); | ||
for (let i = 0; i < graph.deps.length; i++) { | ||
const dep = graph.deps[i]; | ||
if (dep.startsWith(workPathUri)) { | ||
const updated = `file:///var/task${dep.substring(workPathUri.length)}`; | ||
graph.deps[i] = updated; | ||
needsWrite = true; | ||
if (!meta.isDev) { | ||
// patch .graph files to use file paths beginning with /var/task | ||
// reference : https://github.com/TooTallNate/vercel-deno/blob/5a236aab30eeb4a6e68216a80f637e687bc59d2b/src/index.ts#L98-L118 | ||
const workPathUri = `file://${workPath}`; | ||
const sourceFiles = new Set(); | ||
const genFileDir = path_1.join(workPath, '.deno/gen/file'); | ||
sourceFiles.add(entrypoint); | ||
for await (const file of getFilesWithExtension(genFileDir, '.graph')) { | ||
let needsWrite = false; | ||
const graph = JSON.parse(await fs_extra_1.readFile(file, 'utf8')); | ||
for (let i = 0; i < graph.deps.length; i++) { | ||
const dep = graph.deps[i]; | ||
if (dep.startsWith(workPathUri)) { | ||
const relative = dep.substring(workPathUri.length + 1); | ||
const updated = `file:///var/task/${relative}`; | ||
graph.deps[i] = updated; | ||
sourceFiles.add(relative); | ||
needsWrite = true; | ||
} | ||
} | ||
if (needsWrite) { | ||
console.log('Patched %j', file); | ||
await fs_extra_1.writeFile(file, JSON.stringify(graph, null, 2)); | ||
} | ||
} | ||
if (needsWrite) { | ||
console.log('Patched %j', file); | ||
await fs_extra_1.writeFile(file, JSON.stringify(graph)); | ||
for await (const file of getFilesWithExtension(genFileDir, '.buildinfo')) { | ||
let needsWrite = false; | ||
const buildInfo = JSON.parse(await fs_extra_1.readFile(file, 'utf8')); | ||
const { fileInfos, referencedMap, exportedModulesMap, semanticDiagnosticsPerFile, } = buildInfo.program; | ||
for (const filename of Object.keys(fileInfos)) { | ||
if (filename.startsWith(workPathUri)) { | ||
const relative = filename.substring(workPathUri.length + 1); | ||
const updated = `file:///var/task/${relative}`; | ||
fileInfos[updated] = fileInfos[filename]; | ||
delete fileInfos[filename]; | ||
sourceFiles.add(relative); | ||
needsWrite = true; | ||
} | ||
} | ||
for (const [filename, refs] of Object.entries(referencedMap)) { | ||
for (let i = 0; i < refs.length; i++) { | ||
const ref = refs[i]; | ||
if (ref.startsWith(workPathUri)) { | ||
const relative = ref.substring(workPathUri.length + 1); | ||
const updated = `file:///var/task/${relative}`; | ||
refs[i] = updated; | ||
sourceFiles.add(relative); | ||
needsWrite = true; | ||
} | ||
} | ||
if (filename.startsWith(workPathUri)) { | ||
const relative = filename.substring(workPathUri.length + 1); | ||
const updated = `file:///var/task/${relative}`; | ||
referencedMap[updated] = refs; | ||
delete referencedMap[filename]; | ||
sourceFiles.add(relative); | ||
needsWrite = true; | ||
} | ||
} | ||
for (const [filename, refs] of Object.entries(exportedModulesMap)) { | ||
for (let i = 0; i < refs.length; i++) { | ||
const ref = refs[i]; | ||
if (ref.startsWith(workPathUri)) { | ||
const relative = ref.substring(workPathUri.length + 1); | ||
const updated = `file:///var/task/${relative}`; | ||
refs[i] = updated; | ||
sourceFiles.add(relative); | ||
needsWrite = true; | ||
} | ||
} | ||
if (filename.startsWith(workPathUri)) { | ||
const relative = filename.substring(workPathUri.length + 1); | ||
const updated = `file:///var/task/${relative}`; | ||
exportedModulesMap[updated] = refs; | ||
delete exportedModulesMap[filename]; | ||
sourceFiles.add(relative); | ||
needsWrite = true; | ||
} | ||
} | ||
for (let i = 0; i < semanticDiagnosticsPerFile.length; i++) { | ||
const ref = semanticDiagnosticsPerFile[i]; | ||
if (ref.startsWith(workPathUri)) { | ||
const relative = ref.substring(workPathUri.length + 1); | ||
const updated = `file:///var/task/${relative}`; | ||
semanticDiagnosticsPerFile[i] = updated; | ||
sourceFiles.add(relative); | ||
needsWrite = true; | ||
} | ||
} | ||
if (needsWrite) { | ||
console.log('Patched %j', file); | ||
await fs_extra_1.writeFile(file, JSON.stringify(buildInfo, null, 2)); | ||
} | ||
} | ||
// move generated files to AWS path /var/task | ||
const cwd = path_1.join(workPath, '.deno', 'gen', 'file', workPath); | ||
const aws_task = path_1.join(workPath, '.deno', 'gen', 'file', 'var', 'task'); | ||
await fs_extra_1.move(cwd, aws_task, { overwrite: true }); | ||
} | ||
// move generated files to AWS path /var/task | ||
const cwd = path_1.join(workPath, '.deno', 'gen', 'file', workPath); | ||
const aws_task = path_1.join(workPath, '.deno', 'gen', 'file', 'var', 'task'); | ||
await fs_extra_1.move(cwd, aws_task, { overwrite: true }); | ||
return await dist_1.glob("**/*", { cwd: path_1.join(workPath, '.deno/'), ignore: ['bin/**'] }, '.deno'); | ||
return await dist_1.glob(".deno/**", workPath); | ||
} | ||
exports.getgenFiles = getgenFiles; | ||
async function* getGraphFiles(dir) { | ||
exports.CacheEntryPoint = CacheEntryPoint; | ||
async function* getFilesWithExtension(dir, ext) { | ||
const files = await fs_extra_1.readdir(dir); | ||
for (const file of files) { | ||
const absolutePath = path_1.join(dir, file); | ||
if (file.endsWith('.graph')) { | ||
if (file.endsWith(ext)) { | ||
yield absolutePath; | ||
@@ -145,3 +224,3 @@ } | ||
if (s.isDirectory()) { | ||
yield* getGraphFiles(absolutePath); | ||
yield* getFilesWithExtension(absolutePath, ext); | ||
} | ||
@@ -148,0 +227,0 @@ } |
@@ -6,3 +6,3 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.shouldServe = exports.config = exports.build = exports.version = void 0; | ||
exports.startDevServer = exports.shouldServe = exports.config = exports.build = exports.version = void 0; | ||
const build_1 = __importDefault(require("./build")); | ||
@@ -12,5 +12,7 @@ exports.build = build_1.default; | ||
exports.config = config_1.default; | ||
const version_1 = __importDefault(require("./version")); | ||
exports.version = version_1.default; | ||
const dev_1 = __importDefault(require("./dev")); | ||
exports.startDevServer = dev_1.default; | ||
const build_utils_1 = require("@vercel/build-utils"); | ||
Object.defineProperty(exports, "shouldServe", { enumerable: true, get: function () { return build_utils_1.shouldServe; } }); | ||
const version_1 = require("./version"); | ||
Object.defineProperty(exports, "version", { enumerable: true, get: function () { return version_1.version; } }); |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
//import { spawn } from 'child_process'; | ||
/// unused. | ||
function prepareCache({ files, entrypoint }) { | ||
@@ -13,11 +13,3 @@ console.log("Execute caching for deno"); | ||
console.log({ deno, entry, env }); | ||
// if (deno && entry) { | ||
// const ls = spawn(deno,['cache',entry], | ||
// { | ||
// env | ||
// }) | ||
// } | ||
// execute caching | ||
// TODO: add cache here | ||
} | ||
exports.default = prepareCache; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.version = void 0; | ||
exports.version = 3; | ||
exports.default = 3; |
{ | ||
"name": "vercel-deno-dev", | ||
"version": "0.1.0-e096756f5f3f3015955582e994e1d40a030c2f53", | ||
"version": "0.1.0-e1385c1f5802c9360d69d06995b2c051c4a68629", | ||
"description": "run deno on vercel", | ||
@@ -9,6 +9,4 @@ "main": "./dist/index", | ||
"dependencies": { | ||
"@vercel/build-utils": "^2.3.1", | ||
"fs-extra": "^9.0.1", | ||
"which": "^2.0.2", | ||
"execa": "4.0.2" | ||
"execa": "4.0.2", | ||
"fs-extra": "^9.0.1" | ||
}, | ||
@@ -21,12 +19,14 @@ "files": [ | ||
"@types/fs-extra": "^9.0.1", | ||
"@types/node": "^14.0.1", | ||
"@types/which": "^1.3.2", | ||
"@types/node": "^14.0.24", | ||
"@vercel/build-utils": "^2.4.1", | ||
"@vercel/frameworks": "^0.0.14", | ||
"@vercel/routing-utils": "^1.8.2", | ||
"typescript": "^3.9.2" | ||
"typescript": "^3.9.7" | ||
}, | ||
"scripts": { | ||
"build": "tsc && cp -R ./src/boot/ ./dist/boot/", | ||
"test": "rmdir /s /q .\\test\\dist_ress\\ || tsc --project ./test/tsconfig.json && node ./test/dist_ress/test.js" | ||
"clean": "if exist .\\dist\\ ( rmdir /s/q .\\dist\\ )", | ||
"build:win": "tsc && (robocopy .\\src\\boot .\\dist\\boot\\ * /s) ^& IF %ERRORLEVEL% LSS 8 SET ERRORLEVEL = 0", | ||
"build": "tsc && cp -R ./src/boot/. ./dist/boot/", | ||
"publish:win": "npm run clean && npm run build:win" | ||
} | ||
} |
Sorry, the diff of this file is not supported yet
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
33546
2
15
767
53
11
1
- Removed@vercel/build-utils@^2.3.1
- Removedwhich@^2.0.2
- Removed@vercel/build-utils@2.17.0(transitive)