@account-kit/signer 4.0.0-alpha.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 (121) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/base.d.ts +37 -0
  3. package/dist/cjs/base.js +292 -0
  4. package/dist/cjs/base.js.map +1 -0
  5. package/dist/cjs/client/base.d.ts +230 -0
  6. package/dist/cjs/client/base.js +298 -0
  7. package/dist/cjs/client/base.js.map +1 -0
  8. package/dist/cjs/client/index.d.ts +146 -0
  9. package/dist/cjs/client/index.js +260 -0
  10. package/dist/cjs/client/index.js.map +1 -0
  11. package/dist/cjs/client/types.d.ts +106 -0
  12. package/dist/cjs/client/types.js +3 -0
  13. package/dist/cjs/client/types.js.map +1 -0
  14. package/dist/cjs/errors.d.ts +4 -0
  15. package/dist/cjs/errors.js +16 -0
  16. package/dist/cjs/errors.js.map +1 -0
  17. package/dist/cjs/index.d.ts +8 -0
  18. package/dist/cjs/index.js +14 -0
  19. package/dist/cjs/index.js.map +1 -0
  20. package/dist/cjs/package.json +1 -0
  21. package/dist/cjs/session/manager.d.ts +45 -0
  22. package/dist/cjs/session/manager.js +230 -0
  23. package/dist/cjs/session/manager.js.map +1 -0
  24. package/dist/cjs/session/types.d.ts +16 -0
  25. package/dist/cjs/session/types.js +3 -0
  26. package/dist/cjs/session/types.js.map +1 -0
  27. package/dist/cjs/signer.d.ts +262 -0
  28. package/dist/cjs/signer.js +34 -0
  29. package/dist/cjs/signer.js.map +1 -0
  30. package/dist/cjs/types.d.ts +14 -0
  31. package/dist/cjs/types.js +12 -0
  32. package/dist/cjs/types.js.map +1 -0
  33. package/dist/cjs/utils/base64UrlEncode.d.ts +1 -0
  34. package/dist/cjs/utils/base64UrlEncode.js +12 -0
  35. package/dist/cjs/utils/base64UrlEncode.js.map +1 -0
  36. package/dist/cjs/utils/generateRandomBuffer.d.ts +1 -0
  37. package/dist/cjs/utils/generateRandomBuffer.js +10 -0
  38. package/dist/cjs/utils/generateRandomBuffer.js.map +1 -0
  39. package/dist/cjs/version.d.ts +1 -0
  40. package/dist/cjs/version.js +5 -0
  41. package/dist/cjs/version.js.map +1 -0
  42. package/dist/esm/base.d.ts +37 -0
  43. package/dist/esm/base.js +288 -0
  44. package/dist/esm/base.js.map +1 -0
  45. package/dist/esm/client/base.d.ts +230 -0
  46. package/dist/esm/client/base.js +291 -0
  47. package/dist/esm/client/base.js.map +1 -0
  48. package/dist/esm/client/index.d.ts +146 -0
  49. package/dist/esm/client/index.js +256 -0
  50. package/dist/esm/client/index.js.map +1 -0
  51. package/dist/esm/client/types.d.ts +106 -0
  52. package/dist/esm/client/types.js +2 -0
  53. package/dist/esm/client/types.js.map +1 -0
  54. package/dist/esm/errors.d.ts +4 -0
  55. package/dist/esm/errors.js +12 -0
  56. package/dist/esm/errors.js.map +1 -0
  57. package/dist/esm/index.d.ts +8 -0
  58. package/dist/esm/index.js +6 -0
  59. package/dist/esm/index.js.map +1 -0
  60. package/dist/esm/package.json +1 -0
  61. package/dist/esm/session/manager.d.ts +45 -0
  62. package/dist/esm/session/manager.js +223 -0
  63. package/dist/esm/session/manager.js.map +1 -0
  64. package/dist/esm/session/types.d.ts +16 -0
  65. package/dist/esm/session/types.js +2 -0
  66. package/dist/esm/session/types.js.map +1 -0
  67. package/dist/esm/signer.d.ts +262 -0
  68. package/dist/esm/signer.js +30 -0
  69. package/dist/esm/signer.js.map +1 -0
  70. package/dist/esm/types.d.ts +14 -0
  71. package/dist/esm/types.js +9 -0
  72. package/dist/esm/types.js.map +1 -0
  73. package/dist/esm/utils/base64UrlEncode.d.ts +1 -0
  74. package/dist/esm/utils/base64UrlEncode.js +8 -0
  75. package/dist/esm/utils/base64UrlEncode.js.map +1 -0
  76. package/dist/esm/utils/generateRandomBuffer.d.ts +1 -0
  77. package/dist/esm/utils/generateRandomBuffer.js +6 -0
  78. package/dist/esm/utils/generateRandomBuffer.js.map +1 -0
  79. package/dist/esm/version.d.ts +1 -0
  80. package/dist/esm/version.js +2 -0
  81. package/dist/esm/version.js.map +1 -0
  82. package/dist/types/base.d.ts +89 -0
  83. package/dist/types/base.d.ts.map +1 -0
  84. package/dist/types/client/base.d.ts +246 -0
  85. package/dist/types/client/base.d.ts.map +1 -0
  86. package/dist/types/client/index.d.ts +151 -0
  87. package/dist/types/client/index.d.ts.map +1 -0
  88. package/dist/types/client/types.d.ts +107 -0
  89. package/dist/types/client/types.d.ts.map +1 -0
  90. package/dist/types/errors.d.ts +5 -0
  91. package/dist/types/errors.d.ts.map +1 -0
  92. package/dist/types/index.d.ts +9 -0
  93. package/dist/types/index.d.ts.map +1 -0
  94. package/dist/types/session/manager.d.ts +46 -0
  95. package/dist/types/session/manager.d.ts.map +1 -0
  96. package/dist/types/session/types.d.ts +17 -0
  97. package/dist/types/session/types.d.ts.map +1 -0
  98. package/dist/types/signer.d.ts +269 -0
  99. package/dist/types/signer.d.ts.map +1 -0
  100. package/dist/types/types.d.ts +15 -0
  101. package/dist/types/types.d.ts.map +1 -0
  102. package/dist/types/utils/base64UrlEncode.d.ts +2 -0
  103. package/dist/types/utils/base64UrlEncode.d.ts.map +1 -0
  104. package/dist/types/utils/generateRandomBuffer.d.ts +2 -0
  105. package/dist/types/utils/generateRandomBuffer.d.ts.map +1 -0
  106. package/dist/types/version.d.ts +2 -0
  107. package/dist/types/version.d.ts.map +1 -0
  108. package/package.json +79 -0
  109. package/src/base.ts +386 -0
  110. package/src/client/base.ts +399 -0
  111. package/src/client/index.ts +267 -0
  112. package/src/client/types.ts +121 -0
  113. package/src/errors.ts +15 -0
  114. package/src/index.ts +10 -0
  115. package/src/session/manager.ts +249 -0
  116. package/src/session/types.ts +16 -0
  117. package/src/signer.ts +55 -0
  118. package/src/types.ts +17 -0
  119. package/src/utils/base64UrlEncode.ts +7 -0
  120. package/src/utils/generateRandomBuffer.ts +5 -0
  121. package/src/version.ts +3 -0
