@rc-tool/unified-auth-hosted-service 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.
Files changed (130) hide show
  1. package/README.md +5 -0
  2. package/dist/cli/env.d.ts +40 -0
  3. package/dist/cli/env.d.ts.map +1 -0
  4. package/dist/cli/env.js +350 -0
  5. package/dist/cli/env.js.map +1 -0
  6. package/dist/cli/index.d.ts +4 -0
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/index.js +145 -0
  9. package/dist/cli/index.js.map +1 -0
  10. package/dist/cli.d.ts +3 -0
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +4 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/hosted-service/applications.d.ts +8 -0
  15. package/dist/hosted-service/applications.d.ts.map +1 -0
  16. package/dist/hosted-service/applications.js +33 -0
  17. package/dist/hosted-service/applications.js.map +1 -0
  18. package/dist/hosted-service/constants.d.ts +6 -0
  19. package/dist/hosted-service/constants.d.ts.map +1 -0
  20. package/dist/hosted-service/constants.js +6 -0
  21. package/dist/hosted-service/constants.js.map +1 -0
  22. package/dist/hosted-service/cookies.d.ts +17 -0
  23. package/dist/hosted-service/cookies.d.ts.map +1 -0
  24. package/dist/hosted-service/cookies.js +56 -0
  25. package/dist/hosted-service/cookies.js.map +1 -0
  26. package/dist/hosted-service/crypto.d.ts +3 -0
  27. package/dist/hosted-service/crypto.d.ts.map +1 -0
  28. package/dist/hosted-service/crypto.js +39 -0
  29. package/dist/hosted-service/crypto.js.map +1 -0
  30. package/dist/hosted-service/http.d.ts +4 -0
  31. package/dist/hosted-service/http.d.ts.map +1 -0
  32. package/dist/hosted-service/http.js +27 -0
  33. package/dist/hosted-service/http.js.map +1 -0
  34. package/dist/hosted-service/login-page/components.d.ts +7 -0
  35. package/dist/hosted-service/login-page/components.d.ts.map +1 -0
  36. package/dist/hosted-service/login-page/components.js +40 -0
  37. package/dist/hosted-service/login-page/components.js.map +1 -0
  38. package/dist/hosted-service/login-page/document.d.ts +5 -0
  39. package/dist/hosted-service/login-page/document.d.ts.map +1 -0
  40. package/dist/hosted-service/login-page/document.js +19 -0
  41. package/dist/hosted-service/login-page/document.js.map +1 -0
  42. package/dist/hosted-service/login-page/escape.d.ts +2 -0
  43. package/dist/hosted-service/login-page/escape.d.ts.map +1 -0
  44. package/dist/hosted-service/login-page/escape.js +9 -0
  45. package/dist/hosted-service/login-page/escape.js.map +1 -0
  46. package/dist/hosted-service/login-page/icons.d.ts +5 -0
  47. package/dist/hosted-service/login-page/icons.d.ts.map +1 -0
  48. package/dist/hosted-service/login-page/icons.js +20 -0
  49. package/dist/hosted-service/login-page/icons.js.map +1 -0
  50. package/dist/hosted-service/login-page/index.d.ts +3 -0
  51. package/dist/hosted-service/login-page/index.d.ts.map +1 -0
  52. package/dist/hosted-service/login-page/index.js +23 -0
  53. package/dist/hosted-service/login-page/index.js.map +1 -0
  54. package/dist/hosted-service/login-page/links.d.ts +3 -0
  55. package/dist/hosted-service/login-page/links.d.ts.map +1 -0
  56. package/dist/hosted-service/login-page/links.js +50 -0
  57. package/dist/hosted-service/login-page/links.js.map +1 -0
  58. package/dist/hosted-service/login-page/styles.d.ts +2 -0
  59. package/dist/hosted-service/login-page/styles.d.ts.map +1 -0
  60. package/dist/hosted-service/login-page/styles.js +35 -0
  61. package/dist/hosted-service/login-page/styles.js.map +1 -0
  62. package/dist/hosted-service/login-page/types.d.ts +26 -0
  63. package/dist/hosted-service/login-page/types.d.ts.map +1 -0
  64. package/dist/hosted-service/login-page/types.js +2 -0
  65. package/dist/hosted-service/login-page/types.js.map +1 -0
  66. package/dist/hosted-service/oauth.d.ts +11 -0
  67. package/dist/hosted-service/oauth.d.ts.map +1 -0
  68. package/dist/hosted-service/oauth.js +37 -0
  69. package/dist/hosted-service/oauth.js.map +1 -0
  70. package/dist/hosted-service/providers/feishu.d.ts +4 -0
  71. package/dist/hosted-service/providers/feishu.d.ts.map +1 -0
  72. package/dist/hosted-service/providers/feishu.js +72 -0
  73. package/dist/hosted-service/providers/feishu.js.map +1 -0
  74. package/dist/hosted-service/providers/github.d.ts +4 -0
  75. package/dist/hosted-service/providers/github.d.ts.map +1 -0
  76. package/dist/hosted-service/providers/github.js +73 -0
  77. package/dist/hosted-service/providers/github.js.map +1 -0
  78. package/dist/hosted-service/providers/google.d.ts +4 -0
  79. package/dist/hosted-service/providers/google.d.ts.map +1 -0
  80. package/dist/hosted-service/providers/google.js +54 -0
  81. package/dist/hosted-service/providers/google.js.map +1 -0
  82. package/dist/hosted-service/routes.d.ts +12 -0
  83. package/dist/hosted-service/routes.d.ts.map +1 -0
  84. package/dist/hosted-service/routes.js +61 -0
  85. package/dist/hosted-service/routes.js.map +1 -0
  86. package/dist/hosted-service/service.d.ts +16 -0
  87. package/dist/hosted-service/service.d.ts.map +1 -0
  88. package/dist/hosted-service/service.js +205 -0
  89. package/dist/hosted-service/service.js.map +1 -0
  90. package/dist/hosted-service/session.d.ts +11 -0
  91. package/dist/hosted-service/session.d.ts.map +1 -0
  92. package/dist/hosted-service/session.js +52 -0
  93. package/dist/hosted-service/session.js.map +1 -0
  94. package/dist/hosted-service/store/file.d.ts +6 -0
  95. package/dist/hosted-service/store/file.d.ts.map +1 -0
  96. package/dist/hosted-service/store/file.js +62 -0
  97. package/dist/hosted-service/store/file.js.map +1 -0
  98. package/dist/hosted-service/store/index.d.ts +6 -0
  99. package/dist/hosted-service/store/index.d.ts.map +1 -0
  100. package/dist/hosted-service/store/index.js +3 -0
  101. package/dist/hosted-service/store/index.js.map +1 -0
  102. package/dist/hosted-service/store/memory.d.ts +6 -0
  103. package/dist/hosted-service/store/memory.d.ts.map +1 -0
  104. package/dist/hosted-service/store/memory.js +19 -0
  105. package/dist/hosted-service/store/memory.js.map +1 -0
  106. package/dist/hosted-service/store/state.d.ts +9 -0
  107. package/dist/hosted-service/store/state.d.ts.map +1 -0
  108. package/dist/hosted-service/store/state.js +156 -0
  109. package/dist/hosted-service/store/state.js.map +1 -0
  110. package/dist/hosted-service/store/types.d.ts +56 -0
  111. package/dist/hosted-service/store/types.d.ts.map +1 -0
  112. package/dist/hosted-service/store/types.js +2 -0
  113. package/dist/hosted-service/store/types.js.map +1 -0
  114. package/dist/hosted-service/types.d.ts +48 -0
  115. package/dist/hosted-service/types.d.ts.map +1 -0
  116. package/dist/hosted-service/types.js +2 -0
  117. package/dist/hosted-service/types.js.map +1 -0
  118. package/dist/hosted-service-cli.d.ts +2 -0
  119. package/dist/hosted-service-cli.d.ts.map +1 -0
  120. package/dist/hosted-service-cli.js +89 -0
  121. package/dist/hosted-service-cli.js.map +1 -0
  122. package/dist/hosted-service-node.d.ts +7 -0
  123. package/dist/hosted-service-node.d.ts.map +1 -0
  124. package/dist/hosted-service-node.js +35 -0
  125. package/dist/hosted-service-node.js.map +1 -0
  126. package/dist/index.d.ts +10 -0
  127. package/dist/index.d.ts.map +1 -0
  128. package/dist/index.js +6 -0
  129. package/dist/index.js.map +1 -0
  130. package/package.json +39 -0
