@readystack/einvoice-mandate-lint 1.0.3 → 1.0.4

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.
Files changed (2) hide show
  1. package/license.js +15 -1
  2. package/package.json +1 -1
package/license.js CHANGED
@@ -32,15 +32,29 @@ function validate1(key, ben) {
32
32
  req.write(body); req.end();
33
33
  });
34
34
  }
35
+ // ★s151 2026-09-19 — 키 판(키가 없거나 거절된 순간)을 익명으로 센다 (슬러그·출처·이유만) · DO_NOT_TRACK=1 · READYSTACK_NO_TELEMETRY 면 안 보낸다 · 실패는 조용히 · 프로세스당 한 번.
36
+ let _pinged = false;
37
+ function pingPaywall(why) {
38
+ try {
39
+ if (_pinged) return; _pinged = true;
40
+ if (process.env.DO_NOT_TRACK === '1' || process.env.READYSTACK_NO_TELEMETRY) return;
41
+ const body = JSON.stringify({ t: 'paywall', slug: SLUG, src: 'cli', why: why || 'no_key' });
42
+ const req = https.request({ hostname: 'getreadystack.com', path: '/api/ev', method: 'POST', timeout: 3000,
43
+ headers: { 'content-type': 'application/json', 'content-length': Buffer.byteLength(body), 'user-agent': 'readystack-cli/' + SLUG } }, function (res) { res.resume(); });
44
+ req.on('timeout', function () { req.destroy(); }); req.on('error', function () {});
45
+ req.write(body); req.end();
46
+ } catch (e) { /* 세는 것이 실패해도 상품은 돈다 */ }
47
+ }
35
48
  async function ensure(explicitKey) {
36
49
  const st = load();
37
50
  const key = explicitKey || process.env.READYSTACK_LICENSE || st.key;
38
- if (!key) return { ok: false, why: 'no_key' };
51
+ if (!key) { pingPaywall('no_key'); return { ok: false, why: 'no_key' }; } // s151
39
52
  const age = Date.now() - (st.okAt || 0);
40
53
  if (!explicitKey && st.key === key && age < RECHECK_MS) return { ok: true, cached: true };
41
54
  const r = await validate(String(key).trim());
42
55
  if (r.ok) { save({ key: String(key).trim(), okAt: Date.now() }); return { ok: true }; }
43
56
  if (r.offline && st.key === key && age < GRACE_MS) return { ok: true, offline: true };
57
+ if (!r.offline) pingPaywall('invalid'); // s151
44
58
  return { ok: false, why: r.offline ? 'offline' : 'invalid' };
45
59
  }
46
60
  // ★s134 — 구독 규칙 피드(층3 "바뀌면 업데이트"): 키 있는 손님만 · 7일마다 · 오프라인은 캐시. 워커 GET /api/rules/<slug>?key=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@readystack/einvoice-mandate-lint",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "description": "Lints UBL and CII invoice XML against EN 16931 and the national e-invoicing mandates that are live in 2026",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "publishConfig": {