I’m currently using serverless-webpack, using the settings from ‘aws-nodejs-typescript’ and having this issue that one of the function that I wrote for handling dynamodb stream kept getting this error.
serverless_sdk/index.js
9 */(function(){var o="Expected a function",i="__lodash_placeholder__",s=[["ary",128],["bind",1],["bi
^ SyntaxError Unexpected token '.'
And the code I wrote look something like this,
import "source-map-support/register";
import { DynamoDBStreamHandler } from "aws-lambda";
import { DynamoDB, ApiGatewayManagementApi } from "aws-sdk";
const ddb = new DynamoDB.DocumentClient({ apiVersion: "2012-08-10" });
const ws_client = new ApiGatewayManagementApi({
endpoint: process.env.APIG_ENDPOINT,
});
interface UpdateAggregateParams {
user_id: string;
task_id: string;
old_status: string;
new_status?: string;
}
/**
* [WS] Get user connection ID
*
* @param user_id user_id must follow 'USER#{user_id}' pattern
*/
const get_user_connection_id = async (
user_id: string
): Promise<string | null> => {
const params: DynamoDB.DocumentClient.QueryInput = {
TableName: process.env.TABLE_NAME,
KeyConditionExpression: "GSI1_PK = :pk AND GSI1_SK = :sk",
ExpressionAttributeValues: {
":pk": user_id,
":sk": "#CONNID#",
},
};
try {
const result = await ddb.query(params).promise();
return result.Items[0]?.PK || null;
} catch (error) {
console.log(error);
return null;
}
};
/**
* Update aggregate
*
* Update aggregate data in task item
*
* @param params user_id must follow 'USER#{user_id}' pattern
* @param is_delete set if update is from a delete, default false
*/
const update_aggregate = async (
params: UpdateAggregateParams,
is_delete: boolean = false
) => {
let update_expression = `SET aggregate_metrics.${params.old_status} = aggregate_metrics.${params.old_status} - 1`;
if (!is_delete && params.new_status) {
update_expression += `, aggregate_metrics.${params.new_status} = aggregate_metrics.${params.new_status} + 1`;
} else if (!is_delete && !params.new_status) {
throw "New Status is missing";
}
const update_params: DynamoDB.DocumentClient.UpdateItemInput = {
TableName: process.env.TABLE_NAME,
Key: {
PK: params.user_id,
SK: `#TASK#META#${params.task_id}`,
},
UpdateExpression: update_expression,
};
try {
await ddb.update(update_params);
} catch (error) {
console.log(error);
}
};
const send_subscriber_message = async (conn_id, payload) => {
await ws_client
.postToConnection({
ConnectionId: conn_id,
Data: payload,
})
.promise();
};
const delete_subscriber_connection = async (conn_id) => {
await ws_client
.deleteConnection({
ConnectionId: conn_id,
})
.promise();
};
const checklist_handler = async (new_record, old_record) => {
const id_list = new_record.SK.S.split(":");
const task_id = id_list[0].split("#TASK#")[-1];
const checklist_id = id_list[-1].split("#CHECK#")[-1];
const updater = update_aggregate({
user_id: new_record.PK.S,
task_id: task_id,
old_status: old_record.status.S,
new_status: new_record.status.S,
});
const conn_id = await get_user_connection_id(new_record.PK.S);
conn_id != null &&
(await send_subscriber_message(conn_id, {
task_id: task_id,
checklist_id: checklist_id,
name: new_record.name.S,
desc: new_record.desc.S,
status: new_record.desc.S,
message: new_record.desc.S,
}));
await updater;
};
export const main: DynamoDBStreamHandler = async (event, _context) => {
let jobs: Promise<any>[] = [];
const checklist_pattern = /#TASK#\S+:#CHECK#\S+/;
event.Records.forEach((record) => {
if (record?.eventName === "INSERT" || record?.eventName === "MODIFY") {
checklist_pattern.test(record["NewImage"].PK.S) &&
record["NewImage"].PK.S != record["OldImage"].PK.S &&
jobs.push(checklist_handler(record["NewImage"], record["OldImage"]));
} else if (record?.eventName === "REMOVE") {
record["OldImage"].SK.S === "#CONNID#" &&
jobs.push(delete_subscriber_connection(record["OldImage"].PK.S));
}
});
jobs.length > 0 && (await Promise.all(jobs));
};
Anyone have idea why? I honestly cannot figure it out. Thanks in advance.