@@ -0,0 +1,11 @@
1
+ import type { AuthContext, AuthSession } from "@rc-tool/unified-auth-sdk/service-client";
2
+ import type { HostedAuthSessionContext, HostedAuthSessionRecord, HostedAuthStore } from "./store/index.js";
3
+ import type { HostedAuthServiceOptions, SessionPayload } from "./types.js";
4
+ export declare function createSessionExpiresAt(): string;
5
+ export declare function createSessionPayload(session: HostedAuthSessionRecord): SessionPayload;
6
+ export declare function parseSessionPayload(request: Request, options: HostedAuthServiceOptions): SessionPayload | null;
7
+ export declare function getStoredSession(request: Request, options: HostedAuthServiceOptions, store: HostedAuthStore): Promise<HostedAuthSessionContext | null>;
8
+ export declare function deleteRequestSession(request: Request, options: HostedAuthServiceOptions, store: HostedAuthStore): Promise<void>;
9
+ export declare function toAuthSession(session: HostedAuthSessionRecord): AuthSession;
10
+ export declare function toAuthContext(stored: HostedAuthSessionContext | null): AuthContext;
11
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/hosted-service/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAIzF,OAAO,KAAK,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC3G,OAAO,KAAK,EAAE,wBAAwB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE3E,wBAAgB,sBAAsB,WAErC;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,uBAAuB,GAAG,cAAc,CAMrF;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,wBAAwB,yBAWtF;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,wBAAwB,EACjC,KAAK,EAAE,eAAe,4CAevB;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,wBAAwB,EACjC,KAAK,EAAE,eAAe,iBAOvB;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,uBAAuB,GAAG,WAAW,CAO3E;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,wBAAwB,GAAG,IAAI,GAAG,WAAW,CAKlF"}
@@ -0,0 +1,52 @@
1
+ import { AUTH_SERVICE_SESSION_COOKIE, SESSION_MAX_AGE_SECONDS } from "./constants.js";
2
+ import { getCookie } from "./cookies.js";
3
+ import { parseSignedToken } from "./crypto.js";
4
+ export function createSessionExpiresAt() {
5
+ return new Date(Date.now() + SESSION_MAX_AGE_SECONDS * 1000).toISOString();
6
+ }
7
+ export function createSessionPayload(session) {
8
+ return {
9
+ clientId: session.clientId,
10
+ exp: Math.floor(Date.parse(session.expiresAt) / 1000),
11
+ sessionId: session.id,
12
+ };
13
+ }
14
+ export function parseSessionPayload(request, options) {
15
+ const payload = parseSignedToken(getCookie(request, options.cookieName ?? AUTH_SERVICE_SESSION_COOKIE), options.sessionSecret);
16
+ if (!payload || payload.exp < Math.floor(Date.now() / 1000)) {
17
+ return null;
18
+ }
19
+ return payload;
20
+ }
21
+ export async function getStoredSession(request, options, store) {
22
+ const payload = parseSessionPayload(request, options);
23
+ if (!payload) {
24
+ return null;
25
+ }
26
+ const stored = await store.getSession(payload.sessionId);
27
+ if (!stored || stored.session.clientId !== payload.clientId) {
28
+ return null;
29
+ }
30
+ return stored;
31
+ }
32
+ export async function deleteRequestSession(request, options, store) {
33
+ const payload = parseSessionPayload(request, options);
34
+ if (payload) {
35
+ await store.deleteSession(payload.sessionId);
36
+ }
37
+ }
38
+ export function toAuthSession(session) {
39
+ return {
40
+ clientId: session.clientId,
41
+ expiresAt: session.expiresAt,
42
+ id: session.id,
43
+ userId: session.userId,
44
+ };
45
+ }
46
+ export function toAuthContext(stored) {
47
+ return {
48
+ session: stored ? toAuthSession(stored.session) : null,
49
+ user: stored?.user ?? null,
50
+ };
51
+ }
52
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/hosted-service/session.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAI/C,MAAM,UAAU,sBAAsB;IACpC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,uBAAuB,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAgC;IACnE,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;QACrD,SAAS,EAAE,OAAO,CAAC,EAAE;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAgB,EAAE,OAAiC;IACrF,MAAM,OAAO,GAAG,gBAAgB,CAC9B,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,IAAI,2BAA2B,CAAC,EACrE,OAAO,CAAC,aAAa,CACtB,CAAC;IAEF,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAgB,EAChB,OAAiC,EACjC,KAAsB;IAEtB,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAEtD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEzD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAgB,EAChB,OAAiC,EACjC,KAAsB;IAEtB,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAEtD,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAgC;IAC5D,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAuC;IACnE,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI;QACtD,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,IAAI;KAC3B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { HostedAuthStore } from "./types.js";
2
+ export interface CreateFileAuthStoreOptions {
3
+ filePath: string;
4
+ }
5
+ export declare function createFileAuthStore(options: CreateFileAuthStoreOptions): HostedAuthStore;
6
+ //# sourceMappingURL=file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../../src/hosted-service/store/file.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAGV,eAAe,EAEhB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,eAAe,CAuExF"}
@@ -0,0 +1,62 @@
1
+ import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
2
+ import { dirname } from "node:path";
3
+ import { createEmptyStoreState, createSessionInState, deleteSessionInState, getSessionInState, normalizeStoreState, upsertOAuthUserInState, } from "./state.js";
4
+ export function createFileAuthStore(options) {
5
+ let state = null;
6
+ let queue = Promise.resolve();
7
+ async function readState() {
8
+ if (state) {
9
+ return state;
10
+ }
11
+ try {
12
+ state = normalizeStoreState(JSON.parse(await readFile(options.filePath, "utf8")));
13
+ }
14
+ catch (error) {
15
+ const code = error instanceof Error && "code" in error ? error.code : undefined;
16
+ if (code !== "ENOENT") {
17
+ throw error;
18
+ }
19
+ state = createEmptyStoreState();
20
+ }
21
+ return state;
22
+ }
23
+ async function writeState(nextState) {
24
+ const temporaryPath = `${options.filePath}.tmp`;
25
+ await mkdir(dirname(options.filePath), { recursive: true });
26
+ await writeFile(temporaryPath, `${JSON.stringify(nextState, null, 2)}\n`, "utf8");
27
+ await rename(temporaryPath, options.filePath);
28
+ }
29
+ async function withState(mutates, callback) {
30
+ const run = async () => {
31
+ const current = await readState();
32
+ const result = await callback(current);
33
+ if (mutates) {
34
+ await writeState(current);
35
+ }
36
+ return result;
37
+ };
38
+ if (!mutates) {
39
+ return queue.then(run);
40
+ }
41
+ const next = queue.then(run, run);
42
+ queue = next.then(() => undefined, () => undefined);
43
+ return next;
44
+ }
45
+ return {
46
+ createSession(input) {
47
+ return withState(true, (current) => createSessionInState(current, input));
48
+ },
49
+ deleteSession(sessionId) {
50
+ return withState(true, (current) => {
51
+ deleteSessionInState(current, sessionId);
52
+ });
53
+ },
54
+ getSession(sessionId) {
55
+ return withState(false, (current) => getSessionInState(current, sessionId));
56
+ },
57
+ upsertOAuthUser(provider, providerUser) {
58
+ return withState(true, (current) => upsertOAuthUserInState(current, provider, providerUser));
59
+ },
60
+ };
61
+ }
62
+ //# sourceMappingURL=file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.js","sourceRoot":"","sources":["../../../src/hosted-service/store/file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { createFileAuthStore } from "./file.js";
2
+ export type { CreateFileAuthStoreOptions } from "./file.js";
3
+ export { createMemoryAuthStore } from "./memory.js";
4
+ export type { CreateMemoryAuthStoreOptions } from "./memory.js";
5
+ export type { CreateHostedAuthSessionInput, HostedAuthAccountRecord, HostedAuthProviderId, HostedAuthSessionContext, HostedAuthSessionRecord, HostedAuthStore, HostedAuthStoreState, HostedAuthUserRecord, } from "./types.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hosted-service/store/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,YAAY,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,YAAY,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAChE,YAAY,EACV,4BAA4B,EAC5B,uBAAuB,EACvB,oBAAoB,EACpB,wBAAwB,EACxB,uBAAuB,EACvB,eAAe,EACf,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { createFileAuthStore } from "./file.js";
2
+ export { createMemoryAuthStore } from "./memory.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hosted-service/store/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { HostedAuthStore, HostedAuthStoreState } from "./types.js";
2
+ export interface CreateMemoryAuthStoreOptions {
3
+ state?: Partial<HostedAuthStoreState>;
4
+ }
5
+ export declare function createMemoryAuthStore(options?: CreateMemoryAuthStoreOptions): HostedAuthStore;
6
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/hosted-service/store/memory.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAGV,eAAe,EACf,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,4BAA4B;IAC3C,KAAK,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACvC;AAED,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,4BAAiC,GAAG,eAAe,CAiBjG"}
@@ -0,0 +1,19 @@
1
+ import { createEmptyStoreState, createSessionInState, deleteSessionInState, getSessionInState, normalizeStoreState, upsertOAuthUserInState, } from "./state.js";
2
+ export function createMemoryAuthStore(options = {}) {
3
+ const state = options.state ? normalizeStoreState(options.state) : createEmptyStoreState();
4
+ return {
5
+ async createSession(input) {
6
+ return createSessionInState(state, input);
7
+ },
8
+ async deleteSession(sessionId) {
9
+ deleteSessionInState(state, sessionId);
10
+ },
11
+ async getSession(sessionId) {
12
+ return getSessionInState(state, sessionId);
13
+ },
14
+ async upsertOAuthUser(provider, providerUser) {
15
+ return upsertOAuthUserInState(state, provider, providerUser);
16
+ },
17
+ };
18
+ }
19
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/hosted-service/store/memory.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAYpB,MAAM,UAAU,qBAAqB,CAAC,UAAwC,EAAE;IAC9E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,qBAAqB,EAAE,CAAC;IAE3F,OAAO;QACL,KAAK,CAAC,aAAa,CAAC,KAAmC;YACrD,OAAO,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC;QACD,KAAK,CAAC,aAAa,CAAC,SAAiB;YACnC,oBAAoB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACzC,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,SAAiB;YAChC,OAAO,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC7C,CAAC;QACD,KAAK,CAAC,eAAe,CAAC,QAA8B,EAAE,YAAsB;YAC1E,OAAO,sBAAsB,CAAC,KAAK,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC/D,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { AuthUser } from "@rc-tool/unified-auth-sdk/service-client";
2
+ import type { CreateHostedAuthSessionInput, HostedAuthProviderId, HostedAuthSessionContext, HostedAuthSessionRecord, HostedAuthStoreState } from "./types.js";
3
+ export declare function createEmptyStoreState(): HostedAuthStoreState;
4
+ export declare function normalizeStoreState(value: unknown): HostedAuthStoreState;
5
+ export declare function upsertOAuthUserInState(state: HostedAuthStoreState, provider: HostedAuthProviderId, providerUser: AuthUser): AuthUser;
6
+ export declare function createSessionInState(state: HostedAuthStoreState, input: CreateHostedAuthSessionInput): HostedAuthSessionRecord;
7
+ export declare function getSessionInState(state: HostedAuthStoreState, sessionId: string): HostedAuthSessionContext | null;
8
+ export declare function deleteSessionInState(state: HostedAuthStoreState, sessionId: string): void;
9
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/hosted-service/store/state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AACzE,OAAO,KAAK,EACV,4BAA4B,EAE5B,oBAAoB,EACpB,wBAAwB,EACxB,uBAAuB,EACvB,oBAAoB,EAErB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,qBAAqB,IAAI,oBAAoB,CAM5D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CAQxE;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,oBAAoB,EAC3B,QAAQ,EAAE,oBAAoB,EAC9B,YAAY,EAAE,QAAQ,GACrB,QAAQ,CAUV;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,oBAAoB,EAC3B,KAAK,EAAE,4BAA4B,GAClC,uBAAuB,CAgBzB;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,oBAAoB,EAC3B,SAAS,EAAE,MAAM,GAChB,wBAAwB,GAAG,IAAI,CAmBjC;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,QAElF"}
@@ -0,0 +1,156 @@
1
+ import { randomBytes } from "node:crypto";
2
+ export function createEmptyStoreState() {
3
+ return {
4
+ accounts: [],
5
+ sessions: [],
6
+ users: [],
7
+ };
8
+ }
9
+ export function normalizeStoreState(value) {
10
+ const state = value && typeof value === "object" ? value : {};
11
+ return {
12
+ accounts: Array.isArray(state.accounts) ? state.accounts : [],
13
+ sessions: Array.isArray(state.sessions) ? state.sessions : [],
14
+ users: Array.isArray(state.users) ? state.users : [],
15
+ };
16
+ }
17
+ export function upsertOAuthUserInState(state, provider, providerUser) {
18
+ const now = new Date().toISOString();
19
+ const providerAccountId = providerUser.id;
20
+ const account = findAccount(state, provider, providerAccountId);
21
+ const user = account ? findOrCreateMissingUser(state, account, providerUser, provider, now) : findOrCreateUser(state, providerUser, provider, now);
22
+ updateUserProfile(user, providerUser, provider, providerAccountId, now);
23
+ upsertAccount(state, user, provider, providerUser, now);
24
+ return toAuthUser(user, provider, providerAccountId, providerUser.metadata);
25
+ }
26
+ export function createSessionInState(state, input) {
27
+ const now = new Date().toISOString();
28
+ const session = {
29
+ clientId: input.clientId,
30
+ createdAt: now,
31
+ expiresAt: input.expiresAt,
32
+ id: `session_${createId()}`,
33
+ provider: input.provider,
34
+ providerAccountId: input.providerAccountId,
35
+ updatedAt: now,
36
+ userId: input.userId,
37
+ };
38
+ state.sessions.push(session);
39
+ return session;
40
+ }
41
+ export function getSessionInState(state, sessionId) {
42
+ const session = state.sessions.find((item) => item.id === sessionId);
43
+ if (!session || Date.parse(session.expiresAt) <= Date.now()) {
44
+ return null;
45
+ }
46
+ const user = state.users.find((item) => item.id === session.userId);
47
+ if (!user) {
48
+ return null;
49
+ }
50
+ const account = findAccount(state, session.provider, session.providerAccountId);
51
+ return {
52
+ session,
53
+ user: toAuthUser(user, session.provider, session.providerAccountId, account?.metadata),
54
+ };
55
+ }
56
+ export function deleteSessionInState(state, sessionId) {
57
+ state.sessions = state.sessions.filter((item) => item.id !== sessionId);
58
+ }
59
+ function findOrCreateUser(state, providerUser, provider, now) {
60
+ const byEmail = findUserByEmail(state, providerUser.email);
61
+ if (byEmail) {
62
+ return byEmail;
63
+ }
64
+ const user = {
65
+ avatarUrl: providerUser.avatarUrl ?? null,
66
+ createdAt: now,
67
+ email: providerUser.email ?? null,
68
+ id: `auth_${createId()}`,
69
+ metadata: {},
70
+ name: providerUser.name ?? null,
71
+ registrationChannel: provider,
72
+ updatedAt: now,
73
+ };
74
+ state.users.push(user);
75
+ return user;
76
+ }
77
+ function findOrCreateMissingUser(state, account, providerUser, provider, now) {
78
+ const user = state.users.find((item) => item.id === account.userId);
79
+ if (user) {
80
+ return user;
81
+ }
82
+ return findOrCreateUser(state, providerUser, provider, now);
83
+ }
84
+ function updateUserProfile(user, providerUser, provider, providerAccountId, now) {
85
+ user.avatarUrl = providerUser.avatarUrl ?? user.avatarUrl;
86
+ user.email = providerUser.email ?? user.email;
87
+ user.metadata = mergeMetadata(user.metadata, providerUser.metadata, {
88
+ provider,
89
+ providerUserId: providerAccountId,
90
+ registrationChannel: user.registrationChannel,
91
+ });
92
+ user.name = providerUser.name ?? user.name;
93
+ user.updatedAt = now;
94
+ }
95
+ function upsertAccount(state, user, provider, providerUser, now) {
96
+ const existing = findAccount(state, provider, providerUser.id);
97
+ const metadata = mergeMetadata(providerUser.metadata, {
98
+ provider,
99
+ providerUserId: providerUser.id,
100
+ });
101
+ if (existing) {
102
+ existing.email = providerUser.email ?? existing.email;
103
+ existing.lastLoginAt = now;
104
+ existing.metadata = metadata;
105
+ existing.updatedAt = now;
106
+ existing.userId = user.id;
107
+ return;
108
+ }
109
+ state.accounts.push({
110
+ createdAt: now,
111
+ email: providerUser.email ?? null,
112
+ id: `account_${createId()}`,
113
+ lastLoginAt: now,
114
+ metadata,
115
+ provider,
116
+ providerAccountId: providerUser.id,
117
+ updatedAt: now,
118
+ userId: user.id,
119
+ });
120
+ }
121
+ function toAuthUser(user, provider, providerAccountId, providerMetadata) {
122
+ return {
123
+ avatarUrl: user.avatarUrl,
124
+ email: user.email,
125
+ id: user.id,
126
+ metadata: mergeMetadata(user.metadata, providerMetadata, {
127
+ provider,
128
+ providerUserId: providerAccountId,
129
+ registrationChannel: user.registrationChannel,
130
+ }),
131
+ name: user.name,
132
+ };
133
+ }
134
+ function findAccount(state, provider, providerAccountId) {
135
+ return state.accounts.find((item) => item.provider === provider && item.providerAccountId === providerAccountId);
136
+ }
137
+ function findUserByEmail(state, email) {
138
+ const normalized = normalizeEmail(email);
139
+ if (!normalized) {
140
+ return undefined;
141
+ }
142
+ return state.users.find((item) => normalizeEmail(item.email) === normalized);
143
+ }
144
+ function mergeMetadata(...items) {
145
+ return items.reduce((result, item) => ({
146
+ ...result,
147
+ ...(item ?? {}),
148
+ }), {});
149
+ }
150
+ function normalizeEmail(email) {
151
+ return email?.trim().toLowerCase() || undefined;
152
+ }
153
+ function createId() {
154
+ return randomBytes(12).toString("base64url");
155
+ }
156
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/hosted-service/store/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import type { AuthUser } from "@rc-tool/unified-auth-sdk/service-client";
2
+ export type HostedAuthProviderId = "dev" | "feishu" | "github" | "google";
3
+ export interface HostedAuthUserRecord {
4
+ avatarUrl: string | null;
5
+ createdAt: string;
6
+ email: string | null;
7
+ id: string;
8
+ metadata: Record<string, unknown>;
9
+ name: string | null;
10
+ registrationChannel: HostedAuthProviderId;
11
+ updatedAt: string;
12
+ }
13
+ export interface HostedAuthAccountRecord {
14
+ createdAt: string;
15
+ email: string | null;
16
+ id: string;
17
+ lastLoginAt: string;
18
+ metadata: Record<string, unknown>;
19
+ provider: HostedAuthProviderId;
20
+ providerAccountId: string;
21
+ updatedAt: string;
22
+ userId: string;
23
+ }
24
+ export interface HostedAuthSessionRecord {
25
+ clientId: string;
26
+ createdAt: string;
27
+ expiresAt: string;
28
+ id: string;
29
+ provider: HostedAuthProviderId;
30
+ providerAccountId: string;
31
+ updatedAt: string;
32
+ userId: string;
33
+ }
34
+ export interface HostedAuthStoreState {
35
+ accounts: HostedAuthAccountRecord[];
36
+ sessions: HostedAuthSessionRecord[];
37
+ users: HostedAuthUserRecord[];
38
+ }
39
+ export interface HostedAuthSessionContext {
40
+ session: HostedAuthSessionRecord;
41
+ user: AuthUser;
42
+ }
43
+ export interface CreateHostedAuthSessionInput {
44
+ clientId: string;
45
+ expiresAt: string;
46
+ provider: HostedAuthProviderId;
47
+ providerAccountId: string;
48
+ userId: string;
49
+ }
50
+ export interface HostedAuthStore {
51
+ createSession(input: CreateHostedAuthSessionInput): Promise<HostedAuthSessionRecord>;
52
+ deleteSession(sessionId: string): Promise<void>;
53
+ getSession(sessionId: string): Promise<HostedAuthSessionContext | null>;
54
+ upsertOAuthUser(provider: HostedAuthProviderId, providerUser: AuthUser): Promise<AuthUser>;
55
+ }
56
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/hosted-service/store/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AAEzE,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE1E,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,mBAAmB,EAAE,oBAAoB,CAAC;IAC1C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,uBAAuB,EAAE,CAAC;IACpC,QAAQ,EAAE,uBAAuB,EAAE,CAAC;IACpC,KAAK,EAAE,oBAAoB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,uBAAuB,CAAC;IACjC,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,CAAC,KAAK,EAAE,4BAA4B,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACrF,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAAC;IACxE,eAAe,CAAC,QAAQ,EAAE,oBAAoB,EAAE,YAAY,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC5F"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/hosted-service/store/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,48 @@
1
+ import type { HostedAuthStore } from "./store/index.js";
2
+ export interface HostedAuthApplication {
3
+ allowedRedirectURIs?: string[];
4
+ clientId: string;
5
+ name?: string;
6
+ redirectURI?: string;
7
+ }
8
+ export interface HostedFeishuConfig {
9
+ appId?: string;
10
+ appSecret?: string;
11
+ redirectURI?: string;
12
+ }
13
+ export interface HostedGoogleConfig {
14
+ clientId?: string;
15
+ clientSecret?: string;
16
+ redirectURI?: string;
17
+ scopes?: string[];
18
+ }
19
+ export interface HostedGitHubConfig {
20
+ clientId?: string;
21
+ clientSecret?: string;
22
+ redirectURI?: string;
23
+ scopes?: string[];
24
+ }
25
+ export interface HostedAuthServiceOptions {
26
+ allowDevLogin?: boolean;
27
+ applications?: HostedAuthApplication[];
28
+ authBaseURL: string;
29
+ cookieDomain?: string;
30
+ cookieName?: string;
31
+ feishu?: HostedFeishuConfig;
32
+ github?: HostedGitHubConfig;
33
+ google?: HostedGoogleConfig;
34
+ sessionSecret: string;
35
+ store?: HostedAuthStore;
36
+ }
37
+ export type SessionPayload = {
38
+ clientId: string;
39
+ exp: number;
40
+ sessionId: string;
41
+ };
42
+ export type StatePayload = {
43
+ clientId: string;
44
+ exp: number;
45
+ redirectURI: string;
46
+ state: string;
47
+ };
48
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/hosted-service/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,WAAW,qBAAqB;IACpC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/hosted-service/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hosted-service-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosted-service-cli.d.ts","sourceRoot":"","sources":["../src/hosted-service-cli.ts"],"names":[],"mappings":""}
@@ -0,0 +1,89 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ import { config as loadEnv, parse as parseEnv } from "dotenv";
4
+ import { createHostedAuthNodeServer } from "./hosted-service-node.js";
5
+ import { createFileAuthStore } from "./index.js";
6
+ const FEISHU_ENV_KEYS = ["FEISHU_APP_ID", "FEISHU_APP_SECRET", "FEISHU_REDIRECT_URI"];
7
+ loadEnv({ path: ".env.local", quiet: true });
8
+ loadEnv({ quiet: true });
9
+ loadLegacyFeishuEnv();
10
+ function readEnv(name, fallback = "") {
11
+ return process.env[name]?.trim() || fallback;
12
+ }
13
+ const port = Number(readEnv("AUTH_SERVICE_PORT", readEnv("PORT", "3005")));
14
+ const authBaseURL = readEnv("AUTH_SERVICE_URL", `http://localhost:${port}`);
15
+ const clientId = readEnv("AUTH_CLIENT_ID", "ai-pm");
16
+ const redirectURI = readEnv("AUTH_ALLOWED_REDIRECT_URI", "http://localhost:3004/");
17
+ const sessionSecret = readEnv("AUTH_SESSION_SECRET", readEnv("SESSION_SECRET", readEnv("BETTER_AUTH_SECRET", "unified-auth-local-secret")));
18
+ const storeFile = readEnv("AUTH_STORE_FILE", ".auth/unified-auth-store.json");
19
+ const authDatabaseUrl = readEnv("AUTH_DATABASE_URL", readEnv("DATABASE_URL"));
20
+ const storeProvider = readEnv("AUTH_STORE_PROVIDER", authDatabaseUrl ? "prisma" : "file");
21
+ function loadLegacyFeishuEnv() {
22
+ const envFile = resolve(readEnv("AUTH_FEISHU_ENV_FILE", "../ai-pm/.env.local"));
23
+ if (!existsSync(envFile)) {
24
+ return;
25
+ }
26
+ const legacyEnv = parseEnv(readFileSync(envFile));
27
+ for (const key of FEISHU_ENV_KEYS) {
28
+ // 迁移期允许 SDK Auth Service 读取 AI PM 里的飞书 OAuth 配置,但只补缺失值;
29
+ // 这样 Google/GitHub、数据库和未来 SDK 自有配置不会被旧项目环境变量意外覆盖。
30
+ if (!process.env[key] && legacyEnv[key]) {
31
+ process.env[key] = legacyEnv[key];
32
+ }
33
+ }
34
+ }
35
+ async function createAuthStore() {
36
+ if (storeProvider === "prisma") {
37
+ const { createPrismaAuthStore } = await importPrismaStore();
38
+ return createPrismaAuthStore({ databaseUrl: authDatabaseUrl });
39
+ }
40
+ if (storeProvider === "file") {
41
+ return createFileAuthStore({ filePath: storeFile });
42
+ }
43
+ throw new Error(`Unsupported AUTH_STORE_PROVIDER: ${storeProvider}`);
44
+ }
45
+ async function importPrismaStore() {
46
+ const dynamicImport = new Function("specifier", "return import(specifier)");
47
+ try {
48
+ return await dynamicImport("@rc-tool/unified-auth-prisma-store");
49
+ }
50
+ catch (error) {
51
+ throw new Error("AUTH_STORE_PROVIDER=prisma requires installing @rc-tool/unified-auth-prisma-store.", { cause: error });
52
+ }
53
+ }
54
+ const server = createHostedAuthNodeServer({
55
+ allowDevLogin: readEnv("AUTH_ALLOW_DEV_LOGIN", "true") !== "false",
56
+ applications: [
57
+ {
58
+ allowedRedirectURIs: [redirectURI],
59
+ clientId,
60
+ name: readEnv("AUTH_CLIENT_NAME", "AI PM"),
61
+ redirectURI,
62
+ },
63
+ ],
64
+ authBaseURL,
65
+ cookieDomain: readEnv("AUTH_COOKIE_DOMAIN") || undefined,
66
+ feishu: {
67
+ appId: readEnv("FEISHU_APP_ID") || undefined,
68
+ appSecret: readEnv("FEISHU_APP_SECRET") || undefined,
69
+ redirectURI: readEnv("FEISHU_REDIRECT_URI") || undefined,
70
+ },
71
+ google: {
72
+ clientId: readEnv("GOOGLE_CLIENT_ID") || undefined,
73
+ clientSecret: readEnv("GOOGLE_CLIENT_SECRET") || undefined,
74
+ redirectURI: readEnv("GOOGLE_REDIRECT_URI") || undefined,
75
+ },
76
+ github: {
77
+ clientId: readEnv("GITHUB_CLIENT_ID") || undefined,
78
+ clientSecret: readEnv("GITHUB_CLIENT_SECRET") || undefined,
79
+ redirectURI: readEnv("GITHUB_REDIRECT_URI") || undefined,
80
+ },
81
+ sessionSecret,
82
+ store: await createAuthStore(),
83
+ });
84
+ server.listen(port, () => {
85
+ console.log(`Unified Auth Service listening on ${authBaseURL}`);
86
+ console.log(`Configured client ${clientId} -> ${redirectURI}`);
87
+ console.log(`Auth store: ${storeProvider}`);
88
+ });
89
+ //# sourceMappingURL=hosted-service-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosted-service-cli.js","sourceRoot":"","sources":["../src/hosted-service-cli.ts"],"names":[],"mappings":"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"}