@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.
@@ -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 getPool() {
70
- let pool = getSharedPool();
71
- return pool || (pool = new import_piscina.default({
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
- }), pool.on("error", err => {
80
- isClosing() || (err && typeof err == "object" && "message" in err ? String(err.message) : "").includes("Terminating worker thread") || console.error("[tamagui] Worker pool error:", err);
81
- }), setSharedPool(pool)), pool;
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 getPool() {
54
- let pool = getSharedPool();
55
- return pool || (pool = new import_piscina.default({
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
- }), pool.on("error", (err) => {
64
- isClosing() || (err && typeof err == "object" && "message" in err ? String(err.message) : "").includes("Terminating worker thread") || console.error("[tamagui] Worker pool error:", err);
65
- }), setSharedPool(pool)), pool;
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 result.data;
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 result.data;
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;
@@ -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,wBAqBa,mBAAmB,OAAO,UAGjC;AACJ,QAAM,EAAE,SAAS,OAAO,IAAI,MAAM,OAAO,iBAAiB;AAC1D,SAAO,OAAO,iBAAiB,KAAK;AACtC,GAGM,gBAAgB,MAGhB,OAAO,cAAgB,OAAe,YAAY,UACjC,+BAAc,YAAY,QAAQ,wBAAwB,CAAC,EAE5D,QAAQ,UAAU,KAAK,IAIpC,gBAAgB,wBAAwB,EAAE,QAAQ,UAAU,KAAK,GAIpE,WAAW,4BACX,cAAc;AAEpB,SAAS,gBAAgC;AACvC,SAAQ,WAAmB,QAAQ,KAAK;AAC1C;AAEA,SAAS,cAAc,MAAsB;AAC1C,EAAC,WAAmB,QAAQ,IAAI;AACnC;AAEA,SAAS,YAAqB;AAC5B,SAAQ,WAAmB,WAAW,MAAM;AAC9C;AAEA,SAAS,WAAW,OAAgB;AACjC,EAAC,WAAmB,WAAW,IAAI;AACtC;AAKA,SAAS,UAAmB;AAC1B,MAAI,OAAO,cAAc;AACzB,SAAK,SACH,OAAO,IAAI,eAAAA,QAAQ;AAAA,IACjB,UAAU,cAAc;AAAA;AAAA,IAExB,YAAY;AAAA,IACZ,YAAY;AAAA;AAAA;AAAA,IAGZ,aAAa,OAAO;AAAA,EACtB,CAAC,GAGD,KAAK,GAAG,SAAS,CAAC,QAAQ;AAKxB,IAJI,UAAU,MAEZ,OAAO,OAAO,OAAQ,YAAY,aAAa,MAAM,OAAO,IAAI,OAAO,IAAI,IAEjE,SAAS,2BAA2B,KAChD,QAAQ,MAAM,gCAAgC,GAAG;AAAA,EACnD,CAAC,GAED,cAAc,IAAI,IAEb;AACT;AAMA,eAAsB,YAAY,SAAgD;AAChF,QAAM,OAAO,QAAQ,GAIf,OAAO;AAAA,IACX,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,SAAS;AAAA,MACP,YAAY,CAAC,SAAS;AAAA,MACtB,GAAG;AAAA,IACL;AAAA,IACA,kBAAkB;AAAA,EACpB;AAEA,MAAI;AACF,iBAAM,KAAK,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC,GACjC,EAAE,SAAS,GAAK;AAAA,EACzB,SAAS,OAAO;AACd,kBAAQ,MAAM,iDAAiD,KAAK,GAC9D;AAAA,EACR;AACF;AAKA,eAAsB,oBAAoB,QAKzB;AACf,QAAM,EAAE,QAAQ,aAAa,IAAI,SAAS,mBAAmB,GAAM,IAAI;AAEvE,MAAI,OAAO,UAAW;AACpB,UAAM,IAAI,MAAM,yCAAyC;AAG3D,QAAM,OAAO;AAAA,IACX,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAGM,SAAU,MADH,QAAQ,EACM,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAExD,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,eAAe;AAAA,MACnB,4CAA4C,cAAc,WAAW;AAAA,MACrE;AAAA,MACA,OAAO;AAAA,MACP,OAAO,QAAQ;AAAA,EAAK,OAAO,KAAK,KAAK;AAAA,IACvC,EACG,OAAO,OAAO,EACd,KAAK;AAAA,CAAI;AAEZ,UAAM,IAAI,MAAM,YAAY;AAAA,EAC9B;AAEA,SAAO,OAAO;AAChB;AAKA,eAAsB,gBACpB,gBACA,YACA,SACc;AACd,QAAM,OAAO;AAAA,IACX,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAGM,SAAU,MADH,QAAQ,EACM,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAExD,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,eAAe;AAAA,MACnB,4CAA4C,kBAAkB,WAAW;AAAA,MACzE;AAAA,MACA,OAAO;AAAA,MACP,OAAO,QAAQ;AAAA,EAAK,OAAO,KAAK,KAAK;AAAA,IACvC,EACG,OAAO,OAAO,EACd,KAAK;AAAA,CAAI;AAEZ,UAAM,IAAI,MAAM,YAAY;AAAA,EAC9B;AAEA,SAAO,OAAO;AAChB;AAKA,eAAsB,mBACpB,SAC8C;AAG9C,QAAM,EAAE,SAAS,OAAO,IAAI,MAAM,OAAO,iBAAiB,GACpD,UAAU,MAAM,OAAO,mBAAmB,OAAO;AAEvD,MAAI,CAAC;AACH;AAIF,QAAM,kBAAkB,QAAQ;AAChC,SAAO;AAAA,IACL,SAAS,MAAM;AACb,sBAAgB,GACZ,cAAc,KAEhB,iBAAiB;AAAA,IAErB;AAAA,EACF;AACF;AAMA,eAAsB,uBACpB,gBACyB;AAEzB,QAAM,EAAE,SAAS,OAAO,IAAI,MAAM,OAAO,iBAAiB;AAE1D,SAAO,OAAO,2BAA2B,cAAc;AACzD;AAMA,eAAsB,mBAAkC;AACtD,QAAM,OAAO,cAAc;AAC3B,MAAI,CAAC,QAAQ,UAAU,EAAG;AAE1B,QAAM,OAAO,EAAE,MAAM,aAAa;AAClC,QAAM,KAAK,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC1C;AAMA,eAAsB,cAA6B;AACjD,QAAM,OAAO,cAAc;AAC3B,MAAI,MAAM;AACR,eAAW,EAAI;AACf,QAAI;AACF,YAAM,KAAK,MAAM;AAAA,IACnB,UAAE;AACA,oBAAc,IAAI,GAClB,WAAW,EAAK;AAAA,IAClB;AAAA,EACF;AACF;AAKO,SAAS,eAAe;AAC7B,QAAM,OAAO,cAAc;AAC3B,SAAK,OAGE;AAAA,IACL,SAAS,KAAK,QAAQ;AAAA,IACtB,WAAW,KAAK;AAAA,IAChB,WAAW,KAAK;AAAA,IAChB,UAAU,KAAK;AAAA,IACf,aAAa,KAAK;AAAA,EACpB,IARS;AASX;",
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 getPool() {
20
- let pool = getSharedPool();
21
- return pool || (pool = new Piscina({
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
- }), pool.on("error", (err) => {
30
- isClosing() || (err && typeof err == "object" && "message" in err ? String(err.message) : "").includes("Terminating worker thread") || console.error("[tamagui] Worker pool error:", err);
31
- }), setSharedPool(pool)), pool;
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 result.data;
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 result.data;
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;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": []
6
6
  }
@@ -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 getPool() {
25
- let pool = getSharedPool();
26
- return pool || (pool = new Piscina({
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
- }), pool.on("error", err => {
35
- isClosing() || (err && typeof err == "object" && "message" in err ? String(err.message) : "").includes("Terminating worker thread") || console.error("[tamagui] Worker pool error:", err);
36
- }), setSharedPool(pool)), pool;
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;
@@ -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","getPool","filename","minThreads","maxThreads","idleTimeout","Number","POSITIVE_INFINITY","on","err","String","message","includes","console","error","loadTamagui","options","task","type","source","sourcePath","components","shouldPrintDebug","run","name","success","extractToClassNames","params","Error","result","errorMessage","stack","filter","Boolean","join","data","extractToNative","sourceFileName","sourceCode","watchTamaguiConfig","watcher","originalDispose","dispose","clearWorkerCache","loadTamaguiBuildConfig","tamaguiOptions","loadTamaguiBuildConfigSync","destroyPool","close","getPoolStats","threads","length","queueSize","completed","duration","utilization"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
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
- "scripts": {
15
- "build": "tamagui-build --skip-native",
16
- "watch": "tamagui-build --skip-native --watch",
17
- "clean": "tamagui-build clean",
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
- "license": "MIT",
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": "^4.0.4"
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 = new Piscina({
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, } from '@tamagui/static';
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
@@ -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,EACV,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,iBAAiB,CAAA;AACxB,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,eAAO,MAAM,gBAAgB,GAAU,OAAO;IAC5C,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb;;;EAGA,CAAA;AAmED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAuBhF;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,CAgCf;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,GAAG,CAAC,CAyBd;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,sBAAsB,CAC1C,cAAc,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,SAAS,GAClD,OAAO,CAAC,cAAc,CAAC,CAKzB;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"}
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"}