@nocobase/app-server 2.0.0-beta.8 → 3.0.0-beta.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.
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/drive/provider.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAGhE,qBAAa,aAAc,SAAQ,eAAe,CAAC,oBAAoB,CAAC;IACtE,SAAgB,IAAI,EAAE,MAAM,CAAgC;IAE5C,QAAQ,IAAI,IAAI;IAOV,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3C,OAAO,CAAC,cAAc;CAOvB"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/drive/provider.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAGhE,qBAAa,aAAc,SAAQ,eAAe,CAAC,oBAAoB,CAAC;IACtE,SAAgB,IAAI,EAAE,MAAM,CAAgC;IAE5C,QAAQ,IAAI,IAAI;IAOV,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3C,OAAO,CAAC,cAAc;CAQvB"}
@@ -13,7 +13,7 @@ export class DriveProvider extends ServiceProvider {
13
13
  getDriveConfig() {
14
14
  const config = this.app.config.get('drive');
15
15
  const s3 = config.disks.s3;
16
- if (s3?.driver !== 's3' || s3.bucket)
16
+ if (typeof s3 === 'function' || s3?.driver !== 's3' || s3.bucket)
17
17
  return config;
18
18
  const { s3: _s3, ...disks } = config.disks;
19
19
  return { ...config, disks };
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/drive/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,mBAAmB,GAEpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAG7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,OAAO,aAAc,SAAQ,eAAqC;IACtD,IAAI,GAAW,4BAA4B,CAAC;IAE5C,QAAQ;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,iBAAiB,EAAE,GAAG,EAAE,CACnD,kBAAkB,CAAC,KAAK,CAAC,CAC1B,CAAC;IACJ,CAAC;IAEe,KAAK,CAAC,IAAI;QACxB,MAAM,mBAAmB,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;IACnD,CAAC;IAEO,cAAc;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAiB,OAAO,CAAE,CAAC;QAC7D,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,IAAI,EAAE,EAAE,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC,MAAM;YAAE,OAAO,MAAM,CAAC;QACpD,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3C,OAAO,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC;CACF"}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/drive/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,mBAAmB,GAEpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAG7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,OAAO,aAAc,SAAQ,eAAqC;IACtD,IAAI,GAAW,4BAA4B,CAAC;IAE5C,QAAQ;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,iBAAiB,EAAE,GAAG,EAAE,CACnD,kBAAkB,CAAC,KAAK,CAAC,CAC1B,CAAC;IACJ,CAAC;IAEe,KAAK,CAAC,IAAI;QACxB,MAAM,mBAAmB,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;IACnD,CAAC;IAEO,cAAc;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAiB,OAAO,CAAE,CAAC;QAC7D,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,IAAI,OAAO,EAAE,KAAK,UAAU,IAAI,EAAE,EAAE,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC,MAAM;YAC9D,OAAO,MAAM,CAAC;QAChB,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3C,OAAO,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ import { type RedisRealtimeBrokerOptions, type RealtimeServiceOptions } from '@nocobase/realtime/server';
2
+ export interface AppRealtimeConfig {
3
+ readonly adapter?: 'inMemory' | 'redis';
4
+ readonly redis?: Omit<RedisRealtimeBrokerOptions, 'namespace'>;
5
+ readonly namespace?: string;
6
+ readonly authorizationTimeoutMs?: number;
7
+ readonly sessionCheckIntervalMs?: number;
8
+ readonly limits?: {
9
+ readonly maxConcurrentAuthorizations?: number;
10
+ readonly maxPendingAuthorizations?: number;
11
+ readonly maxRecentEventIds?: number;
12
+ readonly maxConnections?: number;
13
+ readonly maxMessageBytes?: number;
14
+ readonly maxSubscriptionsPerConnection?: number;
15
+ readonly maxBufferedBytesPerConnection?: number;
16
+ readonly maxPendingMessagesPerConnection?: number;
17
+ };
18
+ }
19
+ export declare function realtimeServiceOptions(config?: AppRealtimeConfig, appName?: string): RealtimeServiceOptions;
20
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/realtime/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,0BAA0B,EAC/B,KAAK,sBAAsB,EAC5B,MAAM,2BAA2B,CAAC;AAEnC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,0BAA0B,EAAE,WAAW,CAAC,CAAC;IAC/D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB,QAAQ,CAAC,2BAA2B,CAAC,EAAE,MAAM,CAAC;QAC9C,QAAQ,CAAC,wBAAwB,CAAC,EAAE,MAAM,CAAC;QAC3C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QACpC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QACjC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;QAClC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,MAAM,CAAC;QAChD,QAAQ,CAAC,6BAA6B,CAAC,EAAE,MAAM,CAAC;QAChD,QAAQ,CAAC,+BAA+B,CAAC,EAAE,MAAM,CAAC;KACnD,CAAC;CACH;AAED,wBAAgB,sBAAsB,CACpC,MAAM,GAAE,iBAAsB,EAC9B,OAAO,GAAE,MAAkB,GAC1B,sBAAsB,CAoBxB"}
@@ -0,0 +1,20 @@
1
+ import { createRedisRealtimeBroker, } from '@nocobase/realtime/server';
2
+ export function realtimeServiceOptions(config = {}, appName = 'default') {
3
+ if (config.adapter !== undefined &&
4
+ config.adapter !== 'inMemory' &&
5
+ config.adapter !== 'redis')
6
+ throw new TypeError('Unsupported realtime adapter.');
7
+ const namespace = config.namespace ?? appName;
8
+ if (typeof namespace !== 'string' || !namespace.trim())
9
+ throw new TypeError('Realtime namespace must be a non-empty string.');
10
+ return {
11
+ ...config.limits,
12
+ broker: config.adapter === 'redis'
13
+ ? createRedisRealtimeBroker({ ...config.redis, namespace })
14
+ : undefined,
15
+ namespace,
16
+ authorizationTimeoutMs: config.authorizationTimeoutMs,
17
+ sessionCheckIntervalMs: config.sessionCheckIntervalMs,
18
+ };
19
+ }
20
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/realtime/config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,GAG1B,MAAM,2BAA2B,CAAC;AAoBnC,MAAM,UAAU,sBAAsB,CACpC,SAA4B,EAAE,EAC9B,UAAkB,SAAS;IAE3B,IACE,MAAM,CAAC,OAAO,KAAK,SAAS;QAC5B,MAAM,CAAC,OAAO,KAAK,UAAU;QAC7B,MAAM,CAAC,OAAO,KAAK,OAAO;QAE1B,MAAM,IAAI,SAAS,CAAC,+BAA+B,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,OAAO,CAAC;IAC9C,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;QACpD,MAAM,IAAI,SAAS,CAAC,gDAAgD,CAAC,CAAC;IACxE,OAAO;QACL,GAAG,MAAM,CAAC,MAAM;QAChB,MAAM,EACJ,MAAM,CAAC,OAAO,KAAK,OAAO;YACxB,CAAC,CAAC,yBAAyB,CAAC,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC;YAC3D,CAAC,CAAC,SAAS;QACf,SAAS;QACT,sBAAsB,EAAE,MAAM,CAAC,sBAAsB;QACrD,sBAAsB,EAAE,MAAM,CAAC,sBAAsB;KACtD,CAAC;AACJ,CAAC"}
@@ -3,4 +3,5 @@ export * from './provider.js';
3
3
  export * from './service.js';
4
4
  export * from './types.js';
5
5
  export * from './websocket.js';
6
+ export * from './config.js';
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/realtime/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/realtime/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC"}
@@ -3,4 +3,5 @@ export * from './provider.js';
3
3
  export * from './service.js';
4
4
  export * from './types.js';
5
5
  export * from './websocket.js';
6
+ export * from './config.js';
6
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/realtime/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/realtime/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC"}
@@ -1,10 +1,15 @@
1
1
  import { ServiceProvider, type ServiceContainer } from '@nocobase/service-provider';
2
2
  export interface RealtimeProviderApplication {
3
3
  readonly container: ServiceContainer;
4
+ readonly appName?: string;
5
+ readonly config?: {
6
+ get<T>(key: string): T | undefined;
7
+ };
4
8
  }
5
9
  export declare class RealtimeProvider<TApplication extends RealtimeProviderApplication = RealtimeProviderApplication> extends ServiceProvider<TApplication> {
6
10
  readonly name: string;
7
11
  register(): void;
12
+ start(): Promise<void>;
8
13
  shutdown(): Promise<void>;
9
14
  }
10
15
  //# sourceMappingURL=provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/realtime/provider.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,KAAK,gBAAgB,EACtB,MAAM,4BAA4B,CAAC;AAIpC,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;CACtC;AAED,qBAAa,gBAAgB,CAC3B,YAAY,SAAS,2BAA2B,GAC9C,2BAA2B,CAC7B,SAAQ,eAAe,CAAC,YAAY,CAAC;IACrC,SAAgB,IAAI,EAAE,MAAM,CAAc;IAE1B,QAAQ,IAAI,IAAI;IAUhB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAI1C"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/realtime/provider.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,KAAK,gBAAgB,EACtB,MAAM,4BAA4B,CAAC;AAKpC,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAA;KAAE,CAAC;CAC1D;AAED,qBAAa,gBAAgB,CAC3B,YAAY,SAAS,2BAA2B,GAC9C,2BAA2B,CAC7B,SAAQ,eAAe,CAAC,YAAY,CAAC;IACrC,SAAgB,IAAI,EAAE,MAAM,CAAc;IAE1B,QAAQ,IAAI,IAAI;IAcV,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAGhD"}
@@ -2,18 +2,22 @@ import { loggingToken } from '../logging/token.js';
2
2
  import { ServiceProvider, } from '@nocobase/service-provider';
3
3
  import { createRealtimeService } from './service.js';
4
4
  import { realtimeServiceToken } from './types.js';
5
+ import { realtimeServiceOptions } from './config.js';
5
6
  export class RealtimeProvider extends ServiceProvider {
6
7
  name = 'realtime';
7
8
  register() {
8
9
  this.app.container.singleton(realtimeServiceToken, () => createRealtimeService({
10
+ ...realtimeServiceOptions(this.app.config?.get('realtime'), this.app.config?.get('app')?.name),
9
11
  logger: this.app.container.has(loggingToken)
10
12
  ? this.app.container.resolve(loggingToken).getLogger('realtime')
11
13
  : undefined,
12
14
  }));
13
15
  }
14
- shutdown() {
15
- this.app.container.resolveIfCreated(realtimeServiceToken)?.close();
16
- return Promise.resolve();
16
+ async start() {
17
+ await this.app.container.resolve(realtimeServiceToken).setup();
18
+ }
19
+ async shutdown() {
20
+ await this.app.container.resolveIfCreated(realtimeServiceToken)?.close();
17
21
  }
18
22
  }
19
23
  //# sourceMappingURL=provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/realtime/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EACL,eAAe,GAEhB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAMlD,MAAM,OAAO,gBAGX,SAAQ,eAA6B;IACrB,IAAI,GAAW,UAAU,CAAC;IAE1B,QAAQ;QACtB,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,oBAAoB,EAAE,GAAG,EAAE,CACtD,qBAAqB,CAAC;YACpB,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC;gBAC1C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC;gBAChE,CAAC,CAAC,SAAS;SACd,CAAC,CACH,CAAC;IACJ,CAAC;IAEe,QAAQ;QACtB,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,EAAE,KAAK,EAAE,CAAC;QACnE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CACF"}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/realtime/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EACL,eAAe,GAEhB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAA0B,MAAM,aAAa,CAAC;AAQ7E,MAAM,OAAO,gBAGX,SAAQ,eAA6B;IACrB,IAAI,GAAW,UAAU,CAAC;IAE1B,QAAQ;QACtB,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,oBAAoB,EAAE,GAAG,EAAE,CACtD,qBAAqB,CAAC;YACpB,GAAG,sBAAsB,CACvB,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAoB,UAAU,CAAC,EACnD,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAoB,KAAK,CAAC,EAAE,IAAI,CACrD;YACD,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC;gBAC1C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC;gBAChE,CAAC,CAAC,SAAS;SACd,CAAC,CACH,CAAC;IACJ,CAAC;IAEe,KAAK,CAAC,KAAK;QACzB,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,KAAK,EAAE,CAAC;IACjE,CAAC;IAEe,KAAK,CAAC,QAAQ;QAC5B,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,EAAE,KAAK,EAAE,CAAC;IAC3E,CAAC;CACF"}
@@ -1,9 +1,2 @@
1
- import type { Logger } from '@nocobase/logging';
2
- import type { RealtimeService } from './types.js';
3
- export interface RealtimeServiceOptions {
4
- logger?: Pick<Logger, 'error'>;
5
- maxSubscriptionsPerConnection?: number;
6
- }
7
- export type { RealtimeConnection, RealtimeConnectionContext, RealtimePublishResult, RealtimeService, RealtimeSubscription, } from './types.js';
8
- export declare function createRealtimeService(options?: RealtimeServiceOptions): RealtimeService;
1
+ export { createRealtimeService, type RealtimeServiceOptions, } from '@nocobase/realtime/server';
9
2
  //# sourceMappingURL=service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/realtime/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,KAAK,EAGV,eAAe,EAIhB,MAAM,YAAY,CAAC;AAapB,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,6BAA6B,CAAC,EAAE,MAAM,CAAC;CACxC;AAED,YAAY,EACV,kBAAkB,EAClB,yBAAyB,EACzB,qBAAqB,EACrB,eAAe,EACf,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,qBAAqB,CACnC,OAAO,GAAE,sBAA2B,GACnC,eAAe,CAqcjB"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/realtime/service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,KAAK,sBAAsB,GAC5B,MAAM,2BAA2B,CAAC"}
@@ -1,354 +1,2 @@
1
- import { randomUUID } from 'node:crypto';
2
- import { encodeRealtimeServerMessage, parseRealtimeClientMessage, RealtimeProtocolError, validateRealtimeTopic, } from '@nocobase/realtime/protocol';
3
- const WEB_SOCKET_OPEN = 1;
4
- const CLOSE_GOING_AWAY = 1001;
5
- export function createRealtimeService(options = {}) {
6
- const maxSubscriptionsPerConnection = options.maxSubscriptionsPerConnection ?? 64;
7
- const connections = new Map();
8
- const subscriptions = new Map();
9
- const subscriptionsByTopic = new Map();
10
- const listenersByTopic = new Map();
11
- const service = {
12
- connect(ws, context = {}) {
13
- const connection = {
14
- id: randomUUID(),
15
- ws,
16
- connectedAt: new Date(),
17
- request: context.request,
18
- principal: context.principal,
19
- subscriptions: new Set(),
20
- };
21
- connections.set(connection.id, connection);
22
- return connection;
23
- },
24
- disconnect(connection) {
25
- const stored = connections.get(connection.id);
26
- if (!stored) {
27
- return;
28
- }
29
- removeConnectionSubscriptions(stored);
30
- connections.delete(stored.id);
31
- },
32
- disconnectUser(userId) {
33
- let disconnected = 0;
34
- for (const connection of Array.from(connections.values())) {
35
- if (connection.principal?.userId !== userId)
36
- continue;
37
- if (connection.ws.readyState === WEB_SOCKET_OPEN) {
38
- connection.ws.close(CLOSE_GOING_AWAY, 'account session revoked');
39
- }
40
- service.disconnect(connection);
41
- disconnected += 1;
42
- }
43
- return disconnected;
44
- },
45
- subscribe(connection, topic) {
46
- validateRealtimeTopic(topic);
47
- const existing = findSubscription(connection, { topic });
48
- if (existing) {
49
- return existing;
50
- }
51
- if (connection.subscriptions.size >= maxSubscriptionsPerConnection) {
52
- throw new RealtimeProtocolError('TOO_MANY_SUBSCRIPTIONS', 'Realtime connection has too many subscriptions.');
53
- }
54
- const subscription = {
55
- id: randomUUID(),
56
- connectionId: connection.id,
57
- topic,
58
- userId: resolveSubscriptionUserId(connection, topic),
59
- createdAt: new Date(),
60
- };
61
- subscriptions.set(subscription.id, subscription);
62
- connection.subscriptions.add(subscription.id);
63
- addTopicSubscription(subscription);
64
- return subscription;
65
- },
66
- unsubscribe(connection, selector) {
67
- const removed = [];
68
- for (const subscriptionId of Array.from(connection.subscriptions)) {
69
- const subscription = subscriptions.get(subscriptionId);
70
- if (!subscription || !matchesSubscription(subscription, selector)) {
71
- continue;
72
- }
73
- removeSubscription(connection, subscription);
74
- removed.push(subscription);
75
- }
76
- return removed;
77
- },
78
- handleClientMessage(connection, data) {
79
- let message;
80
- try {
81
- message = parseRealtimeClientMessage(data);
82
- }
83
- catch (error) {
84
- sendProtocolError(connection, error);
85
- return;
86
- }
87
- try {
88
- switch (message.type) {
89
- case 'subscribe': {
90
- const subscription = service.subscribe(connection, message.topic);
91
- send(connection, {
92
- type: 'subscribed',
93
- id: message.id,
94
- topic: subscription.topic,
95
- subscriptionId: subscription.id,
96
- });
97
- return;
98
- }
99
- case 'unsubscribe': {
100
- const removed = service.unsubscribe(connection, {
101
- subscriptionId: message.subscriptionId,
102
- topic: message.topic,
103
- });
104
- const first = removed[0];
105
- send(connection, {
106
- type: 'unsubscribed',
107
- id: message.id,
108
- subscriptionId: message.subscriptionId ?? first?.id,
109
- topic: message.topic ?? first?.topic,
110
- });
111
- return;
112
- }
113
- case 'publish':
114
- send(connection, {
115
- type: 'error',
116
- id: message.id,
117
- code: 'PUBLISH_FORBIDDEN',
118
- message: 'Client publish is not allowed.',
119
- });
120
- return;
121
- case 'ping':
122
- send(connection, {
123
- type: 'pong',
124
- id: message.id,
125
- });
126
- return;
127
- }
128
- }
129
- catch (error) {
130
- sendProtocolError(connection, error);
131
- }
132
- },
133
- registerTopic(topic, topicDefinition) {
134
- validateRealtimeTopic(topic);
135
- if (topicOptions.has(topic)) {
136
- throw new RealtimeProtocolError('TOPIC_ALREADY_REGISTERED', `Realtime topic "${topic}" is already registered.`);
137
- }
138
- topicOptions.set(topic, topicDefinition);
139
- return () => {
140
- if (topicOptions.get(topic) !== topicDefinition) {
141
- return;
142
- }
143
- removeTopicSubscriptions(topic);
144
- topicOptions.delete(topic);
145
- };
146
- },
147
- defineTopic(topic, topicDefinition) {
148
- const close = service.registerTopic(topic, topicDefinition);
149
- const definedTopic = topicDefinition.audience === 'user'
150
- ? {
151
- name: topic,
152
- audience: 'user',
153
- publishFor(userId, payload) {
154
- return service.publish(topic, payload, { userId });
155
- },
156
- close,
157
- }
158
- : {
159
- name: topic,
160
- audience: 'public',
161
- publish(payload) {
162
- return service.publish(topic, payload);
163
- },
164
- close,
165
- };
166
- return definedTopic;
167
- },
168
- publish(topic, payload, options = {}) {
169
- validateRealtimeTopic(topic);
170
- const audience = topicOptions.get(topic)?.audience ?? 'public';
171
- const authenticated = requiresAuthentication(topic);
172
- if (audience === 'user' && !options.userId) {
173
- throw new RealtimeProtocolError('USER_AUDIENCE_REQUIRED', `Realtime topic "${topic}" requires a user audience.`);
174
- }
175
- if (audience === 'public' && options.userId) {
176
- throw new RealtimeProtocolError('INVALID_AUDIENCE', `Realtime topic "${topic}" does not accept a user audience.`);
177
- }
178
- const subscriptionIds = subscriptionsByTopic.get(topic);
179
- if (!subscriptionIds?.size) {
180
- return {
181
- topic,
182
- subscriberCount: 0,
183
- };
184
- }
185
- const message = {
186
- type: 'event',
187
- topic,
188
- payload,
189
- publishedAt: new Date().toISOString(),
190
- };
191
- const sentConnections = new Set();
192
- for (const subscriptionId of Array.from(subscriptionIds)) {
193
- const subscription = subscriptions.get(subscriptionId);
194
- const connection = subscription
195
- ? connections.get(subscription.connectionId)
196
- : undefined;
197
- if (!subscription ||
198
- !connection ||
199
- (audience === 'user' && subscription.userId !== options.userId) ||
200
- (authenticated && !connection.principal?.userId) ||
201
- sentConnections.has(connection.id)) {
202
- continue;
203
- }
204
- if (connection.ws.readyState !== WEB_SOCKET_OPEN) {
205
- service.disconnect(connection);
206
- continue;
207
- }
208
- sentConnections.add(connection.id);
209
- send(connection, message);
210
- }
211
- return {
212
- topic,
213
- subscriberCount: sentConnections.size,
214
- };
215
- },
216
- subscriptionCount(topic) {
217
- return subscriptionsByTopic.get(topic)?.size ?? 0;
218
- },
219
- onTopicSubscriptionChange(topic, listener) {
220
- validateRealtimeTopic(topic);
221
- const listeners = listenersByTopic.get(topic) ?? new Set();
222
- listeners.add(listener);
223
- listenersByTopic.set(topic, listeners);
224
- return () => {
225
- listeners.delete(listener);
226
- if (listeners.size === 0) {
227
- listenersByTopic.delete(topic);
228
- }
229
- };
230
- },
231
- close() {
232
- for (const connection of Array.from(connections.values())) {
233
- if (connection.ws.readyState === WEB_SOCKET_OPEN) {
234
- connection.ws.close(CLOSE_GOING_AWAY, 'realtime service closed');
235
- }
236
- service.disconnect(connection);
237
- }
238
- subscriptions.clear();
239
- subscriptionsByTopic.clear();
240
- listenersByTopic.clear();
241
- topicOptions.clear();
242
- },
243
- };
244
- const topicOptions = new Map();
245
- function findSubscription(connection, selector) {
246
- for (const subscriptionId of connection.subscriptions) {
247
- const subscription = subscriptions.get(subscriptionId);
248
- if (subscription && matchesSubscription(subscription, selector)) {
249
- return subscription;
250
- }
251
- }
252
- return undefined;
253
- }
254
- function matchesSubscription(subscription, selector) {
255
- return ((selector.subscriptionId === undefined ||
256
- subscription.id === selector.subscriptionId) &&
257
- (selector.topic === undefined || subscription.topic === selector.topic));
258
- }
259
- function addTopicSubscription(subscription) {
260
- const previousCount = service.subscriptionCount(subscription.topic);
261
- const topicSubscriptions = subscriptionsByTopic.get(subscription.topic) ?? new Set();
262
- topicSubscriptions.add(subscription.id);
263
- subscriptionsByTopic.set(subscription.topic, topicSubscriptions);
264
- notifyTopicSubscriptionChange(subscription.topic, previousCount);
265
- }
266
- function removeConnectionSubscriptions(connection) {
267
- for (const subscriptionId of Array.from(connection.subscriptions)) {
268
- const subscription = subscriptions.get(subscriptionId);
269
- if (subscription) {
270
- removeSubscription(connection, subscription);
271
- }
272
- }
273
- }
274
- function removeTopicSubscriptions(topic) {
275
- const subscriptionIds = subscriptionsByTopic.get(topic);
276
- if (!subscriptionIds) {
277
- return;
278
- }
279
- for (const subscriptionId of Array.from(subscriptionIds)) {
280
- const subscription = subscriptions.get(subscriptionId);
281
- const connection = subscription
282
- ? connections.get(subscription.connectionId)
283
- : undefined;
284
- if (subscription && connection) {
285
- removeSubscription(connection, subscription);
286
- }
287
- }
288
- }
289
- function resolveSubscriptionUserId(connection, topic) {
290
- if (!requiresAuthentication(topic)) {
291
- return undefined;
292
- }
293
- const userId = connection.principal?.userId;
294
- if (!userId) {
295
- throw new RealtimeProtocolError('AUTHENTICATION_REQUIRED', `Realtime topic "${topic}" requires authentication.`);
296
- }
297
- return userId;
298
- }
299
- /** User topics, and public topics registered with `authenticated`, reach only connections with a principal. */
300
- function requiresAuthentication(topic) {
301
- const definition = topicOptions.get(topic);
302
- return (definition?.audience === 'user' || definition?.authenticated === true);
303
- }
304
- function removeSubscription(connection, subscription) {
305
- const previousCount = service.subscriptionCount(subscription.topic);
306
- connection.subscriptions.delete(subscription.id);
307
- subscriptions.delete(subscription.id);
308
- const topicSubscriptions = subscriptionsByTopic.get(subscription.topic);
309
- topicSubscriptions?.delete(subscription.id);
310
- if (topicSubscriptions?.size === 0) {
311
- subscriptionsByTopic.delete(subscription.topic);
312
- }
313
- notifyTopicSubscriptionChange(subscription.topic, previousCount);
314
- }
315
- function notifyTopicSubscriptionChange(topic, previousCount) {
316
- const count = service.subscriptionCount(topic);
317
- if (count === previousCount) {
318
- return;
319
- }
320
- const listeners = listenersByTopic.get(topic);
321
- if (!listeners) {
322
- return;
323
- }
324
- for (const listener of Array.from(listeners)) {
325
- try {
326
- listener(count);
327
- }
328
- catch (error) {
329
- if (options.logger)
330
- options.logger.error({ err: error }, 'Realtime subscription listener failed');
331
- else
332
- console.error(error);
333
- }
334
- }
335
- }
336
- function sendProtocolError(connection, error) {
337
- const code = error instanceof RealtimeProtocolError ? error.code : 'REALTIME_ERROR';
338
- const message = error instanceof Error ? error.message : 'Realtime message failed.';
339
- send(connection, {
340
- type: 'error',
341
- code,
342
- message,
343
- });
344
- }
345
- function send(connection, message) {
346
- if (connection.ws.readyState !== WEB_SOCKET_OPEN) {
347
- service.disconnect(connection);
348
- return;
349
- }
350
- connection.ws.send(encodeRealtimeServerMessage(message));
351
- }
352
- return service;
353
- }
1
+ export { createRealtimeService, } from '@nocobase/realtime/server';
354
2
  //# sourceMappingURL=service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/realtime/service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/realtime/service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,GAEtB,MAAM,2BAA2B,CAAC"}
@@ -1,81 +1,9 @@
1
- import type { AppWebSocket, AppWebSocketMessageData } from '@nocobase/app-websocket';
2
1
  import { type ServiceToken } from '@nocobase/service-provider';
3
- export interface RealtimeConnectionContext {
4
- request?: Request;
5
- principal?: RealtimePrincipal;
6
- }
7
- export interface RealtimePrincipal {
8
- readonly userId: string;
9
- }
2
+ import type { RealtimePrincipal, RealtimeService } from '@nocobase/realtime/server';
3
+ export * from '@nocobase/realtime/server';
10
4
  export interface RealtimePrincipalResolver {
11
5
  resolve(request: Request): Promise<RealtimePrincipal | undefined>;
12
6
  }
13
- export interface RealtimeConnection {
14
- readonly id: string;
15
- readonly ws: AppWebSocket;
16
- readonly connectedAt: Date;
17
- readonly request?: Request;
18
- readonly principal?: RealtimePrincipal;
19
- readonly subscriptions: Set<string>;
20
- }
21
- export interface RealtimeSubscription {
22
- readonly id: string;
23
- readonly connectionId: string;
24
- readonly topic: string;
25
- readonly userId?: string;
26
- readonly createdAt: Date;
27
- }
28
- export interface RealtimePublishResult {
29
- readonly topic: string;
30
- readonly subscriberCount: number;
31
- }
32
- export type RealtimeTopicAudience = 'public' | 'user';
33
- export interface RealtimeTopicOptions {
34
- readonly audience: RealtimeTopicAudience;
35
- /**
36
- * A public topic delivered only to authenticated connections: subscribing without a principal is refused
37
- * (`AUTHENTICATION_REQUIRED`) and publishing skips such connections. For payloads that name records, such as ids,
38
- * which anonymous visitors should not learn of. User topics always require authentication.
39
- */
40
- readonly authenticated?: boolean;
41
- }
42
- export interface RealtimePublishOptions {
43
- readonly userId?: string;
44
- }
45
- export interface RealtimeTopicBase {
46
- readonly name: string;
47
- close(): void;
48
- }
49
- export interface RealtimePublicTopic<Payload> extends RealtimeTopicBase {
50
- readonly audience: 'public';
51
- publish(payload: Payload): RealtimePublishResult;
52
- }
53
- export interface RealtimeUserTopic<Payload> extends RealtimeTopicBase {
54
- readonly audience: 'user';
55
- publishFor(userId: string, payload: Payload): RealtimePublishResult;
56
- }
57
- export type DefinedRealtimeTopic<Payload, Audience extends RealtimeTopicAudience> = Audience extends 'user' ? RealtimeUserTopic<Payload> : RealtimePublicTopic<Payload>;
58
- export interface RealtimeService {
59
- connect(ws: AppWebSocket, context?: RealtimeConnectionContext): RealtimeConnection;
60
- disconnect(connection: RealtimeConnection): void;
61
- /** Closes every active connection authenticated as the given user. */
62
- disconnectUser(userId: string): number;
63
- subscribe(connection: RealtimeConnection, topic: string): RealtimeSubscription;
64
- unsubscribe(connection: RealtimeConnection, selector: {
65
- subscriptionId?: string;
66
- topic?: string;
67
- }): RealtimeSubscription[];
68
- handleClientMessage(connection: RealtimeConnection, data: AppWebSocketMessageData): void;
69
- registerTopic(topic: string, options: RealtimeTopicOptions): () => void;
70
- defineTopic<Payload, Audience extends RealtimeTopicAudience>(topic: string, options: {
71
- readonly audience: Audience;
72
- readonly authenticated?: boolean;
73
- }): DefinedRealtimeTopic<Payload, Audience>;
74
- publish(topic: string, payload: unknown, options?: RealtimePublishOptions): RealtimePublishResult;
75
- subscriptionCount(topic: string): number;
76
- onTopicSubscriptionChange(topic: string, listener: (count: number) => void): () => void;
77
- close(): void;
78
- }
79
7
  export declare const realtimeServiceToken: ServiceToken<RealtimeService>;
80
8
  export declare const realtimePrincipalResolverToken: ServiceToken<RealtimePrincipalResolver>;
81
9
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/realtime/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/realtime/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EAChB,MAAM,2BAA2B,CAAC;AAEnC,cAAc,2BAA2B,CAAC;AAE1C,MAAM,WAAW,yBAAyB;IACxC,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAAC;CACnE;AAED,eAAO,MAAM,oBAAoB,EAAE,YAAY,CAAC,eAAe,CACQ,CAAC;AAExE,eAAO,MAAM,8BAA8B,EAAE,YAAY,CAAC,yBAAyB,CAGhF,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { createServiceToken, } from '@nocobase/service-provider';
2
+ export * from '@nocobase/realtime/server';
2
3
  export const realtimeServiceToken = createServiceToken('@nocobase/app/realtime-service');
3
4
  export const realtimePrincipalResolverToken = createServiceToken('@nocobase/app/realtime-principal-resolver');
4
5
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/realtime/types.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,kBAAkB,GAEnB,MAAM,4BAA4B,CAAC;AAoHpC,MAAM,CAAC,MAAM,oBAAoB,GAC/B,kBAAkB,CAAkB,gCAAgC,CAAC,CAAC;AAExE,MAAM,CAAC,MAAM,8BAA8B,GACzC,kBAAkB,CAChB,2CAA2C,CAC5C,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/realtime/types.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,GAEnB,MAAM,4BAA4B,CAAC;AAMpC,cAAc,2BAA2B,CAAC;AAM1C,MAAM,CAAC,MAAM,oBAAoB,GAC/B,kBAAkB,CAAkB,gCAAgC,CAAC,CAAC;AAExE,MAAM,CAAC,MAAM,8BAA8B,GACzC,kBAAkB,CAChB,2CAA2C,CAC5C,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import type { Hono } from 'hono';
2
2
  import type { ServiceResolver } from '@nocobase/service-provider';
3
- import type { AppWebSocketHandler } from '../websocket.js';
3
+ import type { AppWebSocketHandler } from '@nocobase/app-websocket';
4
4
  export declare const REALTIME_WEBSOCKET_PATH: string;
5
5
  export declare function registerRealtimeWebSocketRoutes(router: Hono): void;
6
6
  export declare function createRealtimeWebSocketHandler(container: ServiceResolver): AppWebSocketHandler;
@@ -1 +1 @@
1
- {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/realtime/websocket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAO3D,eAAO,MAAM,uBAAuB,EAAE,MAAc,CAAC;AAErD,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,IAAI,GAAG,IAAI,CAclE;AAED,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,eAAe,GACzB,mBAAmB,CAmDrB"}
1
+ {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/realtime/websocket.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAOnE,eAAO,MAAM,uBAAuB,EAAE,MAAc,CAAC;AAErD,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,IAAI,GAAG,IAAI,CAclE;AAED,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,eAAe,GACzB,mBAAmB,CAiErB"}
@@ -1,3 +1,4 @@
1
+ import { REALTIME_MAX_MESSAGE_BYTES } from '@nocobase/realtime/protocol';
1
2
  import { realtimePrincipalResolverToken, realtimeServiceToken, } from './types.js';
2
3
  export const REALTIME_WEBSOCKET_PATH = '/ws';
3
4
  export function registerRealtimeWebSocketRoutes(router) {
@@ -24,9 +25,21 @@ export function createRealtimeWebSocketHandler(container) {
24
25
  return Response.json({ error: 'WebSocket origin is not allowed.' }, { status: 403 });
25
26
  }
26
27
  const realtime = container.resolve(realtimeServiceToken);
27
- const principal = container.has(realtimePrincipalResolverToken)
28
- ? await container.resolve(realtimePrincipalResolverToken).resolve(request)
28
+ const resolver = container.has(realtimePrincipalResolverToken)
29
+ ? container.resolve(realtimePrincipalResolverToken)
29
30
  : undefined;
31
+ const principal = await resolver?.resolve(request);
32
+ const context = {
33
+ request,
34
+ principal,
35
+ validatePrincipal: principal && resolver
36
+ ? async () => {
37
+ const current = await resolver.resolve(request);
38
+ return (current?.userId === principal.userId &&
39
+ current?.sessionId === principal.sessionId);
40
+ }
41
+ : undefined,
42
+ };
30
43
  let connection;
31
44
  const disconnect = () => {
32
45
  if (!connection) {
@@ -36,20 +49,21 @@ export function createRealtimeWebSocketHandler(container) {
36
49
  connection = undefined;
37
50
  };
38
51
  return {
52
+ maxMessageBytes: REALTIME_MAX_MESSAGE_BYTES,
39
53
  onOpen(_event, ws) {
40
- connection = realtime.connect(ws, { request, principal });
54
+ connection = realtime.connect(ws, context);
41
55
  },
42
- onMessage(event, ws) {
43
- if (!connection) {
44
- connection = realtime.connect(ws, { request, principal });
45
- }
46
- realtime.handleClientMessage(connection, event.data);
56
+ async onMessage(event) {
57
+ if (!connection)
58
+ return;
59
+ await realtime.handleClientMessage(connection, event.data);
47
60
  },
48
61
  onClose() {
49
62
  disconnect();
50
63
  },
51
- onError() {
64
+ onError(_event, ws) {
52
65
  disconnect();
66
+ ws.close(1011, 'realtime transport failed');
53
67
  },
54
68
  };
55
69
  };
@@ -1 +1 @@
1
- {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/realtime/websocket.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,8BAA8B,EAC9B,oBAAoB,GAErB,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,MAAM,uBAAuB,GAAW,KAAK,CAAC;AAErD,MAAM,UAAU,+BAA+B,CAAC,MAAY;IAC1D,MAAM,CAAC,GAAG,CAAC,uBAAuB,EAAE,CAAC,OAAO,EAAE,EAAE,CAC9C,OAAO,CAAC,IAAI,CACV;QACE,KAAK,EAAE,4BAA4B;KACpC,EACD;QACE,MAAM,EAAE,GAAG;QACX,OAAO,EAAE;YACP,OAAO,EAAE,WAAW;SACrB;KACF,CACF,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,SAA0B;IAE1B,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE;QACvB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,GAAG,CAAC,QAAQ,KAAK,uBAAuB,EAAE,CAAC;YAC7C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7C,kEAAkE;QAClE,sEAAsE;QACtE,sDAAsD;QACtD,IAAI,MAAM,IAAI,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC;YACpC,OAAO,QAAQ,CAAC,IAAI,CAClB,EAAE,KAAK,EAAE,kCAAkC,EAAE,EAC7C,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,8BAA8B,CAAC;YAC7D,CAAC,CAAC,MAAM,SAAS,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;YAC1E,CAAC,CAAC,SAAS,CAAC;QACd,IAAI,UAA0C,CAAC;QAC/C,MAAM,UAAU,GAAG,GAAS,EAAE;YAC5B,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO;YACT,CAAC;YAED,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAChC,UAAU,GAAG,SAAS,CAAC;QACzB,CAAC,CAAC;QAEF,OAAO;YACL,MAAM,CAAC,MAAM,EAAE,EAAE;gBACf,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;YAC5D,CAAC;YACD,SAAS,CAAC,KAAK,EAAE,EAAE;gBACjB,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC5D,CAAC;gBAED,QAAQ,CAAC,mBAAmB,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACvD,CAAC;YACD,OAAO;gBACL,UAAU,EAAE,CAAC;YACf,CAAC;YACD,OAAO;gBACL,UAAU,EAAE,CAAC;YACf,CAAC;SACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/realtime/websocket.ts"],"names":[],"mappings":"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"}
@@ -1,61 +1,2 @@
1
- /**
2
- * This file is part of the NocoBase (R) project.
3
- * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
- * Authors: NocoBase Team.
5
- *
6
- * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
- * For more information, please refer to: https://www.nocobase.com/agreement.
8
- */
9
- import { type IncomingMessage } from 'node:http';
10
- import type { Duplex } from 'node:stream';
11
- export type AppWebSocketReadyState = 0 | 1 | 2 | 3;
12
- export type AppWebSocketMessageData = string | ArrayBuffer;
13
- export interface AppWebSocketSendOptions {
14
- compress?: boolean;
15
- }
16
- export interface AppWebSocket {
17
- readonly url: URL;
18
- readonly protocol: string | null;
19
- readonly readyState: AppWebSocketReadyState;
20
- send(data: string | ArrayBuffer | Uint8Array, options?: AppWebSocketSendOptions): void;
21
- close(code?: number, reason?: string): void;
22
- }
23
- export interface AppWebSocketOpenEvent {
24
- readonly type: 'open';
25
- }
26
- export interface AppWebSocketMessageEvent {
27
- readonly type: 'message';
28
- readonly data: AppWebSocketMessageData;
29
- }
30
- export interface AppWebSocketCloseEvent {
31
- readonly type: 'close';
32
- readonly code: number;
33
- readonly reason: string;
34
- readonly wasClean: boolean;
35
- }
36
- export interface AppWebSocketErrorEvent {
37
- readonly type: 'error';
38
- readonly error: unknown;
39
- }
40
- export interface AppWebSocketEvents {
41
- onOpen?: (event: AppWebSocketOpenEvent, ws: AppWebSocket) => void | Promise<void>;
42
- onMessage?: (event: AppWebSocketMessageEvent, ws: AppWebSocket) => void | Promise<void>;
43
- onClose?: (event: AppWebSocketCloseEvent, ws: AppWebSocket) => void | Promise<void>;
44
- onError?: (event: AppWebSocketErrorEvent, ws: AppWebSocket) => void | Promise<void>;
45
- }
46
- export type AppWebSocketAcceptResult = AppWebSocketEvents | Response | null | undefined;
47
- export type AppWebSocketHandler = (request: Request, env?: unknown) => AppWebSocketAcceptResult | Promise<AppWebSocketAcceptResult>;
48
- export interface AcceptWebSocketUpgradeOptions {
49
- request: Request;
50
- events: AppWebSocketEvents;
51
- head?: Buffer;
52
- signal?: AbortSignal;
53
- }
54
- export interface CreateWebSocketUpgradeRequestOptions {
55
- signal?: AbortSignal;
56
- }
57
- export declare function isWebSocketUpgrade(req: IncomingMessage): boolean;
58
- export declare function createWebSocketUpgradeRequest(req: IncomingMessage, options?: CreateWebSocketUpgradeRequestOptions): Request;
59
- export declare function rejectWebSocketUpgrade(socket: Duplex, status?: number, headers?: Headers): void;
60
- export declare function acceptWebSocketUpgrade(req: IncomingMessage, socket: Duplex, options: AcceptWebSocketUpgradeOptions): AppWebSocket | null;
1
+ export * from '@nocobase/app-websocket';
61
2
  //# sourceMappingURL=websocket.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../src/websocket.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../src/websocket.ts"],"names":[],"mappings":"AACA,cAAc,yBAAyB,CAAC"}
package/dist/websocket.js CHANGED
@@ -1,371 +1,3 @@
1
- /**
2
- * This file is part of the NocoBase (R) project.
3
- * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
- * Authors: NocoBase Team.
5
- *
6
- * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
- * For more information, please refer to: https://www.nocobase.com/agreement.
8
- */
9
- import { createHash } from 'node:crypto';
10
- import { STATUS_CODES } from 'node:http';
11
- const WEBSOCKET_GUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
12
- const CLOSE_NORMAL = 1000;
13
- const CLOSE_GOING_AWAY = 1001;
14
- const CLOSE_PROTOCOL_ERROR = 1002;
15
- const CLOSE_ABNORMAL = 1006;
16
- const responseHeadersToSkip = new Set([
17
- 'connection',
18
- 'content-length',
19
- 'keep-alive',
20
- 'proxy-authenticate',
21
- 'proxy-authorization',
22
- 'te',
23
- 'trailer',
24
- 'transfer-encoding',
25
- 'upgrade',
26
- 'sec-websocket-accept',
27
- 'sec-websocket-extensions',
28
- 'sec-websocket-protocol',
29
- ]);
30
- export function isWebSocketUpgrade(req) {
31
- return firstHeaderValue(req.headers.upgrade)?.toLowerCase() === 'websocket';
32
- }
33
- export function createWebSocketUpgradeRequest(req, options = {}) {
34
- return new Request(createRequestUrl(req), {
35
- method: req.method ?? 'GET',
36
- headers: createRequestHeaders(req),
37
- signal: options.signal,
38
- });
39
- }
40
- export function rejectWebSocketUpgrade(socket, status = 404, headers) {
41
- const responseLines = ['Connection: close', 'Content-Length: 0'];
42
- appendResponseHeaders(responseLines, headers);
43
- try {
44
- socket.end(`HTTP/1.1 ${status.toString()} ${STATUS_CODES[status] ?? ''}\r\n${responseLines.join('\r\n')}\r\n\r\n`);
45
- }
46
- catch (error) {
47
- socket.destroy(error instanceof Error ? error : new Error(String(error)));
48
- }
49
- }
50
- export function acceptWebSocketUpgrade(req, socket, options) {
51
- const key = firstHeaderValue(req.headers['sec-websocket-key']);
52
- if (!key) {
53
- rejectWebSocketUpgrade(socket, 400);
54
- return null;
55
- }
56
- const responseLines = [
57
- 'HTTP/1.1 101 Switching Protocols',
58
- 'Upgrade: websocket',
59
- 'Connection: Upgrade',
60
- `Sec-WebSocket-Accept: ${createAcceptKey(key)}`,
61
- ];
62
- const protocol = selectSubprotocol(req);
63
- if (protocol) {
64
- responseLines.push(`Sec-WebSocket-Protocol: ${protocol}`);
65
- }
66
- socket.write(`${responseLines.join('\r\n')}\r\n\r\n`);
67
- const connection = new NodeAppWebSocket(socket, {
68
- events: options.events,
69
- protocol,
70
- request: options.request,
71
- signal: options.signal,
72
- });
73
- connection.start(options.head);
74
- return connection;
75
- }
76
- function createRequestHeaders(req) {
77
- const headers = new Headers();
78
- for (const [key, value] of Object.entries(req.headers)) {
79
- if (Array.isArray(value)) {
80
- for (const item of value) {
81
- headers.append(key, item);
82
- }
83
- continue;
84
- }
85
- if (value !== undefined) {
86
- headers.set(key, value);
87
- }
88
- }
89
- return headers;
90
- }
91
- function createRequestUrl(req) {
92
- const host = firstHeaderValue(req.headers.host) ?? 'localhost';
93
- const protocol = requestProtocol(req);
94
- return new URL(req.url ?? '/', `${protocol}://${host}`);
95
- }
96
- function requestProtocol(req) {
97
- const forwardedProto = firstHeaderValue(req.headers['x-forwarded-proto']);
98
- if (forwardedProto) {
99
- return forwardedProto.split(',')[0]?.trim() || 'http';
100
- }
101
- const socket = req.socket;
102
- return socket.encrypted ? 'https' : 'http';
103
- }
104
- function appendResponseHeaders(responseLines, headers) {
105
- if (!headers) {
106
- return;
107
- }
108
- headers.forEach((value, key) => {
109
- if (!responseHeadersToSkip.has(key.toLowerCase())) {
110
- responseLines.push(`${key}: ${value}`);
111
- }
112
- });
113
- }
114
- function createAcceptKey(key) {
115
- return createHash('sha1').update(`${key}${WEBSOCKET_GUID}`).digest('base64');
116
- }
117
- function selectSubprotocol(req) {
118
- const header = firstHeaderValue(req.headers['sec-websocket-protocol']);
119
- return header?.split(',')[0]?.trim() || null;
120
- }
121
- function firstHeaderValue(value) {
122
- return Array.isArray(value) ? value[0] : value;
123
- }
124
- class NodeAppWebSocket {
125
- url;
126
- protocol;
127
- events;
128
- socket;
129
- signal;
130
- buffered = Buffer.alloc(0);
131
- state = 1;
132
- closeSent = false;
133
- finished = false;
134
- constructor(socket, options) {
135
- this.socket = socket;
136
- this.events = options.events;
137
- this.protocol = options.protocol;
138
- this.url = new URL(options.request.url);
139
- this.signal = options.signal;
140
- }
141
- get readyState() {
142
- return this.state;
143
- }
144
- start(head) {
145
- const closeForAbort = () => {
146
- this.close(CLOSE_GOING_AWAY, 'app runtime closed');
147
- };
148
- this.signal?.addEventListener('abort', closeForAbort, { once: true });
149
- this.socket.on('data', this.handleData);
150
- this.socket.once('close', () => {
151
- this.signal?.removeEventListener('abort', closeForAbort);
152
- this.finish(CLOSE_ABNORMAL, '', false);
153
- });
154
- this.socket.once('end', () => {
155
- this.finish(CLOSE_ABNORMAL, '', false);
156
- });
157
- this.socket.once('error', (error) => {
158
- this.emitError(error);
159
- this.finish(CLOSE_ABNORMAL, '', false);
160
- });
161
- this.invoke(this.events.onOpen, { type: 'open' }, this);
162
- if (head && head.length > 0) {
163
- this.handleData(head);
164
- }
165
- }
166
- send(data, _options) {
167
- if (this.state !== 1) {
168
- return;
169
- }
170
- const isText = typeof data === 'string';
171
- const payload = normalizeOutgoingData(data);
172
- this.socket.write(encodeWebSocketFrame(isText ? 0x1 : 0x2, payload));
173
- }
174
- close(code = CLOSE_NORMAL, reason = '') {
175
- if (this.state >= 2) {
176
- return;
177
- }
178
- this.state = 2;
179
- this.sendCloseFrame(code, reason);
180
- this.socket.end();
181
- }
182
- handleData = (chunk) => {
183
- this.buffered = Buffer.concat([
184
- this.buffered,
185
- Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk),
186
- ]);
187
- while (this.buffered.length > 0) {
188
- let frame;
189
- try {
190
- frame = parseWebSocketFrame(this.buffered);
191
- }
192
- catch (error) {
193
- this.emitError(error);
194
- this.close(CLOSE_PROTOCOL_ERROR, error instanceof Error ? error.message : 'invalid WebSocket frame');
195
- return;
196
- }
197
- if (!frame) {
198
- return;
199
- }
200
- this.buffered = this.buffered.subarray(frame.bytesRead);
201
- this.handleFrame(frame);
202
- }
203
- };
204
- handleFrame(frame) {
205
- if (!frame.fin) {
206
- this.close(CLOSE_PROTOCOL_ERROR, 'fragmented frames are not supported');
207
- return;
208
- }
209
- if (frame.opcode === 0x1) {
210
- this.emitMessage(frame.payload.toString('utf8'));
211
- return;
212
- }
213
- if (frame.opcode === 0x2) {
214
- this.emitMessage(bufferToArrayBuffer(frame.payload));
215
- return;
216
- }
217
- if (frame.opcode === 0x8) {
218
- const close = parseClosePayload(frame.payload);
219
- if (!this.closeSent) {
220
- this.sendCloseFrame(close.code, close.reason);
221
- }
222
- this.socket.end();
223
- this.finish(close.code, close.reason, true);
224
- return;
225
- }
226
- if (frame.opcode === 0x9) {
227
- this.socket.write(encodeWebSocketFrame(0xa, frame.payload));
228
- return;
229
- }
230
- if (frame.opcode === 0xa) {
231
- return;
232
- }
233
- this.close(CLOSE_PROTOCOL_ERROR, 'unsupported frame opcode');
234
- }
235
- emitMessage(data) {
236
- this.invoke(this.events.onMessage, { type: 'message', data }, this);
237
- }
238
- emitError(error) {
239
- this.invoke(this.events.onError, { type: 'error', error }, this);
240
- }
241
- finish(code, reason, wasClean) {
242
- if (this.finished) {
243
- return;
244
- }
245
- this.finished = true;
246
- this.state = 3;
247
- this.socket.off('data', this.handleData);
248
- this.invoke(this.events.onClose, { type: 'close', code, reason, wasClean }, this);
249
- }
250
- sendCloseFrame(code, reason) {
251
- if (this.closeSent) {
252
- return;
253
- }
254
- this.closeSent = true;
255
- this.socket.write(encodeWebSocketFrame(0x8, createClosePayload(code, reason)));
256
- }
257
- invoke(handler, event, ws) {
258
- if (!handler) {
259
- return;
260
- }
261
- try {
262
- const handlerPromise = Promise.resolve(handler(event, ws));
263
- handlerPromise.catch((error) => this.emitError(error));
264
- }
265
- catch (error) {
266
- this.emitError(error);
267
- }
268
- }
269
- }
270
- function normalizeOutgoingData(data) {
271
- if (typeof data === 'string') {
272
- return Buffer.from(data);
273
- }
274
- if (data instanceof Uint8Array) {
275
- return Buffer.from(data);
276
- }
277
- return Buffer.from(data);
278
- }
279
- function parseWebSocketFrame(buffer) {
280
- if (buffer.length < 2) {
281
- return null;
282
- }
283
- const firstByte = buffer[0];
284
- const secondByte = buffer[1];
285
- const fin = (firstByte & 0x80) !== 0;
286
- const opcode = firstByte & 0x0f;
287
- const masked = (secondByte & 0x80) !== 0;
288
- let payloadLength = secondByte & 0x7f;
289
- let offset = 2;
290
- if (payloadLength === 126) {
291
- if (buffer.length < offset + 2) {
292
- return null;
293
- }
294
- payloadLength = buffer.readUInt16BE(offset);
295
- offset += 2;
296
- }
297
- else if (payloadLength === 127) {
298
- if (buffer.length < offset + 8) {
299
- return null;
300
- }
301
- const length = buffer.readBigUInt64BE(offset);
302
- if (length > BigInt(Number.MAX_SAFE_INTEGER)) {
303
- throw new Error('WebSocket frame is too large');
304
- }
305
- payloadLength = Number(length);
306
- offset += 8;
307
- }
308
- if (!masked) {
309
- throw new Error('Client WebSocket frames must be masked');
310
- }
311
- if (buffer.length < offset + 4 + payloadLength) {
312
- return null;
313
- }
314
- const mask = buffer.subarray(offset, offset + 4);
315
- offset += 4;
316
- const payload = Buffer.from(buffer.subarray(offset, offset + payloadLength));
317
- for (let index = 0; index < payload.length; index += 1) {
318
- payload[index] ^= mask[index % 4];
319
- }
320
- return {
321
- fin,
322
- opcode,
323
- payload,
324
- bytesRead: offset + payloadLength,
325
- };
326
- }
327
- function encodeWebSocketFrame(opcode, payload) {
328
- const length = payload.length;
329
- let header;
330
- if (length < 126) {
331
- header = Buffer.from([0x80 | opcode, length]);
332
- }
333
- else if (length <= 0xffff) {
334
- header = Buffer.allocUnsafe(4);
335
- header[0] = 0x80 | opcode;
336
- header[1] = 126;
337
- header.writeUInt16BE(length, 2);
338
- }
339
- else {
340
- header = Buffer.allocUnsafe(10);
341
- header[0] = 0x80 | opcode;
342
- header[1] = 127;
343
- header.writeBigUInt64BE(BigInt(length), 2);
344
- }
345
- return Buffer.concat([header, payload]);
346
- }
347
- function createClosePayload(code, reason) {
348
- const reasonBuffer = Buffer.from(reason).subarray(0, 123);
349
- const payload = Buffer.allocUnsafe(2 + reasonBuffer.length);
350
- payload.writeUInt16BE(code, 0);
351
- reasonBuffer.copy(payload, 2);
352
- return payload;
353
- }
354
- function parseClosePayload(payload) {
355
- if (payload.length < 2) {
356
- return {
357
- code: CLOSE_NORMAL,
358
- reason: '',
359
- };
360
- }
361
- return {
362
- code: payload.readUInt16BE(0),
363
- reason: payload.subarray(2).toString('utf8'),
364
- };
365
- }
366
- function bufferToArrayBuffer(buffer) {
367
- const arrayBuffer = new ArrayBuffer(buffer.byteLength);
368
- new Uint8Array(arrayBuffer).set(buffer);
369
- return arrayBuffer;
370
- }
1
+ // Compatibility entry: all application hosts share the maintained WebSocket adapter.
2
+ export * from '@nocobase/app-websocket';
371
3
  //# sourceMappingURL=websocket.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../src/websocket.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../src/websocket.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,cAAc,yBAAyB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nocobase/app-server",
3
- "version": "2.0.0-beta.8",
3
+ "version": "3.0.0-beta.0",
4
4
  "type": "module",
5
5
  "prettier": "@nocobase/dev-config/prettier",
6
6
  "engines": {
@@ -117,11 +117,11 @@
117
117
  "hono-openapi": "^1.3.3",
118
118
  "zod": "^4.6.5",
119
119
  "openapi-types": "^12.1.3",
120
- "@nocobase/app-websocket": "^0.0.2-beta.0",
120
+ "@nocobase/app-websocket": "^0.1.0-beta.1",
121
121
  "@nocobase/config": "^0.1.0-beta.3",
122
- "@nocobase/drive": "^0.1.0-beta.6",
122
+ "@nocobase/drive": "^0.1.0-beta.7",
123
123
  "@nocobase/logging": "^0.1.0-beta.7",
124
- "@nocobase/realtime": "^0.1.0-beta.2",
124
+ "@nocobase/realtime": "^0.1.0-beta.3",
125
125
  "@nocobase/secrets": "^0.1.0-beta.1",
126
126
  "@nocobase/session": "^0.1.0-beta.3",
127
127
  "@nocobase/snowflake": "^1.0.0-beta.4",
@@ -141,13 +141,13 @@
141
141
  "@nocobase/db-sqlite": "0.1.0-beta.6",
142
142
  "@nocobase/db-testing": "0.1.0-beta.3",
143
143
  "@nocobase/api-client": "1.0.0-beta.4",
144
- "@nocobase/dev-config": "0.1.0-beta.23"
144
+ "@nocobase/dev-config": "0.1.0-beta.24"
145
145
  },
146
146
  "peerDependencies": {
147
147
  "@nocobase/db-dameng": "^0.1.0-beta.4",
148
148
  "@nocobase/db-kingbase": "^0.1.0-beta.4",
149
149
  "@nocobase/db-oceanbase": "^0.1.0-beta.4",
150
- "@nocobase/i18n": "^1.0.0-beta.7",
150
+ "@nocobase/i18n": "^2.0.0-beta.0",
151
151
  "@nocobase/caching": "^0.1.0-beta.3",
152
152
  "@nocobase/db": "^1.0.0-beta.21",
153
153
  "@nocobase/service-provider": "^0.0.2-beta.2",