@playcraft/common 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -0
- package/dist/auth/index.d.ts +4 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +4 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/jwt.d.ts +18 -0
- package/dist/auth/jwt.d.ts.map +1 -0
- package/dist/auth/jwt.js +47 -0
- package/dist/auth/jwt.js.map +1 -0
- package/dist/auth/jwt.test.d.ts +2 -0
- package/dist/auth/jwt.test.d.ts.map +1 -0
- package/dist/auth/jwt.test.js +13 -0
- package/dist/auth/jwt.test.js.map +1 -0
- package/dist/auth/local-dev.d.ts +27 -0
- package/dist/auth/local-dev.d.ts.map +1 -0
- package/dist/auth/local-dev.js +38 -0
- package/dist/auth/local-dev.js.map +1 -0
- package/dist/auth/types.d.ts +7 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +2 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/constants.d.ts +28 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +28 -0
- package/dist/constants.js.map +1 -0
- package/dist/database/index.d.ts +4 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +4 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/postgres-adapter.d.ts +8 -0
- package/dist/database/postgres-adapter.d.ts.map +1 -0
- package/dist/database/postgres-adapter.js +11 -0
- package/dist/database/postgres-adapter.js.map +1 -0
- package/dist/database/schema.d.ts +919 -0
- package/dist/database/schema.d.ts.map +1 -0
- package/dist/database/schema.js +70 -0
- package/dist/database/schema.js.map +1 -0
- package/dist/database/sqlite-adapter.d.ts +11 -0
- package/dist/database/sqlite-adapter.d.ts.map +1 -0
- package/dist/database/sqlite-adapter.js +78 -0
- package/dist/database/sqlite-adapter.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/messenger/index.d.ts +4 -0
- package/dist/messenger/index.d.ts.map +1 -0
- package/dist/messenger/index.js +4 -0
- package/dist/messenger/index.js.map +1 -0
- package/dist/messenger/protocol.d.ts +6 -0
- package/dist/messenger/protocol.d.ts.map +1 -0
- package/dist/messenger/protocol.js +17 -0
- package/dist/messenger/protocol.js.map +1 -0
- package/dist/messenger/server.d.ts +66 -0
- package/dist/messenger/server.d.ts.map +1 -0
- package/dist/messenger/server.js +249 -0
- package/dist/messenger/server.js.map +1 -0
- package/dist/messenger/server.test.d.ts +2 -0
- package/dist/messenger/server.test.d.ts.map +1 -0
- package/dist/messenger/server.test.js +66 -0
- package/dist/messenger/server.test.js.map +1 -0
- package/dist/messenger/types.d.ts +32 -0
- package/dist/messenger/types.d.ts.map +1 -0
- package/dist/messenger/types.js +2 -0
- package/dist/messenger/types.js.map +1 -0
- package/dist/models/asset.d.ts +57 -0
- package/dist/models/asset.d.ts.map +1 -0
- package/dist/models/asset.js +33 -0
- package/dist/models/asset.js.map +1 -0
- package/dist/models/converters.d.ts +11 -0
- package/dist/models/converters.d.ts.map +1 -0
- package/dist/models/converters.js +25 -0
- package/dist/models/converters.js.map +1 -0
- package/dist/models/converters.test.d.ts +2 -0
- package/dist/models/converters.test.d.ts.map +1 -0
- package/dist/models/converters.test.js +18 -0
- package/dist/models/converters.test.js.map +1 -0
- package/dist/models/index.d.ts +5 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +5 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/playcanvas-compat.d.ts +30 -0
- package/dist/models/playcanvas-compat.d.ts.map +1 -0
- package/dist/models/playcanvas-compat.js +30 -0
- package/dist/models/playcanvas-compat.js.map +1 -0
- package/dist/models/project.d.ts +28 -0
- package/dist/models/project.d.ts.map +1 -0
- package/dist/models/project.js +17 -0
- package/dist/models/project.js.map +1 -0
- package/dist/models/scene.d.ts +52 -0
- package/dist/models/scene.d.ts.map +1 -0
- package/dist/models/scene.js +49 -0
- package/dist/models/scene.js.map +1 -0
- package/dist/models/scene.test.d.ts +2 -0
- package/dist/models/scene.test.d.ts.map +1 -0
- package/dist/models/scene.test.js +12 -0
- package/dist/models/scene.test.js.map +1 -0
- package/dist/sharedb/index.d.ts +4 -0
- package/dist/sharedb/index.d.ts.map +1 -0
- package/dist/sharedb/index.js +4 -0
- package/dist/sharedb/index.js.map +1 -0
- package/dist/sharedb/middleware.d.ts +2 -0
- package/dist/sharedb/middleware.d.ts.map +1 -0
- package/dist/sharedb/middleware.js +2 -0
- package/dist/sharedb/middleware.js.map +1 -0
- package/dist/sharedb/server.d.ts +60 -0
- package/dist/sharedb/server.d.ts.map +1 -0
- package/dist/sharedb/server.js +542 -0
- package/dist/sharedb/server.js.map +1 -0
- package/dist/sharedb/server.test.d.ts +2 -0
- package/dist/sharedb/server.test.d.ts.map +1 -0
- package/dist/sharedb/server.test.js +59 -0
- package/dist/sharedb/server.test.js.map +1 -0
- package/dist/sharedb/snapshot.d.ts +8 -0
- package/dist/sharedb/snapshot.d.ts.map +1 -0
- package/dist/sharedb/snapshot.js +2 -0
- package/dist/sharedb/snapshot.js.map +1 -0
- package/dist/storage/cos.d.ts +25 -0
- package/dist/storage/cos.d.ts.map +1 -0
- package/dist/storage/cos.js +104 -0
- package/dist/storage/cos.js.map +1 -0
- package/dist/storage/index.d.ts +18 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +63 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/interface.d.ts +19 -0
- package/dist/storage/interface.d.ts.map +1 -0
- package/dist/storage/interface.js +2 -0
- package/dist/storage/interface.js.map +1 -0
- package/dist/storage/local.d.ts +16 -0
- package/dist/storage/local.d.ts.map +1 -0
- package/dist/storage/local.js +57 -0
- package/dist/storage/local.js.map +1 -0
- package/dist/utils/env.d.ts +2 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +10 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +8 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +10 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/websocket/connection.d.ts +4 -0
- package/dist/websocket/connection.d.ts.map +1 -0
- package/dist/websocket/connection.js +9 -0
- package/dist/websocket/connection.js.map +1 -0
- package/dist/websocket/heartbeat.d.ts +3 -0
- package/dist/websocket/heartbeat.d.ts.map +1 -0
- package/dist/websocket/heartbeat.js +16 -0
- package/dist/websocket/heartbeat.js.map +1 -0
- package/dist/websocket/index.d.ts +4 -0
- package/dist/websocket/index.d.ts.map +1 -0
- package/dist/websocket/index.js +4 -0
- package/dist/websocket/index.js.map +1 -0
- package/dist/websocket/server.d.ts +12 -0
- package/dist/websocket/server.d.ts.map +1 -0
- package/dist/websocket/server.js +12 -0
- package/dist/websocket/server.js.map +1 -0
- package/package.json +79 -0
package/README.md
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# @playcraft/common
|
|
2
|
+
|
|
3
|
+
PlayCraft monorepo 内部共享库,给 CLI Agent / Backend / Realtime / Messenger 提供可复用的通用能力。
|
|
4
|
+
|
|
5
|
+
## 子模块
|
|
6
|
+
|
|
7
|
+
- `@playcraft/common/auth`: JWT、Local Dev Auth
|
|
8
|
+
- `@playcraft/common/models`: PlayCanvas 兼容数据模型与转换
|
|
9
|
+
- `@playcraft/common/database`: SQLite/Postgres 适配(供 Agent/Backend)
|
|
10
|
+
- `@playcraft/common/sharedb`: ShareDB 服务封装
|
|
11
|
+
- `@playcraft/common/messenger`: Messenger 协议与服务封装
|
|
12
|
+
- `@playcraft/common/utils`: 通用工具(env、logger 等)
|
|
13
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { JwtPayload } from './types.js';
|
|
2
|
+
export type JwtServiceOptions = {
|
|
3
|
+
secret?: string;
|
|
4
|
+
issuer?: string;
|
|
5
|
+
audience?: string;
|
|
6
|
+
};
|
|
7
|
+
export declare class JwtService {
|
|
8
|
+
private readonly secretKey;
|
|
9
|
+
private readonly issuer?;
|
|
10
|
+
private readonly audience?;
|
|
11
|
+
constructor(options?: JwtServiceOptions);
|
|
12
|
+
verify(token: string | undefined | null): Promise<JwtPayload | null>;
|
|
13
|
+
sign(payload: JwtPayload, options?: {
|
|
14
|
+
expiresIn?: string;
|
|
15
|
+
subject?: string;
|
|
16
|
+
}): Promise<string>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=jwt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../../src/auth/jwt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAQ7C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAa;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAS;gBAEvB,OAAO,GAAE,iBAAsB;IAOrC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAapE,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;CAcnF"}
|
package/dist/auth/jwt.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { jwtVerify, SignJWT } from 'jose';
|
|
2
|
+
function requiredEnv(name, fallback) {
|
|
3
|
+
const v = process.env[name];
|
|
4
|
+
if (v == null || v === '')
|
|
5
|
+
return fallback;
|
|
6
|
+
return v;
|
|
7
|
+
}
|
|
8
|
+
export class JwtService {
|
|
9
|
+
secretKey;
|
|
10
|
+
issuer;
|
|
11
|
+
audience;
|
|
12
|
+
constructor(options = {}) {
|
|
13
|
+
const secret = options.secret ?? requiredEnv('JWT_SECRET', 'dev-secret-change-me');
|
|
14
|
+
this.secretKey = new TextEncoder().encode(secret);
|
|
15
|
+
this.issuer = options.issuer;
|
|
16
|
+
this.audience = options.audience;
|
|
17
|
+
}
|
|
18
|
+
async verify(token) {
|
|
19
|
+
if (!token)
|
|
20
|
+
return null;
|
|
21
|
+
try {
|
|
22
|
+
const { payload } = await jwtVerify(token, this.secretKey, {
|
|
23
|
+
issuer: this.issuer,
|
|
24
|
+
audience: this.audience,
|
|
25
|
+
});
|
|
26
|
+
return payload;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async sign(payload, options) {
|
|
33
|
+
const expiresIn = options?.expiresIn ?? '365d';
|
|
34
|
+
const jwt = new SignJWT(payload)
|
|
35
|
+
.setProtectedHeader({ alg: 'HS256', typ: 'JWT' })
|
|
36
|
+
.setIssuedAt()
|
|
37
|
+
.setExpirationTime(expiresIn);
|
|
38
|
+
if (options?.subject)
|
|
39
|
+
jwt.setSubject(options.subject);
|
|
40
|
+
if (this.issuer)
|
|
41
|
+
jwt.setIssuer(this.issuer);
|
|
42
|
+
if (this.audience)
|
|
43
|
+
jwt.setAudience(this.audience);
|
|
44
|
+
return await jwt.sign(this.secretKey);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=jwt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../src/auth/jwt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAG1C,SAAS,WAAW,CAAC,IAAY,EAAE,QAAgB;IACjD,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;QAAE,OAAO,QAAQ,CAAC;IAC3C,OAAO,CAAC,CAAC;AACX,CAAC;AAQD,MAAM,OAAO,UAAU;IACJ,SAAS,CAAa;IACtB,MAAM,CAAU;IAChB,QAAQ,CAAU;IAEnC,YAAY,UAA6B,EAAE;QACzC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,WAAW,CAAC,YAAY,EAAE,sBAAsB,CAAC,CAAC;QACnF,IAAI,CAAC,SAAS,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAgC;QAC3C,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE;gBACzD,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC,CAAC;YACH,OAAO,OAAgC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAmB,EAAE,OAAkD;QAChF,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,MAAM,CAAC;QAE/C,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;aAC7B,kBAAkB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;aAChD,WAAW,EAAE;aACb,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAEhC,IAAI,OAAO,EAAE,OAAO;YAAE,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,MAAM;YAAE,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,IAAI,CAAC,QAAQ;YAAE,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAElD,OAAO,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.test.d.ts","sourceRoot":"","sources":["../../src/auth/jwt.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { JwtService } from './jwt.js';
|
|
3
|
+
describe('JwtService', () => {
|
|
4
|
+
it('sign + verify roundtrip', async () => {
|
|
5
|
+
const jwt = new JwtService({ secret: 'test-secret' });
|
|
6
|
+
const token = await jwt.sign({ sub: 'u1', role: 'admin' }, { subject: 'u1', expiresIn: '1h' });
|
|
7
|
+
const payload = await jwt.verify(token);
|
|
8
|
+
expect(payload).not.toBeNull();
|
|
9
|
+
expect(payload?.sub).toBe('u1');
|
|
10
|
+
expect(payload?.role).toBe('admin');
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=jwt.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.test.js","sourceRoot":"","sources":["../../src/auth/jwt.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QACvC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/F,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC/B,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { JwtPayload } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* 本地开发鉴权工具
|
|
4
|
+
*
|
|
5
|
+
* 用于开发环境绕过鉴权,支持两种使用场景:
|
|
6
|
+
* 1. realtime/messenger: 简化的无 token 模式(shouldAllowWithoutToken)
|
|
7
|
+
* 2. backend HTTP API: 完整的 X-Local-User header 模式(isEnabled)
|
|
8
|
+
*
|
|
9
|
+
* 注意:backend 有更完整的实现(local-dev-auth.ts),包含数据库查询等功能
|
|
10
|
+
*/
|
|
11
|
+
export declare class LocalDevAuth {
|
|
12
|
+
/**
|
|
13
|
+
* 检查是否启用本地开发鉴权绕过
|
|
14
|
+
* 仅在 LOCAL_AUTH_BYPASS=true 且非生产环境时生效
|
|
15
|
+
*/
|
|
16
|
+
static isEnabled(): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* 获取默认的回退用户(用于 realtime/messenger)
|
|
19
|
+
*/
|
|
20
|
+
static getFallbackUser(): JwtPayload;
|
|
21
|
+
/**
|
|
22
|
+
* 判断是否允许无 token 连接(用于 realtime/messenger)
|
|
23
|
+
* 兼容现有行为:开发环境允许无 token
|
|
24
|
+
*/
|
|
25
|
+
static shouldAllowWithoutToken(): boolean;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=local-dev.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-dev.d.ts","sourceRoot":"","sources":["../../src/auth/local-dev.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;;;;;;;GAQG;AACH,qBAAa,YAAY;IACvB;;;OAGG;IACH,MAAM,CAAC,SAAS,IAAI,OAAO;IAI3B;;OAEG;IACH,MAAM,CAAC,eAAe,IAAI,UAAU;IASpC;;;OAGG;IACH,MAAM,CAAC,uBAAuB,IAAI,OAAO;CAI1C"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 本地开发鉴权工具
|
|
3
|
+
*
|
|
4
|
+
* 用于开发环境绕过鉴权,支持两种使用场景:
|
|
5
|
+
* 1. realtime/messenger: 简化的无 token 模式(shouldAllowWithoutToken)
|
|
6
|
+
* 2. backend HTTP API: 完整的 X-Local-User header 模式(isEnabled)
|
|
7
|
+
*
|
|
8
|
+
* 注意:backend 有更完整的实现(local-dev-auth.ts),包含数据库查询等功能
|
|
9
|
+
*/
|
|
10
|
+
export class LocalDevAuth {
|
|
11
|
+
/**
|
|
12
|
+
* 检查是否启用本地开发鉴权绕过
|
|
13
|
+
* 仅在 LOCAL_AUTH_BYPASS=true 且非生产环境时生效
|
|
14
|
+
*/
|
|
15
|
+
static isEnabled() {
|
|
16
|
+
return process.env.LOCAL_AUTH_BYPASS === 'true' && process.env.NODE_ENV !== 'production';
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 获取默认的回退用户(用于 realtime/messenger)
|
|
20
|
+
*/
|
|
21
|
+
static getFallbackUser() {
|
|
22
|
+
return {
|
|
23
|
+
id: 1,
|
|
24
|
+
sub: '1',
|
|
25
|
+
username: 'admin',
|
|
26
|
+
role: 'admin',
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 判断是否允许无 token 连接(用于 realtime/messenger)
|
|
31
|
+
* 兼容现有行为:开发环境允许无 token
|
|
32
|
+
*/
|
|
33
|
+
static shouldAllowWithoutToken() {
|
|
34
|
+
// 兼容现有 realtime/messenger 的行为:开发环境允许无 token
|
|
35
|
+
return !process.env.NODE_ENV || process.env.NODE_ENV === 'development';
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=local-dev.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-dev.js","sourceRoot":"","sources":["../../src/auth/local-dev.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,OAAO,YAAY;IACvB;;;OAGG;IACH,MAAM,CAAC,SAAS;QACd,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;IAC3F,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,eAAe;QACpB,OAAO;YACL,EAAE,EAAE,CAAC;YACL,GAAG,EAAE,GAAG;YACR,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,OAAO;SACd,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,uBAAuB;QAC5B,4CAA4C;QAC5C,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,CAAC;IACzE,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACjD,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 共享常量定义
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* HTTP 头常量
|
|
6
|
+
* 注意:HTTP 头名称大小写不敏感,但为了代码一致性,我们统一使用小写形式
|
|
7
|
+
*/
|
|
8
|
+
export declare const HEADERS: {
|
|
9
|
+
/**
|
|
10
|
+
* 内部服务认证头
|
|
11
|
+
* 用于 backend、realtime、messenger 等内部服务之间的认证
|
|
12
|
+
* 需要匹配环境变量 EMIT_SECRET
|
|
13
|
+
*/
|
|
14
|
+
readonly INTERNAL_SECRET: "x-internal-secret";
|
|
15
|
+
/**
|
|
16
|
+
* 旧版认证头名称(已废弃,仅用于向后兼容)
|
|
17
|
+
* @deprecated 使用 INTERNAL_SECRET 代替
|
|
18
|
+
*/
|
|
19
|
+
readonly EMIT_SECRET: "x-emit-secret";
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* 环境变量名称常量
|
|
23
|
+
*/
|
|
24
|
+
export declare const ENV_VARS: {
|
|
25
|
+
/** 内部服务认证密钥 */
|
|
26
|
+
readonly EMIT_SECRET: "EMIT_SECRET";
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,eAAO,MAAM,OAAO;IAClB;;;;OAIG;;IAGH;;;OAGG;;CAEK,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,QAAQ;IACnB,eAAe;;CAEP,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 共享常量定义
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* HTTP 头常量
|
|
6
|
+
* 注意:HTTP 头名称大小写不敏感,但为了代码一致性,我们统一使用小写形式
|
|
7
|
+
*/
|
|
8
|
+
export const HEADERS = {
|
|
9
|
+
/**
|
|
10
|
+
* 内部服务认证头
|
|
11
|
+
* 用于 backend、realtime、messenger 等内部服务之间的认证
|
|
12
|
+
* 需要匹配环境变量 EMIT_SECRET
|
|
13
|
+
*/
|
|
14
|
+
INTERNAL_SECRET: 'x-internal-secret',
|
|
15
|
+
/**
|
|
16
|
+
* 旧版认证头名称(已废弃,仅用于向后兼容)
|
|
17
|
+
* @deprecated 使用 INTERNAL_SECRET 代替
|
|
18
|
+
*/
|
|
19
|
+
EMIT_SECRET: 'x-emit-secret',
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* 环境变量名称常量
|
|
23
|
+
*/
|
|
24
|
+
export const ENV_VARS = {
|
|
25
|
+
/** 内部服务认证密钥 */
|
|
26
|
+
EMIT_SECRET: 'EMIT_SECRET',
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB;;;;OAIG;IACH,eAAe,EAAE,mBAAmB;IAEpC;;;OAGG;IACH,WAAW,EAAE,eAAe;CACpB,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,eAAe;IACf,WAAW,EAAE,aAAa;CAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { drizzle } from 'drizzle-orm/node-postgres';
|
|
2
|
+
import { Pool } from 'pg';
|
|
3
|
+
export type PostgresAdapter = {
|
|
4
|
+
pool: Pool;
|
|
5
|
+
db: ReturnType<typeof drizzle>;
|
|
6
|
+
};
|
|
7
|
+
export declare function createPostgresAdapter(connectionString: string): PostgresAdapter;
|
|
8
|
+
//# sourceMappingURL=postgres-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-adapter.d.ts","sourceRoot":"","sources":["../../src/database/postgres-adapter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAE1B,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,IAAI,CAAC;IACX,EAAE,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;CAChC,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,gBAAgB,EAAE,MAAM,GAAG,eAAe,CAI/E"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// 注意:目前仅用于共享类型与未来扩展。
|
|
2
|
+
// 现有 backend 已有自己的数据库初始化逻辑;common 这里提供一个可选 adapter,
|
|
3
|
+
// 方便后续统一数据访问层。
|
|
4
|
+
import { drizzle } from 'drizzle-orm/node-postgres';
|
|
5
|
+
import { Pool } from 'pg';
|
|
6
|
+
export function createPostgresAdapter(connectionString) {
|
|
7
|
+
const pool = new Pool({ connectionString });
|
|
8
|
+
const db = drizzle(pool);
|
|
9
|
+
return { pool, db };
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=postgres-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-adapter.js","sourceRoot":"","sources":["../../src/database/postgres-adapter.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,oDAAoD;AACpD,eAAe;AAEf,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAO1B,MAAM,UAAU,qBAAqB,CAAC,gBAAwB;IAC5D,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC5C,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AACtB,CAAC"}
|