@@ -0,0 +1,223 @@
1
+ import EventEmitter from "eventemitter3";
2
+ import { z } from "zod";
3
+ import { createJSONStorage, persist, subscribeWithSelector, } from "zustand/middleware";
4
+ import { createStore } from "zustand/vanilla";
5
+ export const DEFAULT_SESSION_MS = 15 * 60 * 1000;
6
+ export const SessionManagerParamsSchema = z.object({
7
+ sessionKey: z.string().default("alchemy-signer-session"),
8
+ storage: z
9
+ .enum(["localStorage", "sessionStorage"])
10
+ .default("localStorage")
11
+ .or(z.custom()),
12
+ expirationTimeMs: z
13
+ .number()
14
+ .default(DEFAULT_SESSION_MS)
15
+ .describe("The time in milliseconds that a session should last before expiring [default: 15 minutes]"),
16
+ client: z.custom(),
17
+ });
18
+ export class SessionManager {
19
+ constructor(params) {
20
+ Object.defineProperty(this, "sessionKey", {
21
+ enumerable: true,
22
+ configurable: true,
23
+ writable: true,
24
+ value: void 0
25
+ });
26
+ Object.defineProperty(this, "client", {
27
+ enumerable: true,
28
+ configurable: true,
29
+ writable: true,
30
+ value: void 0
31
+ });
32
+ Object.defineProperty(this, "eventEmitter", {
33
+ enumerable: true,
34
+ configurable: true,
35
+ writable: true,
36
+ value: void 0
37
+ });
38
+ Object.defineProperty(this, "expirationTimeMs", {
39
+ enumerable: true,
40
+ configurable: true,
41
+ writable: true,
42
+ value: void 0
43
+ });
44
+ Object.defineProperty(this, "store", {
45
+ enumerable: true,
46
+ configurable: true,
47
+ writable: true,
48
+ value: void 0
49
+ });
50
+ Object.defineProperty(this, "getSessionUser", {
51
+ enumerable: true,
52
+ configurable: true,
53
+ writable: true,
54
+ value: async () => {
55
+ const existingSession = this.getSession();
56
+ if (existingSession == null) {
57
+ return null;
58
+ }
59
+ switch (existingSession.type) {
60
+ case "email": {
61
+ const result = await this.client
62
+ .completeEmailAuth({
63
+ bundle: existingSession.bundle,
64
+ orgId: existingSession.user.orgId,
65
+ })
66
+ .catch((e) => {
67
+ console.warn("Failed to load user from session", e);
68
+ return null;
69
+ });
70
+ if (!result) {
71
+ this.clearSession();
72
+ return null;
73
+ }
74
+ return result;
75
+ }
76
+ case "passkey": {
77
+ return this.client.lookupUserWithPasskey(existingSession.user);
78
+ }
79
+ default:
80
+ throw new Error("Unknown session type");
81
+ }
82
+ }
83
+ });
84
+ Object.defineProperty(this, "clearSession", {
85
+ enumerable: true,
86
+ configurable: true,
87
+ writable: true,
88
+ value: () => {
89
+ this.store.setState({ session: null });
90
+ }
91
+ });
92
+ Object.defineProperty(this, "setTemporarySession", {
93
+ enumerable: true,
94
+ configurable: true,
95
+ writable: true,
96
+ value: (session) => {
97
+ localStorage.setItem(`${this.sessionKey}:temporary`, JSON.stringify(session));
98
+ }
99
+ });
100
+ Object.defineProperty(this, "getTemporarySession", {
101
+ enumerable: true,
102
+ configurable: true,
103
+ writable: true,
104
+ value: () => {
105
+ const sessionStr = localStorage.getItem(`${this.sessionKey}:temporary`);
106
+ if (!sessionStr) {
107
+ return null;
108
+ }
109
+ return JSON.parse(sessionStr);
110
+ }
111
+ });
112
+ Object.defineProperty(this, "on", {
113
+ enumerable: true,
114
+ configurable: true,
115
+ writable: true,
116
+ value: (event, listener) => {
117
+ this.eventEmitter.on(event, listener);
118
+ return () => this.eventEmitter.removeListener(event, listener);
119
+ }
120
+ });
121
+ Object.defineProperty(this, "getSession", {
122
+ enumerable: true,
123
+ configurable: true,
124
+ writable: true,
125
+ value: () => {
126
+ const session = this.store.getState().session;
127
+ if (!session) {
128
+ return null;
129
+ }
130
+ if (session.expirationDateMs < Date.now()) {
131
+ this.store.setState({ session: null });
132
+ return null;
133
+ }
134
+ return session;
135
+ }
136
+ });
137
+ Object.defineProperty(this, "setSession", {
138
+ enumerable: true,
139
+ configurable: true,
140
+ writable: true,
141
+ value: (session) => {
142
+ this.store.setState({
143
+ session: {
144
+ ...session,
145
+ expirationDateMs: Date.now() + this.expirationTimeMs,
146
+ },
147
+ });
148
+ }
149
+ });
150
+ Object.defineProperty(this, "registerEventListeners", {
151
+ enumerable: true,
152
+ configurable: true,
153
+ writable: true,
154
+ value: () => {
155
+ this.store.subscribe(({ session }) => session, (session, prevSession) => {
156
+ if (session != null && prevSession == null) {
157
+ this.eventEmitter.emit("connected", session);
158
+ }
159
+ else if (session == null && prevSession != null) {
160
+ this.eventEmitter.emit("disconnected");
161
+ }
162
+ });
163
+ this.client.on("disconnected", () => this.clearSession());
164
+ this.client.on("connectedEmail", (user, bundle) => {
165
+ const existingSession = this.getSession();
166
+ if (existingSession != null &&
167
+ existingSession.type === "email" &&
168
+ existingSession.user.userId === user.userId &&
169
+ existingSession.bundle === bundle) {
170
+ return;
171
+ }
172
+ this.setSession({ type: "email", user, bundle });
173
+ });
174
+ this.client.on("connectedPasskey", (user) => {
175
+ const existingSession = this.getSession();
176
+ if (existingSession != null &&
177
+ existingSession.type === "passkey" &&
178
+ existingSession.user.userId === user.userId) {
179
+ return;
180
+ }
181
+ this.setSession({ type: "passkey", user });
182
+ });
183
+ window.addEventListener("focus", () => {
184
+ this.store.persist.rehydrate();
185
+ this.initialize();
186
+ });
187
+ }
188
+ });
189
+ const { sessionKey, storage: storageType, expirationTimeMs, client, } = SessionManagerParamsSchema.parse(params);
190
+ this.sessionKey = sessionKey;
191
+ const storage = typeof storageType === "string"
192
+ ? storageType === "localStorage"
193
+ ? localStorage
194
+ : sessionStorage
195
+ : storageType;
196
+ this.expirationTimeMs = expirationTimeMs;
197
+ this.client = client;
198
+ this.eventEmitter = new EventEmitter();
199
+ this.store = createStore(subscribeWithSelector(persist(this.getInitialState, {
200
+ name: this.sessionKey,
201
+ storage: createJSONStorage(() => storage),
202
+ })));
203
+ this.registerEventListeners();
204
+ }
205
+ initialize() {
206
+ this.getSessionUser()
207
+ .then((user) => {
208
+ if (user)
209
+ this.eventEmitter.emit("connected", this.getSession());
210
+ else
211
+ this.eventEmitter.emit("disconnected");
212
+ })
213
+ .finally(() => {
214
+ this.eventEmitter.emit("initialized");
215
+ });
216
+ }
217
+ getInitialState() {
218
+ return {
219
+ session: null,
220
+ };
221
+ }
222
+ }
223
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/session/manager.ts"],"names":[],"mappings":"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","sourcesContent":["import EventEmitter from \"eventemitter3\";\nimport { z } from \"zod\";\nimport {\n createJSONStorage,\n persist,\n subscribeWithSelector,\n} from \"zustand/middleware\";\nimport { createStore, type Mutate, type StoreApi } from \"zustand/vanilla\";\nimport type { BaseSignerClient } from \"../client/base\";\nimport type { User } from \"../client/types\";\nimport type { Session, SessionManagerEvents } from \"./types\";\n\nexport const DEFAULT_SESSION_MS = 15 * 60 * 1000; // 15 minutes\n\nexport const SessionManagerParamsSchema = z.object({\n sessionKey: z.string().default(\"alchemy-signer-session\"),\n storage: z\n .enum([\"localStorage\", \"sessionStorage\"])\n .default(\"localStorage\")\n .or(z.custom<Storage>()),\n expirationTimeMs: z\n .number()\n .default(DEFAULT_SESSION_MS)\n .describe(\n \"The time in milliseconds that a session should last before expiring [default: 15 minutes]\"\n ),\n client: z.custom<BaseSignerClient>(),\n});\n\nexport type SessionManagerParams = z.input<typeof SessionManagerParamsSchema>;\n\ntype SessionState = {\n session: Session | null;\n};\n\ntype Store = Mutate<\n StoreApi<SessionState>,\n [[\"zustand/subscribeWithSelector\", never], [\"zustand/persist\", SessionState]]\n>;\n\nexport class SessionManager {\n private sessionKey: string;\n private client: BaseSignerClient;\n private eventEmitter: EventEmitter<SessionManagerEvents>;\n readonly expirationTimeMs: number;\n private store: Store;\n\n constructor(params: SessionManagerParams) {\n const {\n sessionKey,\n storage: storageType,\n expirationTimeMs,\n client,\n } = SessionManagerParamsSchema.parse(params);\n this.sessionKey = sessionKey;\n const storage =\n typeof storageType === \"string\"\n ? storageType === \"localStorage\"\n ? localStorage\n : sessionStorage\n : storageType;\n this.expirationTimeMs = expirationTimeMs;\n this.client = client;\n this.eventEmitter = new EventEmitter<SessionManagerEvents>();\n\n this.store = createStore(\n subscribeWithSelector(\n persist(this.getInitialState, {\n name: this.sessionKey,\n storage: createJSONStorage<SessionState>(() => storage),\n })\n )\n );\n\n this.registerEventListeners();\n }\n\n public getSessionUser = async (): Promise<User | null> => {\n const existingSession = this.getSession();\n if (existingSession == null) {\n return null;\n }\n\n switch (existingSession.type) {\n case \"email\": {\n const result = await this.client\n .completeEmailAuth({\n bundle: existingSession.bundle,\n orgId: existingSession.user.orgId,\n })\n .catch((e) => {\n console.warn(\"Failed to load user from session\", e);\n return null;\n });\n\n if (!result) {\n this.clearSession();\n return null;\n }\n\n return result;\n }\n case \"passkey\": {\n // we don't need to do much here if we already have a user\n // this will setup the client with the user context, but\n // requests still have to be signed by the user on first request\n // so this is fine\n return this.client.lookupUserWithPasskey(existingSession.user);\n }\n default:\n throw new Error(\"Unknown session type\");\n }\n };\n\n public clearSession = () => {\n this.store.setState({ session: null });\n };\n\n public setTemporarySession = (session: { orgId: string }) => {\n // temporary session must be placed in localStorage so that it can be accessed across tabs\n localStorage.setItem(\n `${this.sessionKey}:temporary`,\n JSON.stringify(session)\n );\n };\n\n public getTemporarySession = (): { orgId: string } | null => {\n // temporary session must be placed in localStorage so that it can be accessed across tabs\n const sessionStr = localStorage.getItem(`${this.sessionKey}:temporary`);\n\n if (!sessionStr) {\n return null;\n }\n\n return JSON.parse(sessionStr);\n };\n\n on = <E extends keyof SessionManagerEvents>(\n event: E,\n listener: SessionManagerEvents[E]\n ) => {\n this.eventEmitter.on(event, listener as any);\n\n return () => this.eventEmitter.removeListener(event, listener as any);\n };\n\n private getSession = (): Session | null => {\n const session = this.store.getState().session;\n\n if (!session) {\n return null;\n }\n\n /**\n * TODO: this isn't really good enough\n * A user's session could be about to expire and we would still return it\n *\n * Instead we should check if a session is about to expire and refresh it\n * We should revisit this later\n */\n if (session.expirationDateMs < Date.now()) {\n this.store.setState({ session: null });\n return null;\n }\n\n return session;\n };\n\n private setSession = (\n session:\n | Omit<Extract<Session, { type: \"email\" }>, \"expirationDateMs\">\n | Omit<Extract<Session, { type: \"passkey\" }>, \"expirationDateMs\">\n ) => {\n this.store.setState({\n session: {\n ...session,\n expirationDateMs: Date.now() + this.expirationTimeMs,\n },\n });\n };\n\n public initialize() {\n this.getSessionUser()\n .then((user) => {\n // once we complete auth we can update the state of the session to connected or disconnected\n if (user) this.eventEmitter.emit(\"connected\", this.getSession()!);\n else this.eventEmitter.emit(\"disconnected\");\n })\n .finally(() => {\n this.eventEmitter.emit(\"initialized\");\n });\n }\n\n private getInitialState(): SessionState {\n return {\n session: null,\n };\n }\n\n private registerEventListeners = () => {\n this.store.subscribe(\n ({ session }) => session,\n (session, prevSession) => {\n if (session != null && prevSession == null) {\n this.eventEmitter.emit(\"connected\", session);\n } else if (session == null && prevSession != null) {\n this.eventEmitter.emit(\"disconnected\");\n }\n }\n );\n\n this.client.on(\"disconnected\", () => this.clearSession());\n\n this.client.on(\"connectedEmail\", (user, bundle) => {\n const existingSession = this.getSession();\n if (\n existingSession != null &&\n existingSession.type === \"email\" &&\n existingSession.user.userId === user.userId &&\n // if the bundle is different, then we've refreshed the session\n // so we need to reset the session\n existingSession.bundle === bundle\n ) {\n return;\n }\n\n this.setSession({ type: \"email\", user, bundle });\n });\n\n this.client.on(\"connectedPasskey\", (user) => {\n const existingSession = this.getSession();\n if (\n existingSession != null &&\n existingSession.type === \"passkey\" &&\n existingSession.user.userId === user.userId\n ) {\n return;\n }\n\n this.setSession({ type: \"passkey\", user });\n });\n\n // sync local state if persisted state has changed from another tab\n window.addEventListener(\"focus\", () => {\n this.store.persist.rehydrate();\n this.initialize();\n });\n };\n}\n"]}
@@ -0,0 +1,16 @@
1
+ import type { User } from "../client/types";
2
+ export type Session = {
3
+ type: "email";
4
+ bundle: string;
5
+ expirationDateMs: number;
6
+ user: User;
7
+ } | {
8
+ type: "passkey";
9
+ user: User;
10
+ expirationDateMs: number;
11
+ };
12
+ export type SessionManagerEvents = {
13
+ connected(session: Session): void;
14
+ disconnected(): void;
15
+ initialized(): void;
16
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/session/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { User } from \"../client/types\";\n\nexport type Session =\n | {\n type: \"email\";\n bundle: string;\n expirationDateMs: number;\n user: User;\n }\n | { type: \"passkey\"; user: User; expirationDateMs: number };\n\nexport type SessionManagerEvents = {\n connected(session: Session): void;\n disconnected(): void;\n initialized(): void;\n};\n"]}
@@ -0,0 +1,262 @@
1
+ import { z } from "zod";
2
+ import { BaseAlchemySigner } from "./base.js";
3
+ import { AlchemySignerWebClient } from "./client/index.js";
4
+ import type { CredentialCreationOptionOverrides } from "./client/types.js";
5
+ export type AuthParams = {
6
+ type: "email";
7
+ email: string;
8
+ redirectParams?: URLSearchParams;
9
+ } | {
10
+ type: "email";
11
+ bundle: string;
12
+ orgId?: string;
13
+ } | {
14
+ type: "passkey";
15
+ createNew: false;
16
+ } | {
17
+ type: "passkey";
18
+ createNew: true;
19
+ username: string;
20
+ creationOpts?: CredentialCreationOptionOverrides;
21
+ };
22
+ export declare const AlchemySignerParamsSchema: z.ZodObject<{
23
+ client: z.ZodUnion<[z.ZodType<AlchemySignerWebClient, z.ZodTypeDef, AlchemySignerWebClient>, z.ZodObject<{
24
+ connection: z.ZodUnion<[z.ZodObject<{
25
+ rpcUrl: z.ZodOptional<z.ZodNever>;
26
+ apiKey: z.ZodString;
27
+ jwt: z.ZodOptional<z.ZodNever>;
28
+ }, "strip", z.ZodTypeAny, {
29
+ apiKey: string;
30
+ rpcUrl?: undefined;
31
+ jwt?: undefined;
32
+ }, {
33
+ apiKey: string;
34
+ rpcUrl?: undefined;
35
+ jwt?: undefined;
36
+ }>, z.ZodObject<{
37
+ rpcUrl: z.ZodOptional<z.ZodNever>;
38
+ apiKey: z.ZodOptional<z.ZodNever>;
39
+ jwt: z.ZodString;
40
+ }, "strip", z.ZodTypeAny, {
41
+ jwt: string;
42
+ rpcUrl?: undefined;
43
+ apiKey?: undefined;
44
+ }, {
45
+ jwt: string;
46
+ rpcUrl?: undefined;
47
+ apiKey?: undefined;
48
+ }>, z.ZodObject<{
49
+ rpcUrl: z.ZodString;
50
+ apiKey: z.ZodOptional<z.ZodNever>;
51
+ jwt: z.ZodOptional<z.ZodNever>;
52
+ }, "strip", z.ZodTypeAny, {
53
+ rpcUrl: string;
54
+ apiKey?: undefined;
55
+ jwt?: undefined;
56
+ }, {
57
+ rpcUrl: string;
58
+ apiKey?: undefined;
59
+ jwt?: undefined;
60
+ }>, z.ZodObject<{
61
+ rpcUrl: z.ZodString;
62
+ apiKey: z.ZodOptional<z.ZodNever>;
63
+ jwt: z.ZodString;
64
+ }, "strip", z.ZodTypeAny, {
65
+ rpcUrl: string;
66
+ jwt: string;
67
+ apiKey?: undefined;
68
+ }, {
69
+ rpcUrl: string;
70
+ jwt: string;
71
+ apiKey?: undefined;
72
+ }>]>;
73
+ iframeConfig: z.ZodObject<{
74
+ iframeElementId: z.ZodDefault<z.ZodString>;
75
+ iframeContainerId: z.ZodString;
76
+ }, "strip", z.ZodTypeAny, {
77
+ iframeElementId: string;
78
+ iframeContainerId: string;
79
+ }, {
80
+ iframeContainerId: string;
81
+ iframeElementId?: string | undefined;
82
+ }>;
83
+ rpId: z.ZodOptional<z.ZodString>;
84
+ rootOrgId: z.ZodDefault<z.ZodOptional<z.ZodString>>;
85
+ }, "strip", z.ZodTypeAny, {
86
+ connection: {
87
+ apiKey: string;
88
+ rpcUrl?: undefined;
89
+ jwt?: undefined;
90
+ } | {
91
+ jwt: string;
92
+ rpcUrl?: undefined;
93
+ apiKey?: undefined;
94
+ } | {
95
+ rpcUrl: string;
96
+ apiKey?: undefined;
97
+ jwt?: undefined;
98
+ } | {
99
+ rpcUrl: string;
100
+ jwt: string;
101
+ apiKey?: undefined;
102
+ };
103
+ rootOrgId: string;
104
+ iframeConfig: {
105
+ iframeElementId: string;
106
+ iframeContainerId: string;
107
+ };
108
+ rpId?: string | undefined;
109
+ }, {
110
+ connection: {
111
+ apiKey: string;
112
+ rpcUrl?: undefined;
113
+ jwt?: undefined;
114
+ } | {
115
+ jwt: string;
116
+ rpcUrl?: undefined;
117
+ apiKey?: undefined;
118
+ } | {
119
+ rpcUrl: string;
120
+ apiKey?: undefined;
121
+ jwt?: undefined;
122
+ } | {
123
+ rpcUrl: string;
124
+ jwt: string;
125
+ apiKey?: undefined;
126
+ };
127
+ iframeConfig: {
128
+ iframeContainerId: string;
129
+ iframeElementId?: string | undefined;
130
+ };
131
+ rpId?: string | undefined;
132
+ rootOrgId?: string | undefined;
133
+ }>]>;
134
+ sessionConfig: z.ZodOptional<z.ZodObject<Omit<{
135
+ sessionKey: z.ZodDefault<z.ZodString>;
136
+ storage: z.ZodUnion<[z.ZodDefault<z.ZodEnum<["localStorage", "sessionStorage"]>>, z.ZodType<Storage, z.ZodTypeDef, Storage>]>;
137
+ expirationTimeMs: z.ZodDefault<z.ZodNumber>;
138
+ client: z.ZodType<import("./index.js").BaseSignerClient<unknown>, z.ZodTypeDef, import("./index.js").BaseSignerClient<unknown>>;
139
+ }, "client">, "strip", z.ZodTypeAny, {
140
+ sessionKey: string;
141
+ storage: ("localStorage" | "sessionStorage" | Storage) & ("localStorage" | "sessionStorage" | Storage | undefined);
142
+ expirationTimeMs: number;
143
+ }, {
144
+ sessionKey?: string | undefined;
145
+ storage?: "localStorage" | "sessionStorage" | Storage | undefined;
146
+ expirationTimeMs?: number | undefined;
147
+ }>>;
148
+ }, "strip", z.ZodTypeAny, {
149
+ client: ({
150
+ connection: {
151
+ apiKey: string;
152
+ rpcUrl?: undefined;
153
+ jwt?: undefined;
154
+ } | {
155
+ jwt: string;
156
+ rpcUrl?: undefined;
157
+ apiKey?: undefined;
158
+ } | {
159
+ rpcUrl: string;
160
+ apiKey?: undefined;
161
+ jwt?: undefined;
162
+ } | {
163
+ rpcUrl: string;
164
+ jwt: string;
165
+ apiKey?: undefined;
166
+ };
167
+ rootOrgId: string;
168
+ iframeConfig: {
169
+ iframeElementId: string;
170
+ iframeContainerId: string;
171
+ };
172
+ rpId?: string | undefined;
173
+ } | AlchemySignerWebClient) & ({
174
+ connection: {
175
+ apiKey: string;
176
+ rpcUrl?: undefined;
177
+ jwt?: undefined;
178
+ } | {
179
+ jwt: string;
180
+ rpcUrl?: undefined;
181
+ apiKey?: undefined;
182
+ } | {
183
+ rpcUrl: string;
184
+ apiKey?: undefined;
185
+ jwt?: undefined;
186
+ } | {
187
+ rpcUrl: string;
188
+ jwt: string;
189
+ apiKey?: undefined;
190
+ };
191
+ rootOrgId: string;
192
+ iframeConfig: {
193
+ iframeElementId: string;
194
+ iframeContainerId: string;
195
+ };
196
+ rpId?: string | undefined;
197
+ } | AlchemySignerWebClient | undefined);
198
+ sessionConfig?: {
199
+ sessionKey: string;
200
+ storage: ("localStorage" | "sessionStorage" | Storage) & ("localStorage" | "sessionStorage" | Storage | undefined);
201
+ expirationTimeMs: number;
202
+ } | undefined;
203
+ }, {
204
+ client: ({
205
+ connection: {
206
+ apiKey: string;
207
+ rpcUrl?: undefined;
208
+ jwt?: undefined;
209
+ } | {
210
+ jwt: string;
211
+ rpcUrl?: undefined;
212
+ apiKey?: undefined;
213
+ } | {
214
+ rpcUrl: string;
215
+ apiKey?: undefined;
216
+ jwt?: undefined;
217
+ } | {
218
+ rpcUrl: string;
219
+ jwt: string;
220
+ apiKey?: undefined;
221
+ };
222
+ iframeConfig: {
223
+ iframeContainerId: string;
224
+ iframeElementId?: string | undefined;
225
+ };
226
+ rpId?: string | undefined;
227
+ rootOrgId?: string | undefined;
228
+ } | AlchemySignerWebClient) & ({
229
+ connection: {
230
+ apiKey: string;
231
+ rpcUrl?: undefined;
232
+ jwt?: undefined;
233
+ } | {
234
+ jwt: string;
235
+ rpcUrl?: undefined;
236
+ apiKey?: undefined;
237
+ } | {
238
+ rpcUrl: string;
239
+ apiKey?: undefined;
240
+ jwt?: undefined;
241
+ } | {
242
+ rpcUrl: string;
243
+ jwt: string;
244
+ apiKey?: undefined;
245
+ };
246
+ iframeConfig: {
247
+ iframeContainerId: string;
248
+ iframeElementId?: string | undefined;
249
+ };
250
+ rpId?: string | undefined;
251
+ rootOrgId?: string | undefined;
252
+ } | AlchemySignerWebClient | undefined);
253
+ sessionConfig?: {
254
+ sessionKey?: string | undefined;
255
+ storage?: "localStorage" | "sessionStorage" | Storage | undefined;
256
+ expirationTimeMs?: number | undefined;
257
+ } | undefined;
258
+ }>;
259
+ export type AlchemySignerParams = z.input<typeof AlchemySignerParamsSchema>;
260
+ export declare class AlchemyWebSigner extends BaseAlchemySigner<AlchemySignerWebClient> {
261
+ constructor(params_: AlchemySignerParams);
262
+ }
@@ -0,0 +1,30 @@
1
+ import { z } from "zod";
2
+ import { BaseAlchemySigner } from "./base.js";
3
+ import { AlchemySignerClientParamsSchema, AlchemySignerWebClient, } from "./client/index.js";
4
+ import { SessionManagerParamsSchema } from "./session/manager.js";
5
+ export const AlchemySignerParamsSchema = z
6
+ .object({
7
+ client: z
8
+ .custom()
9
+ .or(AlchemySignerClientParamsSchema),
10
+ })
11
+ .extend({
12
+ sessionConfig: SessionManagerParamsSchema.omit({ client: true }).optional(),
13
+ });
14
+ export class AlchemyWebSigner extends BaseAlchemySigner {
15
+ constructor(params_) {
16
+ const { sessionConfig, ...params } = AlchemySignerParamsSchema.parse(params_);
17
+ let client;
18
+ if ("connection" in params.client) {
19
+ client = new AlchemySignerWebClient(params.client);
20
+ }
21
+ else {
22
+ client = params.client;
23
+ }
24
+ super({
25
+ client,
26
+ sessionConfig,
27
+ });
28
+ }
29
+ }
30
+ //# sourceMappingURL=signer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signer.js","sourceRoot":"","sources":["../../src/signer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EACL,+BAA+B,EAC/B,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAgBlE,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC;KACvC,MAAM,CAAC;IACN,MAAM,EAAE,CAAC;SACN,MAAM,EAA0B;SAChC,EAAE,CAAC,+BAA+B,CAAC;CACvC,CAAC;KACD,MAAM,CAAC;IACN,aAAa,EAAE,0BAA0B,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC5E,CAAC,CAAC;AAOL,MAAM,OAAO,gBAAiB,SAAQ,iBAAyC;IAC7E,YAAY,OAA4B;QACtC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,EAAE,GAChC,yBAAyB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAE3C,IAAI,MAA8B,CAAC;QACnC,IAAI,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,GAAG,IAAI,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QACzB,CAAC;QACD,KAAK,CAAC;YACJ,MAAM;YACN,aAAa;SACd,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import { z } from \"zod\";\nimport { BaseAlchemySigner } from \"./base.js\";\nimport {\n AlchemySignerClientParamsSchema,\n AlchemySignerWebClient,\n} from \"./client/index.js\";\nimport type { CredentialCreationOptionOverrides } from \"./client/types.js\";\nimport { SessionManagerParamsSchema } from \"./session/manager.js\";\n\nexport type AuthParams =\n | { type: \"email\"; email: string; redirectParams?: URLSearchParams }\n | { type: \"email\"; bundle: string; orgId?: string }\n | {\n type: \"passkey\";\n createNew: false;\n }\n | {\n type: \"passkey\";\n createNew: true;\n username: string;\n creationOpts?: CredentialCreationOptionOverrides;\n };\n\nexport const AlchemySignerParamsSchema = z\n .object({\n client: z\n .custom<AlchemySignerWebClient>()\n .or(AlchemySignerClientParamsSchema),\n })\n .extend({\n sessionConfig: SessionManagerParamsSchema.omit({ client: true }).optional(),\n });\n\nexport type AlchemySignerParams = z.input<typeof AlchemySignerParamsSchema>;\n\n/**\n * A SmartAccountSigner that can be used with any SmartContractAccount\n */\nexport class AlchemyWebSigner extends BaseAlchemySigner<AlchemySignerWebClient> {\n constructor(params_: AlchemySignerParams) {\n const { sessionConfig, ...params } =\n AlchemySignerParamsSchema.parse(params_);\n\n let client: AlchemySignerWebClient;\n if (\"connection\" in params.client) {\n client = new AlchemySignerWebClient(params.client);\n } else {\n client = params.client;\n }\n super({\n client,\n sessionConfig,\n });\n }\n}\n"]}
@@ -0,0 +1,14 @@
1
+ import type { User } from "./client/types";
2
+ export type AlchemySignerEvents = {
3
+ connected(user: User): void;
4
+ disconnected(): void;
5
+ statusChanged(status: AlchemySignerStatus): void;
6
+ };
7
+ export type AlchemySignerEvent = keyof AlchemySignerEvents;
8
+ export declare enum AlchemySignerStatus {
9
+ INITIALIZING = "INITIALIZING",
10
+ CONNECTED = "CONNECTED",
11
+ DISCONNECTED = "DISCONNECTED",
12
+ AUTHENTICATING = "AUTHENTICATING",
13
+ AWAITING_EMAIL_AUTH = "AWAITING_EMAIL_AUTH"
14
+ }
@@ -0,0 +1,9 @@
1
+ export var AlchemySignerStatus;
2
+ (function (AlchemySignerStatus) {
3
+ AlchemySignerStatus["INITIALIZING"] = "INITIALIZING";
4
+ AlchemySignerStatus["CONNECTED"] = "CONNECTED";
5
+ AlchemySignerStatus["DISCONNECTED"] = "DISCONNECTED";
6
+ AlchemySignerStatus["AUTHENTICATING"] = "AUTHENTICATING";
7
+ AlchemySignerStatus["AWAITING_EMAIL_AUTH"] = "AWAITING_EMAIL_AUTH";
8
+ })(AlchemySignerStatus || (AlchemySignerStatus = {}));
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAUA,MAAM,CAAN,IAAY,mBAMX;AAND,WAAY,mBAAmB;IAC7B,oDAA6B,CAAA;IAC7B,8CAAuB,CAAA;IACvB,oDAA6B,CAAA;IAC7B,wDAAiC,CAAA;IACjC,kEAA2C,CAAA;AAC7C,CAAC,EANW,mBAAmB,KAAnB,mBAAmB,QAM9B","sourcesContent":["import type { User } from \"./client/types\";\n\nexport type AlchemySignerEvents = {\n connected(user: User): void;\n disconnected(): void;\n statusChanged(status: AlchemySignerStatus): void;\n};\n\nexport type AlchemySignerEvent = keyof AlchemySignerEvents;\n\nexport enum AlchemySignerStatus {\n INITIALIZING = \"INITIALIZING\",\n CONNECTED = \"CONNECTED\",\n DISCONNECTED = \"DISCONNECTED\",\n AUTHENTICATING = \"AUTHENTICATING\",\n AWAITING_EMAIL_AUTH = \"AWAITING_EMAIL_AUTH\",\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare const base64UrlEncode: (challenge: ArrayBuffer) => string;
@@ -0,0 +1,8 @@
1
+ export const base64UrlEncode = (challenge) => {
2
+ return Buffer.from(challenge)
3
+ .toString("base64")
4
+ .replace(/\+/g, "-")
5
+ .replace(/\//g, "_")
6
+ .replace(/=/g, "");
7
+ };
8
+ //# sourceMappingURL=base64UrlEncode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64UrlEncode.js","sourceRoot":"","sources":["../../../src/utils/base64UrlEncode.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,SAAsB,EAAU,EAAE;IAChE,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;SAC1B,QAAQ,CAAC,QAAQ,CAAC;SAClB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACvB,CAAC,CAAC","sourcesContent":["export const base64UrlEncode = (challenge: ArrayBuffer): string => {\n return Buffer.from(challenge)\n .toString(\"base64\")\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=/g, \"\");\n};\n"]}
@@ -0,0 +1 @@
1
+ export declare const generateRandomBuffer: () => ArrayBuffer;
@@ -0,0 +1,6 @@
1
+ export const generateRandomBuffer = () => {
2
+ const arr = new Uint8Array(32);
3
+ crypto.getRandomValues(arr);
4
+ return arr.buffer;
5
+ };
6
+ //# sourceMappingURL=generateRandomBuffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateRandomBuffer.js","sourceRoot":"","sources":["../../../src/utils/generateRandomBuffer.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAgB,EAAE;IACpD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IAC/B,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,GAAG,CAAC,MAAM,CAAC;AACpB,CAAC,CAAC","sourcesContent":["export const generateRandomBuffer = (): ArrayBuffer => {\n const arr = new Uint8Array(32);\n crypto.getRandomValues(arr);\n return arr.buffer;\n};\n"]}
@@ -0,0 +1 @@
1
+ export declare const VERSION = "4.0.0-alpha.0";
@@ -0,0 +1,2 @@
1
+ export const VERSION = "4.0.0-alpha.0";
2
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,OAAO,GAAG,eAAe,CAAC","sourcesContent":["// This file is autogenerated by inject-version.ts. Any changes will be\n// overwritten on commit!\nexport const VERSION = \"4.0.0-alpha.0\";\n"]}