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.
@@ -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
- buildDeps,
162
- buildParams
308
+ truncateForStorage,
309
+ createHandlerRuntime
163
310
  };