tinbase 0.2.2 → 0.6.0

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 (94) hide show
  1. package/README.md +64 -31
  2. package/dist/admin/api.d.ts +8 -1
  3. package/dist/admin/api.js +94 -1
  4. package/dist/admin/api.js.map +1 -1
  5. package/dist/admin/ui.d.ts +1 -1
  6. package/dist/admin/ui.js +16 -16
  7. package/dist/auth/handler.d.ts +13 -1
  8. package/dist/auth/handler.js +173 -6
  9. package/dist/auth/handler.js.map +1 -1
  10. package/dist/auth/inbox.d.ts +31 -0
  11. package/dist/auth/inbox.js +112 -0
  12. package/dist/auth/inbox.js.map +1 -0
  13. package/dist/auth/oauth.d.ts +59 -0
  14. package/dist/auth/oauth.js +209 -0
  15. package/dist/auth/oauth.js.map +1 -0
  16. package/dist/auth/qr.d.ts +8 -0
  17. package/dist/auth/qr.js +376 -0
  18. package/dist/auth/qr.js.map +1 -0
  19. package/dist/auth/totp.d.ts +19 -0
  20. package/dist/auth/totp.js +101 -0
  21. package/dist/auth/totp.js.map +1 -0
  22. package/dist/cli.js +168 -10
  23. package/dist/cli.js.map +1 -1
  24. package/dist/cron/service.d.ts +29 -0
  25. package/dist/cron/service.js +134 -0
  26. package/dist/cron/service.js.map +1 -0
  27. package/dist/db/bootstrap.d.ts +8 -1
  28. package/dist/db/bootstrap.js +240 -1
  29. package/dist/db/bootstrap.js.map +1 -1
  30. package/dist/db/database.d.ts +24 -0
  31. package/dist/db/database.js +61 -2
  32. package/dist/db/database.js.map +1 -1
  33. package/dist/db/emulated.d.ts +12 -0
  34. package/dist/db/emulated.js +156 -0
  35. package/dist/db/emulated.js.map +1 -0
  36. package/dist/db/engine.d.ts +2 -0
  37. package/dist/db/engine.js.map +1 -1
  38. package/dist/db/inspect.d.ts +13 -0
  39. package/dist/db/inspect.js +22 -0
  40. package/dist/db/inspect.js.map +1 -0
  41. package/dist/db/pgmem-engine.d.ts +22 -0
  42. package/dist/db/pgmem-engine.js +135 -0
  43. package/dist/db/pgmem-engine.js.map +1 -0
  44. package/dist/db/schema-diff.d.ts +23 -0
  45. package/dist/db/schema-diff.js +182 -0
  46. package/dist/db/schema-diff.js.map +1 -0
  47. package/dist/functions/deno-shim.d.ts +24 -0
  48. package/dist/functions/deno-shim.js +47 -0
  49. package/dist/functions/deno-shim.js.map +1 -0
  50. package/dist/functions/handler.d.ts +3 -1
  51. package/dist/functions/handler.js.map +1 -1
  52. package/dist/gen-types.d.ts +17 -0
  53. package/dist/gen-types.js +222 -0
  54. package/dist/gen-types.js.map +1 -0
  55. package/dist/index.d.ts +20 -0
  56. package/dist/index.js +83 -15
  57. package/dist/index.js.map +1 -1
  58. package/dist/jwt.d.ts +7 -0
  59. package/dist/jwt.js.map +1 -1
  60. package/dist/log-buffer.d.ts +21 -0
  61. package/dist/log-buffer.js +20 -0
  62. package/dist/log-buffer.js.map +1 -0
  63. package/dist/node/bundle-function.d.ts +7 -0
  64. package/dist/node/bundle-function.js +90 -0
  65. package/dist/node/bundle-function.js.map +1 -0
  66. package/dist/node/db-diff.d.ts +34 -0
  67. package/dist/node/db-diff.js +82 -0
  68. package/dist/node/db-diff.js.map +1 -0
  69. package/dist/node/index.d.ts +4 -1
  70. package/dist/node/index.js +4 -1
  71. package/dist/node/index.js.map +1 -1
  72. package/dist/node/load-functions.d.ts +6 -0
  73. package/dist/node/load-functions.js +60 -8
  74. package/dist/node/load-functions.js.map +1 -1
  75. package/dist/node/load-oauth.d.ts +4 -0
  76. package/dist/node/load-oauth.js +126 -0
  77. package/dist/node/load-oauth.js.map +1 -0
  78. package/dist/node/native/engine.d.ts +1 -1
  79. package/dist/node/native/engine.js +45 -14
  80. package/dist/node/native/engine.js.map +1 -1
  81. package/dist/realtime/engine.d.ts +24 -1
  82. package/dist/realtime/engine.js +154 -2
  83. package/dist/realtime/engine.js.map +1 -1
  84. package/dist/rest/build.d.ts +5 -1
  85. package/dist/rest/build.js +17 -8
  86. package/dist/rest/build.js.map +1 -1
  87. package/dist/rest/handler.js +22 -9
  88. package/dist/rest/handler.js.map +1 -1
  89. package/dist/types.d.ts +10 -0
  90. package/dist/types.js.map +1 -1
  91. package/dist/webhooks/service.d.ts +47 -0
  92. package/dist/webhooks/service.js +86 -0
  93. package/dist/webhooks/service.js.map +1 -0
  94. package/package.json +7 -2
