effortless-aws 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-I5TS7O5S.js → chunk-7JVA4742.js} +149 -2
- package/dist/cli/index.js +190 -141
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +40 -1
- package/dist/index.js +92 -0
- package/dist/index.js.map +1 -1
- package/dist/runtime/wrap-http.js +25 -43
- package/dist/runtime/wrap-table-stream.js +47 -74
- package/package.json +1 -2
|
@@ -99,6 +99,21 @@ var createTableClient = (tableName) => {
|
|
|
99
99
|
};
|
|
100
100
|
};
|
|
101
101
|
|
|
102
|
+
// src/runtime/platform-types.ts
|
|
103
|
+
var ENV_PLATFORM_TABLE = "EFF_PLATFORM_TABLE";
|
|
104
|
+
var DEFAULT_TTL_SECONDS = 7 * 24 * 60 * 60;
|
|
105
|
+
var truncateForStorage = (value, maxLength = 4096) => {
|
|
106
|
+
if (value === void 0 || value === null) return value;
|
|
107
|
+
const str = typeof value === "string" ? value : JSON.stringify(value);
|
|
108
|
+
if (str.length <= maxLength) return value;
|
|
109
|
+
return str.slice(0, maxLength) + "...[truncated]";
|
|
110
|
+
};
|
|
111
|
+
var dateBucket = (date = /* @__PURE__ */ new Date()) => date.toISOString().slice(0, 10);
|
|
112
|
+
var computeTtl = (ttlSeconds = DEFAULT_TTL_SECONDS) => Math.floor(Date.now() / 1e3) + ttlSeconds;
|
|
113
|
+
|
|
114
|
+
// src/runtime/handler-utils.ts
|
|
115
|
+
import { randomUUID } from "crypto";
|
|
116
|
+
|
|
102
117
|
// src/runtime/ssm-client.ts
|
|
103
118
|
import { SSM } from "@aws-sdk/client-ssm";
|
|
104
119
|
var client = null;
|
|
@@ -120,6 +135,89 @@ var getParameters = async (names) => {
|
|
|
120
135
|
return map;
|
|
121
136
|
};
|
|
122
137
|
|
|
138
|
+
// src/runtime/platform-client.ts
|
|
139
|
+
import { DynamoDB as DynamoDB2 } from "@aws-sdk/client-dynamodb";
|
|
140
|
+
import { marshall as marshall2, unmarshall as unmarshall2 } from "@aws-sdk/util-dynamodb";
|
|
141
|
+
var createPlatformClient = () => {
|
|
142
|
+
const tableName = process.env[ENV_PLATFORM_TABLE];
|
|
143
|
+
if (!tableName) return void 0;
|
|
144
|
+
let client2 = null;
|
|
145
|
+
const getClient2 = () => client2 ??= new DynamoDB2({});
|
|
146
|
+
const appendToList = async (handlerName, handlerType, listAttr, entry) => {
|
|
147
|
+
const sk = `EXEC#${dateBucket()}`;
|
|
148
|
+
try {
|
|
149
|
+
await getClient2().updateItem({
|
|
150
|
+
TableName: tableName,
|
|
151
|
+
Key: marshall2({ pk: `HANDLER#${handlerName}`, sk }),
|
|
152
|
+
UpdateExpression: "SET #list = list_append(if_not_exists(#list, :empty), :entry), #type = :type, #hn = :hn, #ht = :ht, #ttl = :ttl",
|
|
153
|
+
ExpressionAttributeNames: {
|
|
154
|
+
"#list": listAttr,
|
|
155
|
+
"#type": "type",
|
|
156
|
+
"#hn": "handlerName",
|
|
157
|
+
"#ht": "handlerType",
|
|
158
|
+
"#ttl": "ttl"
|
|
159
|
+
},
|
|
160
|
+
ExpressionAttributeValues: marshall2(
|
|
161
|
+
{
|
|
162
|
+
":entry": [entry],
|
|
163
|
+
":empty": [],
|
|
164
|
+
":type": "execution-log",
|
|
165
|
+
":hn": handlerName,
|
|
166
|
+
":ht": handlerType,
|
|
167
|
+
":ttl": computeTtl()
|
|
168
|
+
},
|
|
169
|
+
{ removeUndefinedValues: true }
|
|
170
|
+
)
|
|
171
|
+
});
|
|
172
|
+
} catch (err) {
|
|
173
|
+
console.error("[effortless] Failed to write platform record:", err);
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
return {
|
|
177
|
+
tableName,
|
|
178
|
+
async appendExecution(handlerName, handlerType, entry) {
|
|
179
|
+
await appendToList(handlerName, handlerType, "executions", entry);
|
|
180
|
+
},
|
|
181
|
+
async appendError(handlerName, handlerType, entry) {
|
|
182
|
+
await appendToList(handlerName, handlerType, "errors", entry);
|
|
183
|
+
},
|
|
184
|
+
async get(pk, sk) {
|
|
185
|
+
const result = await getClient2().getItem({
|
|
186
|
+
TableName: tableName,
|
|
187
|
+
Key: marshall2({ pk, sk })
|
|
188
|
+
});
|
|
189
|
+
return result.Item ? unmarshall2(result.Item) : void 0;
|
|
190
|
+
},
|
|
191
|
+
async query(pk, skPrefix) {
|
|
192
|
+
const names = { "#pk": "pk" };
|
|
193
|
+
const values = { ":pk": pk };
|
|
194
|
+
let keyCondition = "#pk = :pk";
|
|
195
|
+
if (skPrefix) {
|
|
196
|
+
names["#sk"] = "sk";
|
|
197
|
+
values[":sk"] = skPrefix;
|
|
198
|
+
keyCondition += " AND begins_with(#sk, :sk)";
|
|
199
|
+
}
|
|
200
|
+
const result = await getClient2().query({
|
|
201
|
+
TableName: tableName,
|
|
202
|
+
KeyConditionExpression: keyCondition,
|
|
203
|
+
ExpressionAttributeNames: names,
|
|
204
|
+
ExpressionAttributeValues: marshall2(values, { removeUndefinedValues: true })
|
|
205
|
+
});
|
|
206
|
+
return (result.Items ?? []).map((item) => unmarshall2(item));
|
|
207
|
+
},
|
|
208
|
+
async put(entity) {
|
|
209
|
+
try {
|
|
210
|
+
await getClient2().putItem({
|
|
211
|
+
TableName: tableName,
|
|
212
|
+
Item: marshall2(entity, { removeUndefinedValues: true })
|
|
213
|
+
});
|
|
214
|
+
} catch (err) {
|
|
215
|
+
console.error("[effortless] Failed to write platform record:", err);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
};
|
|
220
|
+
|
|
123
221
|
// src/runtime/handler-utils.ts
|
|
124
222
|
var ENV_TABLE_PREFIX = "EFF_TABLE_";
|
|
125
223
|
var ENV_PARAM_PREFIX = "EFF_PARAM_";
|
|
@@ -155,9 +253,58 @@ var buildParams = async (params) => {
|
|
|
155
253
|
}
|
|
156
254
|
return result;
|
|
157
255
|
};
|
|
256
|
+
var createHandlerRuntime = (handler, handlerType) => {
|
|
257
|
+
const platform = createPlatformClient();
|
|
258
|
+
const handlerName = process.env.EFF_HANDLER ?? "unknown";
|
|
259
|
+
let ctx = null;
|
|
260
|
+
let resolvedDeps;
|
|
261
|
+
let resolvedParams = null;
|
|
262
|
+
const getDeps = () => resolvedDeps ??= buildDeps(handler.deps);
|
|
263
|
+
const getParams = async () => {
|
|
264
|
+
if (resolvedParams !== null) return resolvedParams;
|
|
265
|
+
resolvedParams = await buildParams(handler.params);
|
|
266
|
+
return resolvedParams;
|
|
267
|
+
};
|
|
268
|
+
const getCtx = async () => {
|
|
269
|
+
if (ctx !== null) return ctx;
|
|
270
|
+
if (handler.context) {
|
|
271
|
+
const params = await getParams();
|
|
272
|
+
ctx = params ? await handler.context({ params }) : await handler.context();
|
|
273
|
+
}
|
|
274
|
+
return ctx;
|
|
275
|
+
};
|
|
276
|
+
const commonArgs = async () => {
|
|
277
|
+
const args = {};
|
|
278
|
+
if (handler.context) args.ctx = await getCtx();
|
|
279
|
+
const deps = getDeps();
|
|
280
|
+
if (deps) args.deps = deps;
|
|
281
|
+
const params = await getParams();
|
|
282
|
+
if (params) args.params = params;
|
|
283
|
+
return args;
|
|
284
|
+
};
|
|
285
|
+
const logExecution = (startTime, input, output) => {
|
|
286
|
+
platform?.appendExecution(handlerName, handlerType, {
|
|
287
|
+
id: randomUUID(),
|
|
288
|
+
ts: (/* @__PURE__ */ new Date()).toISOString(),
|
|
289
|
+
ms: Date.now() - startTime,
|
|
290
|
+
in: input,
|
|
291
|
+
out: truncateForStorage(output)
|
|
292
|
+
});
|
|
293
|
+
};
|
|
294
|
+
const logError = (startTime, input, error) => {
|
|
295
|
+
platform?.appendError(handlerName, handlerType, {
|
|
296
|
+
id: randomUUID(),
|
|
297
|
+
ts: (/* @__PURE__ */ new Date()).toISOString(),
|
|
298
|
+
ms: Date.now() - startTime,
|
|
299
|
+
in: input,
|
|
300
|
+
err: error instanceof Error ? error.message : String(error)
|
|
301
|
+
});
|
|
302
|
+
};
|
|
303
|
+
return { commonArgs, logExecution, logError, handlerName };
|
|
304
|
+
};
|
|
158
305
|
|
|
159
306
|
export {
|
|
160
307
|
createTableClient,
|
|
161
|
-
|
|
162
|
-
|
|
308
|
+
truncateForStorage,
|
|
309
|
+
createHandlerRuntime
|
|
163
310
|
};
|