@parlor/auth 0.1.0 → 0.2.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.
- package/dist/account.d.ts +8 -1
- package/dist/account.d.ts.map +1 -1
- package/dist/account.js +13 -0
- package/dist/account.js.map +1 -1
- package/dist/audit.js.map +1 -1
- package/dist/better-auth.d.ts +5 -0
- package/dist/better-auth.d.ts.map +1 -1
- package/dist/better-auth.js +5 -3
- package/dist/better-auth.js.map +1 -1
- package/dist/client/index.d.ts +38 -2
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +92 -3
- package/dist/client/index.js.map +1 -1
- package/dist/database.js.map +1 -1
- package/dist/devices.d.ts.map +1 -1
- package/dist/devices.js +6 -1
- package/dist/devices.js.map +1 -1
- package/dist/es256.js.map +1 -1
- package/dist/grants.js.map +1 -1
- package/dist/hosts.d.ts.map +1 -1
- package/dist/hosts.js +9 -1
- package/dist/hosts.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/migrations.js.map +1 -1
- package/dist/native-sign-in.d.ts +45 -0
- package/dist/native-sign-in.d.ts.map +1 -0
- package/dist/native-sign-in.js +183 -0
- package/dist/native-sign-in.js.map +1 -0
- package/dist/pages.js.map +1 -1
- package/dist/provider.d.ts +11 -4
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +16 -1
- package/dist/provider.js.map +1 -1
- package/dist/revocation.js.map +1 -1
- package/dist/routes.js.map +1 -1
- package/dist/schema.js.map +1 -1
- package/dist/statements.js.map +1 -1
- package/dist/tokens.js.map +1 -1
- package/dist/turn-keys.js.map +1 -1
- package/package.json +7 -7
package/dist/account.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type ActionContext, type UserPrincipal } from "@parlor/core";
|
|
2
2
|
import { type ActionsOf } from "@parlor/core/registry";
|
|
3
|
-
import type { PluginHost } from "@parlor/server";
|
|
3
|
+
import type { PluginCaller, PluginHost } from "@parlor/server";
|
|
4
4
|
import { z } from "zod";
|
|
5
5
|
import type { DeviceAccountActions } from "./devices.js";
|
|
6
6
|
import type { HostAccountActions } from "./hosts.js";
|
|
@@ -29,6 +29,13 @@ interface AccountDeps {
|
|
|
29
29
|
readonly revoke: (notice: RevocationNotice) => Promise<void>;
|
|
30
30
|
}
|
|
31
31
|
export declare function signedIn(ctx: ActionContext): UserPrincipal;
|
|
32
|
+
/**
|
|
33
|
+
* Computers and device keys exist only for the chat, so a user its `access` refuses can
|
|
34
|
+
* pair neither; removing what they already have stays open.
|
|
35
|
+
*/
|
|
36
|
+
export declare function chatAllows(host: PluginHost, caller: PluginCaller): Promise<boolean>;
|
|
37
|
+
export declare const CHAT_REFUSED = "This account cannot use the agent.";
|
|
38
|
+
export declare function requireChat(host: PluginHost, ctx: ActionContext): Promise<void>;
|
|
32
39
|
/**
|
|
33
40
|
* Plugin actions at `/_parlor/auth/actions/<name>`. Better Auth writes through its own
|
|
34
41
|
* connection, so these never run inside an action transaction (on PGlite that would
|
package/dist/account.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../src/account.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../src/account.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,aAAa,EAElB,KAAK,aAAa,EACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,KAAK,SAAS,EAAkB,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,eAAO,MAAM,YAAY,yBAAyB,CAAC;AACnD,eAAO,MAAM,UAAU,uBAAuB,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAaD,MAAM,MAAM,cAAc,GAAG,SAAS,CAAC,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,GACvE,kBAAkB,GAClB,oBAAoB,CAAC;AAEvB,UAAU,WAAW;IACnB,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9D;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,aAAa,GAAG,aAAa,CAK1D;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,OAAO,CAAC,CAElB;AAED,eAAO,MAAM,YAAY,uCAAuC,CAAC;AAEjE,wBAAsB,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAErF;AAKD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW;;;;;;;;;;;;;GAiGrE"}
|
package/dist/account.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { CHAT_PLUGIN } from "@parlor/chat";
|
|
1
2
|
import { ActionError, defineAction, } from "@parlor/core";
|
|
2
3
|
import { createRegistry } from "@parlor/core/registry";
|
|
3
4
|
import { z } from "zod";
|
|
@@ -10,6 +11,18 @@ export function signedIn(ctx) {
|
|
|
10
11
|
}
|
|
11
12
|
return ctx.principal;
|
|
12
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* Computers and device keys exist only for the chat, so a user its `access` refuses can
|
|
16
|
+
* pair neither; removing what they already have stays open.
|
|
17
|
+
*/
|
|
18
|
+
export async function chatAllows(host, caller) {
|
|
19
|
+
return (await host.allows?.(CHAT_PLUGIN, caller)) ?? true;
|
|
20
|
+
}
|
|
21
|
+
export const CHAT_REFUSED = "This account cannot use the agent.";
|
|
22
|
+
export async function requireChat(host, ctx) {
|
|
23
|
+
if (!(await chatAllows(host, ctx)))
|
|
24
|
+
throw new ActionError("forbidden", CHAT_REFUSED);
|
|
25
|
+
}
|
|
13
26
|
const scopesOf = (scopes) => typeof scopes === "string" ? scopes.split(" ").filter(Boolean) : [...scopes];
|
|
14
27
|
/**
|
|
15
28
|
* Plugin actions at `/_parlor/auth/actions/<name>`. Better Auth writes through its own
|
package/dist/account.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account.js","sourceRoot":"","sources":["../src/account.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EAEX,YAAY,GAEb,MAAM,cAAc,CAAC;AACtB,OAAO,EAAkB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAKxC,MAAM,CAAC,MAAM,YAAY,GAAG,sBAAsB,CAAC;AACnD,MAAM,CAAC,MAAM,UAAU,GAAG,oBAAoB,CAAC;AAuC/C,MAAM,UAAU,QAAQ,CAAC,GAAkB;IACzC,IAAI,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAClC,MAAM,IAAI,WAAW,CAAC,WAAW,EAAE,4CAA4C,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,GAAG,CAAC,SAAS,CAAC;AACvB,CAAC;AAED,MAAM,QAAQ,GAAG,CAAC,MAAuB,EAAE,EAAE,CAC3C,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;AAE/E;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAe;IACpE,OAAO,cAAc,CAAC;QACpB,QAAQ,EAAE,YAAY,CAAC;YACrB,WAAW,EAAE,4CAA4C;YACzD,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YACnB,KAAK,EAAE,CAAC,YAAY,CAAC;YACrB,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAA8B,EAAE;gBACrD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC3B,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC;gBACpD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACjE,OAAO,QAAQ;qBACZ,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;qBAC7D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;qBAC7D,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBACjB,EAAE,EAAE,OAAO,CAAC,EAAE;oBACd,OAAO,EAAE,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS;oBACtC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;oBACpC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;oBACpC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE;oBAC1C,YAAY,EAAE,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE;iBAC9C,CAAC,CAAC,CAAC;YACR,CAAC;SACF,CAAC;QACF,aAAa,EAAE,YAAY,CAAC;YAC1B,WAAW,EAAE,iEAAiE;YAC9E,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1C,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE;gBACzB,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC3B,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC;gBACpD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACjE,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;gBAClE,IAAI,CAAC,OAAO;oBAAE,MAAM,IAAI,WAAW,CAAC,WAAW,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;gBACrE,MAAM,eAAe,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACnD,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;gBACrD,OAAO,EAAE,EAAE,EAAE,CAAC;YAChB,CAAC;SACF,CAAC;QACF,MAAM,EAAE,YAAY,CAAC;YACnB,WAAW,EAAE,sDAAsD;YACnE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YACnB,KAAK,EAAE,CAAC,UAAU,CAAC;YACnB,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAA6B,EAAE;gBACpD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC3B,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC;gBAC5C,MAAM,IAAI,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;gBACvD,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;oBAClD,OAAO,CAAC,QAAQ,CAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;oBAC/D,OAAO,CAAC,QAAQ,CAAuB;wBACrC,KAAK,EAAE,mBAAmB;wBAC1B,KAAK,EAAE,IAAI;qBACZ,CAAC;iBACH,CAAC,CAAC;gBACH,iFAAiF;gBACjF,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAC/B,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CACpE,CAAC;gBACF,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiB,CAAC;gBACxC,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC;oBAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBACzC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS;wBAC7C,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBACtC,CAAC;gBACD,OAAO,OAAO,CAAC,GAAG,CAChB,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;oBACvC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAA2B;wBAC7D,KAAK,EAAE,aAAa;wBACpB,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;qBACtD,CAAC,CAAC;oBACH,OAAO;wBACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,KAAK,CAAC,QAAQ;wBACpC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;wBAC9B,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE;qBAC3C,CAAC;gBACJ,CAAC,CAAC,CACH,CAAC;YACJ,CAAC;SACF,CAAC;QACF,WAAW,EAAE,YAAY,CAAC;YACxB,WAAW,EAAE,4DAA4D;YACzE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAChD,GAAG,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE;gBAC/B,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC3B,MAAM,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACtE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC;gBAC5C,MAAM,KAAK,GAAG;oBACZ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE;oBACvC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE;iBACvC,CAAC;gBACF,KAAK,MAAM,KAAK,IAAI,CAAC,cAAc,EAAE,mBAAmB,EAAE,kBAAkB,CAAC,EAAE,CAAC;oBAC9E,MAAM,OAAO,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC7C,CAAC;gBACD,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACzD,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC;YAC1B,CAAC;SACF,CAAC;KACH,CAAC,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"account.js","sourceRoot":"","sources":["../src/account.ts"],"names":[],"mappings":"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","sourcesContent":["import { CHAT_PLUGIN } from \"@parlor/chat\";\nimport {\n ActionError,\n type ActionContext,\n defineAction,\n type UserPrincipal,\n} from \"@parlor/core\";\nimport { type ActionsOf, createRegistry } from \"@parlor/core/registry\";\nimport type { PluginCaller, PluginHost } from \"@parlor/server\";\nimport { z } from \"zod\";\n\nimport type { DeviceAccountActions } from \"./devices.js\";\nimport { grantIdOf } from \"./grants.js\";\nimport type { HostAccountActions } from \"./hosts.js\";\nimport type { BetterAuthInstance } from \"./provider.js\";\nimport type { RevocationNotice } from \"./revocation.js\";\n\nexport const SESSIONS_TAG = \"parlor_auth_sessions\";\nexport const AGENTS_TAG = \"parlor_auth_agents\";\n\nexport interface SignedInSession {\n readonly id: string;\n readonly current: boolean;\n readonly userAgent: string | null;\n readonly ipAddress: string | null;\n readonly createdAt: string;\n readonly lastActiveAt: string;\n}\n\nexport interface ConnectedAgent {\n readonly clientId: string;\n readonly name: string;\n readonly scopes: readonly string[];\n readonly connectedAt: string;\n}\n\ninterface Grant {\n readonly clientId: string;\n readonly scopes: string | readonly string[];\n readonly createdAt: Date;\n}\n\ninterface RefreshToken {\n readonly revoked?: Date | null;\n readonly expiresAt: Date;\n}\n\nexport type AccountActions = ActionsOf<ReturnType<typeof accountActions>> &\n HostAccountActions &\n DeviceAccountActions;\n\ninterface AccountDeps {\n readonly instance: BetterAuthInstance;\n readonly host: PluginHost;\n readonly revoke: (notice: RevocationNotice) => Promise<void>;\n}\n\nexport function signedIn(ctx: ActionContext): UserPrincipal {\n if (ctx.principal.kind !== \"user\") {\n throw new ActionError(\"forbidden\", \"Only a signed-in user manages the account.\");\n }\n return ctx.principal;\n}\n\n/**\n * Computers and device keys exist only for the chat, so a user its `access` refuses can\n * pair neither; removing what they already have stays open.\n */\nexport async function chatAllows(\n host: PluginHost,\n caller: PluginCaller,\n): Promise<boolean> {\n return (await host.allows?.(CHAT_PLUGIN, caller)) ?? true;\n}\n\nexport const CHAT_REFUSED = \"This account cannot use the agent.\";\n\nexport async function requireChat(host: PluginHost, ctx: ActionContext): Promise<void> {\n if (!(await chatAllows(host, ctx))) throw new ActionError(\"forbidden\", CHAT_REFUSED);\n}\n\nconst scopesOf = (scopes: Grant[\"scopes\"]) =>\n typeof scopes === \"string\" ? scopes.split(\" \").filter(Boolean) : [...scopes];\n\n/**\n * Plugin actions at `/_parlor/auth/actions/<name>`. Better Auth writes through its own\n * connection, so these never run inside an action transaction (on PGlite that would\n * deadlock) and announce their changes afterwards instead of declaring `writes`.\n */\nexport function accountActions({ instance, host, revoke }: AccountDeps) {\n return createRegistry({\n sessions: defineAction({\n description: \"List the places this account is signed in.\",\n input: z.object({}),\n reads: [SESSIONS_TAG],\n run: async (_input, ctx): Promise<SignedInSession[]> => {\n const user = signedIn(ctx);\n const { internalAdapter } = await instance.$context;\n const sessions = await internalAdapter.listSessions(user.userId);\n return sessions\n .filter((session) => session.expiresAt.getTime() > Date.now())\n .sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime())\n .map((session) => ({\n id: session.id,\n current: session.id === user.sessionId,\n userAgent: session.userAgent ?? null,\n ipAddress: session.ipAddress ?? null,\n createdAt: session.createdAt.toISOString(),\n lastActiveAt: session.updatedAt.toISOString(),\n }));\n },\n }),\n revokeSession: defineAction({\n description: \"Sign this account out of one place; its open connections close.\",\n input: z.object({ id: z.string().min(1) }),\n run: async ({ id }, ctx) => {\n const user = signedIn(ctx);\n const { internalAdapter } = await instance.$context;\n const sessions = await internalAdapter.listSessions(user.userId);\n const session = sessions.find((candidate) => candidate.id === id);\n if (!session) throw new ActionError(\"not_found\", `No session ${id}`);\n await internalAdapter.deleteSession(session.token);\n await host.announce(ctx.scope, [[SESSIONS_TAG, id]]);\n return { id };\n },\n }),\n agents: defineAction({\n description: \"List the agents this account authorized through MCP.\",\n input: z.object({}),\n reads: [AGENTS_TAG],\n run: async (_input, ctx): Promise<ConnectedAgent[]> => {\n const user = signedIn(ctx);\n const { adapter } = await instance.$context;\n const mine = [{ field: \"userId\", value: user.userId }];\n const [consents, refreshTokens] = await Promise.all([\n adapter.findMany<Grant>({ model: \"oauthConsent\", where: mine }),\n adapter.findMany<Grant & RefreshToken>({\n model: \"oauthRefreshToken\",\n where: mine,\n }),\n ]);\n // A trusted client skips consent, so its live refresh tokens are its only trace.\n const live = refreshTokens.filter(\n (token) => !token.revoked && token.expiresAt.getTime() > Date.now(),\n );\n const grants = new Map<string, Grant>();\n for (const grant of [...live, ...consents]) {\n const known = grants.get(grant.clientId);\n if (!known || grant.createdAt < known.createdAt)\n grants.set(grant.clientId, grant);\n }\n return Promise.all(\n [...grants.values()].map(async (grant) => {\n const client = await adapter.findOne<{ name?: string | null }>({\n model: \"oauthClient\",\n where: [{ field: \"clientId\", value: grant.clientId }],\n });\n return {\n clientId: grant.clientId,\n name: client?.name || grant.clientId,\n scopes: scopesOf(grant.scopes),\n connectedAt: grant.createdAt.toISOString(),\n };\n }),\n );\n },\n }),\n revokeAgent: defineAction({\n description: \"Revoke an agent's access; its tokens stop working at once.\",\n input: z.object({ clientId: z.string().min(1) }),\n run: async ({ clientId }, ctx) => {\n const user = signedIn(ctx);\n await revoke({ kind: \"grant\", id: grantIdOf(user.userId, clientId) });\n const { adapter } = await instance.$context;\n const where = [\n { field: \"userId\", value: user.userId },\n { field: \"clientId\", value: clientId },\n ];\n for (const model of [\"oauthConsent\", \"oauthRefreshToken\", \"oauthAccessToken\"]) {\n await adapter.deleteMany({ model, where });\n }\n await host.announce(ctx.scope, [[AGENTS_TAG, clientId]]);\n return { id: clientId };\n },\n }),\n });\n}\n"]}
|
package/dist/audit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DataProvider } from \"@parlor/core\";\nimport type { ActionAudit, Migration } from \"@parlor/server\";\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport type { Database } from \"./database.js\";\n\nexport const AUDIT_MIGRATION: Migration = {\n id: \"auth/0006_audit\",\n sql: `\n create table parlor_auth_audit (\n id bigint generated always as identity primary key,\n at timestamptz not null,\n action text not null,\n actor_kind text not null,\n user_id text,\n grant_id text,\n session_id text,\n device_id text,\n host_id text,\n agent_name text,\n agent_verified boolean,\n thread_id text,\n turn_id text,\n source text not null,\n scope text not null,\n input_digest text not null,\n stage text not null,\n outcome text not null,\n confirmation text\n );\n create index parlor_auth_audit_by_user on parlor_auth_audit (user_id, at);\n create function parlor_auth_audit_append_only() returns trigger language plpgsql as $$\n begin\n raise exception 'parlor_auth_audit is append-only';\n end\n $$;\n create trigger parlor_auth_audit_append_only\n before update or delete on parlor_auth_audit\n for each row execute function parlor_auth_audit_append_only()`,\n};\n\nconst FLUSH_MS = 250;\nconst FLUSH_AT = 100;\nconst KEEP_AT_MOST = 10_000;\n\nfunction audited({ principal, stage, confirmation }: ActionAudit): boolean {\n return principal.kind === \"agent\" || stage === \"refused\" || confirmation !== undefined;\n}\n\nfunction rowOf(audit: ActionAudit): SQL {\n const { principal } = audit;\n const user = principal.kind === \"anonymous\" ? undefined : principal.userId;\n const grant =\n principal.kind === \"agent\" || principal.kind === \"host\"\n ? principal.grantId\n : undefined;\n const turn = principal.kind === \"agent\" ? principal.turn : undefined;\n const host = principal.kind === \"host\" ? principal.hostId : turn?.hostId;\n return sql`(${new Date(audit.at).toISOString()}, ${audit.action}, ${principal.kind},\n ${user ?? null}, ${grant ?? null},\n ${principal.kind === \"user\" ? principal.sessionId : null},\n ${principal.kind === \"user\" ? (principal.deviceId ?? null) : null},\n ${host ?? null},\n ${principal.kind === \"agent\" ? principal.agent.name : null},\n ${principal.kind === \"agent\" ? principal.agent.verified : null},\n ${turn?.threadId ?? null}, ${turn?.turnId ?? null},\n ${audit.source}, ${audit.scope}, ${audit.inputDigest}, ${audit.stage}, ${audit.outcome},\n ${audit.confirmation ?? null})`;\n}\n\nexport interface AuditLog {\n record(audit: ActionAudit): void;\n flush(): Promise<void>;\n stop(): Promise<void>;\n}\n\nexport function createAuditLog(database: DataProvider): AuditLog {\n let queued: ActionAudit[] = [];\n let timer: ReturnType<typeof setTimeout> | undefined;\n let writing: Promise<void> = Promise.resolve();\n let stopped = false;\n\n const write = async () => {\n if (queued.length === 0) return;\n const batch = queued;\n queued = [];\n try {\n await database.transaction(async (tx) => {\n await (tx as Database).execute(sql`\n insert into parlor_auth_audit\n (at, action, actor_kind, user_id, grant_id, session_id, device_id, host_id,\n agent_name, agent_verified, thread_id, turn_id, source, scope, input_digest,\n stage, outcome, confirmation)\n values ${sql.join(batch.map(rowOf), sql`, `)}`);\n });\n } catch (error) {\n queued = [...batch, ...queued].slice(-KEEP_AT_MOST);\n throw error;\n }\n };\n\n const flush = () => {\n if (timer !== undefined) clearTimeout(timer);\n timer = undefined;\n const next = writing.then(write, write);\n writing = next.catch(() => {});\n return next;\n };\n\n const schedule = () => {\n if (timer !== undefined || stopped) return;\n timer = setTimeout(() => {\n timer = undefined;\n flush().catch((error: unknown) => {\n console.error(\"[parlor] audit write failed, will retry:\", error);\n schedule();\n });\n }, FLUSH_MS);\n timer.unref?.();\n };\n\n return {\n record(audit) {\n if (!audited(audit)) return;\n queued.push(audit);\n if (queued.length >= FLUSH_AT) {\n flush().catch((error: unknown) => {\n console.error(\"[parlor] audit write failed, will retry:\", error);\n schedule();\n });\n } else {\n schedule();\n }\n },\n flush,\n async stop() {\n stopped = true;\n await flush().catch((error: unknown) => {\n console.error(\"[parlor] audit write failed on shutdown:\", error);\n });\n },\n };\n}\n"]}
|
package/dist/better-auth.d.ts
CHANGED
|
@@ -16,6 +16,11 @@ export interface ParlorAuthOptions extends Omit<BetterAuthOptions, "basePath" |
|
|
|
16
16
|
* resumes once the user signs in through `@parlor/auth/client`.
|
|
17
17
|
*/
|
|
18
18
|
readonly signInPage: string;
|
|
19
|
+
/**
|
|
20
|
+
* The app's URL scheme, `app.scheme`, where social sign-in in a native shell returns.
|
|
21
|
+
* Defaults to `PARLOR_APP_SCHEME`, which `parlor dev` and `parlor build` set from it.
|
|
22
|
+
*/
|
|
23
|
+
readonly scheme?: string | undefined;
|
|
19
24
|
}
|
|
20
25
|
export interface ParlorAuthSettings {
|
|
21
26
|
readonly appName?: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"better-auth.d.ts","sourceRoot":"","sources":["../src/better-auth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAoB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"better-auth.d.ts","sourceRoot":"","sources":["../src/better-auth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAoB,MAAM,aAAa,CAAC;AAIvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,eAAO,MAAM,WAAW,SAAS,CAAC;AAClC,eAAO,MAAM,cAAc,kBAAwC,CAAC;AACpE,eAAO,MAAM,SAAS,QAAQ,CAAC;AAC/B,eAAO,MAAM,YAAY,aAAa,CAAC;AAGvC,eAAO,MAAM,kBAAkB,QAA2C,CAAC;AAa3E,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAC7C,iBAAiB,EACjB,UAAU,GAAG,SAAS,CACvB;IACC;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,UAAU,MAAM;IACd,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;CACpE;AA8BD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAQ3D;AAED,gGAAgG;AAChG,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,SAAS,MAAM,EAAE,CAMlF;AAWD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,iBAAiB,CA4BxE"}
|
package/dist/better-auth.js
CHANGED
|
@@ -3,6 +3,7 @@ import { fetchClientMetadataResource } from "@better-auth/cimd/node";
|
|
|
3
3
|
import { mcp } from "@better-auth/mcp";
|
|
4
4
|
import { DEFAULT_BASE_PATH, REVOCATION_HORIZON_MS, SHELL_ORIGINS } from "@parlor/server";
|
|
5
5
|
import { bearer, jwt } from "better-auth/plugins";
|
|
6
|
+
import { nativeSignIn } from "./native-sign-in.js";
|
|
6
7
|
export const AUTH_PLUGIN = "auth";
|
|
7
8
|
export const AUTH_BASE_PATH = `${DEFAULT_BASE_PATH}/${AUTH_PLUGIN}`;
|
|
8
9
|
export const MCP_SCOPE = "mcp";
|
|
@@ -72,7 +73,7 @@ function originOf(options) {
|
|
|
72
73
|
* PKCE, tokens bound to `/_parlor/mcp`).
|
|
73
74
|
*/
|
|
74
75
|
export function parlorAuth(options) {
|
|
75
|
-
const { origin: _origin, signInPage, ...rest } = options;
|
|
76
|
+
const { origin: _origin, signInPage, scheme, ...rest } = options;
|
|
76
77
|
const origin = originOf(options);
|
|
77
78
|
const baseURL = `${origin}${AUTH_BASE_PATH}`;
|
|
78
79
|
const resource = `${origin}${DEFAULT_BASE_PATH}/mcp`;
|
|
@@ -95,12 +96,12 @@ export function parlorAuth(options) {
|
|
|
95
96
|
disabledPaths: [...DISABLED_PATHS, ...(rest.disabledPaths ?? [])],
|
|
96
97
|
plugins: [
|
|
97
98
|
...(rest.plugins ?? []),
|
|
98
|
-
...frameworkPlugins(resource, signInPage),
|
|
99
|
+
...frameworkPlugins(resource, signInPage, scheme ?? process.env.PARLOR_APP_SCHEME),
|
|
99
100
|
bridgePlugin(bridge),
|
|
100
101
|
],
|
|
101
102
|
};
|
|
102
103
|
}
|
|
103
|
-
function frameworkPlugins(resource, signInPage) {
|
|
104
|
+
function frameworkPlugins(resource, signInPage, scheme) {
|
|
104
105
|
// Better Auth's plugin types are not written for exactOptionalPropertyTypes.
|
|
105
106
|
return [
|
|
106
107
|
bearer(),
|
|
@@ -113,6 +114,7 @@ function frameworkPlugins(resource, signInPage) {
|
|
|
113
114
|
accessTokenExpiresIn: ACCESS_TOKEN_TTL_S,
|
|
114
115
|
}),
|
|
115
116
|
cimd({ fetchClientMetadataResource, metadataProfile: "mcp-2026-07-28" }),
|
|
117
|
+
nativeSignIn({ scheme: scheme || undefined }),
|
|
116
118
|
];
|
|
117
119
|
}
|
|
118
120
|
//# sourceMappingURL=better-auth.js.map
|
package/dist/better-auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"better-auth.js","sourceRoot":"","sources":["../src/better-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEzF,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"better-auth.js","sourceRoot":"","sources":["../src/better-auth.ts"],"names":[],"mappings":"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","sourcesContent":["import { cimd } from \"@better-auth/cimd\";\nimport { fetchClientMetadataResource } from \"@better-auth/cimd/node\";\nimport { mcp } from \"@better-auth/mcp\";\nimport { DEFAULT_BASE_PATH, REVOCATION_HORIZON_MS, SHELL_ORIGINS } from \"@parlor/server\";\nimport type { BetterAuthOptions, BetterAuthPlugin } from \"better-auth\";\nimport { bearer, jwt } from \"better-auth/plugins\";\n\nimport { nativeSignIn } from \"./native-sign-in.js\";\nimport type { RevocationNotice } from \"./revocation.js\";\n\nexport const AUTH_PLUGIN = \"auth\";\nexport const AUTH_BASE_PATH = `${DEFAULT_BASE_PATH}/${AUTH_PLUGIN}`;\nexport const MCP_SCOPE = \"mcp\";\nexport const CONSENT_PATH = \"/consent\";\n/** Clock skew a revocation must outlast beyond a credential's own lifetime. */\nconst SKEW_MS = 60_000;\nexport const ACCESS_TOKEN_TTL_S = (REVOCATION_HORIZON_MS - SKEW_MS) / 1000;\n\n/** Better Auth endpoints that would let a user bypass Parlor's own account actions. */\nconst DISABLED_PATHS = [\n \"/oauth2/create-client\",\n \"/oauth2/update-client\",\n \"/oauth2/delete-client\",\n \"/oauth2/client/rotate-secret\",\n \"/oauth2/get-clients\",\n \"/oauth2/delete-consent\",\n \"/oauth2/update-consent\",\n];\n\nexport interface ParlorAuthOptions extends Omit<\n BetterAuthOptions,\n \"basePath\" | \"baseURL\"\n> {\n /**\n * The app's public origin, which serves its pages and `/_parlor`. Defaults to\n * `PARLOR_ORIGIN`, then to the web origin `parlor dev` sets.\n */\n readonly origin?: string | undefined;\n /**\n * The app page that signs a user in. An MCP client's authorization lands there and\n * resumes once the user signs in through `@parlor/auth/client`.\n */\n readonly signInPage: string;\n /**\n * The app's URL scheme, `app.scheme`, where social sign-in in a native shell returns.\n * Defaults to `PARLOR_APP_SCHEME`, which `parlor dev` and `parlor build` set from it.\n */\n readonly scheme?: string | undefined;\n}\n\nexport interface ParlorAuthSettings {\n readonly appName?: string | undefined;\n readonly origin: string;\n readonly baseURL: string;\n readonly resource: string;\n}\n\ninterface Bridge {\n settings: ParlorAuthSettings;\n revoke?: ((notice: RevocationNotice) => Promise<void>) | undefined;\n}\n\nconst BRIDGE_PLUGIN = \"parlor\";\n\ninterface BridgePlugin extends BetterAuthPlugin {\n readonly bridge: Bridge;\n}\n\nfunction bridgePlugin(bridge: Bridge): BridgePlugin {\n const ended = async (notice: RevocationNotice) => {\n if (!bridge.revoke) {\n throw new Error(\"Install betterAuthProvider() in createServer({ auth }).\");\n }\n await bridge.revoke(notice);\n };\n return {\n id: BRIDGE_PLUGIN,\n bridge,\n init: () => ({\n options: {\n databaseHooks: {\n session: {\n delete: { after: (session) => ended({ kind: \"session\", id: session.id }) },\n },\n },\n },\n }),\n };\n}\n\nexport function bridgeOf(options: BetterAuthOptions): Bridge {\n const plugin = options.plugins?.find((candidate) => candidate.id === BRIDGE_PLUGIN);\n if (!plugin) {\n throw new Error(\n \"Pass the Better Auth options through parlorAuth() before betterAuth().\",\n );\n }\n return (plugin as BridgePlugin).bridge;\n}\n\n/** The other frontends one `parlor dev` serves next to the web target, each on its own port. */\nexport function devOrigins(env: NodeJS.ProcessEnv = process.env): readonly string[] {\n if (env.PARLOR_DEV !== \"1\") return [];\n return (env.PARLOR_DEV_ORIGINS ?? \"\")\n .split(\",\")\n .map((origin) => origin.trim())\n .filter((origin) => /^https?:\\/\\//.test(origin));\n}\n\nfunction originOf(options: ParlorAuthOptions): string {\n const origin =\n options.origin ?? process.env.PARLOR_ORIGIN ?? process.env.PARLOR_WEB_ORIGIN;\n if (!origin) {\n throw new Error(\"Set PARLOR_ORIGIN to the app's public origin, or pass `origin`.\");\n }\n return new URL(origin).origin;\n}\n\n/**\n * The Better Auth options Parlor needs, merged into the app's own: sessions as a cookie\n * on the web and a bearer token in native shells, and an OAuth authorization server for\n * MCP clients (MCP 2026-07-28: protected resource metadata, Client ID Metadata Documents,\n * PKCE, tokens bound to `/_parlor/mcp`).\n */\nexport function parlorAuth(options: ParlorAuthOptions): BetterAuthOptions {\n const { origin: _origin, signInPage, scheme, ...rest } = options;\n const origin = originOf(options);\n const baseURL = `${origin}${AUTH_BASE_PATH}`;\n const resource = `${origin}${DEFAULT_BASE_PATH}/mcp`;\n const bridge: Bridge = {\n settings: { appName: rest.appName, origin, baseURL, resource },\n };\n const trusted = rest.trustedOrigins;\n return {\n ...rest,\n baseURL,\n basePath: AUTH_BASE_PATH,\n trustedOrigins: Array.isArray(trusted)\n ? [origin, ...SHELL_ORIGINS, ...devOrigins(), ...trusted]\n : async (request) => [\n origin,\n ...SHELL_ORIGINS,\n ...devOrigins(),\n ...(typeof trusted === \"function\" ? await trusted(request) : []),\n ],\n disabledPaths: [...DISABLED_PATHS, ...(rest.disabledPaths ?? [])],\n plugins: [\n ...(rest.plugins ?? []),\n ...frameworkPlugins(resource, signInPage, scheme ?? process.env.PARLOR_APP_SCHEME),\n bridgePlugin(bridge),\n ],\n };\n}\n\nfunction frameworkPlugins(\n resource: string,\n signInPage: string,\n scheme: string | undefined,\n): BetterAuthPlugin[] {\n // Better Auth's plugin types are not written for exactOptionalPropertyTypes.\n return [\n bearer(),\n jwt(),\n mcp({\n resource,\n loginPage: signInPage,\n consentPage: `${AUTH_BASE_PATH}${CONSENT_PATH}`,\n scopes: [MCP_SCOPE, \"offline_access\"],\n accessTokenExpiresIn: ACCESS_TOKEN_TTL_S,\n }),\n cimd({ fetchClientMetadataResource, metadataProfile: \"mcp-2026-07-28\" }),\n nativeSignIn({ scheme: scheme || undefined }),\n ] as BetterAuthPlugin[];\n}\n"]}
|
package/dist/client/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type DeviceKey, type SessionStore } from "@parlor/capabilities";
|
|
1
|
+
import { type AuthBrowser, type DeviceKey, type SessionStore } from "@parlor/capabilities";
|
|
2
2
|
import { type ActionClient, type DeviceLinker, type DeviceSource, type HostAuthorizer, type SessionDevice, type SessionSource } from "@parlor/client";
|
|
3
3
|
import type { AccountActions } from "../account.js";
|
|
4
4
|
export interface AuthClientOptions {
|
|
@@ -12,6 +12,10 @@ export interface AuthClientOptions {
|
|
|
12
12
|
readonly session?: SessionStore | undefined;
|
|
13
13
|
/** Where this device's signing keys live. Defaults to the `deviceKey` capability. */
|
|
14
14
|
readonly deviceKey?: DeviceKey | undefined;
|
|
15
|
+
/** Where social sign-in runs. Defaults to the `authBrowser` capability. */
|
|
16
|
+
readonly browser?: AuthBrowser | undefined;
|
|
17
|
+
/** The app's URL scheme, where social sign-in returns in a native shell. Defaults to `app.scheme`. */
|
|
18
|
+
readonly scheme?: string | undefined;
|
|
15
19
|
readonly fetch?: typeof fetch | undefined;
|
|
16
20
|
}
|
|
17
21
|
export declare class AuthClientError extends Error {
|
|
@@ -21,6 +25,14 @@ export declare class AuthClientError extends Error {
|
|
|
21
25
|
constructor(message: string, status: number, code: string | undefined);
|
|
22
26
|
}
|
|
23
27
|
export type DeviceHandle = SessionDevice;
|
|
28
|
+
export interface SocialSignInInput {
|
|
29
|
+
/** A provider in Better Auth's `socialProviders`, or a `genericOAuth` provider id. */
|
|
30
|
+
readonly provider: string;
|
|
31
|
+
/** On the web, the page the provider returns to once signed in. Defaults to `/`. */
|
|
32
|
+
readonly callbackURL?: string | undefined;
|
|
33
|
+
/** On the web, the page a failed sign-in returns to with `?error=`. Defaults to this page. */
|
|
34
|
+
readonly errorCallbackURL?: string | undefined;
|
|
35
|
+
}
|
|
24
36
|
export interface AuthClient extends SessionSource, DeviceSource, HostAuthorizer, DeviceLinker {
|
|
25
37
|
deviceSetup(): Promise<"needed" | "ready">;
|
|
26
38
|
/** Plug into `createActionClient({ headers })` so every surface carries the session. */
|
|
@@ -35,9 +47,33 @@ export interface AuthClient extends SessionSource, DeviceSource, HostAuthorizer,
|
|
|
35
47
|
readonly password: string;
|
|
36
48
|
}): Promise<void>;
|
|
37
49
|
signOut(): Promise<void>;
|
|
50
|
+
/** Sign-in with a one-time code sent by email, through Better Auth's `emailOTP` plugin. */
|
|
51
|
+
readonly emailOtp: {
|
|
52
|
+
send(input: {
|
|
53
|
+
readonly email: string;
|
|
54
|
+
}): Promise<void>;
|
|
55
|
+
/** Signs in, creating the account on first use unless the plugin disables sign-up. */
|
|
56
|
+
signIn(input: {
|
|
57
|
+
readonly email: string;
|
|
58
|
+
readonly otp: string;
|
|
59
|
+
readonly name?: string | undefined;
|
|
60
|
+
}): Promise<void>;
|
|
61
|
+
};
|
|
62
|
+
/** Sign-in with a provider such as Google, through Better Auth's `socialProviders`. */
|
|
63
|
+
readonly social: {
|
|
64
|
+
/** Whether this platform can run it: false in a native shell without the `authBrowser` capability. */
|
|
65
|
+
available(): Promise<boolean>;
|
|
66
|
+
/**
|
|
67
|
+
* On the web the page leaves for the provider and comes back to `callbackURL`, so this
|
|
68
|
+
* never resolves. In a native shell the provider opens in the system's sign-in browser
|
|
69
|
+
* and this resolves once the app is signed in; it throws `AuthClientError` with code
|
|
70
|
+
* `CANCELLED` when the user closes it.
|
|
71
|
+
*/
|
|
72
|
+
signIn(input: SocialSignInInput): Promise<void>;
|
|
73
|
+
};
|
|
38
74
|
/** The account actions: `sessions`, `revokeSession`, `agents`, `revokeAgent`. */
|
|
39
75
|
readonly account: ActionClient<AccountActions>;
|
|
40
76
|
}
|
|
41
77
|
export declare function createAuthClient(options?: AuthClientOptions): AuthClient;
|
|
42
|
-
export type { HostPairing, SessionStore } from "@parlor/capabilities";
|
|
78
|
+
export type { AuthBrowser, HostPairing, SessionStore } from "@parlor/capabilities";
|
|
43
79
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
|
package/dist/client/index.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { oauthProviderClient } from "@better-auth/oauth-provider/client";
|
|
2
|
-
import { detectPlatform, deviceKey, resolveCapability, sessionStore, } from "@parlor/capabilities";
|
|
3
|
-
import { decodeBase64url } from "@parlor/capabilities/encoding";
|
|
2
|
+
import { authBrowser, detectPlatform, deviceKey, resolveCapability, sessionStore, } from "@parlor/capabilities";
|
|
3
|
+
import { decodeBase64url, encodeBase64url } from "@parlor/capabilities/encoding";
|
|
4
4
|
import { appOrigin, createActionClient, LinkOnComputer, } from "@parlor/client";
|
|
5
5
|
import { ActionError } from "@parlor/core";
|
|
6
6
|
import { createAuthClient as createBetterAuthClient } from "better-auth/client";
|
|
7
|
+
import { emailOTPClient } from "better-auth/client/plugins";
|
|
7
8
|
import { answerStatement, deviceCommitment, HOST_PAIRING_FRAGMENT, linkCode, normalizeLinkCode, pairingProof, promptStatement, removeStatement, statementBytes, vouchStatement, } from "../statements.js";
|
|
8
9
|
const DEFAULT_BASE_PATH = "/_parlor";
|
|
9
10
|
const RETRY_BASE_MS = 1000;
|
|
@@ -12,10 +13,27 @@ const TOKEN_HEADER = "set-auth-token";
|
|
|
12
13
|
const HOST_IPC_REDIRECT = "urn:parlor:ipc";
|
|
13
14
|
const DEBUG_KEY = "parlor:debug";
|
|
14
15
|
const HOST_PAIRING_KEY = "parlor:host-pairing";
|
|
16
|
+
const NATIVE_CALLBACK = "//_parlor/auth/callback";
|
|
15
17
|
function injectedServerUrl() {
|
|
16
18
|
const env = import.meta.env;
|
|
17
19
|
return env?.PARLOR_SERVER_URL ?? "";
|
|
18
20
|
}
|
|
21
|
+
function injectedScheme() {
|
|
22
|
+
const env = import.meta.env;
|
|
23
|
+
return env?.PARLOR_APP_SCHEME ?? "";
|
|
24
|
+
}
|
|
25
|
+
const nativeSignInClient = {
|
|
26
|
+
id: "parlor-native-sign-in",
|
|
27
|
+
$InferServerPlugin: {},
|
|
28
|
+
atomListeners: [
|
|
29
|
+
{ matcher: (path) => path === "/native/token", signal: "$sessionSignal" },
|
|
30
|
+
],
|
|
31
|
+
};
|
|
32
|
+
const randomText = (bytes) => encodeBase64url(crypto.getRandomValues(new Uint8Array(bytes)));
|
|
33
|
+
async function pkceChallenge(verifier) {
|
|
34
|
+
const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(verifier));
|
|
35
|
+
return encodeBase64url(new Uint8Array(digest));
|
|
36
|
+
}
|
|
19
37
|
export class AuthClientError extends Error {
|
|
20
38
|
status;
|
|
21
39
|
code;
|
|
@@ -145,7 +163,7 @@ export function createAuthClient(options = {}) {
|
|
|
145
163
|
let client;
|
|
146
164
|
const connect = () => createBetterAuthClient({
|
|
147
165
|
baseURL: `${baseUrl || globalThis.location.origin}${basePath}/auth`,
|
|
148
|
-
plugins: [oauthProviderClient()],
|
|
166
|
+
plugins: [oauthProviderClient(), emailOTPClient(), nativeSignInClient],
|
|
149
167
|
fetchOptions: {
|
|
150
168
|
...(options.fetch ? { customFetchImpl: options.fetch } : {}),
|
|
151
169
|
onRequest: async (context) => {
|
|
@@ -211,6 +229,60 @@ export function createAuthClient(options = {}) {
|
|
|
211
229
|
basePath: `${basePath}/auth`,
|
|
212
230
|
headers,
|
|
213
231
|
});
|
|
232
|
+
const signInBrowser = async () => {
|
|
233
|
+
if (options.browser)
|
|
234
|
+
return options.browser;
|
|
235
|
+
const handle = await resolveCapability(authBrowser);
|
|
236
|
+
return handle.available ? handle.api : undefined;
|
|
237
|
+
};
|
|
238
|
+
const signInOnThePage = async (browser, input) => {
|
|
239
|
+
const page = new URL(globalThis.location.href);
|
|
240
|
+
const callbackURL = new URL(input.callbackURL ?? "/", page).href;
|
|
241
|
+
const errorPage = new URL(input.errorCallbackURL ?? page, page);
|
|
242
|
+
errorPage.searchParams.delete("error");
|
|
243
|
+
errorPage.searchParams.delete("error_description");
|
|
244
|
+
const result = await betterAuth().signIn.social({
|
|
245
|
+
provider: input.provider,
|
|
246
|
+
callbackURL,
|
|
247
|
+
errorCallbackURL: errorPage.href,
|
|
248
|
+
disableRedirect: true,
|
|
249
|
+
});
|
|
250
|
+
settle(result);
|
|
251
|
+
const url = result.data?.url;
|
|
252
|
+
if (!url)
|
|
253
|
+
throw new AuthClientError("The provider gave no sign-in page.", 500, undefined);
|
|
254
|
+
await browser.open(url, callbackURL);
|
|
255
|
+
};
|
|
256
|
+
const signInInTheApp = async (browser, provider) => {
|
|
257
|
+
const scheme = options.scheme ?? injectedScheme();
|
|
258
|
+
if (!scheme) {
|
|
259
|
+
throw new AuthClientError("Set app.scheme in parlor.config.ts to sign in with a provider in the app.", 0, "NO_SCHEME");
|
|
260
|
+
}
|
|
261
|
+
const callback = `${scheme}:${NATIVE_CALLBACK}`;
|
|
262
|
+
const verifier = randomText(32);
|
|
263
|
+
const state = randomText(16);
|
|
264
|
+
const start = new URL(`${baseUrl || globalThis.location.origin}${basePath}/auth/native/sign-in/social`);
|
|
265
|
+
start.search = new URLSearchParams({
|
|
266
|
+
provider,
|
|
267
|
+
redirect_uri: callback,
|
|
268
|
+
code_challenge: await pkceChallenge(verifier),
|
|
269
|
+
code_challenge_method: "S256",
|
|
270
|
+
state,
|
|
271
|
+
}).toString();
|
|
272
|
+
const returned = await browser.open(start.href, callback);
|
|
273
|
+
if (!returned)
|
|
274
|
+
throw new AuthClientError("Sign-in was cancelled.", 0, "CANCELLED");
|
|
275
|
+
const answer = new URL(returned).searchParams;
|
|
276
|
+
if (answer.get("state") !== state) {
|
|
277
|
+
throw new AuthClientError("This sign-in was not started here.", 0, "STATE_MISMATCH");
|
|
278
|
+
}
|
|
279
|
+
const failed = answer.get("error");
|
|
280
|
+
const code = answer.get("code");
|
|
281
|
+
if (failed || !code) {
|
|
282
|
+
throw new AuthClientError(answer.get("error_description") || `Sign-in failed (${failed ?? "no code"}).`, 400, failed ?? undefined);
|
|
283
|
+
}
|
|
284
|
+
settle(await betterAuth().native.token({ code, code_verifier: verifier }));
|
|
285
|
+
};
|
|
214
286
|
const keysOfThisPlatform = async () => {
|
|
215
287
|
const handle = await resolveCapability(deviceKey);
|
|
216
288
|
return handle.available ? handle.api : undefined;
|
|
@@ -315,6 +387,23 @@ export function createAuthClient(options = {}) {
|
|
|
315
387
|
},
|
|
316
388
|
signIn: async (input) => settle(await betterAuth().signIn.email(input)),
|
|
317
389
|
signUp: async (input) => settle(await betterAuth().signUp.email(input)),
|
|
390
|
+
emailOtp: {
|
|
391
|
+
send: async ({ email }) => settle(await betterAuth().emailOtp.sendVerificationOtp({ email, type: "sign-in" })),
|
|
392
|
+
signIn: async ({ email, otp, name }) => settle(await betterAuth().signIn.emailOtp({ email, otp, ...(name ? { name } : {}) })),
|
|
393
|
+
},
|
|
394
|
+
social: {
|
|
395
|
+
available: async () => (await signInBrowser()) !== undefined,
|
|
396
|
+
signIn: async (input) => {
|
|
397
|
+
const browser = await signInBrowser();
|
|
398
|
+
if (!browser) {
|
|
399
|
+
throw new AuthClientError(`Signing in with ${input.provider} is not available here.`, 0, "UNSUPPORTED");
|
|
400
|
+
}
|
|
401
|
+
if (await store)
|
|
402
|
+
await signInInTheApp(browser, input.provider);
|
|
403
|
+
else
|
|
404
|
+
await signInOnThePage(browser, input);
|
|
405
|
+
},
|
|
406
|
+
},
|
|
318
407
|
signOut: async () => {
|
|
319
408
|
try {
|
|
320
409
|
settle(await betterAuth().signOut());
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { oauthProviderClient } from \"@better-auth/oauth-provider/client\";\nimport {\n type AuthBrowser,\n authBrowser,\n detectPlatform,\n type DeviceKey,\n deviceKey,\n type PairingPresenceKey,\n type PresencePublicKey,\n resolveCapability,\n type SessionStore,\n sessionStore,\n} from \"@parlor/capabilities\";\nimport { decodeBase64url, encodeBase64url } from \"@parlor/capabilities/encoding\";\nimport {\n type ActionClient,\n appOrigin,\n createActionClient,\n type DeviceLinker,\n type DeviceSource,\n type HostAuthorizer,\n LinkOnComputer,\n type PendingLink,\n type SessionDevice,\n type SessionSnapshot,\n type SessionSource,\n type SessionUser,\n} from \"@parlor/client\";\nimport { ActionError } from \"@parlor/core\";\nimport type { BetterAuthClientPlugin } from \"better-auth/client\";\nimport { createAuthClient as createBetterAuthClient } from \"better-auth/client\";\nimport { emailOTPClient } from \"better-auth/client/plugins\";\n\nimport type { AccountActions } from \"../account.js\";\nimport type { nativeSignIn } from \"../native-sign-in.js\";\nimport {\n answerStatement,\n deviceCommitment,\n HOST_PAIRING_FRAGMENT,\n linkCode,\n normalizeLinkCode,\n pairingProof,\n promptStatement,\n removeStatement,\n type Statement,\n statementBytes,\n vouchStatement,\n} from \"../statements.js\";\n\nconst DEFAULT_BASE_PATH = \"/_parlor\";\nconst RETRY_BASE_MS = 1000;\nconst RETRY_MAX_MS = 30_000;\nconst TOKEN_HEADER = \"set-auth-token\";\nconst HOST_IPC_REDIRECT = \"urn:parlor:ipc\";\nconst DEBUG_KEY = \"parlor:debug\";\nconst HOST_PAIRING_KEY = \"parlor:host-pairing\";\n\nconst NATIVE_CALLBACK = \"//_parlor/auth/callback\";\n\nfunction injectedServerUrl(): string {\n const env = (import.meta as { env?: { PARLOR_SERVER_URL?: string } }).env;\n return env?.PARLOR_SERVER_URL ?? \"\";\n}\n\nfunction injectedScheme(): string {\n const env = (import.meta as { env?: { PARLOR_APP_SCHEME?: string } }).env;\n return env?.PARLOR_APP_SCHEME ?? \"\";\n}\n\nconst nativeSignInClient = {\n id: \"parlor-native-sign-in\",\n $InferServerPlugin: {} as ReturnType<typeof nativeSignIn>,\n atomListeners: [\n { matcher: (path: string) => path === \"/native/token\", signal: \"$sessionSignal\" },\n ],\n} satisfies BetterAuthClientPlugin;\n\nconst randomText = (bytes: number) =>\n encodeBase64url(crypto.getRandomValues(new Uint8Array(bytes)));\n\nasync function pkceChallenge(verifier: string): Promise<string> {\n const digest = await crypto.subtle.digest(\n \"SHA-256\",\n new TextEncoder().encode(verifier),\n );\n return encodeBase64url(new Uint8Array(digest));\n}\n\nexport interface AuthClientOptions {\n /** The backend origin; defaults to the shell's `server.url`, or this page's origin. */\n readonly baseUrl?: string | undefined;\n readonly basePath?: string | undefined;\n /**\n * Where a bearer session is kept. Defaults to the `sessionStore` capability: native\n * shells keep a bearer token, the web keeps a cookie.\n */\n readonly session?: SessionStore | undefined;\n /** Where this device's signing keys live. Defaults to the `deviceKey` capability. */\n readonly deviceKey?: DeviceKey | undefined;\n /** Where social sign-in runs. Defaults to the `authBrowser` capability. */\n readonly browser?: AuthBrowser | undefined;\n /** The app's URL scheme, where social sign-in returns in a native shell. Defaults to `app.scheme`. */\n readonly scheme?: string | undefined;\n readonly fetch?: typeof fetch | undefined;\n}\n\nexport class AuthClientError extends Error {\n override readonly name = \"AuthClientError\";\n constructor(\n message: string,\n readonly status: number,\n readonly code: string | undefined,\n ) {\n super(message);\n }\n}\n\nexport type DeviceHandle = SessionDevice;\n\nexport interface SocialSignInInput {\n /** A provider in Better Auth's `socialProviders`, or a `genericOAuth` provider id. */\n readonly provider: string;\n /** On the web, the page the provider returns to once signed in. Defaults to `/`. */\n readonly callbackURL?: string | undefined;\n /** On the web, the page a failed sign-in returns to with `?error=`. Defaults to this page. */\n readonly errorCallbackURL?: string | undefined;\n}\n\nexport interface AuthClient\n extends SessionSource, DeviceSource, HostAuthorizer, DeviceLinker {\n deviceSetup(): Promise<\"needed\" | \"ready\">;\n /** Plug into `createActionClient({ headers })` so every surface carries the session. */\n readonly headers: () => Promise<HeadersInit>;\n signIn(input: { readonly email: string; readonly password: string }): Promise<void>;\n signUp(input: {\n readonly name: string;\n readonly email: string;\n readonly password: string;\n }): Promise<void>;\n signOut(): Promise<void>;\n /** Sign-in with a one-time code sent by email, through Better Auth's `emailOTP` plugin. */\n readonly emailOtp: {\n send(input: { readonly email: string }): Promise<void>;\n /** Signs in, creating the account on first use unless the plugin disables sign-up. */\n signIn(input: {\n readonly email: string;\n readonly otp: string;\n readonly name?: string | undefined;\n }): Promise<void>;\n };\n /** Sign-in with a provider such as Google, through Better Auth's `socialProviders`. */\n readonly social: {\n /** Whether this platform can run it: false in a native shell without the `authBrowser` capability. */\n available(): Promise<boolean>;\n /**\n * On the web the page leaves for the provider and comes back to `callbackURL`, so this\n * never resolves. In a native shell the provider opens in the system's sign-in browser\n * and this resolves once the app is signed in; it throws `AuthClientError` with code\n * `CANCELLED` when the user closes it.\n */\n signIn(input: SocialSignInInput): Promise<void>;\n };\n /** The account actions: `sessions`, `revokeSession`, `agents`, `revokeAgent`. */\n readonly account: ActionClient<AccountActions>;\n}\n\ninterface BetterAuthResult {\n readonly error?: {\n readonly message?: string | undefined;\n readonly status: number;\n readonly code?: string | undefined;\n } | null;\n}\n\nfunction settle(result: BetterAuthResult): void {\n if (!result.error) return;\n const { message, status, code } = result.error;\n throw new AuthClientError(message || \"Authentication failed.\", status, code);\n}\n\nconst ANONYMOUS_SESSION: SessionSnapshot = { status: \"anonymous\" };\n\nconst BROWSERS = [\n [/Edg\\//, \"Edge\"],\n [/OPR\\//, \"Opera\"],\n [/Firefox\\//, \"Firefox\"],\n [/Chrome\\//, \"Chrome\"],\n [/Safari\\//, \"Safari\"],\n] as const;\n\nconst SYSTEMS = [\n [/iPhone|iPad/, \"iOS\"],\n [/Android/, \"Android\"],\n [/Mac OS X/, \"macOS\"],\n [/Windows/, \"Windows\"],\n [/Linux/, \"Linux\"],\n] as const;\n\nfunction deviceName(): string {\n const agent = globalThis.navigator?.userAgent ?? \"\";\n const browser = BROWSERS.find(([pattern]) => pattern.test(agent))?.[1];\n const system = SYSTEMS.find(([pattern]) => pattern.test(agent))?.[1];\n if (browser && system) return `${browser} on ${system}`;\n return browser ?? system ?? \"This device\";\n}\n\nfunction debugStatements(): boolean {\n try {\n return (\n globalThis.localStorage?.getItem(DEBUG_KEY)?.split(\",\").includes(\"statements\") ??\n false\n );\n } catch {\n return false;\n }\n}\n\nasync function logSigned(statement: Statement): Promise<void> {\n if (!debugStatements()) return;\n const digest = await crypto.subtle.digest(\n \"SHA-256\",\n new Uint8Array(statementBytes(statement)),\n );\n const hex = [...new Uint8Array(digest)]\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\");\n console.info(`[parlor] signed ${statement.kind} sha256=${hex}`);\n}\n\n/** Takes the host's pairing secret off this page's URL, where only that redirect puts it. */\nfunction keepHostPairing(): void {\n try {\n const location = globalThis.location;\n if (!location?.hash) return;\n const fragment = new URLSearchParams(location.hash.slice(1));\n const secret = fragment.get(HOST_PAIRING_FRAGMENT);\n if (!secret) return;\n globalThis.localStorage?.setItem(HOST_PAIRING_KEY, secret);\n fragment.delete(HOST_PAIRING_FRAGMENT);\n const rest = fragment.toString();\n globalThis.history?.replaceState(\n globalThis.history.state,\n \"\",\n `${location.pathname}${location.search}${rest ? `#${rest}` : \"\"}`,\n );\n } catch {}\n}\n\nfunction hostPairing(): string | undefined {\n try {\n return globalThis.localStorage?.getItem(HOST_PAIRING_KEY) ?? undefined;\n } catch {\n return undefined;\n }\n}\n\nconst serverHasNoAuth = (error: { readonly status?: unknown }) => error.status === 404;\n\nfunction enrollmentPresence(presence: PresencePublicKey | undefined, rpId: string) {\n if (!presence) return undefined;\n return presence.format === \"webauthn\"\n ? {\n format: \"webauthn\" as const,\n credentialId: presence.credentialId,\n rpId,\n publicKey: { ...presence.publicKey },\n attestation: presence.attestation,\n }\n : {\n format: \"es256-raw\" as const,\n keyId: presence.keyId,\n publicKey: { ...presence.publicKey },\n };\n}\n\nfunction registered(\n presence: ReturnType<typeof enrollmentPresence>,\n): PairingPresenceKey | undefined {\n if (presence?.format !== \"webauthn\") return presence;\n const { attestation: _attestation, ...key } = presence;\n return key;\n}\n\nfunction hostnameOf(origin: string): string {\n try {\n return new URL(origin).hostname;\n } catch {\n return globalThis.location.hostname;\n }\n}\n\nexport function createAuthClient(options: AuthClientOptions = {}): AuthClient {\n keepHostPairing();\n const baseUrl = options.baseUrl ?? injectedServerUrl();\n const basePath = options.basePath ?? DEFAULT_BASE_PATH;\n const store: Promise<SessionStore | undefined> = options.session\n ? Promise.resolve(options.session)\n : resolveCapability(sessionStore).then((handle) =>\n handle.available ? handle.api : undefined,\n );\n\n const headers = async (): Promise<HeadersInit> => {\n const token = await (await store)?.get();\n return token ? { authorization: `Bearer ${token}` } : {};\n };\n\n // Built on first use: importing a module that creates the client must work outside a page.\n let client: ReturnType<typeof connect> | undefined;\n const connect = () =>\n createBetterAuthClient({\n baseURL: `${baseUrl || globalThis.location.origin}${basePath}/auth`,\n plugins: [oauthProviderClient(), emailOTPClient(), nativeSignInClient],\n fetchOptions: {\n ...(options.fetch ? { customFetchImpl: options.fetch } : {}),\n onRequest: async (context) => {\n for (const [name, value] of new Headers(await headers())) {\n context.headers.set(name, value);\n }\n return context;\n },\n onSuccess: async (context) => {\n const token = context.response.headers.get(TOKEN_HEADER);\n if (token) await (await store)?.set(token);\n else if (\n context.request.url.toString().endsWith(\"/get-session\") &&\n !context.data\n ) {\n // A bearer token the server no longer knows would fail every later request.\n await (await store)?.set(undefined);\n }\n },\n },\n });\n const betterAuth = () => (client ??= connect());\n\n let watchers = 0;\n let retry: ReturnType<typeof setTimeout> | undefined;\n let retryDelay = RETRY_BASE_MS;\n const retryAfterError = () => {\n const state = betterAuth().useSession.get();\n if (!state.error || serverHasNoAuth(state.error)) {\n retryDelay = RETRY_BASE_MS;\n return;\n }\n if (retry !== undefined || state.isRefetching) return;\n retry = setTimeout(() => {\n retry = undefined;\n void state.refetch();\n }, retryDelay);\n retryDelay = Math.min(retryDelay * 2, RETRY_MAX_MS);\n };\n\n let last: unknown;\n let snapshot: SessionSnapshot = { status: \"loading\" };\n const current = (): SessionSnapshot => {\n const state = betterAuth().useSession.get();\n if (state === last) return snapshot;\n last = state;\n if (state.error) {\n if (serverHasNoAuth(state.error)) snapshot = ANONYMOUS_SESSION;\n // Only the server saying there is no session signs the user out, never an unreachable one.\n return snapshot;\n }\n const user = state.data?.user;\n snapshot = user\n ? { status: \"signed-in\", user: { id: user.id, name: user.name, email: user.email } }\n : state.isPending\n ? { status: \"loading\" }\n : { status: \"signed-out\" };\n return snapshot;\n };\n\n const account = createActionClient<AccountActions>({\n baseUrl,\n fetch: options.fetch,\n basePath: `${basePath}/auth`,\n headers,\n });\n\n const signInBrowser = async (): Promise<AuthBrowser | undefined> => {\n if (options.browser) return options.browser;\n const handle = await resolveCapability(authBrowser);\n return handle.available ? handle.api : undefined;\n };\n\n const signInOnThePage = async (browser: AuthBrowser, input: SocialSignInInput) => {\n const page = new URL(globalThis.location.href);\n const callbackURL = new URL(input.callbackURL ?? \"/\", page).href;\n const errorPage = new URL(input.errorCallbackURL ?? page, page);\n errorPage.searchParams.delete(\"error\");\n errorPage.searchParams.delete(\"error_description\");\n const result = await betterAuth().signIn.social({\n provider: input.provider,\n callbackURL,\n errorCallbackURL: errorPage.href,\n disableRedirect: true,\n });\n settle(result);\n const url = result.data?.url;\n if (!url)\n throw new AuthClientError(\"The provider gave no sign-in page.\", 500, undefined);\n await browser.open(url, callbackURL);\n };\n\n const signInInTheApp = async (browser: AuthBrowser, provider: string) => {\n const scheme = options.scheme ?? injectedScheme();\n if (!scheme) {\n throw new AuthClientError(\n \"Set app.scheme in parlor.config.ts to sign in with a provider in the app.\",\n 0,\n \"NO_SCHEME\",\n );\n }\n const callback = `${scheme}:${NATIVE_CALLBACK}`;\n const verifier = randomText(32);\n const state = randomText(16);\n const start = new URL(\n `${baseUrl || globalThis.location.origin}${basePath}/auth/native/sign-in/social`,\n );\n start.search = new URLSearchParams({\n provider,\n redirect_uri: callback,\n code_challenge: await pkceChallenge(verifier),\n code_challenge_method: \"S256\",\n state,\n }).toString();\n const returned = await browser.open(start.href, callback);\n if (!returned) throw new AuthClientError(\"Sign-in was cancelled.\", 0, \"CANCELLED\");\n const answer = new URL(returned).searchParams;\n if (answer.get(\"state\") !== state) {\n throw new AuthClientError(\n \"This sign-in was not started here.\",\n 0,\n \"STATE_MISMATCH\",\n );\n }\n const failed = answer.get(\"error\");\n const code = answer.get(\"code\");\n if (failed || !code) {\n throw new AuthClientError(\n answer.get(\"error_description\") || `Sign-in failed (${failed ?? \"no code\"}).`,\n 400,\n failed ?? undefined,\n );\n }\n settle(await betterAuth().native.token({ code, code_verifier: verifier }));\n };\n\n const keysOfThisPlatform = async (): Promise<DeviceKey | undefined> => {\n const handle = await resolveCapability(deviceKey);\n return handle.available ? handle.api : undefined;\n };\n\n const devices = new Map<string, Promise<DeviceHandle | undefined>>();\n const enroll = async (\n user: SessionUser,\n wantsPresence: boolean,\n ): Promise<DeviceHandle | undefined> => {\n const key = options.deviceKey ?? (await keysOfThisPlatform());\n if (!key) return undefined;\n const app = appOrigin(baseUrl || undefined);\n const rpId = hostnameOf(app);\n const { challenge } = await account.call(\"deviceChallenge\", {});\n const keys = await key.publicKeys(\n {\n rpId,\n userId: user.id,\n userName: user.email,\n challenge: decodeBase64url(challenge),\n },\n { presence: wantsPresence },\n );\n const presence = enrollmentPresence(keys.presence, rpId);\n const name = deviceName();\n const platform = detectPlatform();\n const signingKey = { ...keys.signing.publicKey };\n const { id } = await account.call(\"enrollDevice\", {\n name,\n platform,\n challenge,\n signing: { keyId: keys.signing.keyId, publicKey: signingKey },\n ...(presence ? { presence } : {}),\n proof: keys.proof,\n });\n return {\n id,\n keys: {\n deviceId: id,\n name,\n platform,\n signingKey,\n presenceKey: registered(presence),\n },\n signPrompt: async (prompt, wanted) => {\n const at = Date.now();\n const statement = await promptStatement(app, prompt, at);\n const bytes = statementBytes(statement);\n const signature = wanted?.presence\n ? await key.sign(bytes, { presence: true })\n : await key.sign(bytes, { presence: false });\n await logSigned(statement);\n const secret = hostPairing();\n const pairing = secret && (await pairingProof(secret, id, signingKey));\n return { deviceId: id, at, signature, ...(pairing ? { pairing } : {}) };\n },\n signAnswer: async (answer, { presence: wanted }) => {\n const at = Date.now();\n const statement = await answerStatement(app, answer, at);\n const bytes = statementBytes(statement);\n const signature = wanted\n ? await key.sign(bytes, { presence: true })\n : await key.sign(bytes, { presence: false });\n await logSigned(statement);\n return { deviceId: id, at, signature };\n },\n };\n };\n\n const device = async (wanted?: {\n readonly presence?: boolean;\n }): Promise<DeviceHandle | undefined> => {\n const session = current();\n if (session.status !== \"signed-in\") return undefined;\n const known = devices.get(session.user.id);\n if (known) return known;\n // The browser that approved `connect` is on the computer, which answers its permission questions.\n const presence = wanted?.presence ?? hostPairing() === undefined;\n const enrolling = enroll(session.user, presence).catch((error: unknown) => {\n if (error instanceof ActionError && error.code === \"not_found\") return undefined;\n throw error;\n });\n devices.set(session.user.id, enrolling);\n enrolling.then(\n (enrolled) => {\n if (!enrolled) devices.delete(session.user.id);\n },\n () => devices.delete(session.user.id),\n );\n return enrolling;\n };\n\n return {\n headers,\n current,\n subscribe: (listener) => {\n watchers += 1;\n const stop = betterAuth().useSession.listen(() => {\n retryAfterError();\n listener();\n });\n return () => {\n stop();\n watchers -= 1;\n if (watchers === 0 && retry !== undefined) {\n clearTimeout(retry);\n retry = undefined;\n }\n };\n },\n signIn: async (input) => settle(await betterAuth().signIn.email(input)),\n signUp: async (input) => settle(await betterAuth().signUp.email(input)),\n emailOtp: {\n send: async ({ email }) =>\n settle(\n await betterAuth().emailOtp.sendVerificationOtp({ email, type: \"sign-in\" }),\n ),\n signIn: async ({ email, otp, name }) =>\n settle(\n await betterAuth().signIn.emailOtp({ email, otp, ...(name ? { name } : {}) }),\n ),\n },\n social: {\n available: async () => (await signInBrowser()) !== undefined,\n signIn: async (input) => {\n const browser = await signInBrowser();\n if (!browser) {\n throw new AuthClientError(\n `Signing in with ${input.provider} is not available here.`,\n 0,\n \"UNSUPPORTED\",\n );\n }\n if (await store) await signInInTheApp(browser, input.provider);\n else await signInOnThePage(browser, input);\n },\n },\n signOut: async () => {\n try {\n settle(await betterAuth().signOut());\n } finally {\n await (await store)?.set(undefined);\n }\n },\n linkState: async () => {\n const pairing = hostPairing() !== undefined;\n const session = current();\n if (session.status !== \"signed-in\") return { vouched: false, pairing };\n const known = devices.get(session.user.id);\n const key = options.deviceKey ?? (await keysOfThisPlatform());\n const silent =\n known !== undefined ||\n (key !== undefined && (await key.presenceSetup?.()) !== \"needed\");\n const own = silent ? await device() : undefined;\n if (!own) return { vouched: false, pairing };\n const listed = await account.call(\"devices\", {});\n const listing = listed.find((entry) => entry.id === own.id);\n if (!listing) {\n devices.delete(session.user.id);\n return { vouched: false, pairing };\n }\n return { deviceId: own.id, vouched: listing.vouched, pairing };\n },\n startLink: async (wanted) => {\n const own = await device(wanted);\n if (!own) throw new Error(\"Sign in on this device first.\");\n const app = appOrigin(baseUrl || undefined);\n const commitment = await deviceCommitment(\n app,\n own.id,\n own.keys.signingKey,\n own.keys.presenceKey?.publicKey,\n );\n const code = linkCode(commitment);\n const { expiresAt } = await account.call(\"startDeviceLink\", {\n device: own.id,\n code,\n });\n return { deviceId: own.id, code, commitment, expiresAt };\n },\n resolveLink: async (from): Promise<PendingLink> => {\n const code = typeof from === \"string\" ? normalizeLinkCode(from) : undefined;\n const found = await account.call(\n \"resolveDeviceLink\",\n code ? { code } : { device: (from as { deviceId: string }).deviceId },\n );\n const commitment = await deviceCommitment(\n appOrigin(baseUrl || undefined),\n found.id,\n found.signingKey,\n found.presenceKey?.publicKey,\n );\n const matches =\n typeof from === \"string\"\n ? linkCode(commitment) === code\n : found.id === from.deviceId && commitment === from.commitment;\n if (!matches) {\n throw new Error(\n \"The app returned a device whose keys do not match this code, so it was not linked.\",\n );\n }\n return {\n id: found.id,\n name: found.name,\n platform: found.platform,\n commitment,\n code: linkCode(commitment),\n };\n },\n listDevices: async () => {\n const session = current();\n if (session.status !== \"signed-in\") return [];\n const own = devices.has(session.user.id) ? await device() : undefined;\n const listed = await account.call(\"devices\", {});\n return listed.map((entry) => ({ ...entry, current: entry.id === own?.id }));\n },\n removeDevice: async (id) => {\n const own = await device();\n const key = options.deviceKey ?? (await keysOfThisPlatform());\n if (!own?.keys.presenceKey || !key) {\n throw new LinkOnComputer(\"This device cannot confirm it is you.\");\n }\n const app = appOrigin(baseUrl || undefined);\n const at = Date.now();\n const signature = await key.sign(\n statementBytes(removeStatement(app, own.id, id, at)),\n {\n presence: true,\n },\n );\n await account.call(\"removeDevice\", {\n device: id,\n actor: own.id,\n app,\n at,\n signature,\n });\n const session = current();\n if (id === own.id && session.status === \"signed-in\")\n devices.delete(session.user.id);\n },\n canVouch: async () => {\n const session = current();\n if (session.status !== \"signed-in\") return false;\n const known = devices.get(session.user.id);\n const key = options.deviceKey ?? (await keysOfThisPlatform());\n if (!known && (await key?.presenceSetup?.()) === \"needed\") return false;\n return (await device())?.keys.presenceKey !== undefined;\n },\n vouch: async (link) => {\n const own = await device();\n const key = options.deviceKey ?? (await keysOfThisPlatform());\n if (!own?.keys.presenceKey || !key) {\n throw new LinkOnComputer(\"This device cannot confirm it is you.\");\n }\n const app = appOrigin(baseUrl || undefined);\n const at = Date.now();\n const statement = vouchStatement(app, own.id, link.id, link.commitment, at);\n const signature = await key.sign(statementBytes(statement), { presence: true });\n await account.call(\"vouchDevice\", {\n device: link.id,\n voucher: own.id,\n app,\n commitment: link.commitment,\n at,\n signature,\n });\n },\n deviceSetup: async () => {\n const session = current();\n if (session.status !== \"signed-in\" || devices.has(session.user.id)) return \"ready\";\n const key = options.deviceKey ?? (await keysOfThisPlatform());\n return (await key?.presenceSetup?.()) === \"needed\" ? \"needed\" : \"ready\";\n },\n device,\n authorizeHost: async (pairing) => {\n const response = await (options.fetch ?? fetch)(\n `${baseUrl}${basePath}/auth/hosts/authorize`,\n {\n method: \"POST\",\n headers: { ...(await headers()), \"content-type\": \"application/json\" },\n body: JSON.stringify({\n ...pairing,\n redirectUri: HOST_IPC_REDIRECT,\n decision: \"connect\",\n }),\n },\n );\n const body = (await response.json().catch(() => undefined)) as\n | { code?: unknown; state?: unknown; error?: { message?: string; code?: string } }\n | undefined;\n if (\n !response.ok ||\n typeof body?.code !== \"string\" ||\n body.state !== pairing.state\n ) {\n throw new AuthClientError(\n body?.error?.message ?? \"The computer could not be connected.\",\n response.status,\n body?.error?.code,\n );\n }\n return body.code;\n },\n account,\n };\n}\n\nexport type { AuthBrowser, HostPairing, SessionStore } from \"@parlor/capabilities\";\n"]}
|
package/dist/database.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAIA,qGAAqG;AACrG,MAAM,UAAU,MAAM,CAAI,MAAe;IACvC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,MAAa,CAAC;IAChD,OAAO,CAAE,MAAyB,CAAC,IAAI,IAAI,EAAE,CAAQ,CAAC;AACxD,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,KAAK,CAAC,KAA0B;IAC9C,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAgB,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/E,CAAC"}
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAIA,qGAAqG;AACrG,MAAM,UAAU,MAAM,CAAI,MAAe;IACvC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,MAAa,CAAC;IAChD,OAAO,CAAE,MAAyB,CAAC,IAAI,IAAI,EAAE,CAAQ,CAAC;AACxD,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,KAAK,CAAC,KAA0B;IAC9C,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAgB,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/E,CAAC","sourcesContent":["import type { PgDatabase, PgQueryResultHKT } from \"drizzle-orm/pg-core\";\n\nexport type Database = PgDatabase<PgQueryResultHKT>;\n\n/** node-postgres and PGlite both answer `execute` with `{ rows }`; drizzle's proxy with an array. */\nexport function rowsOf<T>(result: unknown): T[] {\n if (Array.isArray(result)) return result as T[];\n return ((result as { rows?: T[] }).rows ?? []) as T[];\n}\n\n/** A jsonb column arrives parsed from node-postgres and PGlite, as text from other drivers. */\nexport function jwkOf(value: JsonWebKey | string): JsonWebKey {\n return typeof value === \"string\" ? (JSON.parse(value) as JsonWebKey) : value;\n}\n"]}
|