@@ -0,0 +1,209 @@
1
+ import { randomToken } from '../jwt.js';
2
+ const PRESETS = {
3
+ google: {
4
+ authorizeUrl: 'https://accounts.google.com/o/oauth2/v2/auth',
5
+ tokenUrl: 'https://oauth2.googleapis.com/token',
6
+ userInfoUrl: 'https://openidconnect.googleapis.com/v1/userinfo',
7
+ scopes: 'openid email profile',
8
+ profileMap: (r) => ({ id: r.sub, email: r.email, name: r.name, metadata: { avatar_url: r.picture, full_name: r.name } }),
9
+ },
10
+ github: {
11
+ authorizeUrl: 'https://github.com/login/oauth/authorize',
12
+ tokenUrl: 'https://github.com/login/oauth/access_token',
13
+ userInfoUrl: 'https://api.github.com/user',
14
+ scopes: 'read:user user:email',
15
+ profileMap: (r) => ({ id: String(r.id), email: r.email, name: r.name ?? r.login, metadata: { avatar_url: r.avatar_url, user_name: r.login } }),
16
+ },
17
+ };
18
+ export function resolveProvider(name, cfg) {
19
+ const preset = PRESETS[name] ?? {};
20
+ const authorizeUrl = cfg.authorizeUrl ?? preset.authorizeUrl;
21
+ const tokenUrl = cfg.tokenUrl ?? preset.tokenUrl;
22
+ const userInfoUrl = cfg.userInfoUrl ?? preset.userInfoUrl;
23
+ if (!authorizeUrl || !tokenUrl || !userInfoUrl) {
24
+ throw new Error(`OAuth provider "${name}" needs authorizeUrl/tokenUrl/userInfoUrl (no preset available)`);
25
+ }
26
+ return {
27
+ name,
28
+ clientId: cfg.clientId,
29
+ clientSecret: cfg.clientSecret,
30
+ authorizeUrl,
31
+ tokenUrl,
32
+ userInfoUrl,
33
+ scopes: cfg.scopes ?? preset.scopes ?? '',
34
+ profileMap: cfg.profileMap ?? preset.profileMap ?? ((r) => ({ id: String(r.id ?? r.sub), email: r.email, name: r.name })),
35
+ };
36
+ }
37
+ export class OAuthService {
38
+ db;
39
+ siteUrl;
40
+ fetchImpl;
41
+ providers = new Map();
42
+ constructor(db, siteUrl, configs, fetchImpl = fetch) {
43
+ this.db = db;
44
+ this.siteUrl = siteUrl;
45
+ this.fetchImpl = fetchImpl;
46
+ for (const [name, cfg] of Object.entries(configs)) {
47
+ this.providers.set(name, resolveProvider(name, cfg));
48
+ }
49
+ }
50
+ has(name) {
51
+ return this.providers.has(name);
52
+ }
53
+ callbackUrl() {
54
+ return `${this.siteUrl}/auth/v1/callback`;
55
+ }
56
+ /** GET /authorize — persist state, redirect to the provider. */
57
+ async authorize(url) {
58
+ const providerName = url.searchParams.get('provider') ?? '';
59
+ const provider = this.providers.get(providerName);
60
+ if (!provider) {
61
+ return redirect(`${this.siteUrl}#error=provider_not_enabled&error_description=${encodeURIComponent(`provider ${providerName} is not configured`)}`);
62
+ }
63
+ const providerState = randomToken(16);
64
+ const scopes = url.searchParams.get('scopes') || provider.scopes;
65
+ await this.db.query(`insert into auth.flow_state (provider, provider_state, redirect_to, code_challenge, code_challenge_method, expires_at)
66
+ values ($1, $2, $3, $4, $5, now() + interval '10 minutes')`, [
67
+ providerName,
68
+ providerState,
69
+ url.searchParams.get('redirect_to') ?? this.siteUrl,
70
+ url.searchParams.get('code_challenge'),
71
+ url.searchParams.get('code_challenge_method'),
72
+ ]);
73
+ const p = new URLSearchParams({
74
+ client_id: provider.clientId,
75
+ redirect_uri: this.callbackUrl(),
76
+ response_type: 'code',
77
+ scope: scopes,
78
+ state: providerState,
79
+ });
80
+ return redirect(`${provider.authorizeUrl}?${p}`);
81
+ }
82
+ /** GET /callback — exchange code, upsert user+identity, redirect back. */
83
+ async callback(url, createSession) {
84
+ const code = url.searchParams.get('code');
85
+ const state = url.searchParams.get('state');
86
+ if (!code || !state)
87
+ return redirect(`${this.siteUrl}#error=invalid_request`);
88
+ const res = await this.db.query(`delete from auth.flow_state where provider_state = $1 and expires_at > now() returning *`, [state]);
89
+ const flow = res.rows[0];
90
+ if (!flow)
91
+ return redirect(`${this.siteUrl}#error=invalid_state`);
92
+ const provider = this.providers.get(flow.provider);
93
+ if (!provider)
94
+ return redirect(`${flow.redirect_to}#error=provider_not_enabled`);
95
+ let profile;
96
+ try {
97
+ const token = await this.exchangeCode(provider, code);
98
+ profile = await this.fetchProfile(provider, token);
99
+ }
100
+ catch (e) {
101
+ const msg = encodeURIComponent(e instanceof Error ? e.message : 'oauth_error');
102
+ return redirect(`${flow.redirect_to}#error=server_error&error_description=${msg}`);
103
+ }
104
+ const userId = await this.upsertUser(provider.name, profile);
105
+ // PKCE: hand back an auth code the client exchanges for a session.
106
+ if (flow.code_challenge) {
107
+ const authCode = randomToken(24);
108
+ await this.db.query(`insert into auth.flow_state (provider, provider_state, redirect_to, code_challenge, code_challenge_method, auth_code, user_id, expires_at)
109
+ values ($1, $2, $3, $4, $5, $6, $7, now() + interval '5 minutes')`, [flow.provider, randomToken(16), flow.redirect_to, flow.code_challenge, flow.code_challenge_method, authCode, userId]);
110
+ return redirect(`${flow.redirect_to}?code=${authCode}`);
111
+ }
112
+ // implicit: tokens in the URL fragment
113
+ const session = await createSession(userId);
114
+ const hash = `#access_token=${session.access_token}&refresh_token=${session.refresh_token}&expires_in=${session.expires_in}&token_type=bearer&provider_token=`;
115
+ return redirect(`${flow.redirect_to}${hash}`);
116
+ }
117
+ /** POST /token?grant_type=pkce — exchange an auth code + verifier for a session. */
118
+ async exchangePkce(authCode, verifier) {
119
+ const res = await this.db.query(`delete from auth.flow_state where auth_code = $1 and expires_at > now() returning *`, [authCode]);
120
+ const flow = res.rows[0];
121
+ if (!flow || !flow.user_id)
122
+ return null;
123
+ if (flow.code_challenge_method === 's256' || flow.code_challenge_method === 'S256') {
124
+ const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(verifier));
125
+ const challenge = base64url(new Uint8Array(digest));
126
+ if (challenge !== flow.code_challenge)
127
+ return null;
128
+ }
129
+ else if (flow.code_challenge && flow.code_challenge !== verifier) {
130
+ return null; // plain method
131
+ }
132
+ return flow.user_id;
133
+ }
134
+ async exchangeCode(provider, code) {
135
+ const body = new URLSearchParams({
136
+ client_id: provider.clientId,
137
+ client_secret: provider.clientSecret,
138
+ code,
139
+ redirect_uri: this.callbackUrl(),
140
+ grant_type: 'authorization_code',
141
+ });
142
+ const res = await this.fetchImpl(provider.tokenUrl, {
143
+ method: 'POST',
144
+ headers: { 'content-type': 'application/x-www-form-urlencoded', accept: 'application/json' },
145
+ body,
146
+ });
147
+ if (!res.ok)
148
+ throw new Error(`token exchange failed: HTTP ${res.status}`);
149
+ const json = (await res.json());
150
+ if (!json.access_token)
151
+ throw new Error('no access_token from provider');
152
+ return json.access_token;
153
+ }
154
+ async fetchProfile(provider, token) {
155
+ const res = await this.fetchImpl(provider.userInfoUrl, {
156
+ headers: { authorization: `Bearer ${token}`, accept: 'application/json', 'user-agent': 'tinbase' },
157
+ });
158
+ if (!res.ok)
159
+ throw new Error(`userinfo failed: HTTP ${res.status}`);
160
+ const profile = provider.profileMap(await res.json());
161
+ if (!profile.id)
162
+ throw new Error('provider profile missing id');
163
+ return profile;
164
+ }
165
+ async upsertUser(provider, profile) {
166
+ // existing identity?
167
+ const existing = await this.db.query(`select user_id from auth.identities where provider = $1 and provider_id = $2`, [provider, profile.id]);
168
+ if (existing.rows[0]) {
169
+ await this.db.query(`update auth.identities set last_sign_in_at = now(), identity_data = $3 where provider = $1 and provider_id = $2`, [
170
+ provider,
171
+ profile.id,
172
+ JSON.stringify({ sub: profile.id, email: profile.email, ...profile.metadata }),
173
+ ]);
174
+ await this.db.query(`update auth.users set last_sign_in_at = now() where id = $1`, [existing.rows[0].user_id]);
175
+ return existing.rows[0].user_id;
176
+ }
177
+ // link to an existing user with the same email, else create one
178
+ let userId;
179
+ if (profile.email) {
180
+ const byEmail = await this.db.query(`select id from auth.users where email = $1`, [
181
+ profile.email.toLowerCase(),
182
+ ]);
183
+ userId = byEmail.rows[0]?.id;
184
+ }
185
+ if (!userId) {
186
+ const created = await this.db.query(`insert into auth.users (aud, role, email, email_confirmed_at, last_sign_in_at, raw_app_meta_data, raw_user_meta_data)
187
+ values ('authenticated','authenticated',$1, now(), now(),
188
+ $2::jsonb, $3::jsonb) returning id`, [
189
+ profile.email?.toLowerCase() ?? null,
190
+ JSON.stringify({ provider, providers: [provider] }),
191
+ JSON.stringify({ sub: profile.id, email: profile.email, full_name: profile.name, ...profile.metadata }),
192
+ ]);
193
+ userId = created.rows[0].id;
194
+ }
195
+ await this.db.query(`insert into auth.identities (user_id, provider, provider_id, identity_data)
196
+ values ($1, $2, $3, $4::jsonb)`, [userId, provider, profile.id, JSON.stringify({ sub: profile.id, email: profile.email, ...profile.metadata })]);
197
+ return userId;
198
+ }
199
+ }
200
+ function redirect(location) {
201
+ return new Response(null, { status: 303, headers: { location } });
202
+ }
203
+ function base64url(bytes) {
204
+ let bin = '';
205
+ for (const b of bytes)
206
+ bin += String.fromCharCode(b);
207
+ return btoa(bin).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
208
+ }
209
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/auth/oauth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Minimal QR Code generator (byte mode, full version/ECC/mask support) used to
3
+ * render the MFA enrollment otpauth:// URI as a scannable SVG. Compact port of
4
+ * Nayuki's public-domain "QR Code generator" algorithm — no dependencies.
5
+ * Source of the algorithm: https://www.nayuki.io/page/qr-code-generator-library
6
+ */
7
+ /** Encode `text` as a QR SVG data URI (works directly as an <img src>). */
8
+ export declare function qrSvgDataUri(text: string): string;
@@ -0,0 +1,376 @@
1
+ /**
2
+ * Minimal QR Code generator (byte mode, full version/ECC/mask support) used to
3
+ * render the MFA enrollment otpauth:// URI as a scannable SVG. Compact port of
4
+ * Nayuki's public-domain "QR Code generator" algorithm — no dependencies.
5
+ * Source of the algorithm: https://www.nayuki.io/page/qr-code-generator-library
6
+ */
7
+ // Error-correction level → format bits. We use M (medium) like GoTrue.
8
+ const ECC_M = { ordinal: 0, formatBits: 0 };
9
+ const ECC_CODEWORDS_PER_BLOCK = [
10
+ // index by version (1..40); level M row
11
+ -1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
12
+ ];
13
+ const NUM_ERROR_CORRECTION_BLOCKS = [
14
+ -1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49,
15
+ ];
16
+ function getNumRawDataModules(ver) {
17
+ let result = (16 * ver + 128) * ver + 64;
18
+ if (ver >= 2) {
19
+ const numAlign = Math.floor(ver / 7) + 2;
20
+ result -= (25 * numAlign - 10) * numAlign - 55;
21
+ if (ver >= 7)
22
+ result -= 36;
23
+ }
24
+ return result;
25
+ }
26
+ function getNumDataCodewords(ver) {
27
+ return (Math.floor(getNumRawDataModules(ver) / 8) -
28
+ ECC_CODEWORDS_PER_BLOCK[ver] * NUM_ERROR_CORRECTION_BLOCKS[ver]);
29
+ }
30
+ // ── Reed-Solomon over GF(256) ──────────────────────────────────────────────
31
+ function reedSolomonComputeDivisor(degree) {
32
+ const result = new Uint8Array(degree);
33
+ result[degree - 1] = 1;
34
+ let root = 1;
35
+ for (let i = 0; i < degree; i++) {
36
+ for (let j = 0; j < result.length; j++) {
37
+ result[j] = reedSolomonMultiply(result[j], root);
38
+ if (j + 1 < result.length)
39
+ result[j] ^= result[j + 1];
40
+ }
41
+ root = reedSolomonMultiply(root, 0x02);
42
+ }
43
+ return result;
44
+ }
45
+ function reedSolomonComputeRemainder(data, divisor) {
46
+ const result = new Uint8Array(divisor.length);
47
+ for (const b of data) {
48
+ const factor = b ^ result[0];
49
+ result.copyWithin(0, 1);
50
+ result[result.length - 1] = 0;
51
+ for (let i = 0; i < result.length; i++)
52
+ result[i] ^= reedSolomonMultiply(divisor[i], factor);
53
+ }
54
+ return result;
55
+ }
56
+ function reedSolomonMultiply(x, y) {
57
+ let z = 0;
58
+ for (let i = 7; i >= 0; i--) {
59
+ z = (z << 1) ^ ((z >>> 7) * 0x11d);
60
+ z ^= ((y >>> i) & 1) * x;
61
+ }
62
+ return z & 0xff;
63
+ }
64
+ class QrCode {
65
+ version;
66
+ size;
67
+ modules;
68
+ isFunction;
69
+ static encodeText(text) {
70
+ const bytes = new TextEncoder().encode(text);
71
+ // byte-mode segment bit length = 4 (mode) + charCountBits + 8*len
72
+ let version = 1;
73
+ for (; version <= 40; version++) {
74
+ const dataCapacityBits = getNumDataCodewords(version) * 8;
75
+ const ccBits = version < 10 ? 8 : 16;
76
+ const usedBits = 4 + ccBits + bytes.length * 8;
77
+ if (usedBits <= dataCapacityBits)
78
+ break;
79
+ }
80
+ if (version > 40)
81
+ throw new Error('QR data too long');
82
+ const bb = [];
83
+ const append = (val, len) => {
84
+ for (let i = len - 1; i >= 0; i--)
85
+ bb.push((val >>> i) & 1);
86
+ };
87
+ append(0x4, 4); // byte mode
88
+ append(bytes.length, version < 10 ? 8 : 16);
89
+ for (const b of bytes)
90
+ append(b, 8);
91
+ const dataCapacityBits = getNumDataCodewords(version) * 8;
92
+ append(0, Math.min(4, dataCapacityBits - bb.length));
93
+ while (bb.length % 8 !== 0)
94
+ bb.push(0);
95
+ for (let pad = 0xec; bb.length < dataCapacityBits; pad ^= 0xec ^ 0x11)
96
+ append(pad, 8);
97
+ const dataCodewords = new Uint8Array(bb.length / 8);
98
+ for (let i = 0; i < bb.length; i++)
99
+ dataCodewords[i >>> 3] |= bb[i] << (7 - (i & 7));
100
+ return new QrCode(version, dataCodewords);
101
+ }
102
+ constructor(version, dataCodewords) {
103
+ this.version = version;
104
+ this.size = version * 4 + 17;
105
+ const row = () => new Array(this.size).fill(false);
106
+ this.modules = Array.from({ length: this.size }, row);
107
+ this.isFunction = Array.from({ length: this.size }, row);
108
+ this.drawFunctionPatterns();
109
+ const allCodewords = this.addEccAndInterleave(dataCodewords);
110
+ this.drawCodewords(allCodewords);
111
+ // pick the mask with the lowest penalty (all masks are valid; this is polish)
112
+ let minPenalty = Infinity;
113
+ let bestMask = 0;
114
+ for (let mask = 0; mask < 8; mask++) {
115
+ this.applyMask(mask);
116
+ this.drawFormatBits(mask);
117
+ const penalty = this.getPenaltyScore();
118
+ if (penalty < minPenalty) {
119
+ bestMask = mask;
120
+ minPenalty = penalty;
121
+ }
122
+ this.applyMask(mask); // undo
123
+ }
124
+ this.applyMask(bestMask);
125
+ this.drawFormatBits(bestMask);
126
+ }
127
+ getModule(x, y) {
128
+ return x >= 0 && x < this.size && y >= 0 && y < this.size && this.modules[y][x];
129
+ }
130
+ setFunctionModule(x, y, isDark) {
131
+ this.modules[y][x] = isDark;
132
+ this.isFunction[y][x] = true;
133
+ }
134
+ drawFunctionPatterns() {
135
+ for (let i = 0; i < this.size; i++) {
136
+ this.setFunctionModule(6, i, i % 2 === 0);
137
+ this.setFunctionModule(i, 6, i % 2 === 0);
138
+ }
139
+ this.drawFinderPattern(3, 3);
140
+ this.drawFinderPattern(this.size - 4, 3);
141
+ this.drawFinderPattern(3, this.size - 4);
142
+ const alignPos = this.getAlignmentPatternPositions();
143
+ const n = alignPos.length;
144
+ for (let i = 0; i < n; i++) {
145
+ for (let j = 0; j < n; j++) {
146
+ if (!((i === 0 && j === 0) || (i === 0 && j === n - 1) || (i === n - 1 && j === 0)))
147
+ this.drawAlignmentPattern(alignPos[i], alignPos[j]);
148
+ }
149
+ }
150
+ this.drawFormatBits(0);
151
+ this.drawVersion();
152
+ }
153
+ drawFormatBits(mask) {
154
+ const data = (ECC_M.formatBits << 3) | mask;
155
+ let rem = data;
156
+ for (let i = 0; i < 10; i++)
157
+ rem = (rem << 1) ^ ((rem >>> 9) * 0x537);
158
+ const bits = ((data << 10) | rem) ^ 0x5412;
159
+ for (let i = 0; i <= 5; i++)
160
+ this.setFunctionModule(8, i, ((bits >>> i) & 1) !== 0);
161
+ this.setFunctionModule(8, 7, ((bits >>> 6) & 1) !== 0);
162
+ this.setFunctionModule(8, 8, ((bits >>> 7) & 1) !== 0);
163
+ this.setFunctionModule(7, 8, ((bits >>> 8) & 1) !== 0);
164
+ for (let i = 9; i < 15; i++)
165
+ this.setFunctionModule(14 - i, 8, ((bits >>> i) & 1) !== 0);
166
+ for (let i = 0; i < 8; i++)
167
+ this.setFunctionModule(this.size - 1 - i, 8, ((bits >>> i) & 1) !== 0);
168
+ for (let i = 8; i < 15; i++)
169
+ this.setFunctionModule(8, this.size - 15 + i, ((bits >>> i) & 1) !== 0);
170
+ this.setFunctionModule(8, this.size - 8, true);
171
+ }
172
+ drawVersion() {
173
+ if (this.version < 7)
174
+ return;
175
+ let rem = this.version;
176
+ for (let i = 0; i < 12; i++)
177
+ rem = (rem << 1) ^ ((rem >>> 11) * 0x1f25);
178
+ const bits = (this.version << 12) | rem;
179
+ for (let i = 0; i < 18; i++) {
180
+ const bit = ((bits >>> i) & 1) !== 0;
181
+ const a = this.size - 11 + (i % 3);
182
+ const b = Math.floor(i / 3);
183
+ this.setFunctionModule(a, b, bit);
184
+ this.setFunctionModule(b, a, bit);
185
+ }
186
+ }
187
+ drawFinderPattern(x, y) {
188
+ for (let dy = -4; dy <= 4; dy++) {
189
+ for (let dx = -4; dx <= 4; dx++) {
190
+ const dist = Math.max(Math.abs(dx), Math.abs(dy));
191
+ const xx = x + dx;
192
+ const yy = y + dy;
193
+ if (xx >= 0 && xx < this.size && yy >= 0 && yy < this.size)
194
+ this.setFunctionModule(xx, yy, dist !== 2 && dist !== 4);
195
+ }
196
+ }
197
+ }
198
+ drawAlignmentPattern(x, y) {
199
+ for (let dy = -2; dy <= 2; dy++)
200
+ for (let dx = -2; dx <= 2; dx++)
201
+ this.setFunctionModule(x + dx, y + dy, Math.max(Math.abs(dx), Math.abs(dy)) !== 1);
202
+ }
203
+ getAlignmentPatternPositions() {
204
+ if (this.version === 1)
205
+ return [];
206
+ const numAlign = Math.floor(this.version / 7) + 2;
207
+ const step = Math.floor((this.version * 8 + numAlign * 3 + 5) / (numAlign * 4 - 4)) * 2;
208
+ const result = [6];
209
+ for (let pos = this.size - 7; result.length < numAlign; pos -= step)
210
+ result.splice(1, 0, pos);
211
+ return result;
212
+ }
213
+ addEccAndInterleave(data) {
214
+ const ver = this.version;
215
+ const numBlocks = NUM_ERROR_CORRECTION_BLOCKS[ver];
216
+ const blockEccLen = ECC_CODEWORDS_PER_BLOCK[ver];
217
+ const rawCodewords = Math.floor(getNumRawDataModules(ver) / 8);
218
+ const numShortBlocks = numBlocks - (rawCodewords % numBlocks);
219
+ const shortBlockLen = Math.floor(rawCodewords / numBlocks);
220
+ const blocks = [];
221
+ const rsDiv = reedSolomonComputeDivisor(blockEccLen);
222
+ let k = 0;
223
+ for (let i = 0; i < numBlocks; i++) {
224
+ const datLen = shortBlockLen - blockEccLen + (i < numShortBlocks ? 0 : 1);
225
+ const dat = data.slice(k, k + datLen);
226
+ k += datLen;
227
+ const ecc = reedSolomonComputeRemainder(dat, rsDiv);
228
+ const block = new Uint8Array(shortBlockLen + 1);
229
+ block.set(dat, 0);
230
+ block.set(ecc, block.length - blockEccLen);
231
+ blocks.push(block);
232
+ }
233
+ const result = new Uint8Array(rawCodewords);
234
+ let ri = 0;
235
+ for (let i = 0; i < blocks[0].length; i++) {
236
+ for (let j = 0; j < blocks.length; j++) {
237
+ // skip the unused cell in short blocks' data region
238
+ if (i !== shortBlockLen - blockEccLen || j >= numShortBlocks) {
239
+ result[ri++] = blocks[j][i];
240
+ }
241
+ }
242
+ }
243
+ return result;
244
+ }
245
+ drawCodewords(data) {
246
+ let i = 0;
247
+ for (let right = this.size - 1; right >= 1; right -= 2) {
248
+ if (right === 6)
249
+ right = 5;
250
+ for (let vert = 0; vert < this.size; vert++) {
251
+ for (let j = 0; j < 2; j++) {
252
+ const x = right - j;
253
+ const upward = ((right + 1) & 2) === 0;
254
+ const y = upward ? this.size - 1 - vert : vert;
255
+ if (!this.isFunction[y][x] && i < data.length * 8) {
256
+ this.modules[y][x] = ((data[i >>> 3] >>> (7 - (i & 7))) & 1) !== 0;
257
+ i++;
258
+ }
259
+ }
260
+ }
261
+ }
262
+ }
263
+ applyMask(mask) {
264
+ for (let y = 0; y < this.size; y++) {
265
+ for (let x = 0; x < this.size; x++) {
266
+ let invert = false;
267
+ switch (mask) {
268
+ case 0:
269
+ invert = (x + y) % 2 === 0;
270
+ break;
271
+ case 1:
272
+ invert = y % 2 === 0;
273
+ break;
274
+ case 2:
275
+ invert = x % 3 === 0;
276
+ break;
277
+ case 3:
278
+ invert = (x + y) % 3 === 0;
279
+ break;
280
+ case 4:
281
+ invert = (Math.floor(x / 3) + Math.floor(y / 2)) % 2 === 0;
282
+ break;
283
+ case 5:
284
+ invert = ((x * y) % 2) + ((x * y) % 3) === 0;
285
+ break;
286
+ case 6:
287
+ invert = (((x * y) % 2) + ((x * y) % 3)) % 2 === 0;
288
+ break;
289
+ case 7:
290
+ invert = (((x + y) % 2) + ((x * y) % 3)) % 2 === 0;
291
+ break;
292
+ }
293
+ if (invert && !this.isFunction[y][x])
294
+ this.modules[y][x] = !this.modules[y][x];
295
+ }
296
+ }
297
+ }
298
+ getPenaltyScore() {
299
+ let result = 0;
300
+ const size = this.size;
301
+ // adjacent same-color runs in rows/columns
302
+ for (let y = 0; y < size; y++) {
303
+ let runColor = false;
304
+ let runLen = 0;
305
+ for (let x = 0; x < size; x++) {
306
+ if (this.modules[y][x] === runColor) {
307
+ runLen++;
308
+ if (runLen === 5)
309
+ result += 3;
310
+ else if (runLen > 5)
311
+ result++;
312
+ }
313
+ else {
314
+ runColor = this.modules[y][x];
315
+ runLen = 1;
316
+ }
317
+ }
318
+ }
319
+ for (let x = 0; x < size; x++) {
320
+ let runColor = false;
321
+ let runLen = 0;
322
+ for (let y = 0; y < size; y++) {
323
+ if (this.modules[y][x] === runColor) {
324
+ runLen++;
325
+ if (runLen === 5)
326
+ result += 3;
327
+ else if (runLen > 5)
328
+ result++;
329
+ }
330
+ else {
331
+ runColor = this.modules[y][x];
332
+ runLen = 1;
333
+ }
334
+ }
335
+ }
336
+ // 2x2 blocks
337
+ for (let y = 0; y < size - 1; y++) {
338
+ for (let x = 0; x < size - 1; x++) {
339
+ const c = this.modules[y][x];
340
+ if (c === this.modules[y][x + 1] && c === this.modules[y + 1][x] && c === this.modules[y + 1][x + 1])
341
+ result += 3;
342
+ }
343
+ }
344
+ // proportion of dark modules
345
+ let dark = 0;
346
+ for (const rowArr of this.modules)
347
+ for (const v of rowArr)
348
+ if (v)
349
+ dark++;
350
+ const total = size * size;
351
+ const k = Math.ceil(Math.abs(dark * 20 - total * 10) / total) - 1;
352
+ result += k * 10;
353
+ return result;
354
+ }
355
+ /** Render as an SVG string with a quiet-zone border (module units). */
356
+ toSvgString(border) {
357
+ const dim = this.size + border * 2;
358
+ const parts = [];
359
+ for (let y = 0; y < this.size; y++) {
360
+ for (let x = 0; x < this.size; x++) {
361
+ if (this.modules[y][x])
362
+ parts.push(`M${x + border},${y + border}h1v1h-1z`);
363
+ }
364
+ }
365
+ return (`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${dim} ${dim}" shape-rendering="crispEdges">` +
366
+ `<rect width="${dim}" height="${dim}" fill="#ffffff"/>` +
367
+ `<path d="${parts.join('')}" fill="#000000"/>` +
368
+ `</svg>`);
369
+ }
370
+ }
371
+ /** Encode `text` as a QR SVG data URI (works directly as an <img src>). */
372
+ export function qrSvgDataUri(text) {
373
+ const svg = QrCode.encodeText(text).toSvgString(4);
374
+ return `data:image/svg+xml;utf8,${encodeURIComponent(svg)}`;
375
+ }
376
+ //# sourceMappingURL=qr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qr.js","sourceRoot":"","sources":["../../src/auth/qr.ts"],"names":[],"mappings":"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"}