@everystack/server 0.2.7 → 0.2.9

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@everystack/server",
3
- "version": "0.2.7",
3
+ "version": "0.2.9",
4
4
  "description": "Server runtime primitives for Lambda — event adapters, routing, SSR, image processing",
5
5
  "license": "AGPL-3.0-only",
6
6
  "publishConfig": {
@@ -59,17 +59,25 @@
59
59
  "lint": "tsc --noEmit"
60
60
  },
61
61
  "peerDependencies": {
62
+ "@aws-sdk/client-cloudfront-keyvaluestore": ">=3.1053.0",
62
63
  "@aws-sdk/client-s3": "3.1053.0",
63
64
  "@aws-sdk/s3-request-presigner": "3.1053.0",
65
+ "@aws-sdk/signature-v4a": ">=3.1048.0",
64
66
  "@everystack/auth": ">=0.1.0",
65
67
  "@everystack/cli": ">=0.1.0",
66
68
  "drizzle-orm": "0.41.0",
67
- "postgres": "3.4.9",
68
69
  "heic-decode": "2.1.0",
70
+ "postgres": "3.4.9",
69
71
  "sharp": "0.34.5",
70
72
  "sst": "4.13.1"
71
73
  },
72
74
  "peerDependenciesMeta": {
75
+ "@aws-sdk/client-cloudfront-keyvaluestore": {
76
+ "optional": true
77
+ },
78
+ "@aws-sdk/signature-v4a": {
79
+ "optional": true
80
+ },
73
81
  "sst": {
74
82
  "optional": true
75
83
  },
@@ -93,6 +101,8 @@
93
101
  }
94
102
  },
95
103
  "devDependencies": {
104
+ "@aws-sdk/client-cloudfront-keyvaluestore": "3.1053.0",
105
+ "@aws-sdk/signature-v4a": "3.1063.0",
96
106
  "@everystack/auth": "workspace:*",
97
107
  "@everystack/cli": "workspace:*",
98
108
  "@types/aws-lambda": "8.10.161",
package/src/plugin.ts CHANGED
@@ -34,7 +34,11 @@ export interface PluginContext {
34
34
  /** Runtime environment */
35
35
  environment: string;
36
36
  /** Publish a background job */
37
- publishJob: (type: string, payload: unknown) => Promise<string>;
37
+ publishJob: (type: string, payload: unknown, options?: { schedulable?: boolean; runAt?: Date }) => Promise<string>;
38
+ /** Cancel a scheduled job */
39
+ cancelJob?: (jobId: string) => Promise<void>;
40
+ /** Reschedule a pending job */
41
+ rescheduleJob?: (jobId: string, options: { runAt: Date }) => Promise<void>;
38
42
  /** Extensible — apps add whatever their plugins need */
39
43
  [key: string]: unknown;
40
44
  }
package/src/ssr.ts CHANGED
@@ -95,12 +95,11 @@ const HYDRATE_SCRIPT = '<script>globalThis.__EXPO_ROUTER_HYDRATE__=true;</script
95
95
  * (e.g., JSON-LD injection, status code override from meta tags).
96
96
  *
97
97
  * @param innerHandler - The expo-server request handler
98
- * @param bundleKey - Bundle identifier, set as X-Bundle-Key header
99
98
  * @param options - SSR processing options
99
+ * @param metadata - Release metadata (createdAt used for X-Server-Debug header)
100
100
  */
101
101
  export function wrapSsrHandler(
102
102
  innerHandler: (request: Request) => Promise<Response>,
103
- bundleKey: string,
104
103
  options?: Pick<WebHandlerOptions, 'stripQueryParams' | 'injectHydrateFlag' | 'postProcessHtml'>,
105
104
  metadata?: ReleaseMetadata,
106
105
  ): (request: Request) => Promise<Response> {
@@ -128,12 +127,9 @@ export function wrapSsrHandler(
128
127
  // Delegate to inner handler
129
128
  const response = await innerHandler(cleanRequest);
130
129
 
131
- // Set bundle key and release metadata on all responses
130
+ // Set debug fingerprint release timestamp identifies the serving bundle
132
131
  const headers = new Headers(response.headers);
133
- headers.set('X-Bundle-Key', bundleKey);
134
- if (metadata?.updateId) headers.set('X-Update-Id', metadata.updateId);
135
- if (metadata?.runtimeVersion) headers.set('X-Runtime-Version', metadata.runtimeVersion);
136
- if (metadata?.createdAt) headers.set('X-Release-Created', metadata.createdAt);
132
+ if (metadata?.createdAt) headers.set('X-Server-Debug', metadata.createdAt);
137
133
 
138
134
  // Non-HTML responses pass through untouched
139
135
  const ct = headers.get('content-type') || '';
@@ -286,7 +282,7 @@ export async function getWebHandler(
286
282
  // If cached and within TTL, return existing handler (no DB/S3 check)
287
283
  if (cached && (now - cached.checkedAt) < TTL_MS) {
288
284
  const rawHandler = async (req: Request) => cached.run(cached.handler, req);
289
- return wrapSsrHandler(rawHandler, cached.bundleKey, options, cached.metadata);
285
+ return wrapSsrHandler(rawHandler, options, cached.metadata);
290
286
  }
291
287
 
292
288
  // TTL expired or no cache — resolve bundle key and metadata
@@ -309,7 +305,7 @@ export async function getWebHandler(
309
305
  if (cached && cached.bundleKey === bundleKey && cached.etag === meta.etag) {
310
306
  cached.checkedAt = now;
311
307
  const rawHandler = async (req: Request) => cached.run(cached.handler, req);
312
- return wrapSsrHandler(rawHandler, bundleKey, options, cached.metadata);
308
+ return wrapSsrHandler(rawHandler, options, cached.metadata);
313
309
  }
314
310
 
315
311
  // New or updated release — download and extract server bundle archive
@@ -342,7 +338,7 @@ export async function getWebHandler(
342
338
  cachedHandlers.set(channel, entry);
343
339
 
344
340
  const rawHandler = async (req: Request) => entry.run(entry.handler, req);
345
- return wrapSsrHandler(rawHandler, bundleKey, options, metadata);
341
+ return wrapSsrHandler(rawHandler, options, metadata);
346
342
  }
347
343
 
348
344
  /**