jskelet 0.6.0 → 0.6.2
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/AGENTS.md +2 -3
- package/CHANGELOG.md +158 -103
- package/README.md +7 -14
- package/bin/jskelet.mjs +1 -1
- package/docs/02-mimari.md +6 -1
- package/docs/03-routing.md +3 -1
- package/docs/04-render-ve-sablonlar.md +25 -0
- package/docs/06-cache.md +18 -7
- package/docs/07-yapilandirma.md +29 -9
- package/docs/09-dev-araclari.md +17 -7
- package/docs/10-dagitim.md +8 -12
- package/docs/README.md +3 -28
- package/docs/en/02-architecture.md +7 -1
- package/docs/en/03-routing.md +3 -1
- package/docs/en/04-rendering.md +24 -0
- package/docs/en/06-caching.md +21 -7
- package/docs/en/07-configuration.md +29 -9
- package/docs/en/09-dev-tools.md +18 -7
- package/docs/en/10-deployment.md +8 -13
- package/docs/en/README.md +3 -30
- package/package.json +2 -2
- package/src/config/defaults.js +36 -3
- package/src/config/index.js +137 -26
- package/src/server/create-app.js +9 -0
- package/src/server/html-cache.js +178 -32
- package/src/server/middleware/dev-gate.js +21 -8
- package/src/server/middleware/robots-txt.js +341 -0
- package/src/server/prewarm.js +137 -51
- package/src/server/render.js +3 -1
- package/types/config/defaults.d.ts +31 -3
- package/types/config/index.d.ts +5 -0
- package/types/server/html-cache.d.ts +40 -6
- package/types/server/middleware/robots-txt.d.ts +33 -0
- package/types/server/prewarm.d.ts +6 -3
|
@@ -94,25 +94,53 @@ export declare const DEFAULT_PREWARM_ON_VISIT: {
|
|
|
94
94
|
/** Sayfa başına üstten alta en fazla kaç link kuyruğa alınır. */
|
|
95
95
|
perPage: number;
|
|
96
96
|
/**
|
|
97
|
-
* Paralel işçi
|
|
98
|
-
* (
|
|
97
|
+
* Paralel işçi. `null` yalnızca kapalı modda durur; açıkken tavan
|
|
98
|
+
* (`ON_VISIT_CONCURRENCY_CEILING`) uygulanır. Klasik prewarm'daki
|
|
99
|
+
* prod 4 burada geçerli değil — onVisit sürekli çalışır.
|
|
99
100
|
* @type {number | null}
|
|
100
101
|
*/
|
|
101
102
|
concurrency: number | null;
|
|
102
103
|
/**
|
|
103
|
-
* Saniyedeki istek tavan
|
|
104
|
+
* Saniyedeki istek tavanı. `null` yalnızca kapalı modda durur; açıkken
|
|
105
|
+
* `0` (sınırsız) dahil her şey `ON_VISIT_RPS_CEILING` ile kesilir.
|
|
104
106
|
* @type {number | null}
|
|
105
107
|
*/
|
|
106
108
|
rps: number | null;
|
|
107
109
|
};
|
|
110
|
+
/**
|
|
111
|
+
* onVisit sürekli tur olduğu için klasik prewarm'daki "sınırsız" burada yok.
|
|
112
|
+
* Config daha yükseğini yazsa da çözümlenen değer bu tavanları geçemez.
|
|
113
|
+
*/
|
|
114
|
+
export declare const ON_VISIT_PER_PAGE_CEILING = 20;
|
|
115
|
+
export declare const ON_VISIT_RPS_CEILING = 2;
|
|
116
|
+
export declare const ON_VISIT_CONCURRENCY_CEILING = 2;
|
|
117
|
+
/**
|
|
118
|
+
* Bekleyen onVisit yolları. Bir sayfa düzinelerce link basınca kuyruk
|
|
119
|
+
* birikmesin; taşan link bu turda alınmaz.
|
|
120
|
+
*/
|
|
121
|
+
export declare const ON_VISIT_QUEUE_MAX = 64;
|
|
108
122
|
/** `onVisit` açıkken `cache().prewarm` kökünde yasak olan klasik alanlar. */
|
|
109
123
|
export declare const CLASSIC_PREWARM_KEYS: string[];
|
|
110
124
|
/**
|
|
111
125
|
* HTML önbelleğinin girdi sınırı. 500 girdi ortalama bir sayfa boyutunda
|
|
112
126
|
* yaklaşık 100-200 MB tutar; uzun kuyruklu siteler bunu yükseltmek yerine
|
|
113
127
|
* veri önbelleğine yaslanmalı (bkz. `DEFAULT_DATA_CACHE`).
|
|
128
|
+
*
|
|
129
|
+
* Config daha yükseğini istese de girdi sayısı `HTML_CACHE_MAX_ENTRIES_CEILING`
|
|
130
|
+
* değerini geçemez. Asıl bellek freni bayt bütçesidir: şişman sayfa ve
|
|
131
|
+
* `vary.host` kopyası sayı tavanının altında da RSS'i şişirir.
|
|
114
132
|
*/
|
|
115
133
|
export declare const DEFAULT_HTML_CACHE_MAX_ENTRIES = 500;
|
|
134
|
+
/** `cache().maxEntries` için sert tavan. Üstü uyarıyla bu değere çekilir. */
|
|
135
|
+
export declare const HTML_CACHE_MAX_ENTRIES_CEILING = 800;
|
|
136
|
+
/**
|
|
137
|
+
* Süreç içi HTML string + sıkıştırılmış gövde tavanı (256 MB).
|
|
138
|
+
* `install()` bunu uygular; config yükseltemez. Tek sayfa bütçeden büyükse
|
|
139
|
+
* saklanmaz, yanıt yine gider.
|
|
140
|
+
*/
|
|
141
|
+
export declare const HTML_CACHE_BYTE_BUDGET: number;
|
|
142
|
+
/** `cache().data.maxEntries` için sert tavan. Uzun kuyruk burada durur, HTML'de değil. */
|
|
143
|
+
export declare const DATA_CACHE_MAX_ENTRIES_CEILING = 20000;
|
|
116
144
|
/**
|
|
117
145
|
* `notFound()` geçici bir upstream hatasına denk geldiğinde sayfanın kaç kez
|
|
118
146
|
* daha denenmesi gerektiği.
|
package/types/config/index.d.ts
CHANGED
|
@@ -178,6 +178,11 @@ export type ResolvedConfig = {
|
|
|
178
178
|
extensions: Set<string>;
|
|
179
179
|
prefixes: string[];
|
|
180
180
|
};
|
|
181
|
+
/**
|
|
182
|
+
* `DEV_TOKEN` tek başına siteyi kilitlemez; gate
|
|
183
|
+
* ancak bu bayrak veya `DEV_GATE=1` ile açılır.
|
|
184
|
+
*/
|
|
185
|
+
devGate: boolean;
|
|
181
186
|
devGateBypass: string[];
|
|
182
187
|
preconnect: string[];
|
|
183
188
|
navigation: NavigationConfig;
|
|
@@ -49,6 +49,23 @@ export type HtmlEntry = {
|
|
|
49
49
|
* @returns {number}
|
|
50
50
|
*/
|
|
51
51
|
export declare function earlyRefreshLeadMs(produceMs: number, ttlMs: number): number;
|
|
52
|
+
/**
|
|
53
|
+
* Sıkıştırılmış gövde `install()`'dan sonra, ilk brotli/gzip yanıtında
|
|
54
|
+
* girdinin `encoded` haritasına eklenir. Sayacı delta ile büyütmek, o sıra
|
|
55
|
+
* LRU'dan düşmüş bir haritaya yazınca bir daha inmeyen bir artık bırakır;
|
|
56
|
+
* store'dan yeniden okumak o artığı taşımaz.
|
|
57
|
+
*
|
|
58
|
+
* @returns {void}
|
|
59
|
+
*/
|
|
60
|
+
export declare function noteHtmlCacheGrowth(): void;
|
|
61
|
+
/**
|
|
62
|
+
* Bellek freninin bayt tavanını geçici olarak değiştirir. Testler LRU
|
|
63
|
+
* tahliyesini küçük bir değerle doğrular; `null` üretim tavanına döner.
|
|
64
|
+
*
|
|
65
|
+
* @param {number | null} bytes
|
|
66
|
+
* @returns {void}
|
|
67
|
+
*/
|
|
68
|
+
export declare function setHtmlCacheByteBudget(bytes: number | null): void;
|
|
52
69
|
/**
|
|
53
70
|
* @param {string} key
|
|
54
71
|
* @param {number} ttlSeconds 0 → cache yok
|
|
@@ -121,12 +138,20 @@ export declare function invalidateHtmlByDependency(dataKeys: Iterable<string>):
|
|
|
121
138
|
*/
|
|
122
139
|
export declare function dropHtmlCacheKey(key: string): boolean;
|
|
123
140
|
/**
|
|
124
|
-
* Invalidate edilmiş
|
|
125
|
-
*
|
|
126
|
-
*
|
|
141
|
+
* Invalidate edilmiş yollar. Okuma yıkıcıdır; iki tur aynı yolu tekrar
|
|
142
|
+
* ısıtmasın. `onlyHost` verilirse başka host'ların anahtarları kuyrukta
|
|
143
|
+
* kalır — süre dolumu onları kendi host'uyla ısıtır, `127.0.0.1` anahtarı
|
|
144
|
+
* açılmaz.
|
|
127
145
|
*
|
|
128
|
-
*
|
|
129
|
-
*
|
|
146
|
+
* @param {string} [onlyHost]
|
|
147
|
+
* @returns {{ path: string, host: string }[]}
|
|
148
|
+
*/
|
|
149
|
+
export declare function takeInvalidatedTargets(onlyHost?: string): {
|
|
150
|
+
path: string;
|
|
151
|
+
host: string;
|
|
152
|
+
}[];
|
|
153
|
+
/**
|
|
154
|
+
* Yol listesi. Vary öneki düşülür; host ayrımı `takeInvalidatedTargets`.
|
|
130
155
|
*
|
|
131
156
|
* @returns {string[]}
|
|
132
157
|
*/
|
|
@@ -152,10 +177,19 @@ export declare function getHtmlCacheEntries(): {
|
|
|
152
177
|
* Yol (query'siz) için taze bir HTML girdisi var mı? Ziyaret ısıtması yalnızca
|
|
153
178
|
* soğuk / bayat hedefleri kuyruğa alır; HIT'leri yeniden çekmez.
|
|
154
179
|
*
|
|
180
|
+
* Gerçek anahtar `h=host|/yol?` biçimindedir: düz `store.get(pathname)` hem
|
|
181
|
+
* vary önekini hem sondaki `?` işaretini kaçırır ve sıcak sayfayı yeniden
|
|
182
|
+
* ısıtır. `vary.host` açıkken yalnızca bu isteğin host'u sayılır; diğer
|
|
183
|
+
* locale'in kopyası bu yolu sıcak yapmaz.
|
|
184
|
+
*
|
|
155
185
|
* @param {string} pathname
|
|
186
|
+
* @param {{ headers?: Record<string, unknown>, get?: (name: string) => string | undefined }} [req]
|
|
156
187
|
* @returns {boolean}
|
|
157
188
|
*/
|
|
158
|
-
export declare function isHtmlCacheFresh(pathname: string
|
|
189
|
+
export declare function isHtmlCacheFresh(pathname: string, req?: {
|
|
190
|
+
headers?: Record<string, unknown>;
|
|
191
|
+
get?: (name: string) => string | undefined;
|
|
192
|
+
}): boolean;
|
|
159
193
|
/**
|
|
160
194
|
* Erken tazeleme penceresine girmiş (veya TTL'i dolmuş) trafiksiz girdileri
|
|
161
195
|
* soft-bayatlatır ve ısıtma kuyruğuna alır. HTTP ısıtması producer'sız
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {string} [brandName]
|
|
3
|
+
* @returns {string}
|
|
4
|
+
*/
|
|
5
|
+
export declare function frameworkRobotsNote(brandName?: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* `robots.txt`'e yazılacak `Disallow` yolları.
|
|
8
|
+
*
|
|
9
|
+
* Üç önek her zaman vardır. Panel, uzak görsel ve handoff yalnızca
|
|
10
|
+
* gerçekten mount edildiklerinde ve öneklerin dışına taşındıklarında eklenir.
|
|
11
|
+
* Dev araçlarının özel yolu yalnızca development'ta yazılır: production'da
|
|
12
|
+
* o yol uygulamanın kendi sayfası olabilir.
|
|
13
|
+
*
|
|
14
|
+
* @param {object} [config]
|
|
15
|
+
* @param {{ dev?: boolean }} [options]
|
|
16
|
+
* @returns {string[]}
|
|
17
|
+
*/
|
|
18
|
+
export declare function frameworkDisallowPaths(config?: object, options?: {
|
|
19
|
+
dev?: boolean;
|
|
20
|
+
}): string[];
|
|
21
|
+
/**
|
|
22
|
+
* @param {string} body
|
|
23
|
+
* @param {{ brandName?: string, paths: string[] }} options
|
|
24
|
+
* @returns {string}
|
|
25
|
+
*/
|
|
26
|
+
export declare function appendFrameworkRobots(body: string, options: {
|
|
27
|
+
brandName?: string;
|
|
28
|
+
paths: string[];
|
|
29
|
+
}): string;
|
|
30
|
+
/**
|
|
31
|
+
* @returns {import('express').RequestHandler}
|
|
32
|
+
*/
|
|
33
|
+
export declare function robotsTxtMiddleware(): import('express').RequestHandler;
|
|
@@ -65,15 +65,18 @@ export declare function notePrewarmError(status: number, error: unknown): void;
|
|
|
65
65
|
*/
|
|
66
66
|
export declare function selectPrewarmPaths(all: string[], limit: number, rotate?: boolean): string[];
|
|
67
67
|
/**
|
|
68
|
-
* @param {{ origin: string, quiet?: boolean, paths?: string[]
|
|
68
|
+
* @param {{ origin: string, quiet?: boolean, paths?: string[],
|
|
69
|
+
* forwardedHost?: string }} options
|
|
69
70
|
* `paths` verilirse hook çağrılmaz, yalnızca o yollar ısıtılır (dev
|
|
70
|
-
* panelindeki "tekrar dene" bunu kullanır).
|
|
71
|
+
* panelindeki "tekrar dene" bunu kullanır). `forwardedHost` loopback
|
|
72
|
+
* isteğine public host'u taşır; cache anahtarı `h=127.0.0.1` olmasın.
|
|
71
73
|
* @returns {Promise<{ ok: number, failed: number, total: number, elapsed: number }>}
|
|
72
74
|
*/
|
|
73
|
-
export declare function prewarm({ origin, quiet, paths: only }: {
|
|
75
|
+
export declare function prewarm({ origin, quiet, paths: only, forwardedHost }: {
|
|
74
76
|
origin: string;
|
|
75
77
|
quiet?: boolean;
|
|
76
78
|
paths?: string[];
|
|
79
|
+
forwardedHost?: string;
|
|
77
80
|
}): Promise<{
|
|
78
81
|
ok: number;
|
|
79
82
|
failed: number;
|