@tamagui/static-worker 2.0.0-rc.0 → 2.0.0-rc.0-1769998500160
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/cjs/index.cjs +73 -15
- package/dist/cjs/index.js +67 -13
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.js +67 -13
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.mjs +73 -15
- package/dist/esm/index.mjs.map +1 -1
- package/package.json +19 -21
- package/src/index.ts +157 -41
- package/types/index.d.ts +6 -6
- package/types/index.d.ts.map +1 -1
package/dist/cjs/index.cjs
CHANGED
|
@@ -53,7 +53,10 @@ const import_meta = {},
|
|
|
53
53
|
},
|
|
54
54
|
getWorkerPath = () => typeof import_meta < "u" && import_meta.url ? (0, import_node_url.fileURLToPath)(import_meta.resolve("@tamagui/static/worker")).replace(/\.mjs$/, ".js") : require.resolve("@tamagui/static/worker").replace(/\.mjs$/, ".js"),
|
|
55
55
|
POOL_KEY = "__tamagui_piscina_pool__",
|
|
56
|
-
CLOSING_KEY = "__tamagui_piscina_closing__"
|
|
56
|
+
CLOSING_KEY = "__tamagui_piscina_closing__",
|
|
57
|
+
TASK_COUNT_KEY = "__tamagui_piscina_task_count__",
|
|
58
|
+
RECYCLING_KEY = "__tamagui_piscina_recycling__",
|
|
59
|
+
MAX_TASKS_BEFORE_RECYCLE = 200;
|
|
57
60
|
function getSharedPool() {
|
|
58
61
|
return globalThis[POOL_KEY] ?? null;
|
|
59
62
|
}
|
|
@@ -66,9 +69,24 @@ function isClosing() {
|
|
|
66
69
|
function setClosing(value) {
|
|
67
70
|
globalThis[CLOSING_KEY] = value;
|
|
68
71
|
}
|
|
69
|
-
function
|
|
70
|
-
|
|
71
|
-
|
|
72
|
+
function isRecycling() {
|
|
73
|
+
return globalThis[RECYCLING_KEY] === !0;
|
|
74
|
+
}
|
|
75
|
+
function setRecycling(value) {
|
|
76
|
+
globalThis[RECYCLING_KEY] = value;
|
|
77
|
+
}
|
|
78
|
+
function getTaskCount() {
|
|
79
|
+
return globalThis[TASK_COUNT_KEY] ?? 0;
|
|
80
|
+
}
|
|
81
|
+
function incrementTaskCount() {
|
|
82
|
+
const count = getTaskCount() + 1;
|
|
83
|
+
return globalThis[TASK_COUNT_KEY] = count, count;
|
|
84
|
+
}
|
|
85
|
+
function resetTaskCount() {
|
|
86
|
+
globalThis[TASK_COUNT_KEY] = 0;
|
|
87
|
+
}
|
|
88
|
+
function createPool() {
|
|
89
|
+
const pool = new import_piscina.default({
|
|
72
90
|
filename: getWorkerPath(),
|
|
73
91
|
// Single worker for state consistency and simpler caching
|
|
74
92
|
minThreads: 1,
|
|
@@ -76,9 +94,16 @@ function getPool() {
|
|
|
76
94
|
// Never terminate due to idle - worker stays alive until close() or process exit
|
|
77
95
|
// This prevents "Terminating worker thread" errors from Piscina during idle
|
|
78
96
|
idleTimeout: Number.POSITIVE_INFINITY
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
})
|
|
97
|
+
// no resourceLimits - we rely on task-based recycling instead
|
|
98
|
+
// V8 resourceLimits cause "Terminating worker thread" messages when hit
|
|
99
|
+
});
|
|
100
|
+
return pool.on("error", err => {
|
|
101
|
+
isClosing() || isRecycling() || (err && typeof err == "object" && "message" in err ? String(err.message) : "").includes("Terminating worker thread") || console.error("[tamagui] Worker pool error:", err);
|
|
102
|
+
}), pool;
|
|
103
|
+
}
|
|
104
|
+
function getPool() {
|
|
105
|
+
let pool = getSharedPool();
|
|
106
|
+
return pool || (pool = createPool(), setSharedPool(pool)), pool;
|
|
82
107
|
}
|
|
83
108
|
async function loadTamagui(options) {
|
|
84
109
|
const pool = getPool(),
|
|
@@ -102,6 +127,45 @@ async function loadTamagui(options) {
|
|
|
102
127
|
throw console.error("[static-worker] Error loading Tamagui config:", error), error;
|
|
103
128
|
}
|
|
104
129
|
}
|
|
130
|
+
async function recyclePool(options) {
|
|
131
|
+
if (isClosing() || isRecycling()) return;
|
|
132
|
+
const oldPool = getSharedPool();
|
|
133
|
+
if (!oldPool) return;
|
|
134
|
+
setRecycling(!0);
|
|
135
|
+
const start = Date.now();
|
|
136
|
+
try {
|
|
137
|
+
const originalStderr = process.stderr.write.bind(process.stderr),
|
|
138
|
+
originalStdout = process.stdout.write.bind(process.stdout),
|
|
139
|
+
filter = (chunk, ...args) => !!(typeof chunk == "string" ? chunk : chunk?.toString?.() || "").includes("Terminating worker thread");
|
|
140
|
+
process.stderr.write = (chunk, ...args) => filter(chunk) ? !0 : originalStderr(chunk, ...args), process.stdout.write = (chunk, ...args) => filter(chunk) ? !0 : originalStdout(chunk, ...args);
|
|
141
|
+
const newPool = createPool();
|
|
142
|
+
setSharedPool(newPool);
|
|
143
|
+
const warmupTask = {
|
|
144
|
+
type: "extractToClassNames",
|
|
145
|
+
source: "// warmup",
|
|
146
|
+
sourcePath: "__warmup__.tsx",
|
|
147
|
+
options: {
|
|
148
|
+
...options,
|
|
149
|
+
// skip the "built config" log on warmup since it's a recycle
|
|
150
|
+
_skipBuildLog: !0
|
|
151
|
+
},
|
|
152
|
+
shouldPrintDebug: !1
|
|
153
|
+
};
|
|
154
|
+
await newPool.run(warmupTask, {
|
|
155
|
+
name: "runTask"
|
|
156
|
+
}), oldPool.removeAllListeners(), oldPool.destroy().catch(() => {}), setTimeout(() => {
|
|
157
|
+
process.stderr.write = originalStderr, process.stdout.write = originalStdout;
|
|
158
|
+
}), console.log(` \u267B\uFE0F [tamagui] recycled worker pool (${Date.now() - start}ms)`);
|
|
159
|
+
} finally {
|
|
160
|
+
setRecycling(!1);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
async function loadTamaguiBuildConfig(tamaguiOptions) {
|
|
164
|
+
const {
|
|
165
|
+
default: Static
|
|
166
|
+
} = await import("@tamagui/static");
|
|
167
|
+
return Static.loadTamaguiBuildConfigAsync(tamaguiOptions);
|
|
168
|
+
}
|
|
105
169
|
async function extractToClassNames(params) {
|
|
106
170
|
const {
|
|
107
171
|
source,
|
|
@@ -126,7 +190,7 @@ ${result.stack}` : ""].filter(Boolean).join(`
|
|
|
126
190
|
`);
|
|
127
191
|
throw new Error(errorMessage);
|
|
128
192
|
}
|
|
129
|
-
return result.data;
|
|
193
|
+
return incrementTaskCount() >= MAX_TASKS_BEFORE_RECYCLE && (resetTaskCount(), recyclePool(options).catch(() => {})), result.data;
|
|
130
194
|
}
|
|
131
195
|
async function extractToNative(sourceFileName, sourceCode, options) {
|
|
132
196
|
const task = {
|
|
@@ -144,7 +208,7 @@ ${result.stack}` : ""].filter(Boolean).join(`
|
|
|
144
208
|
`);
|
|
145
209
|
throw new Error(errorMessage);
|
|
146
210
|
}
|
|
147
|
-
return result.data;
|
|
211
|
+
return incrementTaskCount() >= MAX_TASKS_BEFORE_RECYCLE && (resetTaskCount(), recyclePool(options).catch(() => {})), result.data;
|
|
148
212
|
}
|
|
149
213
|
async function watchTamaguiConfig(options) {
|
|
150
214
|
const {
|
|
@@ -159,12 +223,6 @@ async function watchTamaguiConfig(options) {
|
|
|
159
223
|
}
|
|
160
224
|
};
|
|
161
225
|
}
|
|
162
|
-
async function loadTamaguiBuildConfig(tamaguiOptions) {
|
|
163
|
-
const {
|
|
164
|
-
default: Static
|
|
165
|
-
} = await import("@tamagui/static");
|
|
166
|
-
return Static.loadTamaguiBuildConfigSync(tamaguiOptions);
|
|
167
|
-
}
|
|
168
226
|
async function clearWorkerCache() {
|
|
169
227
|
const pool = getSharedPool();
|
|
170
228
|
if (!pool || isClosing()) return;
|
package/dist/cjs/index.js
CHANGED
|
@@ -37,7 +37,7 @@ var import_node_url = require("node:url"), import_piscina = __toESM(require("pis
|
|
|
37
37
|
const import_meta = {}, getPragmaOptions = async (props) => {
|
|
38
38
|
const { default: Static } = await import("@tamagui/static");
|
|
39
39
|
return Static.getPragmaOptions(props);
|
|
40
|
-
}, getWorkerPath = () => typeof import_meta < "u" && import_meta.url ? (0, import_node_url.fileURLToPath)(import_meta.resolve("@tamagui/static/worker")).replace(/\.mjs$/, ".js") : require.resolve("@tamagui/static/worker").replace(/\.mjs$/, ".js"), POOL_KEY = "__tamagui_piscina_pool__", CLOSING_KEY = "__tamagui_piscina_closing__";
|
|
40
|
+
}, getWorkerPath = () => typeof import_meta < "u" && import_meta.url ? (0, import_node_url.fileURLToPath)(import_meta.resolve("@tamagui/static/worker")).replace(/\.mjs$/, ".js") : require.resolve("@tamagui/static/worker").replace(/\.mjs$/, ".js"), POOL_KEY = "__tamagui_piscina_pool__", CLOSING_KEY = "__tamagui_piscina_closing__", TASK_COUNT_KEY = "__tamagui_piscina_task_count__", RECYCLING_KEY = "__tamagui_piscina_recycling__", MAX_TASKS_BEFORE_RECYCLE = 200;
|
|
41
41
|
function getSharedPool() {
|
|
42
42
|
return globalThis[POOL_KEY] ?? null;
|
|
43
43
|
}
|
|
@@ -50,9 +50,24 @@ function isClosing() {
|
|
|
50
50
|
function setClosing(value) {
|
|
51
51
|
globalThis[CLOSING_KEY] = value;
|
|
52
52
|
}
|
|
53
|
-
function
|
|
54
|
-
|
|
55
|
-
|
|
53
|
+
function isRecycling() {
|
|
54
|
+
return globalThis[RECYCLING_KEY] === !0;
|
|
55
|
+
}
|
|
56
|
+
function setRecycling(value) {
|
|
57
|
+
globalThis[RECYCLING_KEY] = value;
|
|
58
|
+
}
|
|
59
|
+
function getTaskCount() {
|
|
60
|
+
return globalThis[TASK_COUNT_KEY] ?? 0;
|
|
61
|
+
}
|
|
62
|
+
function incrementTaskCount() {
|
|
63
|
+
const count = getTaskCount() + 1;
|
|
64
|
+
return globalThis[TASK_COUNT_KEY] = count, count;
|
|
65
|
+
}
|
|
66
|
+
function resetTaskCount() {
|
|
67
|
+
globalThis[TASK_COUNT_KEY] = 0;
|
|
68
|
+
}
|
|
69
|
+
function createPool() {
|
|
70
|
+
const pool = new import_piscina.default({
|
|
56
71
|
filename: getWorkerPath(),
|
|
57
72
|
// Single worker for state consistency and simpler caching
|
|
58
73
|
minThreads: 1,
|
|
@@ -60,9 +75,16 @@ function getPool() {
|
|
|
60
75
|
// Never terminate due to idle - worker stays alive until close() or process exit
|
|
61
76
|
// This prevents "Terminating worker thread" errors from Piscina during idle
|
|
62
77
|
idleTimeout: Number.POSITIVE_INFINITY
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
})
|
|
78
|
+
// no resourceLimits - we rely on task-based recycling instead
|
|
79
|
+
// V8 resourceLimits cause "Terminating worker thread" messages when hit
|
|
80
|
+
});
|
|
81
|
+
return pool.on("error", (err) => {
|
|
82
|
+
isClosing() || isRecycling() || (err && typeof err == "object" && "message" in err ? String(err.message) : "").includes("Terminating worker thread") || console.error("[tamagui] Worker pool error:", err);
|
|
83
|
+
}), pool;
|
|
84
|
+
}
|
|
85
|
+
function getPool() {
|
|
86
|
+
let pool = getSharedPool();
|
|
87
|
+
return pool || (pool = createPool(), setSharedPool(pool)), pool;
|
|
66
88
|
}
|
|
67
89
|
async function loadTamagui(options) {
|
|
68
90
|
const pool = getPool(), task = {
|
|
@@ -81,6 +103,40 @@ async function loadTamagui(options) {
|
|
|
81
103
|
throw console.error("[static-worker] Error loading Tamagui config:", error), error;
|
|
82
104
|
}
|
|
83
105
|
}
|
|
106
|
+
async function recyclePool(options) {
|
|
107
|
+
if (isClosing() || isRecycling()) return;
|
|
108
|
+
const oldPool = getSharedPool();
|
|
109
|
+
if (!oldPool) return;
|
|
110
|
+
setRecycling(!0);
|
|
111
|
+
const start = Date.now();
|
|
112
|
+
try {
|
|
113
|
+
const originalStderr = process.stderr.write.bind(process.stderr), originalStdout = process.stdout.write.bind(process.stdout), filter = (chunk, ...args) => !!(typeof chunk == "string" ? chunk : chunk?.toString?.() || "").includes("Terminating worker thread");
|
|
114
|
+
process.stderr.write = ((chunk, ...args) => filter(chunk) ? !0 : originalStderr(chunk, ...args)), process.stdout.write = ((chunk, ...args) => filter(chunk) ? !0 : originalStdout(chunk, ...args));
|
|
115
|
+
const newPool = createPool();
|
|
116
|
+
setSharedPool(newPool);
|
|
117
|
+
const warmupTask = {
|
|
118
|
+
type: "extractToClassNames",
|
|
119
|
+
source: "// warmup",
|
|
120
|
+
sourcePath: "__warmup__.tsx",
|
|
121
|
+
options: {
|
|
122
|
+
...options,
|
|
123
|
+
// skip the "built config" log on warmup since it's a recycle
|
|
124
|
+
_skipBuildLog: !0
|
|
125
|
+
},
|
|
126
|
+
shouldPrintDebug: !1
|
|
127
|
+
};
|
|
128
|
+
await newPool.run(warmupTask, { name: "runTask" }), oldPool.removeAllListeners(), oldPool.destroy().catch(() => {
|
|
129
|
+
}), setTimeout(() => {
|
|
130
|
+
process.stderr.write = originalStderr, process.stdout.write = originalStdout;
|
|
131
|
+
}), console.log(` \u267B\uFE0F [tamagui] recycled worker pool (${Date.now() - start}ms)`);
|
|
132
|
+
} finally {
|
|
133
|
+
setRecycling(!1);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async function loadTamaguiBuildConfig(tamaguiOptions) {
|
|
137
|
+
const { default: Static } = await import("@tamagui/static");
|
|
138
|
+
return Static.loadTamaguiBuildConfigAsync(tamaguiOptions);
|
|
139
|
+
}
|
|
84
140
|
async function extractToClassNames(params) {
|
|
85
141
|
const { source, sourcePath = "", options, shouldPrintDebug = !1 } = params;
|
|
86
142
|
if (typeof source != "string")
|
|
@@ -103,7 +159,8 @@ ${result.stack}` : ""
|
|
|
103
159
|
`);
|
|
104
160
|
throw new Error(errorMessage);
|
|
105
161
|
}
|
|
106
|
-
return
|
|
162
|
+
return incrementTaskCount() >= MAX_TASKS_BEFORE_RECYCLE && (resetTaskCount(), recyclePool(options).catch(() => {
|
|
163
|
+
})), result.data;
|
|
107
164
|
}
|
|
108
165
|
async function extractToNative(sourceFileName, sourceCode, options) {
|
|
109
166
|
const task = {
|
|
@@ -123,7 +180,8 @@ ${result.stack}` : ""
|
|
|
123
180
|
`);
|
|
124
181
|
throw new Error(errorMessage);
|
|
125
182
|
}
|
|
126
|
-
return
|
|
183
|
+
return incrementTaskCount() >= MAX_TASKS_BEFORE_RECYCLE && (resetTaskCount(), recyclePool(options).catch(() => {
|
|
184
|
+
})), result.data;
|
|
127
185
|
}
|
|
128
186
|
async function watchTamaguiConfig(options) {
|
|
129
187
|
const { default: Static } = await import("@tamagui/static"), watcher = await Static.watchTamaguiConfig(options);
|
|
@@ -136,10 +194,6 @@ async function watchTamaguiConfig(options) {
|
|
|
136
194
|
}
|
|
137
195
|
};
|
|
138
196
|
}
|
|
139
|
-
async function loadTamaguiBuildConfig(tamaguiOptions) {
|
|
140
|
-
const { default: Static } = await import("@tamagui/static");
|
|
141
|
-
return Static.loadTamaguiBuildConfigSync(tamaguiOptions);
|
|
142
|
-
}
|
|
143
197
|
async function clearWorkerCache() {
|
|
144
198
|
const pool = getSharedPool();
|
|
145
199
|
if (!pool || isClosing()) return;
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYA,sBAA8B,qBAC9B,iBAAoB;AAbpB,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["Piscina"]
|
|
6
6
|
}
|
package/dist/esm/index.js
CHANGED
|
@@ -3,7 +3,7 @@ import Piscina from "piscina";
|
|
|
3
3
|
const getPragmaOptions = async (props) => {
|
|
4
4
|
const { default: Static } = await import("@tamagui/static");
|
|
5
5
|
return Static.getPragmaOptions(props);
|
|
6
|
-
}, getWorkerPath = () => typeof import.meta < "u" && import.meta.url ? fileURLToPath(import.meta.resolve("@tamagui/static/worker")).replace(/\.mjs$/, ".js") : require.resolve("@tamagui/static/worker").replace(/\.mjs$/, ".js"), POOL_KEY = "__tamagui_piscina_pool__", CLOSING_KEY = "__tamagui_piscina_closing__";
|
|
6
|
+
}, getWorkerPath = () => typeof import.meta < "u" && import.meta.url ? fileURLToPath(import.meta.resolve("@tamagui/static/worker")).replace(/\.mjs$/, ".js") : require.resolve("@tamagui/static/worker").replace(/\.mjs$/, ".js"), POOL_KEY = "__tamagui_piscina_pool__", CLOSING_KEY = "__tamagui_piscina_closing__", TASK_COUNT_KEY = "__tamagui_piscina_task_count__", RECYCLING_KEY = "__tamagui_piscina_recycling__", MAX_TASKS_BEFORE_RECYCLE = 200;
|
|
7
7
|
function getSharedPool() {
|
|
8
8
|
return globalThis[POOL_KEY] ?? null;
|
|
9
9
|
}
|
|
@@ -16,9 +16,24 @@ function isClosing() {
|
|
|
16
16
|
function setClosing(value) {
|
|
17
17
|
globalThis[CLOSING_KEY] = value;
|
|
18
18
|
}
|
|
19
|
-
function
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
function isRecycling() {
|
|
20
|
+
return globalThis[RECYCLING_KEY] === !0;
|
|
21
|
+
}
|
|
22
|
+
function setRecycling(value) {
|
|
23
|
+
globalThis[RECYCLING_KEY] = value;
|
|
24
|
+
}
|
|
25
|
+
function getTaskCount() {
|
|
26
|
+
return globalThis[TASK_COUNT_KEY] ?? 0;
|
|
27
|
+
}
|
|
28
|
+
function incrementTaskCount() {
|
|
29
|
+
const count = getTaskCount() + 1;
|
|
30
|
+
return globalThis[TASK_COUNT_KEY] = count, count;
|
|
31
|
+
}
|
|
32
|
+
function resetTaskCount() {
|
|
33
|
+
globalThis[TASK_COUNT_KEY] = 0;
|
|
34
|
+
}
|
|
35
|
+
function createPool() {
|
|
36
|
+
const pool = new Piscina({
|
|
22
37
|
filename: getWorkerPath(),
|
|
23
38
|
// Single worker for state consistency and simpler caching
|
|
24
39
|
minThreads: 1,
|
|
@@ -26,9 +41,16 @@ function getPool() {
|
|
|
26
41
|
// Never terminate due to idle - worker stays alive until close() or process exit
|
|
27
42
|
// This prevents "Terminating worker thread" errors from Piscina during idle
|
|
28
43
|
idleTimeout: Number.POSITIVE_INFINITY
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
})
|
|
44
|
+
// no resourceLimits - we rely on task-based recycling instead
|
|
45
|
+
// V8 resourceLimits cause "Terminating worker thread" messages when hit
|
|
46
|
+
});
|
|
47
|
+
return pool.on("error", (err) => {
|
|
48
|
+
isClosing() || isRecycling() || (err && typeof err == "object" && "message" in err ? String(err.message) : "").includes("Terminating worker thread") || console.error("[tamagui] Worker pool error:", err);
|
|
49
|
+
}), pool;
|
|
50
|
+
}
|
|
51
|
+
function getPool() {
|
|
52
|
+
let pool = getSharedPool();
|
|
53
|
+
return pool || (pool = createPool(), setSharedPool(pool)), pool;
|
|
32
54
|
}
|
|
33
55
|
async function loadTamagui(options) {
|
|
34
56
|
const pool = getPool(), task = {
|
|
@@ -47,6 +69,40 @@ async function loadTamagui(options) {
|
|
|
47
69
|
throw console.error("[static-worker] Error loading Tamagui config:", error), error;
|
|
48
70
|
}
|
|
49
71
|
}
|
|
72
|
+
async function recyclePool(options) {
|
|
73
|
+
if (isClosing() || isRecycling()) return;
|
|
74
|
+
const oldPool = getSharedPool();
|
|
75
|
+
if (!oldPool) return;
|
|
76
|
+
setRecycling(!0);
|
|
77
|
+
const start = Date.now();
|
|
78
|
+
try {
|
|
79
|
+
const originalStderr = process.stderr.write.bind(process.stderr), originalStdout = process.stdout.write.bind(process.stdout), filter = (chunk, ...args) => !!(typeof chunk == "string" ? chunk : chunk?.toString?.() || "").includes("Terminating worker thread");
|
|
80
|
+
process.stderr.write = ((chunk, ...args) => filter(chunk) ? !0 : originalStderr(chunk, ...args)), process.stdout.write = ((chunk, ...args) => filter(chunk) ? !0 : originalStdout(chunk, ...args));
|
|
81
|
+
const newPool = createPool();
|
|
82
|
+
setSharedPool(newPool);
|
|
83
|
+
const warmupTask = {
|
|
84
|
+
type: "extractToClassNames",
|
|
85
|
+
source: "// warmup",
|
|
86
|
+
sourcePath: "__warmup__.tsx",
|
|
87
|
+
options: {
|
|
88
|
+
...options,
|
|
89
|
+
// skip the "built config" log on warmup since it's a recycle
|
|
90
|
+
_skipBuildLog: !0
|
|
91
|
+
},
|
|
92
|
+
shouldPrintDebug: !1
|
|
93
|
+
};
|
|
94
|
+
await newPool.run(warmupTask, { name: "runTask" }), oldPool.removeAllListeners(), oldPool.destroy().catch(() => {
|
|
95
|
+
}), setTimeout(() => {
|
|
96
|
+
process.stderr.write = originalStderr, process.stdout.write = originalStdout;
|
|
97
|
+
}), console.log(` \u267B\uFE0F [tamagui] recycled worker pool (${Date.now() - start}ms)`);
|
|
98
|
+
} finally {
|
|
99
|
+
setRecycling(!1);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
async function loadTamaguiBuildConfig(tamaguiOptions) {
|
|
103
|
+
const { default: Static } = await import("@tamagui/static");
|
|
104
|
+
return Static.loadTamaguiBuildConfigAsync(tamaguiOptions);
|
|
105
|
+
}
|
|
50
106
|
async function extractToClassNames(params) {
|
|
51
107
|
const { source, sourcePath = "", options, shouldPrintDebug = !1 } = params;
|
|
52
108
|
if (typeof source != "string")
|
|
@@ -69,7 +125,8 @@ ${result.stack}` : ""
|
|
|
69
125
|
`);
|
|
70
126
|
throw new Error(errorMessage);
|
|
71
127
|
}
|
|
72
|
-
return
|
|
128
|
+
return incrementTaskCount() >= MAX_TASKS_BEFORE_RECYCLE && (resetTaskCount(), recyclePool(options).catch(() => {
|
|
129
|
+
})), result.data;
|
|
73
130
|
}
|
|
74
131
|
async function extractToNative(sourceFileName, sourceCode, options) {
|
|
75
132
|
const task = {
|
|
@@ -89,7 +146,8 @@ ${result.stack}` : ""
|
|
|
89
146
|
`);
|
|
90
147
|
throw new Error(errorMessage);
|
|
91
148
|
}
|
|
92
|
-
return
|
|
149
|
+
return incrementTaskCount() >= MAX_TASKS_BEFORE_RECYCLE && (resetTaskCount(), recyclePool(options).catch(() => {
|
|
150
|
+
})), result.data;
|
|
93
151
|
}
|
|
94
152
|
async function watchTamaguiConfig(options) {
|
|
95
153
|
const { default: Static } = await import("@tamagui/static"), watcher = await Static.watchTamaguiConfig(options);
|
|
@@ -102,10 +160,6 @@ async function watchTamaguiConfig(options) {
|
|
|
102
160
|
}
|
|
103
161
|
};
|
|
104
162
|
}
|
|
105
|
-
async function loadTamaguiBuildConfig(tamaguiOptions) {
|
|
106
|
-
const { default: Static } = await import("@tamagui/static");
|
|
107
|
-
return Static.loadTamaguiBuildConfigSync(tamaguiOptions);
|
|
108
|
-
}
|
|
109
163
|
async function clearWorkerCache() {
|
|
110
164
|
const pool = getSharedPool();
|
|
111
165
|
if (!pool || isClosing()) return;
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.ts"],
|
|
4
|
-
"mappings": "AAYA,SAAS,qBAAqB;AAC9B,OAAO,aAAa;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -8,7 +8,10 @@ const getPragmaOptions = async props => {
|
|
|
8
8
|
},
|
|
9
9
|
getWorkerPath = () => typeof import.meta < "u" && import.meta.url ? fileURLToPath(import.meta.resolve("@tamagui/static/worker")).replace(/\.mjs$/, ".js") : require.resolve("@tamagui/static/worker").replace(/\.mjs$/, ".js"),
|
|
10
10
|
POOL_KEY = "__tamagui_piscina_pool__",
|
|
11
|
-
CLOSING_KEY = "__tamagui_piscina_closing__"
|
|
11
|
+
CLOSING_KEY = "__tamagui_piscina_closing__",
|
|
12
|
+
TASK_COUNT_KEY = "__tamagui_piscina_task_count__",
|
|
13
|
+
RECYCLING_KEY = "__tamagui_piscina_recycling__",
|
|
14
|
+
MAX_TASKS_BEFORE_RECYCLE = 200;
|
|
12
15
|
function getSharedPool() {
|
|
13
16
|
return globalThis[POOL_KEY] ?? null;
|
|
14
17
|
}
|
|
@@ -21,9 +24,24 @@ function isClosing() {
|
|
|
21
24
|
function setClosing(value) {
|
|
22
25
|
globalThis[CLOSING_KEY] = value;
|
|
23
26
|
}
|
|
24
|
-
function
|
|
25
|
-
|
|
26
|
-
|
|
27
|
+
function isRecycling() {
|
|
28
|
+
return globalThis[RECYCLING_KEY] === !0;
|
|
29
|
+
}
|
|
30
|
+
function setRecycling(value) {
|
|
31
|
+
globalThis[RECYCLING_KEY] = value;
|
|
32
|
+
}
|
|
33
|
+
function getTaskCount() {
|
|
34
|
+
return globalThis[TASK_COUNT_KEY] ?? 0;
|
|
35
|
+
}
|
|
36
|
+
function incrementTaskCount() {
|
|
37
|
+
const count = getTaskCount() + 1;
|
|
38
|
+
return globalThis[TASK_COUNT_KEY] = count, count;
|
|
39
|
+
}
|
|
40
|
+
function resetTaskCount() {
|
|
41
|
+
globalThis[TASK_COUNT_KEY] = 0;
|
|
42
|
+
}
|
|
43
|
+
function createPool() {
|
|
44
|
+
const pool = new Piscina({
|
|
27
45
|
filename: getWorkerPath(),
|
|
28
46
|
// Single worker for state consistency and simpler caching
|
|
29
47
|
minThreads: 1,
|
|
@@ -31,9 +49,16 @@ function getPool() {
|
|
|
31
49
|
// Never terminate due to idle - worker stays alive until close() or process exit
|
|
32
50
|
// This prevents "Terminating worker thread" errors from Piscina during idle
|
|
33
51
|
idleTimeout: Number.POSITIVE_INFINITY
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
})
|
|
52
|
+
// no resourceLimits - we rely on task-based recycling instead
|
|
53
|
+
// V8 resourceLimits cause "Terminating worker thread" messages when hit
|
|
54
|
+
});
|
|
55
|
+
return pool.on("error", err => {
|
|
56
|
+
isClosing() || isRecycling() || (err && typeof err == "object" && "message" in err ? String(err.message) : "").includes("Terminating worker thread") || console.error("[tamagui] Worker pool error:", err);
|
|
57
|
+
}), pool;
|
|
58
|
+
}
|
|
59
|
+
function getPool() {
|
|
60
|
+
let pool = getSharedPool();
|
|
61
|
+
return pool || (pool = createPool(), setSharedPool(pool)), pool;
|
|
37
62
|
}
|
|
38
63
|
async function loadTamagui(options) {
|
|
39
64
|
const pool = getPool(),
|
|
@@ -57,6 +82,45 @@ async function loadTamagui(options) {
|
|
|
57
82
|
throw console.error("[static-worker] Error loading Tamagui config:", error), error;
|
|
58
83
|
}
|
|
59
84
|
}
|
|
85
|
+
async function recyclePool(options) {
|
|
86
|
+
if (isClosing() || isRecycling()) return;
|
|
87
|
+
const oldPool = getSharedPool();
|
|
88
|
+
if (!oldPool) return;
|
|
89
|
+
setRecycling(!0);
|
|
90
|
+
const start = Date.now();
|
|
91
|
+
try {
|
|
92
|
+
const originalStderr = process.stderr.write.bind(process.stderr),
|
|
93
|
+
originalStdout = process.stdout.write.bind(process.stdout),
|
|
94
|
+
filter = (chunk, ...args) => !!(typeof chunk == "string" ? chunk : chunk?.toString?.() || "").includes("Terminating worker thread");
|
|
95
|
+
process.stderr.write = (chunk, ...args) => filter(chunk) ? !0 : originalStderr(chunk, ...args), process.stdout.write = (chunk, ...args) => filter(chunk) ? !0 : originalStdout(chunk, ...args);
|
|
96
|
+
const newPool = createPool();
|
|
97
|
+
setSharedPool(newPool);
|
|
98
|
+
const warmupTask = {
|
|
99
|
+
type: "extractToClassNames",
|
|
100
|
+
source: "// warmup",
|
|
101
|
+
sourcePath: "__warmup__.tsx",
|
|
102
|
+
options: {
|
|
103
|
+
...options,
|
|
104
|
+
// skip the "built config" log on warmup since it's a recycle
|
|
105
|
+
_skipBuildLog: !0
|
|
106
|
+
},
|
|
107
|
+
shouldPrintDebug: !1
|
|
108
|
+
};
|
|
109
|
+
await newPool.run(warmupTask, {
|
|
110
|
+
name: "runTask"
|
|
111
|
+
}), oldPool.removeAllListeners(), oldPool.destroy().catch(() => {}), setTimeout(() => {
|
|
112
|
+
process.stderr.write = originalStderr, process.stdout.write = originalStdout;
|
|
113
|
+
}), console.log(` \u267B\uFE0F [tamagui] recycled worker pool (${Date.now() - start}ms)`);
|
|
114
|
+
} finally {
|
|
115
|
+
setRecycling(!1);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
async function loadTamaguiBuildConfig(tamaguiOptions) {
|
|
119
|
+
const {
|
|
120
|
+
default: Static
|
|
121
|
+
} = await import("@tamagui/static");
|
|
122
|
+
return Static.loadTamaguiBuildConfigAsync(tamaguiOptions);
|
|
123
|
+
}
|
|
60
124
|
async function extractToClassNames(params) {
|
|
61
125
|
const {
|
|
62
126
|
source,
|
|
@@ -81,7 +145,7 @@ ${result.stack}` : ""].filter(Boolean).join(`
|
|
|
81
145
|
`);
|
|
82
146
|
throw new Error(errorMessage);
|
|
83
147
|
}
|
|
84
|
-
return result.data;
|
|
148
|
+
return incrementTaskCount() >= MAX_TASKS_BEFORE_RECYCLE && (resetTaskCount(), recyclePool(options).catch(() => {})), result.data;
|
|
85
149
|
}
|
|
86
150
|
async function extractToNative(sourceFileName, sourceCode, options) {
|
|
87
151
|
const task = {
|
|
@@ -99,7 +163,7 @@ ${result.stack}` : ""].filter(Boolean).join(`
|
|
|
99
163
|
`);
|
|
100
164
|
throw new Error(errorMessage);
|
|
101
165
|
}
|
|
102
|
-
return result.data;
|
|
166
|
+
return incrementTaskCount() >= MAX_TASKS_BEFORE_RECYCLE && (resetTaskCount(), recyclePool(options).catch(() => {})), result.data;
|
|
103
167
|
}
|
|
104
168
|
async function watchTamaguiConfig(options) {
|
|
105
169
|
const {
|
|
@@ -114,12 +178,6 @@ async function watchTamaguiConfig(options) {
|
|
|
114
178
|
}
|
|
115
179
|
};
|
|
116
180
|
}
|
|
117
|
-
async function loadTamaguiBuildConfig(tamaguiOptions) {
|
|
118
|
-
const {
|
|
119
|
-
default: Static
|
|
120
|
-
} = await import("@tamagui/static");
|
|
121
|
-
return Static.loadTamaguiBuildConfigSync(tamaguiOptions);
|
|
122
|
-
}
|
|
123
181
|
async function clearWorkerCache() {
|
|
124
182
|
const pool = getSharedPool();
|
|
125
183
|
if (!pool || isClosing()) return;
|
package/dist/esm/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["fileURLToPath","Piscina","getPragmaOptions","props","default","Static","getWorkerPath","import","meta","url","resolve","replace","require","POOL_KEY","CLOSING_KEY","getSharedPool","globalThis","setSharedPool","pool","isClosing","setClosing","value","
|
|
1
|
+
{"version":3,"names":["fileURLToPath","Piscina","getPragmaOptions","props","default","Static","getWorkerPath","import","meta","url","resolve","replace","require","POOL_KEY","CLOSING_KEY","TASK_COUNT_KEY","RECYCLING_KEY","MAX_TASKS_BEFORE_RECYCLE","getSharedPool","globalThis","setSharedPool","pool","isClosing","setClosing","value","isRecycling","setRecycling","getTaskCount","incrementTaskCount","count","resetTaskCount","createPool","filename","minThreads","maxThreads","idleTimeout","Number","POSITIVE_INFINITY","on","err","String","message","includes","console","error","getPool","loadTamagui","options","task","type","source","sourcePath","components","shouldPrintDebug","run","name","success","recyclePool","oldPool","start","Date","now","originalStderr","process","stderr","write","bind","originalStdout","stdout","filter","chunk","args","toString","newPool","warmupTask","_skipBuildLog","removeAllListeners","destroy","catch","setTimeout","log","loadTamaguiBuildConfig","tamaguiOptions","loadTamaguiBuildConfigAsync","extractToClassNames","params","Error","result","errorMessage","stack","Boolean","join","data","extractToNative","sourceFileName","sourceCode","watchTamaguiConfig","watcher","originalDispose","dispose","clearWorkerCache","destroyPool","close","getPoolStats","threads","length","queueSize","completed","duration","utilization"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,26 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tamagui/static-worker",
|
|
3
|
-
"version": "2.0.0-rc.0",
|
|
3
|
+
"version": "2.0.0-rc.0-1769998500160",
|
|
4
|
+
"license": "MIT",
|
|
4
5
|
"source": "src/index.ts",
|
|
5
|
-
"types": "./types/index.d.ts",
|
|
6
|
-
"type": "module",
|
|
7
|
-
"main": "dist/cjs",
|
|
8
|
-
"module": "dist/esm",
|
|
9
6
|
"files": [
|
|
10
7
|
"src",
|
|
11
8
|
"types",
|
|
12
9
|
"dist"
|
|
13
10
|
],
|
|
14
|
-
"
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
"clean:build": "tamagui-build clean:build",
|
|
19
|
-
"lint": "biome check src",
|
|
20
|
-
"lint:fix": "biome check --write src",
|
|
21
|
-
"test": "vitest run",
|
|
22
|
-
"test:watch": "vitest"
|
|
23
|
-
},
|
|
11
|
+
"type": "module",
|
|
12
|
+
"main": "dist/cjs",
|
|
13
|
+
"module": "dist/esm",
|
|
14
|
+
"types": "./types/index.d.ts",
|
|
24
15
|
"exports": {
|
|
25
16
|
"./package.json": "./package.json",
|
|
26
17
|
".": {
|
|
@@ -33,14 +24,21 @@
|
|
|
33
24
|
"publishConfig": {
|
|
34
25
|
"access": "public"
|
|
35
26
|
},
|
|
36
|
-
"
|
|
27
|
+
"scripts": {
|
|
28
|
+
"build": "tamagui-build --skip-native",
|
|
29
|
+
"watch": "tamagui-build --skip-native --watch",
|
|
30
|
+
"clean": "tamagui-build clean",
|
|
31
|
+
"clean:build": "tamagui-build clean:build",
|
|
32
|
+
"test": "vitest run",
|
|
33
|
+
"test:watch": "vitest"
|
|
34
|
+
},
|
|
37
35
|
"dependencies": {
|
|
38
|
-
"@tamagui/static": "2.0.0-rc.0",
|
|
39
|
-
"@tamagui/types": "2.0.0-rc.0",
|
|
36
|
+
"@tamagui/static": "2.0.0-rc.0-1769998500160",
|
|
37
|
+
"@tamagui/types": "2.0.0-rc.0-1769998500160",
|
|
40
38
|
"piscina": "^4.7.0"
|
|
41
39
|
},
|
|
42
40
|
"devDependencies": {
|
|
43
|
-
"@tamagui/build": "2.0.0-rc.0",
|
|
44
|
-
"vitest": "
|
|
41
|
+
"@tamagui/build": "2.0.0-rc.0-1769998500160",
|
|
42
|
+
"vitest": "4.0.4"
|
|
45
43
|
}
|
|
46
|
-
}
|
|
44
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -13,16 +13,10 @@ import { dirname, resolve } from 'node:path'
|
|
|
13
13
|
import { fileURLToPath } from 'node:url'
|
|
14
14
|
import Piscina from 'piscina'
|
|
15
15
|
|
|
16
|
-
export type {
|
|
17
|
-
ExtractedResponse,
|
|
18
|
-
TamaguiProjectInfo,
|
|
19
|
-
} from '@tamagui/static'
|
|
16
|
+
export type { ExtractedResponse, TamaguiProjectInfo } from '@tamagui/static'
|
|
20
17
|
export type { TamaguiOptions } from '@tamagui/types'
|
|
21
18
|
|
|
22
|
-
export const getPragmaOptions = async (props: {
|
|
23
|
-
source: string
|
|
24
|
-
path: string
|
|
25
|
-
}) => {
|
|
19
|
+
export const getPragmaOptions = async (props: { source: string; path: string }) => {
|
|
26
20
|
const { default: Static } = await import('@tamagui/static')
|
|
27
21
|
return Static.getPragmaOptions(props)
|
|
28
22
|
}
|
|
@@ -44,6 +38,13 @@ const getWorkerPath = () => {
|
|
|
44
38
|
// Use globalThis to share pool across module instances (Vite environments)
|
|
45
39
|
const POOL_KEY = '__tamagui_piscina_pool__'
|
|
46
40
|
const CLOSING_KEY = '__tamagui_piscina_closing__'
|
|
41
|
+
const TASK_COUNT_KEY = '__tamagui_piscina_task_count__'
|
|
42
|
+
const RECYCLING_KEY = '__tamagui_piscina_recycling__'
|
|
43
|
+
|
|
44
|
+
// recycle worker after this many tasks to prevent RSS bloat from V8 memory fragmentation
|
|
45
|
+
// Node.js worker threads don't release memory properly - see https://github.com/nodejs/node/issues/51868
|
|
46
|
+
// Lower threshold to recycle before hitting V8 memory limits
|
|
47
|
+
const MAX_TASKS_BEFORE_RECYCLE = 200
|
|
47
48
|
|
|
48
49
|
function getSharedPool(): Piscina | null {
|
|
49
50
|
return (globalThis as any)[POOL_KEY] ?? null
|
|
@@ -61,32 +62,64 @@ function setClosing(value: boolean) {
|
|
|
61
62
|
;(globalThis as any)[CLOSING_KEY] = value
|
|
62
63
|
}
|
|
63
64
|
|
|
65
|
+
function isRecycling(): boolean {
|
|
66
|
+
return (globalThis as any)[RECYCLING_KEY] === true
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function setRecycling(value: boolean) {
|
|
70
|
+
;(globalThis as any)[RECYCLING_KEY] = value
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function getTaskCount(): number {
|
|
74
|
+
return (globalThis as any)[TASK_COUNT_KEY] ?? 0
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function incrementTaskCount(): number {
|
|
78
|
+
const count = getTaskCount() + 1
|
|
79
|
+
;(globalThis as any)[TASK_COUNT_KEY] = count
|
|
80
|
+
return count
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function resetTaskCount() {
|
|
84
|
+
;(globalThis as any)[TASK_COUNT_KEY] = 0
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Create a new Piscina pool instance
|
|
89
|
+
*/
|
|
90
|
+
function createPool(): Piscina {
|
|
91
|
+
const pool = new Piscina({
|
|
92
|
+
filename: getWorkerPath(),
|
|
93
|
+
// Single worker for state consistency and simpler caching
|
|
94
|
+
minThreads: 1,
|
|
95
|
+
maxThreads: 1,
|
|
96
|
+
// Never terminate due to idle - worker stays alive until close() or process exit
|
|
97
|
+
// This prevents "Terminating worker thread" errors from Piscina during idle
|
|
98
|
+
idleTimeout: Number.POSITIVE_INFINITY,
|
|
99
|
+
// no resourceLimits - we rely on task-based recycling instead
|
|
100
|
+
// V8 resourceLimits cause "Terminating worker thread" messages when hit
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
// Handle error events to prevent uncaught exceptions during pool destruction
|
|
104
|
+
pool.on('error', (err) => {
|
|
105
|
+
if (isClosing() || isRecycling()) return
|
|
106
|
+
const message =
|
|
107
|
+
err && typeof err === 'object' && 'message' in err ? String(err.message) : ''
|
|
108
|
+
// Suppress termination errors (can still occur during explicit close/destroy)
|
|
109
|
+
if (message.includes('Terminating worker thread')) return
|
|
110
|
+
console.error('[tamagui] Worker pool error:', err)
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
return pool
|
|
114
|
+
}
|
|
115
|
+
|
|
64
116
|
/**
|
|
65
117
|
* Get or create the Piscina worker pool
|
|
66
118
|
*/
|
|
67
119
|
function getPool(): Piscina {
|
|
68
120
|
let pool = getSharedPool()
|
|
69
121
|
if (!pool) {
|
|
70
|
-
pool =
|
|
71
|
-
filename: getWorkerPath(),
|
|
72
|
-
// Single worker for state consistency and simpler caching
|
|
73
|
-
minThreads: 1,
|
|
74
|
-
maxThreads: 1,
|
|
75
|
-
// Never terminate due to idle - worker stays alive until close() or process exit
|
|
76
|
-
// This prevents "Terminating worker thread" errors from Piscina during idle
|
|
77
|
-
idleTimeout: Number.POSITIVE_INFINITY,
|
|
78
|
-
})
|
|
79
|
-
|
|
80
|
-
// Handle error events to prevent uncaught exceptions during pool destruction
|
|
81
|
-
pool.on('error', (err) => {
|
|
82
|
-
if (isClosing()) return
|
|
83
|
-
const message =
|
|
84
|
-
err && typeof err === 'object' && 'message' in err ? String(err.message) : ''
|
|
85
|
-
// Suppress termination errors (can still occur during explicit close/destroy)
|
|
86
|
-
if (message.includes('Terminating worker thread')) return
|
|
87
|
-
console.error('[tamagui] Worker pool error:', err)
|
|
88
|
-
})
|
|
89
|
-
|
|
122
|
+
pool = createPool()
|
|
90
123
|
setSharedPool(pool)
|
|
91
124
|
}
|
|
92
125
|
return pool
|
|
@@ -121,6 +154,86 @@ export async function loadTamagui(options: Partial<TamaguiOptions>): Promise<any
|
|
|
121
154
|
}
|
|
122
155
|
}
|
|
123
156
|
|
|
157
|
+
/**
|
|
158
|
+
* Recycle the worker pool to release RSS memory
|
|
159
|
+
* Creates new pool, swaps immediately, then destroys old pool
|
|
160
|
+
* V8 doesn't return memory to OS, so we need to restart the worker periodically
|
|
161
|
+
*/
|
|
162
|
+
async function recyclePool(options: TamaguiOptions): Promise<void> {
|
|
163
|
+
if (isClosing() || isRecycling()) return
|
|
164
|
+
|
|
165
|
+
const oldPool = getSharedPool()
|
|
166
|
+
if (!oldPool) return
|
|
167
|
+
|
|
168
|
+
setRecycling(true)
|
|
169
|
+
|
|
170
|
+
const start = Date.now()
|
|
171
|
+
|
|
172
|
+
try {
|
|
173
|
+
// suppress "Terminating worker thread" messages during recycle
|
|
174
|
+
const originalStderr = process.stderr.write.bind(process.stderr)
|
|
175
|
+
const originalStdout = process.stdout.write.bind(process.stdout)
|
|
176
|
+
const filter = (chunk: any, ...args: any[]) => {
|
|
177
|
+
const str = typeof chunk === 'string' ? chunk : chunk?.toString?.() || ''
|
|
178
|
+
if (str.includes('Terminating worker thread')) return true
|
|
179
|
+
return false
|
|
180
|
+
}
|
|
181
|
+
process.stderr.write = ((chunk: any, ...args: any[]) => {
|
|
182
|
+
if (filter(chunk)) return true
|
|
183
|
+
return originalStderr(chunk, ...args)
|
|
184
|
+
}) as any
|
|
185
|
+
process.stdout.write = ((chunk: any, ...args: any[]) => {
|
|
186
|
+
if (filter(chunk)) return true
|
|
187
|
+
return originalStdout(chunk, ...args)
|
|
188
|
+
}) as any
|
|
189
|
+
|
|
190
|
+
// create new pool and swap immediately
|
|
191
|
+
const newPool = createPool()
|
|
192
|
+
setSharedPool(newPool)
|
|
193
|
+
|
|
194
|
+
// warm up new pool with config (this caches it in the new worker)
|
|
195
|
+
const warmupTask = {
|
|
196
|
+
type: 'extractToClassNames',
|
|
197
|
+
source: '// warmup',
|
|
198
|
+
sourcePath: '__warmup__.tsx',
|
|
199
|
+
options: {
|
|
200
|
+
...options,
|
|
201
|
+
// skip the "built config" log on warmup since it's a recycle
|
|
202
|
+
_skipBuildLog: true,
|
|
203
|
+
},
|
|
204
|
+
shouldPrintDebug: false,
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
await newPool.run(warmupTask, { name: 'runTask' })
|
|
208
|
+
|
|
209
|
+
// destroy old pool - pending tasks will be rejected
|
|
210
|
+
oldPool.removeAllListeners()
|
|
211
|
+
oldPool.destroy().catch(() => {})
|
|
212
|
+
|
|
213
|
+
// restore stderr/stdout after a delay
|
|
214
|
+
setTimeout(() => {
|
|
215
|
+
process.stderr.write = originalStderr
|
|
216
|
+
process.stdout.write = originalStdout
|
|
217
|
+
})
|
|
218
|
+
|
|
219
|
+
console.log(` ♻️ [tamagui] recycled worker pool (${Date.now() - start}ms)`)
|
|
220
|
+
} finally {
|
|
221
|
+
setRecycling(false)
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Load Tamagui build configuration asynchronously
|
|
227
|
+
* Uses esbuild-wasm to avoid EPIPE errors from native esbuild service lifecycle
|
|
228
|
+
*/
|
|
229
|
+
export async function loadTamaguiBuildConfig(
|
|
230
|
+
tamaguiOptions: Partial<TamaguiOptions> | undefined
|
|
231
|
+
): Promise<TamaguiOptions> {
|
|
232
|
+
const { default: Static } = await import('@tamagui/static')
|
|
233
|
+
|
|
234
|
+
return Static.loadTamaguiBuildConfigAsync(tamaguiOptions)
|
|
235
|
+
}
|
|
236
|
+
|
|
124
237
|
/**
|
|
125
238
|
* Extract Tamagui components to className-based CSS for web
|
|
126
239
|
*/
|
|
@@ -160,6 +273,14 @@ export async function extractToClassNames(params: {
|
|
|
160
273
|
throw new Error(errorMessage)
|
|
161
274
|
}
|
|
162
275
|
|
|
276
|
+
// check if we need to recycle the worker to prevent RSS bloat
|
|
277
|
+
const count = incrementTaskCount()
|
|
278
|
+
if (count >= MAX_TASKS_BEFORE_RECYCLE) {
|
|
279
|
+
resetTaskCount()
|
|
280
|
+
// recycle asynchronously with hot-swap to not block current request
|
|
281
|
+
recyclePool(options).catch(() => {})
|
|
282
|
+
}
|
|
283
|
+
|
|
163
284
|
return result.data
|
|
164
285
|
}
|
|
165
286
|
|
|
@@ -194,6 +315,14 @@ export async function extractToNative(
|
|
|
194
315
|
throw new Error(errorMessage)
|
|
195
316
|
}
|
|
196
317
|
|
|
318
|
+
// check if we need to recycle the worker to prevent RSS bloat
|
|
319
|
+
const count = incrementTaskCount()
|
|
320
|
+
if (count >= MAX_TASKS_BEFORE_RECYCLE) {
|
|
321
|
+
resetTaskCount()
|
|
322
|
+
// recycle asynchronously with hot-swap to not block current request
|
|
323
|
+
recyclePool(options).catch(() => {})
|
|
324
|
+
}
|
|
325
|
+
|
|
197
326
|
return result.data
|
|
198
327
|
}
|
|
199
328
|
|
|
@@ -225,19 +354,6 @@ export async function watchTamaguiConfig(
|
|
|
225
354
|
}
|
|
226
355
|
}
|
|
227
356
|
|
|
228
|
-
/**
|
|
229
|
-
* Load Tamagui build configuration synchronously
|
|
230
|
-
* This is only used for loading tamagui.build.ts config, not the full tamagui config
|
|
231
|
-
*/
|
|
232
|
-
export async function loadTamaguiBuildConfig(
|
|
233
|
-
tamaguiOptions: Partial<TamaguiOptions> | undefined
|
|
234
|
-
): Promise<TamaguiOptions> {
|
|
235
|
-
// Import from static package for this sync operation
|
|
236
|
-
const { default: Static } = await import('@tamagui/static')
|
|
237
|
-
|
|
238
|
-
return Static.loadTamaguiBuildConfigSync(tamaguiOptions)
|
|
239
|
-
}
|
|
240
|
-
|
|
241
357
|
/**
|
|
242
358
|
* Clear the worker's config cache
|
|
243
359
|
* Call this when config files change
|
package/types/index.d.ts
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* implementation without exposing any sync/legacy APIs.
|
|
9
9
|
*/
|
|
10
10
|
import type { TamaguiOptions } from '@tamagui/types';
|
|
11
|
-
export type { ExtractedResponse, TamaguiProjectInfo
|
|
11
|
+
export type { ExtractedResponse, TamaguiProjectInfo } from '@tamagui/static';
|
|
12
12
|
export type { TamaguiOptions } from '@tamagui/types';
|
|
13
13
|
export declare const getPragmaOptions: (props: {
|
|
14
14
|
source: string;
|
|
@@ -22,6 +22,11 @@ export declare const getPragmaOptions: (props: {
|
|
|
22
22
|
* This is cached in the worker, so subsequent calls are fast
|
|
23
23
|
*/
|
|
24
24
|
export declare function loadTamagui(options: Partial<TamaguiOptions>): Promise<any>;
|
|
25
|
+
/**
|
|
26
|
+
* Load Tamagui build configuration asynchronously
|
|
27
|
+
* Uses esbuild-wasm to avoid EPIPE errors from native esbuild service lifecycle
|
|
28
|
+
*/
|
|
29
|
+
export declare function loadTamaguiBuildConfig(tamaguiOptions: Partial<TamaguiOptions> | undefined): Promise<TamaguiOptions>;
|
|
25
30
|
/**
|
|
26
31
|
* Extract Tamagui components to className-based CSS for web
|
|
27
32
|
*/
|
|
@@ -41,11 +46,6 @@ export declare function extractToNative(sourceFileName: string, sourceCode: stri
|
|
|
41
46
|
export declare function watchTamaguiConfig(options: TamaguiOptions): Promise<{
|
|
42
47
|
dispose: () => void;
|
|
43
48
|
} | undefined>;
|
|
44
|
-
/**
|
|
45
|
-
* Load Tamagui build configuration synchronously
|
|
46
|
-
* This is only used for loading tamagui.build.ts config, not the full tamagui config
|
|
47
|
-
*/
|
|
48
|
-
export declare function loadTamaguiBuildConfig(tamaguiOptions: Partial<TamaguiOptions> | undefined): Promise<TamaguiOptions>;
|
|
49
49
|
/**
|
|
50
50
|
* Clear the worker's config cache
|
|
51
51
|
* Call this when config files change
|
package/types/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAKpD,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAKpD,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAC5E,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,eAAO,MAAM,gBAAgB,GAAU,OAAO;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;;;EAG7E,CAAA;AA0GD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAuBhF;AAsED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,cAAc,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,SAAS,GAClD,OAAO,CAAC,cAAc,CAAC,CAIzB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE;IAChD,MAAM,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,cAAc,CAAA;IACvB,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CACvC,GAAG,OAAO,CAAC,GAAG,CAAC,CAwCf;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,GAAG,CAAC,CAiCd;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,GAAG,SAAS,CAAC,CAqB9C;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAMtD;AAED;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAWjD;AAED;;GAEG;AACH,wBAAgB,YAAY;;;;;;SAY3B"}
|