@drawcall/market 0.1.44 → 0.1.45

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/install.js CHANGED
@@ -61,56 +61,127 @@ export async function findInstallRoot(cwd = process.cwd()) {
61
61
  }
62
62
  }
63
63
  }
64
+ /** Max asset downloads in flight at once. Assets write disjoint file trees, so downloading them
65
+ * concurrently is safe and turns a ~40-asset install from serial round-trips into a few batched
66
+ * waves. Kept modest so one install does not itself overwhelm the worker's per-request memory. */
67
+ const DOWNLOAD_CONCURRENCY = 8;
68
+ /** Attempts per asset download, including the first. The worker can shed load transiently (a 5xx
69
+ * under memory pressure, a dropped connection); a bounded retry rides that out instead of aborting
70
+ * the whole install and leaving a partial asset tree. */
71
+ const DOWNLOAD_ATTEMPTS = 5;
64
72
  async function downloadAssets(client, resolution, projectRoot, opts) {
65
- const installedAssets = [];
73
+ const perAsset = await mapWithConcurrency(resolution.assets, DOWNLOAD_CONCURRENCY, (asset) => downloadOneAsset(client, asset, projectRoot, opts));
74
+ return {
75
+ assets: perAsset.map((r) => r.asset),
76
+ // A template ships its own package.json; if any downloaded asset wrote one, the caller must run
77
+ // the package manager to bring its npm deps.
78
+ wrotePackageJson: perAsset.some((r) => r.wrotePackageJson),
79
+ warnings: perAsset.flatMap((r) => r.warnings),
80
+ };
81
+ }
82
+ async function downloadOneAsset(client, asset, projectRoot, opts) {
83
+ opts.log(`Downloading ${asset.name}@${asset.version}...`);
84
+ // Only the network fetch is retried — the download is the sole transient step; unzip and file
85
+ // writes are deterministic local work and a failure there is a real error, not worth re-attempting.
86
+ const zip = await withRetry(() => client.asset.downloadZip({ name: asset.name, version: asset.version }), {
87
+ attempts: DOWNLOAD_ATTEMPTS,
88
+ onRetry: (msg) => opts.log(`Downloading ${asset.name}@${asset.version}: ${msg}`),
89
+ });
90
+ const files = unzipSync(new Uint8Array(await zip.arrayBuffer()));
91
+ const installedFiles = [];
92
+ const fileHashes = {};
66
93
  const warnings = [];
67
94
  let wrotePackageJson = false;
68
- for (const asset of resolution.assets) {
69
- opts.log(`Downloading ${asset.name}@${asset.version}...`);
70
- const zip = await client.asset.downloadZip({ name: asset.name, version: asset.version });
71
- const files = unzipSync(new Uint8Array(await zip.arrayBuffer()));
72
- const installedFiles = [];
73
- const fileHashes = {};
74
- for (const [relativePath, content] of Object.entries(files)) {
75
- const zipPath = relativePath.replace(/\\/g, '/');
76
- if (zipPath.split('/').includes('..') ||
77
- path.posix.isAbsolute(zipPath) ||
78
- path.win32.isAbsolute(zipPath)) {
79
- throw new Error(`Zip contains an unsafe path: ${relativePath}`);
80
- }
81
- const normalizedPath = path.posix.normalize(zipPath);
82
- if (normalizedPath === '.' ||
83
- (normalizedPath === 'README.md' && asset.type !== 'template') ||
84
- normalizedPath.endsWith('/')) {
85
- continue;
86
- }
87
- const filePath = path.join(projectRoot, normalizedPath);
88
- const existing = await maybeReadFile(filePath);
89
- if (existing && !bytesEqual(existing, content) && !opts.force) {
90
- warnings.push(`Skipped ${normalizedPath} from ${asset.name}@${asset.version}; file already exists. Re-run with --force to overwrite.`);
91
- continue;
92
- }
93
- if (!existing || !bytesEqual(existing, content)) {
94
- await fs.mkdir(path.dirname(filePath), { recursive: true });
95
- await fs.writeFile(filePath, content);
96
- if (normalizedPath === 'package.json') {
97
- wrotePackageJson = true;
98
- }
95
+ for (const [relativePath, content] of Object.entries(files)) {
96
+ const zipPath = relativePath.replace(/\\/g, '/');
97
+ if (zipPath.split('/').includes('..') ||
98
+ path.posix.isAbsolute(zipPath) ||
99
+ path.win32.isAbsolute(zipPath)) {
100
+ throw new Error(`Zip contains an unsafe path: ${relativePath}`);
101
+ }
102
+ const normalizedPath = path.posix.normalize(zipPath);
103
+ if (normalizedPath === '.' ||
104
+ (normalizedPath === 'README.md' && asset.type !== 'template') ||
105
+ normalizedPath.endsWith('/')) {
106
+ continue;
107
+ }
108
+ const filePath = path.join(projectRoot, normalizedPath);
109
+ const existing = await maybeReadFile(filePath);
110
+ if (existing && !bytesEqual(existing, content) && !opts.force) {
111
+ warnings.push(`Skipped ${normalizedPath} from ${asset.name}@${asset.version}; file already exists. Re-run with --force to overwrite.`);
112
+ continue;
113
+ }
114
+ if (!existing || !bytesEqual(existing, content)) {
115
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
116
+ await fs.writeFile(filePath, content);
117
+ if (normalizedPath === 'package.json') {
118
+ wrotePackageJson = true;
99
119
  }
100
- installedFiles.push(normalizedPath);
101
- fileHashes[normalizedPath] = { sha256: sha256(content) };
102
120
  }
103
- installedAssets.push({
121
+ installedFiles.push(normalizedPath);
122
+ fileHashes[normalizedPath] = { sha256: sha256(content) };
123
+ }
124
+ opts.log(`Downloaded ${installedFiles.length} files from ${asset.name}@${asset.version}.`);
125
+ return {
126
+ asset: {
104
127
  name: asset.name,
105
128
  type: asset.type,
106
129
  version: asset.version,
107
130
  description: asset.description,
108
131
  files: installedFiles,
109
132
  fileHashes,
110
- });
111
- opts.log(`Downloaded ${installedFiles.length} files.`);
133
+ },
134
+ wrotePackageJson,
135
+ warnings,
136
+ };
137
+ }
138
+ /** Map over items with a bounded number of concurrent workers, preserving input order. The first
139
+ * rejection propagates (via Promise.all), so a download that fails every attempt fails the whole
140
+ * install loudly rather than silently yielding a partial asset tree. */
141
+ async function mapWithConcurrency(items, concurrency, fn) {
142
+ const results = new Array(items.length);
143
+ let next = 0;
144
+ async function worker() {
145
+ for (let index = next++; index < items.length; index = next++) {
146
+ results[index] = await fn(items[index], index);
147
+ }
112
148
  }
113
- return { assets: installedAssets, wrotePackageJson, warnings };
149
+ await Promise.all(Array.from({ length: Math.min(concurrency, items.length) }, () => worker()));
150
+ return results;
151
+ }
152
+ /** Retry a transient operation with exponential backoff + jitter. Permanent failures (a 4xx from
153
+ * the worker) are not retried — only server/overload (5xx, 429) and connection-level errors are. */
154
+ async function withRetry(op, opts) {
155
+ let lastError;
156
+ for (let attempt = 1; attempt <= opts.attempts; attempt++) {
157
+ try {
158
+ return await op();
159
+ }
160
+ catch (error) {
161
+ lastError = error;
162
+ if (attempt === opts.attempts || !isRetriable(error))
163
+ break;
164
+ const backoffMs = Math.min(8000, 400 * 2 ** (attempt - 1)) + Math.floor(Math.random() * 250);
165
+ opts.onRetry?.(`attempt ${attempt}/${opts.attempts} failed (${errorMessage(error)}), retrying in ${backoffMs}ms`);
166
+ await delay(backoffMs);
167
+ }
168
+ }
169
+ throw lastError;
170
+ }
171
+ /** oRPC surfaces an HTTP failure as an error carrying the numeric `status`; a server/overload
172
+ * (5xx) or rate-limit (429) is transient and worth retrying, a client error (4xx) is not. An error
173
+ * without a status (connection reset, DNS/fetch failure, timeout) is treated as transient. */
174
+ function isRetriable(error) {
175
+ const status = error?.status;
176
+ if (typeof status === 'number')
177
+ return status === 429 || status >= 500;
178
+ return true;
179
+ }
180
+ function errorMessage(error) {
181
+ return error instanceof Error ? error.message : String(error);
182
+ }
183
+ function delay(ms) {
184
+ return new Promise((resolve) => setTimeout(resolve, ms));
114
185
  }
115
186
  async function isFile(file) {
116
187
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drawcall/market",
3
- "version": "0.1.44",
3
+ "version": "0.1.45",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/drawcall-ai/market",
package/src/install.ts CHANGED
@@ -133,6 +133,15 @@ export async function findInstallRoot(cwd: string = process.cwd()): Promise<stri
133
133
  }
134
134
  }
135
135
 
136
+ /** Max asset downloads in flight at once. Assets write disjoint file trees, so downloading them
137
+ * concurrently is safe and turns a ~40-asset install from serial round-trips into a few batched
138
+ * waves. Kept modest so one install does not itself overwhelm the worker's per-request memory. */
139
+ const DOWNLOAD_CONCURRENCY = 8
140
+ /** Attempts per asset download, including the first. The worker can shed load transiently (a 5xx
141
+ * under memory pressure, a dropped connection); a bounded retry rides that out instead of aborting
142
+ * the whole install and leaving a partial asset tree. */
143
+ const DOWNLOAD_ATTEMPTS = 5
144
+
136
145
  async function downloadAssets(
137
146
  client: MarketClient,
138
147
  resolution: ResolveResult,
@@ -142,71 +151,158 @@ async function downloadAssets(
142
151
  log: (msg: string) => void
143
152
  },
144
153
  ): Promise<DownloadResult> {
145
- const installedAssets: DownloadedAsset[] = []
154
+ const perAsset = await mapWithConcurrency(
155
+ resolution.assets,
156
+ DOWNLOAD_CONCURRENCY,
157
+ (asset) => downloadOneAsset(client, asset, projectRoot, opts),
158
+ )
159
+
160
+ return {
161
+ assets: perAsset.map((r) => r.asset),
162
+ // A template ships its own package.json; if any downloaded asset wrote one, the caller must run
163
+ // the package manager to bring its npm deps.
164
+ wrotePackageJson: perAsset.some((r) => r.wrotePackageJson),
165
+ warnings: perAsset.flatMap((r) => r.warnings),
166
+ }
167
+ }
168
+
169
+ async function downloadOneAsset(
170
+ client: MarketClient,
171
+ asset: ResolveResult['assets'][number],
172
+ projectRoot: string,
173
+ opts: { force: boolean; log: (msg: string) => void },
174
+ ): Promise<{ asset: DownloadedAsset; wrotePackageJson: boolean; warnings: string[] }> {
175
+ opts.log(`Downloading ${asset.name}@${asset.version}...`)
176
+
177
+ // Only the network fetch is retried — the download is the sole transient step; unzip and file
178
+ // writes are deterministic local work and a failure there is a real error, not worth re-attempting.
179
+ const zip = await withRetry(
180
+ () => client.asset.downloadZip({ name: asset.name, version: asset.version }),
181
+ {
182
+ attempts: DOWNLOAD_ATTEMPTS,
183
+ onRetry: (msg) => opts.log(`Downloading ${asset.name}@${asset.version}: ${msg}`),
184
+ },
185
+ )
186
+ const files = unzipSync(new Uint8Array(await zip.arrayBuffer()))
187
+ const installedFiles: string[] = []
188
+ const fileHashes: Record<string, { sha256: string }> = {}
146
189
  const warnings: string[] = []
147
190
  let wrotePackageJson = false
148
191
 
149
- for (const asset of resolution.assets) {
150
- opts.log(`Downloading ${asset.name}@${asset.version}...`)
151
-
152
- const zip = await client.asset.downloadZip({ name: asset.name, version: asset.version })
153
- const files = unzipSync(new Uint8Array(await zip.arrayBuffer()))
154
- const installedFiles: string[] = []
155
- const fileHashes: Record<string, { sha256: string }> = {}
156
-
157
- for (const [relativePath, content] of Object.entries(files) as [string, Uint8Array][]) {
158
- const zipPath = relativePath.replace(/\\/g, '/')
159
- if (
160
- zipPath.split('/').includes('..') ||
161
- path.posix.isAbsolute(zipPath) ||
162
- path.win32.isAbsolute(zipPath)
163
- ) {
164
- throw new Error(`Zip contains an unsafe path: ${relativePath}`)
165
- }
192
+ for (const [relativePath, content] of Object.entries(files) as [string, Uint8Array][]) {
193
+ const zipPath = relativePath.replace(/\\/g, '/')
194
+ if (
195
+ zipPath.split('/').includes('..') ||
196
+ path.posix.isAbsolute(zipPath) ||
197
+ path.win32.isAbsolute(zipPath)
198
+ ) {
199
+ throw new Error(`Zip contains an unsafe path: ${relativePath}`)
200
+ }
166
201
 
167
- const normalizedPath = path.posix.normalize(zipPath)
168
- if (
169
- normalizedPath === '.' ||
170
- (normalizedPath === 'README.md' && asset.type !== 'template') ||
171
- normalizedPath.endsWith('/')
172
- ) {
173
- continue
174
- }
202
+ const normalizedPath = path.posix.normalize(zipPath)
203
+ if (
204
+ normalizedPath === '.' ||
205
+ (normalizedPath === 'README.md' && asset.type !== 'template') ||
206
+ normalizedPath.endsWith('/')
207
+ ) {
208
+ continue
209
+ }
175
210
 
176
- const filePath = path.join(projectRoot, normalizedPath)
177
- const existing = await maybeReadFile(filePath)
178
- if (existing && !bytesEqual(existing, content) && !opts.force) {
179
- warnings.push(
180
- `Skipped ${normalizedPath} from ${asset.name}@${asset.version}; file already exists. Re-run with --force to overwrite.`,
181
- )
182
- continue
183
- }
211
+ const filePath = path.join(projectRoot, normalizedPath)
212
+ const existing = await maybeReadFile(filePath)
213
+ if (existing && !bytesEqual(existing, content) && !opts.force) {
214
+ warnings.push(
215
+ `Skipped ${normalizedPath} from ${asset.name}@${asset.version}; file already exists. Re-run with --force to overwrite.`,
216
+ )
217
+ continue
218
+ }
184
219
 
185
- if (!existing || !bytesEqual(existing, content)) {
186
- await fs.mkdir(path.dirname(filePath), { recursive: true })
187
- await fs.writeFile(filePath, content)
188
- if (normalizedPath === 'package.json') {
189
- wrotePackageJson = true
190
- }
220
+ if (!existing || !bytesEqual(existing, content)) {
221
+ await fs.mkdir(path.dirname(filePath), { recursive: true })
222
+ await fs.writeFile(filePath, content)
223
+ if (normalizedPath === 'package.json') {
224
+ wrotePackageJson = true
191
225
  }
192
-
193
- installedFiles.push(normalizedPath)
194
- fileHashes[normalizedPath] = { sha256: sha256(content) }
195
226
  }
196
227
 
197
- installedAssets.push({
228
+ installedFiles.push(normalizedPath)
229
+ fileHashes[normalizedPath] = { sha256: sha256(content) }
230
+ }
231
+
232
+ opts.log(`Downloaded ${installedFiles.length} files from ${asset.name}@${asset.version}.`)
233
+ return {
234
+ asset: {
198
235
  name: asset.name,
199
236
  type: asset.type,
200
237
  version: asset.version,
201
238
  description: asset.description,
202
239
  files: installedFiles,
203
240
  fileHashes,
204
- })
241
+ },
242
+ wrotePackageJson,
243
+ warnings,
244
+ }
245
+ }
205
246
 
206
- opts.log(`Downloaded ${installedFiles.length} files.`)
247
+ /** Map over items with a bounded number of concurrent workers, preserving input order. The first
248
+ * rejection propagates (via Promise.all), so a download that fails every attempt fails the whole
249
+ * install loudly rather than silently yielding a partial asset tree. */
250
+ async function mapWithConcurrency<T, R>(
251
+ items: readonly T[],
252
+ concurrency: number,
253
+ fn: (item: T, index: number) => Promise<R>,
254
+ ): Promise<R[]> {
255
+ const results = new Array<R>(items.length)
256
+ let next = 0
257
+ async function worker(): Promise<void> {
258
+ for (let index = next++; index < items.length; index = next++) {
259
+ results[index] = await fn(items[index], index)
260
+ }
207
261
  }
262
+ await Promise.all(
263
+ Array.from({ length: Math.min(concurrency, items.length) }, () => worker()),
264
+ )
265
+ return results
266
+ }
267
+
268
+ /** Retry a transient operation with exponential backoff + jitter. Permanent failures (a 4xx from
269
+ * the worker) are not retried — only server/overload (5xx, 429) and connection-level errors are. */
270
+ async function withRetry<T>(
271
+ op: () => Promise<T>,
272
+ opts: { attempts: number; onRetry?: (msg: string) => void },
273
+ ): Promise<T> {
274
+ let lastError: unknown
275
+ for (let attempt = 1; attempt <= opts.attempts; attempt++) {
276
+ try {
277
+ return await op()
278
+ } catch (error) {
279
+ lastError = error
280
+ if (attempt === opts.attempts || !isRetriable(error)) break
281
+ const backoffMs = Math.min(8000, 400 * 2 ** (attempt - 1)) + Math.floor(Math.random() * 250)
282
+ opts.onRetry?.(
283
+ `attempt ${attempt}/${opts.attempts} failed (${errorMessage(error)}), retrying in ${backoffMs}ms`,
284
+ )
285
+ await delay(backoffMs)
286
+ }
287
+ }
288
+ throw lastError
289
+ }
290
+
291
+ /** oRPC surfaces an HTTP failure as an error carrying the numeric `status`; a server/overload
292
+ * (5xx) or rate-limit (429) is transient and worth retrying, a client error (4xx) is not. An error
293
+ * without a status (connection reset, DNS/fetch failure, timeout) is treated as transient. */
294
+ function isRetriable(error: unknown): boolean {
295
+ const status = (error as { status?: unknown } | null)?.status
296
+ if (typeof status === 'number') return status === 429 || status >= 500
297
+ return true
298
+ }
299
+
300
+ function errorMessage(error: unknown): string {
301
+ return error instanceof Error ? error.message : String(error)
302
+ }
208
303
 
209
- return { assets: installedAssets, wrotePackageJson, warnings }
304
+ function delay(ms: number): Promise<void> {
305
+ return new Promise((resolve) => setTimeout(resolve, ms))
210
306
  }
211
307
 
212
308
  async function isFile(file: string): Promise<boolean> {