@runlot/next 0.1.0-rc.21 → 0.1.0-rc.211
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/README.md +10 -10
- package/dist/ai.d.ts +576 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/ai.js +2 -0
- package/dist/ai.js.map +1 -0
- package/dist/build.d.ts +22 -17
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +48 -32
- package/dist/build.js.map +1 -1
- package/dist/entry.d.ts +4 -3
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +11 -9
- package/dist/entry.js.map +1 -1
- package/dist/index.d.ts +15 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +43 -25
- package/dist/index.js.map +1 -1
- package/dist/judge.d.ts +36 -0
- package/dist/judge.d.ts.map +1 -0
- package/dist/judge.js +27 -0
- package/dist/judge.js.map +1 -0
- package/dist/opennext/context.d.ts +6 -3
- package/dist/opennext/context.d.ts.map +1 -1
- package/dist/opennext/context.js +17 -12
- package/dist/opennext/context.js.map +1 -1
- package/dist/opennext/incremental-cache.d.ts +2 -1
- package/dist/opennext/incremental-cache.d.ts.map +1 -1
- package/dist/opennext/incremental-cache.js +18 -12
- package/dist/opennext/incremental-cache.js.map +1 -1
- package/dist/opennext/tag-cache.d.ts +3 -3
- package/dist/opennext/tag-cache.d.ts.map +1 -1
- package/dist/opennext/tag-cache.js +15 -11
- package/dist/opennext/tag-cache.js.map +1 -1
- package/dist/store.d.ts +14 -9
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +22 -20
- package/dist/store.js.map +1 -1
- package/package.json +5 -5
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/** The env of this request. When it is in no store, an empty bundle — the
|
|
2
|
+
* caller reads that as having no bindings. */
|
|
2
3
|
export declare function bindings(): Record<string, unknown>;
|
|
3
|
-
/**
|
|
4
|
+
/** The build id OpenNext plants. When the deployment changes, the cache keys
|
|
5
|
+
* are separated. */
|
|
4
6
|
export declare function buildId(): string;
|
|
5
|
-
/**
|
|
7
|
+
/** A notice printed only once per deployment. It does not pile up the same
|
|
8
|
+
* line on every request. */
|
|
6
9
|
export declare function sayOnce(key: string, line: string): void;
|
|
7
10
|
//# sourceMappingURL=context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/opennext/context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/opennext/context.ts"],"names":[],"mappings":"AAoBA;+CAC+C;AAC/C,wBAAgB,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAElD;AAED;qBACqB;AACrB,wBAAgB,OAAO,IAAI,MAAM,CAKhC;AAID;6BAC6B;AAC7B,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAIvD"}
|
package/dist/opennext/context.js
CHANGED
|
@@ -1,26 +1,31 @@
|
|
|
1
|
-
//
|
|
1
|
+
// Where a cache override finds the bindings.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
// (`Symbol.for("__cloudflare-context__")`)
|
|
3
|
+
// It reads OpenNext's own request context
|
|
4
|
+
// (`Symbol.for("__cloudflare-context__")`), not our store (`../store.js`).
|
|
5
|
+
// There are two reasons:
|
|
5
6
|
//
|
|
6
|
-
// 1.
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
7
|
+
// 1. The overrides also go into the middleware bundle. That bundle is built
|
|
8
|
+
// with esbuild's `browser` platform and its only external is
|
|
9
|
+
// `node:crypto`, so importing our store — which drags in
|
|
10
|
+
// `node:async_hooks` — **breaks the build** (not measured — read off the
|
|
11
|
+
// external list in compileOpenNextConfigEdge).
|
|
12
|
+
// 2. A cache override always runs inside OpenNext's request context. Our
|
|
13
|
+
// bindings are in that context as they are — it is the same `env`.
|
|
12
14
|
const CF_CONTEXT = Symbol.for("__cloudflare-context__");
|
|
13
|
-
/**
|
|
15
|
+
/** The env of this request. When it is in no store, an empty bundle — the
|
|
16
|
+
* caller reads that as having no bindings. */
|
|
14
17
|
export function bindings() {
|
|
15
18
|
return globalThis[CF_CONTEXT]?.env ?? {};
|
|
16
19
|
}
|
|
17
|
-
/**
|
|
20
|
+
/** The build id OpenNext plants. When the deployment changes, the cache keys
|
|
21
|
+
* are separated. */
|
|
18
22
|
export function buildId() {
|
|
19
23
|
const id = globalThis.process?.env?.["OPEN_NEXT_BUILD_ID"];
|
|
20
24
|
return typeof id === "string" && id !== "" ? id : "no-build-id";
|
|
21
25
|
}
|
|
22
26
|
const said = new Set();
|
|
23
|
-
/**
|
|
27
|
+
/** A notice printed only once per deployment. It does not pile up the same
|
|
28
|
+
* line on every request. */
|
|
24
29
|
export function sayOnce(key, line) {
|
|
25
30
|
if (said.has(key))
|
|
26
31
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/opennext/context.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/opennext/context.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,EAAE;AACF,0CAA0C;AAC1C,2EAA2E;AAC3E,yBAAyB;AACzB,EAAE;AACF,8EAA8E;AAC9E,kEAAkE;AAClE,8DAA8D;AAC9D,8EAA8E;AAC9E,oDAAoD;AACpD,2EAA2E;AAC3E,wEAAwE;AAExE,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;AAMxD;+CAC+C;AAC/C,MAAM,UAAU,QAAQ;IACtB,OAAQ,UAAqB,CAAC,UAAU,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC;AACvD,CAAC;AAED;qBACqB;AACrB,MAAM,UAAU,OAAO;IACrB,MAAM,EAAE,GAAa,UAAyE,CAAC,OAAO,EAAE,GAAG,EAAE,CAC3G,oBAAoB,CACrB,CAAC;IACF,OAAO,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;AAClE,CAAC;AAED,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;AAE/B;6BAC6B;AAC7B,MAAM,UAAU,OAAO,CAAC,GAAW,EAAE,IAAY;IAC/C,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO;IAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACd,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { CacheEntryType, CacheValue, IncrementalCache, WithLastModified } from "@opennextjs/aws/types/overrides";
|
|
2
2
|
export declare const NAME = "runlot-storage";
|
|
3
|
-
/** `__next/cache/<buildId>/<key>.<type>`.
|
|
3
|
+
/** `__next/cache/<buildId>/<key>.<type>`. A leading `/` and any doubled `/`
|
|
4
|
+
* are erased. */
|
|
4
5
|
export declare function cacheKey(key: string, cacheType?: CacheEntryType, id?: string): string;
|
|
5
6
|
declare class RunlotStorageIncrementalCache implements IncrementalCache {
|
|
6
7
|
name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"incremental-cache.d.ts","sourceRoot":"","sources":["../../src/opennext/incremental-cache.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"incremental-cache.d.ts","sourceRoot":"","sources":["../../src/opennext/incremental-cache.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,iCAAiC,CAAC;AAGzC,eAAO,MAAM,IAAI,mBAAmB,CAAC;AAMrC;kBACkB;AAClB,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,GAAE,cAAwB,EAAE,EAAE,SAAY,GAAG,MAAM,CAEjG;AAOD,cAAM,6BAA8B,YAAW,gBAAgB;IAC7D,IAAI,SAAQ;IAEN,GAAG,CAAC,SAAS,SAAS,cAAc,GAAG,OAAO,EAClD,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,SAAS,GACpB,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC;IAsBpD,GAAG,CAAC,SAAS,SAAS,cAAc,GAAG,OAAO,EAClD,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC,EAC5B,SAAS,CAAC,EAAE,SAAS,GACpB,OAAO,CAAC,IAAI,CAAC;IAWV,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAKzC;;AAED,wBAAmD"}
|
|
@@ -1,17 +1,21 @@
|
|
|
1
|
-
// ISR
|
|
1
|
+
// The ISR cache — on top of `env.storage` (the first row of the table in
|
|
2
|
+
// docs/nextjs.md §2).
|
|
2
3
|
//
|
|
3
|
-
// OpenNext
|
|
4
|
-
//
|
|
5
|
-
//
|
|
4
|
+
// OpenNext's default (the static asset cache) is **read-only**, so revalidation
|
|
5
|
+
// does not work: it hands back the pages baked at build time but has nowhere to
|
|
6
|
+
// write the new page after a `revalidatePath`. The only place we can write is
|
|
7
|
+
// object storage.
|
|
6
8
|
//
|
|
7
|
-
// `env.storage`
|
|
8
|
-
//
|
|
9
|
+
// Without `env.storage` (a project whose storage was turned off) it falls
|
|
10
|
+
// back to the static asset cache and says one line. Why it does not throw: the
|
|
11
|
+
// page has to come up even without ISR.
|
|
9
12
|
import staticAssetsCache from "@opennextjs/cloudflare/overrides/incremental-cache/static-assets-incremental-cache";
|
|
10
13
|
import { bindings, buildId, sayOnce } from "./context.js";
|
|
11
14
|
export const NAME = "runlot-storage";
|
|
12
|
-
const NO_STORAGE =
|
|
13
|
-
"
|
|
14
|
-
/** `__next/cache/<buildId>/<key>.<type>`.
|
|
15
|
+
const NO_STORAGE = 'There is no storage to keep the ISR cache in: this project\'s storage is off. Turn it on with `runlot storage on` and deploy again ' +
|
|
16
|
+
"to be able to use cache revalidation. Until then, only the pages generated at build time are returned.";
|
|
17
|
+
/** `__next/cache/<buildId>/<key>.<type>`. A leading `/` and any doubled `/`
|
|
18
|
+
* are erased. */
|
|
15
19
|
export function cacheKey(key, cacheType = "cache", id = buildId()) {
|
|
16
20
|
return `__next/cache/${id}/${key}.${cacheType}`.replace(/\/+/g, "/").replace(/^\//, "");
|
|
17
21
|
}
|
|
@@ -32,13 +36,15 @@ class RunlotStorageIncrementalCache {
|
|
|
32
36
|
return null;
|
|
33
37
|
try {
|
|
34
38
|
const value = (await new Response(object.body).json());
|
|
35
|
-
// `lastModified`
|
|
36
|
-
//
|
|
39
|
+
// `lastModified` is RFC 1123. When it cannot be read it has to be read
|
|
40
|
+
// as "written just now", not as 0 — at 0 every entry becomes stale in the
|
|
41
|
+
// tag check.
|
|
37
42
|
const at = Date.parse(object.lastModified);
|
|
38
43
|
return { value, lastModified: Number.isNaN(at) ? Date.now() : at };
|
|
39
44
|
}
|
|
40
45
|
catch {
|
|
41
|
-
//
|
|
46
|
+
// A half-written entry. Read it as a cache miss and let the next render
|
|
47
|
+
// overwrite it.
|
|
42
48
|
return null;
|
|
43
49
|
}
|
|
44
50
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"incremental-cache.js","sourceRoot":"","sources":["../../src/opennext/incremental-cache.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"incremental-cache.js","sourceRoot":"","sources":["../../src/opennext/incremental-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import type { OriginalTagCache, OriginalTagCacheWriteInput } from "@opennextjs/a
|
|
|
2
2
|
export declare const NAME = "runlot-db";
|
|
3
3
|
export declare const SCHEMA = "runlot_next";
|
|
4
4
|
export declare const TABLE = "runlot_next.tags";
|
|
5
|
-
/**
|
|
5
|
+
/** For when a test imitates opening a fresh isolate. */
|
|
6
6
|
export declare function resetBootstrap(): void;
|
|
7
7
|
declare class RunlotDbTagCache implements OriginalTagCache {
|
|
8
8
|
#private;
|
|
@@ -11,8 +11,8 @@ declare class RunlotDbTagCache implements OriginalTagCache {
|
|
|
11
11
|
getByTag(tag: string): Promise<string[]>;
|
|
12
12
|
getByPath(path: string): Promise<string[]>;
|
|
13
13
|
/**
|
|
14
|
-
*
|
|
15
|
-
* `-1`
|
|
14
|
+
* `-1` when any tag of this path was invalidated after `lastModified`.
|
|
15
|
+
* To the adapter, `-1` means "throw this entry away".
|
|
16
16
|
*/
|
|
17
17
|
getLastModified(path: string, lastModified?: number): Promise<number>;
|
|
18
18
|
writeTags(tags: OriginalTagCacheWriteInput[]): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tag-cache.d.ts","sourceRoot":"","sources":["../../src/opennext/tag-cache.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tag-cache.d.ts","sourceRoot":"","sources":["../../src/opennext/tag-cache.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAGpG,eAAO,MAAM,IAAI,cAAc,CAAC;AAChC,eAAO,MAAM,MAAM,gBAAgB,CAAC;AACpC,eAAO,MAAM,KAAK,qBAAqB,CAAC;AAsCxC,wDAAwD;AACxD,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAiBD,cAAM,gBAAiB,YAAW,gBAAgB;;IAChD,IAAI,EAAG,UAAU,CAAU;IAC3B,IAAI,SAAQ;IA8BN,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAOxC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAOhD;;;OAGG;IACG,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWrE,SAAS,CAAC,IAAI,EAAE,0BAA0B,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAgBnE;;AAED,wBAAsC"}
|
|
@@ -2,8 +2,8 @@ import { bindings, buildId, sayOnce } from "./context.js";
|
|
|
2
2
|
export const NAME = "runlot-db";
|
|
3
3
|
export const SCHEMA = "runlot_next";
|
|
4
4
|
export const TABLE = "runlot_next.tags";
|
|
5
|
-
const NO_DB =
|
|
6
|
-
"revalidateTag
|
|
5
|
+
const NO_DB = 'The database the tag cache needs is not available: this project has no database. Create one with `runlot pg on` and deploy again ' +
|
|
6
|
+
"to be able to use revalidateTag. Until the database is available, calling revalidateTag does not invalidate the cache.";
|
|
7
7
|
const BOOTSTRAP = [
|
|
8
8
|
`create schema if not exists ${SCHEMA}`,
|
|
9
9
|
`create table if not exists ${TABLE} (
|
|
@@ -18,12 +18,13 @@ function dbOf() {
|
|
|
18
18
|
const db = bindings()["db"];
|
|
19
19
|
return db === undefined || db === null ? undefined : db;
|
|
20
20
|
}
|
|
21
|
-
/**
|
|
21
|
+
/** Once per isolate. On failure the next call tries again — we do not leave a
|
|
22
|
+
* cached rejection behind. */
|
|
22
23
|
let ready;
|
|
23
24
|
async function ensure(db) {
|
|
24
25
|
ready ??= (async () => {
|
|
25
|
-
//
|
|
26
|
-
//
|
|
26
|
+
// Send the statements one at a time. `exec` is an extended query, so it
|
|
27
|
+
// does not take several statements joined by semicolons at once.
|
|
27
28
|
for (const sql of BOOTSTRAP)
|
|
28
29
|
await db.exec(sql);
|
|
29
30
|
})().catch((err) => {
|
|
@@ -32,14 +33,15 @@ async function ensure(db) {
|
|
|
32
33
|
});
|
|
33
34
|
return ready;
|
|
34
35
|
}
|
|
35
|
-
/**
|
|
36
|
+
/** For when a test imitates opening a fresh isolate. */
|
|
36
37
|
export function resetBootstrap() {
|
|
37
38
|
ready = undefined;
|
|
38
39
|
}
|
|
39
40
|
function rowsOf(value) {
|
|
40
41
|
return Array.isArray(value) ? value : [];
|
|
41
42
|
}
|
|
42
|
-
/** bigint
|
|
43
|
+
/** Depending on the driver, a bigint arrives as a string. Read it as a
|
|
44
|
+
* number. */
|
|
43
45
|
function num(value) {
|
|
44
46
|
if (typeof value === "number")
|
|
45
47
|
return value;
|
|
@@ -52,7 +54,8 @@ function num(value) {
|
|
|
52
54
|
class RunlotDbTagCache {
|
|
53
55
|
mode = "original";
|
|
54
56
|
name = NAME;
|
|
55
|
-
/**
|
|
57
|
+
/** Keeps the tag names separated per deployment. An invalidation from an old
|
|
58
|
+
* deployment does not shake a new one. */
|
|
56
59
|
#key(tag) {
|
|
57
60
|
return `${buildId()}/${tag}`.replace(/\/+/g, "/");
|
|
58
61
|
}
|
|
@@ -70,7 +73,8 @@ class RunlotDbTagCache {
|
|
|
70
73
|
await ensure(db);
|
|
71
74
|
}
|
|
72
75
|
catch {
|
|
73
|
-
//
|
|
76
|
+
// Either there is no permission or the DB is not attached yet. Carry on
|
|
77
|
+
// with no tags.
|
|
74
78
|
sayOnce("no-db-bootstrap", NO_DB);
|
|
75
79
|
return undefined;
|
|
76
80
|
}
|
|
@@ -91,8 +95,8 @@ class RunlotDbTagCache {
|
|
|
91
95
|
return rows.map((r) => this.#bare(String(r["tag"])));
|
|
92
96
|
}
|
|
93
97
|
/**
|
|
94
|
-
*
|
|
95
|
-
* `-1`
|
|
98
|
+
* `-1` when any tag of this path was invalidated after `lastModified`.
|
|
99
|
+
* To the adapter, `-1` means "throw this entry away".
|
|
96
100
|
*/
|
|
97
101
|
async getLastModified(path, lastModified) {
|
|
98
102
|
const at = lastModified ?? Date.now();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tag-cache.js","sourceRoot":"","sources":["../../src/opennext/tag-cache.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tag-cache.js","sourceRoot":"","sources":["../../src/opennext/tag-cache.ts"],"names":[],"mappings":"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"}
|
package/dist/store.d.ts
CHANGED
|
@@ -1,22 +1,26 @@
|
|
|
1
1
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
2
|
import type { AuthBinding, SignOutHeaders, User } from "@runlot/auth";
|
|
3
3
|
import type { Db, Storage } from "@runlot/pg";
|
|
4
|
+
import type { RunlotAI } from "./ai.js";
|
|
4
5
|
/**
|
|
5
|
-
* `env.auth`.
|
|
6
|
-
*
|
|
6
|
+
* `env.auth`. The same as `AuthBinding` in `@runlot/auth`, except that the
|
|
7
|
+
* request argument of `user()` and `signOut()` is optional — without it the
|
|
8
|
+
* adapter puts in the request from the store (docs/nextjs.md §4).
|
|
7
9
|
*/
|
|
8
10
|
export interface RunlotAuth extends Omit<AuthBinding, "user" | "signOut"> {
|
|
9
11
|
user(request?: Request): Promise<User | null>;
|
|
10
12
|
signOut(request?: Request): Promise<SignOutHeaders>;
|
|
11
13
|
}
|
|
12
|
-
/**
|
|
14
|
+
/** The bundle of bindings the worker receives. The unnamed rest are secrets
|
|
15
|
+
* and environment variables (strings). */
|
|
13
16
|
export interface RunlotBindings {
|
|
14
17
|
db: Db;
|
|
15
18
|
auth: RunlotAuth;
|
|
16
19
|
storage: Storage;
|
|
20
|
+
ai: RunlotAI;
|
|
17
21
|
}
|
|
18
22
|
export type RunlotEnv = RunlotBindings & Record<string, string>;
|
|
19
|
-
/** workerd
|
|
23
|
+
/** The part of workerd's `ExecutionContext` that we use. */
|
|
20
24
|
export interface RunlotContext {
|
|
21
25
|
waitUntil(promise: Promise<unknown>): void;
|
|
22
26
|
passThroughOnException?(): void;
|
|
@@ -26,14 +30,15 @@ export interface RunlotStore {
|
|
|
26
30
|
env: RunlotEnv;
|
|
27
31
|
ctx: RunlotContext;
|
|
28
32
|
}
|
|
29
|
-
/**
|
|
33
|
+
/** The request-context store. The entry wrapper puts into it and `env`,
|
|
34
|
+
* `request()` and `waitUntil()` read from it. */
|
|
30
35
|
export declare const als: AsyncLocalStorage<RunlotStore>;
|
|
31
36
|
/**
|
|
32
|
-
*
|
|
37
|
+
* The sentence for being called outside the store.
|
|
33
38
|
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
39
|
+
* The reason it does not quietly hand back `null` or `undefined` is the same as
|
|
40
|
+
* docs/auth.md §4 — when "cannot be done" becomes an empty value, every page
|
|
41
|
+
* looks logged out, and the only place that is noticed is after a deploy.
|
|
37
42
|
*/
|
|
38
43
|
export declare const OUTSIDE_REQUEST: string;
|
|
39
44
|
export declare function store(): RunlotStore;
|
package/dist/store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC;;;;GAIG;AACH,MAAM,WAAW,UAAW,SAAQ,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IACvE,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAC9C,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CACrD;AAED;2CAC2C;AAC3C,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,EAAE,CAAC;IACP,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,EAAE,EAAE,QAAQ,CAAC;CACd;AAED,MAAM,MAAM,SAAS,GAAG,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEhE,4DAA4D;AAC5D,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IAC3C,sBAAsB,CAAC,IAAI,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,SAAS,CAAC;IACf,GAAG,EAAE,aAAa,CAAC;CACpB;AAUD;kDACkD;AAClD,eAAO,MAAM,GAAG,EAAE,iBAAiB,CAAC,WAAW,CAAuD,CAAC;AAEvG;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,QAIwE,CAAC;AAErG,wBAAgB,KAAK,IAAI,WAAW,CAInC"}
|
package/dist/store.js
CHANGED
|
@@ -1,32 +1,34 @@
|
|
|
1
|
-
//
|
|
1
|
+
// The request-context store (docs/nextjs.md §4).
|
|
2
2
|
//
|
|
3
|
-
// `
|
|
4
|
-
// Next
|
|
5
|
-
// `page.tsx`
|
|
6
|
-
//
|
|
3
|
+
// The `env` of `runlot/next` reads the `(request, env, ctx)` the worker entry
|
|
4
|
+
// point received. A Next server component has no place to pass those three down
|
|
5
|
+
// as arguments — `page.tsx` only receives `props` — so the entry wrapper puts
|
|
6
|
+
// them into an AsyncLocalStorage and this module takes them back out.
|
|
7
7
|
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
8
|
+
// **The store is one symbol on `globalThis`.** Because there is no guarantee of
|
|
9
|
+
// a single module instance: the `worker.js` OpenNext emits is an already-bundled
|
|
10
|
+
// bundle that contains a copy of this package inside it, and bundling the
|
|
11
|
+
// `runlot-entry.js` we stand up beside it makes one more copy. Keep the store in
|
|
12
|
+
// a module-local variable and the page cannot see the value the wrapper put in —
|
|
13
|
+
// it quietly becomes "there is no request". OpenNext itself uses
|
|
14
|
+
// `Symbol.for("__cloudflare-context__")` for the same reason.
|
|
14
15
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
15
16
|
const STORE = Symbol.for("runlot.next.store");
|
|
16
17
|
const g = globalThis;
|
|
17
|
-
/**
|
|
18
|
+
/** The request-context store. The entry wrapper puts into it and `env`,
|
|
19
|
+
* `request()` and `waitUntil()` read from it. */
|
|
18
20
|
export const als = (g[STORE] ??= new AsyncLocalStorage());
|
|
19
21
|
/**
|
|
20
|
-
*
|
|
22
|
+
* The sentence for being called outside the store.
|
|
21
23
|
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
24
|
+
* The reason it does not quietly hand back `null` or `undefined` is the same as
|
|
25
|
+
* docs/auth.md §4 — when "cannot be done" becomes an empty value, every page
|
|
26
|
+
* looks logged out, and the only place that is noticed is after a deploy.
|
|
25
27
|
*/
|
|
26
|
-
export const OUTSIDE_REQUEST = "runlot/next
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"`next dev
|
|
28
|
+
export const OUTSIDE_REQUEST = "The `env` of runlot/next can only be read inside a request. " +
|
|
29
|
+
"There is no request at module top level or in a build-time static render — " +
|
|
30
|
+
"move it inside a server component, a route handler or middleware. " +
|
|
31
|
+
"Runlot bindings are not available under `next dev`. Deploy with `runlot deploy` and check there.";
|
|
30
32
|
export function store() {
|
|
31
33
|
const s = als.getStore();
|
|
32
34
|
if (!s)
|
package/dist/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,EAAE;AACF,8EAA8E;AAC9E,gFAAgF;AAChF,8EAA8E;AAC9E,sEAAsE;AACtE,EAAE;AACF,gFAAgF;AAChF,iFAAiF;AACjF,0EAA0E;AAC1E,iFAAiF;AACjF,iFAAiF;AACjF,iEAAiE;AACjE,8DAA8D;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAsCrD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AAM9C,MAAM,CAAC,GAAG,UAAoB,CAAC;AAE/B;kDACkD;AAClD,MAAM,CAAC,MAAM,GAAG,GAAmC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,iBAAiB,EAAe,CAAC,CAAC;AAEvG;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAC1B,8DAA8D;IAC9D,6EAA6E;IAC7E,oEAAoE;IACpE,kGAAkG,CAAC;AAErG,MAAM,UAAU,KAAK;IACnB,MAAM,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;IACzB,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;IACzC,OAAO,CAAC,CAAC;AACX,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@runlot/next",
|
|
3
|
-
"version": "0.1.0-rc.
|
|
4
|
-
"description": "Next.js
|
|
3
|
+
"version": "0.1.0-rc.211",
|
|
4
|
+
"description": "Next.js adapter for Runlot — request-scoped env plus the OpenNext build",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -42,14 +42,14 @@
|
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"@opennextjs/aws": "4.1.4",
|
|
44
44
|
"@opennextjs/cloudflare": "^1.20.6",
|
|
45
|
-
"@runlot/pg": "0.1.0-rc.
|
|
46
|
-
"@runlot/auth": "0.1.0-rc.
|
|
45
|
+
"@runlot/pg": "0.1.0-rc.211",
|
|
46
|
+
"@runlot/auth": "0.1.0-rc.211"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
49
|
"@types/node": "^22.10.2",
|
|
50
50
|
"esbuild": "^0.24.2",
|
|
51
51
|
"typescript": "^5.7.2",
|
|
52
|
-
"@runlot/config": "0.1.0-rc.
|
|
52
|
+
"@runlot/config": "0.1.0-rc.211"
|
|
53
53
|
},
|
|
54
54
|
"scripts": {
|
|
55
55
|
"build": "tsc -p tsconfig.build.json",
|