@thru/passkey 0.2.13 → 0.2.14
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/README.md +73 -90
- package/dist/auth.cjs +672 -0
- package/dist/auth.cjs.map +1 -0
- package/dist/auth.d.cts +60 -0
- package/dist/auth.d.ts +60 -0
- package/dist/auth.js +422 -0
- package/dist/auth.js.map +1 -0
- package/dist/chunk-2JHC7OOH.js +250 -0
- package/dist/chunk-2JHC7OOH.js.map +1 -0
- package/dist/chunk-75G2FPYW.js +54 -0
- package/dist/chunk-75G2FPYW.js.map +1 -0
- package/dist/chunk-B5SN7AS7.js +586 -0
- package/dist/chunk-B5SN7AS7.js.map +1 -0
- package/dist/chunk-LNDWK3FA.js +163 -0
- package/dist/chunk-LNDWK3FA.js.map +1 -0
- package/dist/index.cjs +27 -94
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -187
- package/dist/index.d.ts +4 -187
- package/dist/index.js +47 -810
- package/dist/index.js.map +1 -1
- package/dist/mobile.cjs +301 -0
- package/dist/mobile.cjs.map +1 -0
- package/dist/mobile.d.cts +49 -0
- package/dist/mobile.d.ts +49 -0
- package/dist/mobile.js +41 -0
- package/dist/mobile.js.map +1 -0
- package/dist/popup.cjs +247 -0
- package/dist/popup.cjs.map +1 -0
- package/dist/popup.d.cts +22 -0
- package/dist/popup.d.ts +22 -0
- package/dist/popup.js +31 -0
- package/dist/popup.js.map +1 -0
- package/dist/server.cjs +351 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.cts +119 -0
- package/dist/server.d.ts +119 -0
- package/dist/server.js +340 -0
- package/dist/server.js.map +1 -0
- package/dist/types-_HRzmn-j.d.cts +125 -0
- package/dist/types-_HRzmn-j.d.ts +125 -0
- package/dist/web.cjs +758 -0
- package/dist/web.cjs.map +1 -0
- package/dist/web.d.cts +32 -0
- package/dist/web.d.ts +32 -0
- package/dist/web.js +60 -0
- package/dist/web.js.map +1 -0
- package/package.json +47 -2
- package/src/auth/execute-tx.ts +87 -0
- package/src/auth/index.ts +18 -0
- package/src/auth/types.ts +56 -0
- package/src/auth/use-passkey-auth.ts +428 -0
- package/src/index.ts +37 -39
- package/src/mobile/errors.ts +31 -0
- package/src/mobile/index.ts +33 -0
- package/src/mobile/passkey.ts +154 -0
- package/src/mobile/storage.ts +115 -0
- package/src/mobile/types.ts +24 -0
- package/src/popup-entry.ts +33 -0
- package/src/popup-service.ts +0 -103
- package/src/server/challenge.ts +26 -0
- package/src/server/create-wallet.ts +149 -0
- package/src/server/handlers.ts +93 -0
- package/src/server/index.ts +13 -0
- package/src/server/submit.ts +47 -0
- package/src/server/types.ts +70 -0
- package/src/server/utils.ts +69 -0
- package/src/types.ts +1 -0
- package/src/web.ts +51 -0
- package/tsconfig.json +6 -1
- package/tsup.config.ts +9 -1
package/dist/popup.cjs
ADDED
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/popup-entry.ts
|
|
21
|
+
var popup_entry_exports = {};
|
|
22
|
+
__export(popup_entry_exports, {
|
|
23
|
+
PASSKEY_POPUP_CHANNEL: () => PASSKEY_POPUP_CHANNEL,
|
|
24
|
+
PASSKEY_POPUP_PATH: () => PASSKEY_POPUP_PATH,
|
|
25
|
+
PASSKEY_POPUP_READY_EVENT: () => PASSKEY_POPUP_READY_EVENT,
|
|
26
|
+
PASSKEY_POPUP_REQUEST_EVENT: () => PASSKEY_POPUP_REQUEST_EVENT,
|
|
27
|
+
PASSKEY_POPUP_RESPONSE_EVENT: () => PASSKEY_POPUP_RESPONSE_EVENT,
|
|
28
|
+
buildSuccessResponse: () => buildSuccessResponse,
|
|
29
|
+
closePopup: () => closePopup,
|
|
30
|
+
decodeChallenge: () => decodeChallenge,
|
|
31
|
+
getResponseError: () => getResponseError,
|
|
32
|
+
openPasskeyPopupWindow: () => openPasskeyPopupWindow,
|
|
33
|
+
requestPasskeyPopup: () => requestPasskeyPopup,
|
|
34
|
+
toPopupSigningResult: () => toPopupSigningResult
|
|
35
|
+
});
|
|
36
|
+
module.exports = __toCommonJS(popup_entry_exports);
|
|
37
|
+
|
|
38
|
+
// src/popup.ts
|
|
39
|
+
var PASSKEY_POPUP_PATH = "/passkey/popup";
|
|
40
|
+
var PASSKEY_POPUP_READY_EVENT = "thru:passkey-popup-ready";
|
|
41
|
+
var PASSKEY_POPUP_REQUEST_EVENT = "thru:passkey-popup-request";
|
|
42
|
+
var PASSKEY_POPUP_RESPONSE_EVENT = "thru:passkey-popup-response";
|
|
43
|
+
var PASSKEY_POPUP_CHANNEL = "thru:passkey-popup-channel";
|
|
44
|
+
var PASSKEY_POPUP_TIMEOUT_MS = 6e4;
|
|
45
|
+
function closePopup(popup) {
|
|
46
|
+
if (popup && !popup.closed) {
|
|
47
|
+
popup.close();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function openPasskeyPopupWindow() {
|
|
51
|
+
const popupUrl = new URL(PASSKEY_POPUP_PATH, window.location.origin).toString();
|
|
52
|
+
const popup = window.open(
|
|
53
|
+
popupUrl,
|
|
54
|
+
"thru_passkey_popup",
|
|
55
|
+
"popup=yes,width=440,height=640"
|
|
56
|
+
);
|
|
57
|
+
if (!popup) {
|
|
58
|
+
throw new Error("Passkey popup was blocked");
|
|
59
|
+
}
|
|
60
|
+
return popup;
|
|
61
|
+
}
|
|
62
|
+
function createPopupRequestId() {
|
|
63
|
+
const rand = Math.random().toString(36).slice(2, 10);
|
|
64
|
+
return `passkey_${Date.now()}_${rand}`;
|
|
65
|
+
}
|
|
66
|
+
async function requestPasskeyPopup(action, payload, preopenedPopup) {
|
|
67
|
+
if (typeof window === "undefined") {
|
|
68
|
+
throw new Error("Passkey popup is only available in the browser");
|
|
69
|
+
}
|
|
70
|
+
const requestId = createPopupRequestId();
|
|
71
|
+
const targetOrigin = window.location.origin;
|
|
72
|
+
let popup = preopenedPopup ?? null;
|
|
73
|
+
const channel = typeof BroadcastChannel !== "undefined" ? new BroadcastChannel(PASSKEY_POPUP_CHANNEL) : null;
|
|
74
|
+
return new Promise((resolve, reject) => {
|
|
75
|
+
let timeout = null;
|
|
76
|
+
let closePoll = null;
|
|
77
|
+
let requestSent = false;
|
|
78
|
+
const cleanup = () => {
|
|
79
|
+
if (timeout) {
|
|
80
|
+
clearTimeout(timeout);
|
|
81
|
+
timeout = null;
|
|
82
|
+
}
|
|
83
|
+
if (closePoll) {
|
|
84
|
+
clearInterval(closePoll);
|
|
85
|
+
closePoll = null;
|
|
86
|
+
}
|
|
87
|
+
window.removeEventListener("message", handleMessage);
|
|
88
|
+
if (channel) {
|
|
89
|
+
channel.removeEventListener("message", handleChannelMessage);
|
|
90
|
+
channel.close();
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
const sendRequest = (viaChannel) => {
|
|
94
|
+
if (requestSent) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
requestSent = true;
|
|
98
|
+
const request = {
|
|
99
|
+
type: PASSKEY_POPUP_REQUEST_EVENT,
|
|
100
|
+
requestId,
|
|
101
|
+
action,
|
|
102
|
+
payload
|
|
103
|
+
};
|
|
104
|
+
if (viaChannel) {
|
|
105
|
+
channel?.postMessage(request);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
popup?.postMessage(request, targetOrigin);
|
|
109
|
+
};
|
|
110
|
+
const handleResponse = (data) => {
|
|
111
|
+
if (data.requestId !== requestId) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
cleanup();
|
|
115
|
+
if (popup && !popup.closed) {
|
|
116
|
+
popup.close();
|
|
117
|
+
}
|
|
118
|
+
if (data.success) {
|
|
119
|
+
resolve(data.result);
|
|
120
|
+
} else {
|
|
121
|
+
const err = new Error(data.error?.message || "Passkey popup failed");
|
|
122
|
+
if (data.error?.name) {
|
|
123
|
+
err.name = data.error.name;
|
|
124
|
+
}
|
|
125
|
+
reject(err);
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
const handleMessage = (event) => {
|
|
129
|
+
if (event.origin !== targetOrigin) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const data = event.data;
|
|
133
|
+
if (!data || typeof data !== "object") {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (data.type === PASSKEY_POPUP_READY_EVENT) {
|
|
137
|
+
if (popup && event.source !== popup) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
sendRequest(false);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if (data.type === PASSKEY_POPUP_RESPONSE_EVENT && "requestId" in data) {
|
|
144
|
+
handleResponse(data);
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
window.addEventListener("message", handleMessage);
|
|
148
|
+
const handleChannelMessage = (event) => {
|
|
149
|
+
const data = event.data;
|
|
150
|
+
if (!data || typeof data !== "object") {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
if (data.type === PASSKEY_POPUP_READY_EVENT) {
|
|
154
|
+
sendRequest(true);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
if (data.type === PASSKEY_POPUP_RESPONSE_EVENT && "requestId" in data) {
|
|
158
|
+
handleResponse(data);
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
if (channel) {
|
|
162
|
+
channel.addEventListener("message", handleChannelMessage);
|
|
163
|
+
}
|
|
164
|
+
if (!popup) {
|
|
165
|
+
try {
|
|
166
|
+
popup = openPasskeyPopupWindow();
|
|
167
|
+
} catch (error) {
|
|
168
|
+
cleanup();
|
|
169
|
+
reject(error);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
timeout = setTimeout(() => {
|
|
174
|
+
cleanup();
|
|
175
|
+
try {
|
|
176
|
+
popup?.close();
|
|
177
|
+
} catch {
|
|
178
|
+
}
|
|
179
|
+
reject(new Error("Passkey popup timed out"));
|
|
180
|
+
}, PASSKEY_POPUP_TIMEOUT_MS);
|
|
181
|
+
closePoll = setInterval(() => {
|
|
182
|
+
if (popup && popup.closed) {
|
|
183
|
+
cleanup();
|
|
184
|
+
reject(new Error("Passkey popup was closed"));
|
|
185
|
+
}
|
|
186
|
+
}, 250);
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// src/popup-service.ts
|
|
191
|
+
var import_passkey_manager = require("@thru/passkey-manager");
|
|
192
|
+
function toPopupSigningResult(result) {
|
|
193
|
+
return {
|
|
194
|
+
signatureBase64Url: (0, import_passkey_manager.bytesToBase64Url)(result.signature),
|
|
195
|
+
authenticatorDataBase64Url: (0, import_passkey_manager.bytesToBase64Url)(result.authenticatorData),
|
|
196
|
+
clientDataJSONBase64Url: (0, import_passkey_manager.bytesToBase64Url)(result.clientDataJSON),
|
|
197
|
+
signatureRBase64Url: (0, import_passkey_manager.bytesToBase64Url)(result.signatureR),
|
|
198
|
+
signatureSBase64Url: (0, import_passkey_manager.bytesToBase64Url)(result.signatureS)
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
function buildSuccessResponse(requestId, action, result) {
|
|
202
|
+
return {
|
|
203
|
+
type: PASSKEY_POPUP_RESPONSE_EVENT,
|
|
204
|
+
requestId,
|
|
205
|
+
action,
|
|
206
|
+
success: true,
|
|
207
|
+
result
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
function decodeChallenge(base64Url) {
|
|
211
|
+
return (0, import_passkey_manager.base64UrlToBytes)(base64Url);
|
|
212
|
+
}
|
|
213
|
+
function getResponseError(action, error) {
|
|
214
|
+
const { name, message } = normalizeError(error);
|
|
215
|
+
const actionLabel = `Popup ${action}`;
|
|
216
|
+
const messageText = message || "Passkey popup failed";
|
|
217
|
+
const detailedMessage = messageText.includes("Popup") ? messageText : `${actionLabel}: ${messageText}`;
|
|
218
|
+
return {
|
|
219
|
+
name,
|
|
220
|
+
message: detailedMessage
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
function normalizeError(error) {
|
|
224
|
+
const name = error && typeof error === "object" && "name" in error ? String(error.name) : "";
|
|
225
|
+
const message = error && typeof error === "object" && "message" in error ? String(error.message) : "";
|
|
226
|
+
return {
|
|
227
|
+
name,
|
|
228
|
+
message,
|
|
229
|
+
normalized: `${name} ${message}`.toLowerCase()
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
233
|
+
0 && (module.exports = {
|
|
234
|
+
PASSKEY_POPUP_CHANNEL,
|
|
235
|
+
PASSKEY_POPUP_PATH,
|
|
236
|
+
PASSKEY_POPUP_READY_EVENT,
|
|
237
|
+
PASSKEY_POPUP_REQUEST_EVENT,
|
|
238
|
+
PASSKEY_POPUP_RESPONSE_EVENT,
|
|
239
|
+
buildSuccessResponse,
|
|
240
|
+
closePopup,
|
|
241
|
+
decodeChallenge,
|
|
242
|
+
getResponseError,
|
|
243
|
+
openPasskeyPopupWindow,
|
|
244
|
+
requestPasskeyPopup,
|
|
245
|
+
toPopupSigningResult
|
|
246
|
+
});
|
|
247
|
+
//# sourceMappingURL=popup.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/popup-entry.ts","../src/popup.ts","../src/popup-service.ts"],"sourcesContent":["export type {\n PasskeyPopupAction,\n PasskeyPopupGetRequestPayload,\n PasskeyPopupCreateRequestPayload,\n PasskeyPopupGetStoredRequestPayload,\n PasskeyPopupRequestPayload,\n PasskeyPopupRequest,\n PasskeyPopupSigningResult,\n PasskeyPopupStoredPasskey,\n PasskeyPopupStoredSigningResult,\n PasskeyPopupRegistrationResult,\n PasskeyPopupResponse,\n PasskeyPopupContext,\n PasskeyPopupAccount,\n} from './types';\n\nexport {\n PASSKEY_POPUP_PATH,\n PASSKEY_POPUP_READY_EVENT,\n PASSKEY_POPUP_REQUEST_EVENT,\n PASSKEY_POPUP_RESPONSE_EVENT,\n PASSKEY_POPUP_CHANNEL,\n openPasskeyPopupWindow,\n closePopup,\n requestPasskeyPopup,\n} from './popup';\n\nexport {\n toPopupSigningResult,\n buildSuccessResponse,\n decodeChallenge,\n getResponseError,\n} from './popup-service';\n","import type {\n PasskeyPopupAction,\n PasskeyPopupRequestPayload,\n PasskeyPopupRequest,\n PasskeyPopupResponse,\n} from './types';\n\nexport const PASSKEY_POPUP_PATH = '/passkey/popup';\nexport const PASSKEY_POPUP_READY_EVENT = 'thru:passkey-popup-ready';\nexport const PASSKEY_POPUP_REQUEST_EVENT = 'thru:passkey-popup-request';\nexport const PASSKEY_POPUP_RESPONSE_EVENT = 'thru:passkey-popup-response';\nexport const PASSKEY_POPUP_CHANNEL = 'thru:passkey-popup-channel';\n\nconst PASSKEY_POPUP_TIMEOUT_MS = 60000;\n\nexport function closePopup(popup: Window | null | undefined): void {\n if (popup && !popup.closed) {\n popup.close();\n }\n}\n\nexport function openPasskeyPopupWindow(): Window {\n const popupUrl = new URL(PASSKEY_POPUP_PATH, window.location.origin).toString();\n const popup = window.open(\n popupUrl,\n 'thru_passkey_popup',\n 'popup=yes,width=440,height=640'\n );\n\n if (!popup) {\n throw new Error('Passkey popup was blocked');\n }\n\n return popup;\n}\n\nfunction createPopupRequestId(): string {\n const rand = Math.random().toString(36).slice(2, 10);\n return `passkey_${Date.now()}_${rand}`;\n}\n\nexport async function requestPasskeyPopup<T>(\n action: PasskeyPopupAction,\n payload: PasskeyPopupRequestPayload,\n preopenedPopup?: Window | null\n): Promise<T> {\n if (typeof window === 'undefined') {\n throw new Error('Passkey popup is only available in the browser');\n }\n\n const requestId = createPopupRequestId();\n const targetOrigin = window.location.origin;\n let popup: Window | null = preopenedPopup ?? null;\n const channel =\n typeof BroadcastChannel !== 'undefined' ? new BroadcastChannel(PASSKEY_POPUP_CHANNEL) : null;\n\n return new Promise<T>((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n let closePoll: ReturnType<typeof setInterval> | null = null;\n let requestSent = false;\n\n const cleanup = () => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n if (closePoll) {\n clearInterval(closePoll);\n closePoll = null;\n }\n window.removeEventListener('message', handleMessage);\n if (channel) {\n channel.removeEventListener('message', handleChannelMessage);\n channel.close();\n }\n };\n\n const sendRequest = (viaChannel: boolean) => {\n if (requestSent) {\n return;\n }\n requestSent = true;\n\n const request: PasskeyPopupRequest = {\n type: PASSKEY_POPUP_REQUEST_EVENT,\n requestId,\n action,\n payload,\n };\n\n if (viaChannel) {\n channel?.postMessage(request);\n return;\n }\n\n popup?.postMessage(request, targetOrigin);\n };\n\n const handleResponse = (data: PasskeyPopupResponse) => {\n if (data.requestId !== requestId) {\n return;\n }\n\n cleanup();\n if (popup && !popup.closed) {\n popup.close();\n }\n\n if (data.success) {\n resolve((data as Extract<PasskeyPopupResponse, { success: true }>).result as T);\n } else {\n const err = new Error(data.error?.message || 'Passkey popup failed');\n if (data.error?.name) {\n (err as { name?: string }).name = data.error.name;\n }\n reject(err);\n }\n };\n\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== targetOrigin) {\n return;\n }\n\n const data = event.data as PasskeyPopupResponse | { type?: string };\n if (!data || typeof data !== 'object') {\n return;\n }\n\n if (data.type === PASSKEY_POPUP_READY_EVENT) {\n if (popup && event.source !== popup) {\n return;\n }\n sendRequest(false);\n return;\n }\n\n if (data.type === PASSKEY_POPUP_RESPONSE_EVENT && 'requestId' in data) {\n handleResponse(data as PasskeyPopupResponse);\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n const handleChannelMessage = (event: MessageEvent) => {\n const data = event.data as PasskeyPopupResponse | { type?: string };\n if (!data || typeof data !== 'object') {\n return;\n }\n\n if (data.type === PASSKEY_POPUP_READY_EVENT) {\n sendRequest(true);\n return;\n }\n\n if (data.type === PASSKEY_POPUP_RESPONSE_EVENT && 'requestId' in data) {\n handleResponse(data as PasskeyPopupResponse);\n }\n };\n\n if (channel) {\n channel.addEventListener('message', handleChannelMessage);\n }\n\n if (!popup) {\n try {\n popup = openPasskeyPopupWindow();\n } catch (error) {\n cleanup();\n reject(error);\n return;\n }\n }\n\n timeout = setTimeout(() => {\n cleanup();\n try {\n popup?.close();\n } catch {\n /* ignore */\n }\n reject(new Error('Passkey popup timed out'));\n }, PASSKEY_POPUP_TIMEOUT_MS);\n\n closePoll = setInterval(() => {\n if (popup && popup.closed) {\n cleanup();\n reject(new Error('Passkey popup was closed'));\n }\n }, 250);\n });\n}\n","import type {\n PasskeyPopupAction,\n PasskeyPopupResponse,\n PasskeyPopupSigningResult,\n PasskeySigningResult,\n} from './types';\nimport {\n PASSKEY_POPUP_RESPONSE_EVENT,\n} from './popup';\nimport { bytesToBase64Url, base64UrlToBytes } from '@thru/passkey-manager';\nexport function toPopupSigningResult(result: PasskeySigningResult): PasskeyPopupSigningResult {\n return {\n signatureBase64Url: bytesToBase64Url(result.signature),\n authenticatorDataBase64Url: bytesToBase64Url(result.authenticatorData),\n clientDataJSONBase64Url: bytesToBase64Url(result.clientDataJSON),\n signatureRBase64Url: bytesToBase64Url(result.signatureR),\n signatureSBase64Url: bytesToBase64Url(result.signatureS),\n };\n}\n\nexport function buildSuccessResponse<T>(\n requestId: string,\n action: PasskeyPopupAction,\n result: T\n): PasskeyPopupResponse {\n return {\n type: PASSKEY_POPUP_RESPONSE_EVENT,\n requestId,\n action,\n success: true,\n result,\n } as PasskeyPopupResponse;\n}\n\nexport function decodeChallenge(base64Url: string): Uint8Array {\n return base64UrlToBytes(base64Url);\n}\n\nexport function getResponseError(action: PasskeyPopupAction, error: unknown): { name?: string; message: string } {\n const { name, message } = normalizeError(error);\n const actionLabel = `Popup ${action}`;\n const messageText = message || 'Passkey popup failed';\n const detailedMessage = messageText.includes('Popup')\n ? messageText\n : `${actionLabel}: ${messageText}`;\n return {\n name,\n message: detailedMessage,\n };\n}\nfunction normalizeError(error: unknown): { name?: string; message?: string; normalized: string } {\n const name =\n error && typeof error === 'object' && 'name' in error\n ? String((error as { name?: unknown }).name)\n : '';\n const message =\n error && typeof error === 'object' && 'message' in error\n ? String((error as { message?: unknown }).message)\n : '';\n return {\n name,\n message,\n normalized: `${name} ${message}`.toLowerCase(),\n };\n}\n"],"mappings":"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","names":[]}
|
package/dist/popup.d.cts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { d as PasskeyPopupAction, h as PasskeyPopupRequestPayload, j as PasskeyPopupSigningResult, n as PasskeyPopupResponse } from './types-_HRzmn-j.cjs';
|
|
2
|
+
export { c as PasskeyPopupAccount, b as PasskeyPopupContext, f as PasskeyPopupCreateRequestPayload, e as PasskeyPopupGetRequestPayload, g as PasskeyPopupGetStoredRequestPayload, m as PasskeyPopupRegistrationResult, i as PasskeyPopupRequest, k as PasskeyPopupStoredPasskey, l as PasskeyPopupStoredSigningResult } from './types-_HRzmn-j.cjs';
|
|
3
|
+
import { PasskeySigningResult } from '@thru/passkey-manager';
|
|
4
|
+
|
|
5
|
+
declare const PASSKEY_POPUP_PATH = "/passkey/popup";
|
|
6
|
+
declare const PASSKEY_POPUP_READY_EVENT = "thru:passkey-popup-ready";
|
|
7
|
+
declare const PASSKEY_POPUP_REQUEST_EVENT = "thru:passkey-popup-request";
|
|
8
|
+
declare const PASSKEY_POPUP_RESPONSE_EVENT = "thru:passkey-popup-response";
|
|
9
|
+
declare const PASSKEY_POPUP_CHANNEL = "thru:passkey-popup-channel";
|
|
10
|
+
declare function closePopup(popup: Window | null | undefined): void;
|
|
11
|
+
declare function openPasskeyPopupWindow(): Window;
|
|
12
|
+
declare function requestPasskeyPopup<T>(action: PasskeyPopupAction, payload: PasskeyPopupRequestPayload, preopenedPopup?: Window | null): Promise<T>;
|
|
13
|
+
|
|
14
|
+
declare function toPopupSigningResult(result: PasskeySigningResult): PasskeyPopupSigningResult;
|
|
15
|
+
declare function buildSuccessResponse<T>(requestId: string, action: PasskeyPopupAction, result: T): PasskeyPopupResponse;
|
|
16
|
+
declare function decodeChallenge(base64Url: string): Uint8Array;
|
|
17
|
+
declare function getResponseError(action: PasskeyPopupAction, error: unknown): {
|
|
18
|
+
name?: string;
|
|
19
|
+
message: string;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export { PASSKEY_POPUP_CHANNEL, PASSKEY_POPUP_PATH, PASSKEY_POPUP_READY_EVENT, PASSKEY_POPUP_REQUEST_EVENT, PASSKEY_POPUP_RESPONSE_EVENT, PasskeyPopupAction, PasskeyPopupRequestPayload, PasskeyPopupResponse, PasskeyPopupSigningResult, buildSuccessResponse, closePopup, decodeChallenge, getResponseError, openPasskeyPopupWindow, requestPasskeyPopup, toPopupSigningResult };
|
package/dist/popup.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { d as PasskeyPopupAction, h as PasskeyPopupRequestPayload, j as PasskeyPopupSigningResult, n as PasskeyPopupResponse } from './types-_HRzmn-j.js';
|
|
2
|
+
export { c as PasskeyPopupAccount, b as PasskeyPopupContext, f as PasskeyPopupCreateRequestPayload, e as PasskeyPopupGetRequestPayload, g as PasskeyPopupGetStoredRequestPayload, m as PasskeyPopupRegistrationResult, i as PasskeyPopupRequest, k as PasskeyPopupStoredPasskey, l as PasskeyPopupStoredSigningResult } from './types-_HRzmn-j.js';
|
|
3
|
+
import { PasskeySigningResult } from '@thru/passkey-manager';
|
|
4
|
+
|
|
5
|
+
declare const PASSKEY_POPUP_PATH = "/passkey/popup";
|
|
6
|
+
declare const PASSKEY_POPUP_READY_EVENT = "thru:passkey-popup-ready";
|
|
7
|
+
declare const PASSKEY_POPUP_REQUEST_EVENT = "thru:passkey-popup-request";
|
|
8
|
+
declare const PASSKEY_POPUP_RESPONSE_EVENT = "thru:passkey-popup-response";
|
|
9
|
+
declare const PASSKEY_POPUP_CHANNEL = "thru:passkey-popup-channel";
|
|
10
|
+
declare function closePopup(popup: Window | null | undefined): void;
|
|
11
|
+
declare function openPasskeyPopupWindow(): Window;
|
|
12
|
+
declare function requestPasskeyPopup<T>(action: PasskeyPopupAction, payload: PasskeyPopupRequestPayload, preopenedPopup?: Window | null): Promise<T>;
|
|
13
|
+
|
|
14
|
+
declare function toPopupSigningResult(result: PasskeySigningResult): PasskeyPopupSigningResult;
|
|
15
|
+
declare function buildSuccessResponse<T>(requestId: string, action: PasskeyPopupAction, result: T): PasskeyPopupResponse;
|
|
16
|
+
declare function decodeChallenge(base64Url: string): Uint8Array;
|
|
17
|
+
declare function getResponseError(action: PasskeyPopupAction, error: unknown): {
|
|
18
|
+
name?: string;
|
|
19
|
+
message: string;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export { PASSKEY_POPUP_CHANNEL, PASSKEY_POPUP_PATH, PASSKEY_POPUP_READY_EVENT, PASSKEY_POPUP_REQUEST_EVENT, PASSKEY_POPUP_RESPONSE_EVENT, PasskeyPopupAction, PasskeyPopupRequestPayload, PasskeyPopupResponse, PasskeyPopupSigningResult, buildSuccessResponse, closePopup, decodeChallenge, getResponseError, openPasskeyPopupWindow, requestPasskeyPopup, toPopupSigningResult };
|
package/dist/popup.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import {
|
|
2
|
+
buildSuccessResponse,
|
|
3
|
+
decodeChallenge,
|
|
4
|
+
getResponseError,
|
|
5
|
+
toPopupSigningResult
|
|
6
|
+
} from "./chunk-75G2FPYW.js";
|
|
7
|
+
import {
|
|
8
|
+
PASSKEY_POPUP_CHANNEL,
|
|
9
|
+
PASSKEY_POPUP_PATH,
|
|
10
|
+
PASSKEY_POPUP_READY_EVENT,
|
|
11
|
+
PASSKEY_POPUP_REQUEST_EVENT,
|
|
12
|
+
PASSKEY_POPUP_RESPONSE_EVENT,
|
|
13
|
+
closePopup,
|
|
14
|
+
openPasskeyPopupWindow,
|
|
15
|
+
requestPasskeyPopup
|
|
16
|
+
} from "./chunk-LNDWK3FA.js";
|
|
17
|
+
export {
|
|
18
|
+
PASSKEY_POPUP_CHANNEL,
|
|
19
|
+
PASSKEY_POPUP_PATH,
|
|
20
|
+
PASSKEY_POPUP_READY_EVENT,
|
|
21
|
+
PASSKEY_POPUP_REQUEST_EVENT,
|
|
22
|
+
PASSKEY_POPUP_RESPONSE_EVENT,
|
|
23
|
+
buildSuccessResponse,
|
|
24
|
+
closePopup,
|
|
25
|
+
decodeChallenge,
|
|
26
|
+
getResponseError,
|
|
27
|
+
openPasskeyPopupWindow,
|
|
28
|
+
requestPasskeyPopup,
|
|
29
|
+
toPopupSigningResult
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=popup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|