Skip to content
This repository was archived by the owner on Dec 11, 2023. It is now read-only.

Commit 3fb1c49

Browse files
committed
Node 4.3 runtime prototype, triggermesh/aws-custom-runtime#6
Signed-off-by: tzununbekov <t.zununbekov@gmail.com>
1 parent cdd4c70 commit 3fb1c49

File tree

4 files changed

+704
-0
lines changed

4 files changed

+704
-0
lines changed

node-4.x/awslambda.js

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
var fs = require('fs')
2+
var crypto = require('crypto')
3+
4+
var HANDLER = process.env.AWS_LAMBDA_FUNCTION_HANDLER || process.env._HANDLER || 'index.handler'
5+
var EVENT_ID = process.argv[2] || process.env.AWS_LAMBDA_EVENT_ID
6+
var EVENT_BODY = process.argv[3] || process.env.AWS_LAMBDA_EVENT_BODY || '{}'
7+
8+
var FN_NAME = process.env.AWS_LAMBDA_FUNCTION_NAME || 'test'
9+
var VERSION = process.env.AWS_LAMBDA_FUNCTION_VERSION || '$LATEST'
10+
var MEM_SIZE = process.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE || '1536'
11+
var TIMEOUT = process.env.AWS_LAMBDA_FUNCTION_TIMEOUT || '300'
12+
var REGION = process.env.AWS_REGION || process.env.AWS_DEFAULT_REGION || 'us-east-1'
13+
var ACCOUNT_ID = process.env.AWS_ACCOUNT_ID || randomAccountId()
14+
var ACCESS_KEY_ID = process.env.AWS_ACCESS_KEY_ID || 'SOME_ACCESS_KEY_ID'
15+
var SECRET_ACCESS_KEY = process.env.AWS_SECRET_ACCESS_KEY || 'SOME_SECRET_ACCESS_KEY'
16+
var SESSION_TOKEN = process.env.AWS_SESSION_TOKEN
17+
var INVOKED_ARN = process.env.AWS_LAMBDA_FUNCTION_INVOKED_ARN || arn(REGION, ACCOUNT_ID, FN_NAME)
18+
19+
function consoleLog(str) {
20+
process.stderr.write(formatConsole(str))
21+
}
22+
23+
function systemLog(str) {
24+
process.stderr.write(formatSystem(str) + '\n')
25+
}
26+
27+
function systemErr(str) {
28+
process.stderr.write(formatErr(str) + '\n')
29+
}
30+
31+
function handleResult(resultStr, cb) {
32+
if (!process.stdout.write(resultStr + '\n')) {
33+
process.stdout.once('drain', cb)
34+
} else {
35+
process.nextTick(cb)
36+
}
37+
}
38+
39+
// Don't think this can be done in the Docker image
40+
process.umask(2)
41+
42+
process.env.AWS_LAMBDA_FUNCTION_NAME = FN_NAME
43+
process.env.AWS_LAMBDA_FUNCTION_VERSION = VERSION
44+
process.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE = MEM_SIZE
45+
process.env.AWS_LAMBDA_LOG_GROUP_NAME = '/aws/lambda/' + FN_NAME
46+
process.env.AWS_LAMBDA_LOG_STREAM_NAME = new Date().toISOString().slice(0, 10).replace(/-/g, '/') +
47+
'/[' + VERSION + ']' + crypto.randomBytes(16).toString('hex')
48+
process.env.AWS_REGION = REGION
49+
process.env.AWS_DEFAULT_REGION = REGION
50+
process.env._HANDLER = HANDLER
51+
52+
var OPTIONS = {
53+
initInvokeId: EVENT_ID,
54+
invokeId: EVENT_ID,
55+
handler: HANDLER,
56+
suppressInit: true,
57+
credentials: {
58+
key: ACCESS_KEY_ID,
59+
secret: SECRET_ACCESS_KEY,
60+
session: SESSION_TOKEN,
61+
},
62+
eventBody: EVENT_BODY,
63+
contextObjects: {
64+
// clientContext: '{}',
65+
// cognitoIdentityId: undefined,
66+
// cognitoPoolId: undefined,
67+
},
68+
invokedFunctionArn: INVOKED_ARN,
69+
}
70+
71+
// Some weird spelling error in the source?
72+
OPTIONS.invokeid = OPTIONS.invokeId
73+
74+
var invoked = false
75+
var errored = false
76+
var start = null
77+
78+
module.exports = {
79+
initRuntime: function() { return OPTIONS },
80+
waitForInvoke: function(fn) {
81+
if (invoked) return
82+
start = process.hrtime()
83+
invoked = true
84+
fn(OPTIONS)
85+
},
86+
reportRunning: function(invokeId) {}, // eslint-disable-line no-unused-vars
87+
reportDone: function(invokeId, errType, resultStr) {
88+
if (!invoked) return
89+
90+
var exitCode = errored || errType ? 1 : 0
91+
if (typeof resultStr === 'string') {
92+
handleResult(resultStr, function() { process.exit(exitCode) })
93+
} else {
94+
process.exit(exitCode)
95+
}
96+
},
97+
reportFault: function(invokeId, msg, errName, errStack) {
98+
errored = true
99+
systemErr(msg + (errName ? ': ' + errName : ''))
100+
if (errStack) systemErr(errStack)
101+
},
102+
reportUserInitStart: function() {},
103+
reportUserInitEnd: function() {},
104+
reportUserInvokeStart: function() {},
105+
reportUserInvokeEnd: function() {},
106+
reportException: function() {},
107+
sendConsoleLogs: consoleLog,
108+
maxLoggerErrorSize: 256 * 1024,
109+
}
110+
111+
function formatConsole(str) {
112+
return str.replace(/^[0-9TZ:.-]+\t[0-9a-f-]+\t/, '\u001b[34m$&\u001b[0m')
113+
}
114+
115+
function formatSystem(str) {
116+
return '\u001b[32m' + str + '\u001b[0m'
117+
}
118+
119+
function formatErr(str) {
120+
return '\u001b[31m' + str + '\u001b[0m'
121+
}
122+
123+
function hrTimeMs(hrtime) {
124+
return (hrtime[0] * 1e9 + hrtime[1]) / 1e6
125+
}
126+
127+
function hrTimeMs(hrtime) {
128+
return (hrtime[0] * 1e9 + hrtime[1]) / 1e6
129+
}
130+
131+
function randomAccountId() {
132+
return String(0x100000000 * Math.random())
133+
}
134+
135+
function arn(region, accountId, fnName) {
136+
return 'arn:aws:lambda:' + region + ':' + accountId.replace(/[^\d]/g, '') + ':function:' + fnName
137+
}

node-4.x/bootstrap

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#!/bin/sh
2+
3+
# Processing
4+
while true
5+
do
6+
HEADERS="$(mktemp)"
7+
# Get an event
8+
EVENT_DATA=$(curl -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next")
9+
REQUEST_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2)
10+
11+
# Execute the handler function from the script
12+
RESPONSE=$(node --expose-gc bootstrap.js "${REQUEST_ID}" "${EVENT_DATA}")
13+
14+
# Send the response
15+
curl -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response" -d "$RESPONSE"
16+
done

0 commit comments

Comments
 (0)