@fluojs/redis 1.0.0 → 1.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.ko.md CHANGED
@@ -32,6 +32,8 @@ npm install @fluojs/redis ioredis
32
32
 
33
33
  `RedisModule.forRoot(options)`는 기본 Redis 클라이언트와 `RedisService` 파사드를 등록하는 지원되는 root entrypoint입니다.
34
34
 
35
+ `RedisModule.forRoot(...)`는 의도적으로 동기 방식입니다. NestJS의 `forRootAsync(...)` 같은 async dynamic module에서 마이그레이션할 때는 secret, 환경별 host, 외부에서 만든 client를 애플리케이션 경계에서 먼저 해석한 뒤 최종 Redis 옵션을 `forRoot(...)`에 전달하세요. fluo는 Redis module wiring을 module graph 안의 숨겨진 async factory로 미루지 않습니다.
36
+
35
37
  ```typescript
36
38
  import { Module } from '@fluojs/core';
37
39
  import { RedisModule } from '@fluojs/redis';
@@ -131,6 +133,8 @@ export class AnalyticsStore {
131
133
 
132
134
  Redis Pub/Sub은 일반적인 shared-client 재사용의 예외입니다. Redis는 구독한 연결을 subscribe mode로 전환하므로, lifecycle-managed `REDIS_CLIENT`나 `RedisService.getRawClient()` 결과를 publisher와 subscriber로 동시에 사용하지 마세요. `client.duplicate()`로 전용 subscriber 연결을 만들거나 명시적인 `RedisModule.forRoot({ name: 'subscriber', ... })` 등록을 사용하고, 그 연결도 별도 lifecycle owner를 갖게 하세요.
133
135
 
136
+ `client.duplicate()`를 사용한다면 그 duplicate는 애플리케이션이 소유합니다. 직접 연결하고, subscribe에 사용하며, 자체 shutdown 경로에서 닫아야 합니다. Subscriber 시작/종료 timeout을 fluo가 소유하게 하려면 named registration을 선호하고 `getRedisClientToken(name)`으로 주입하세요.
137
+
134
138
  ```typescript
135
139
  import { Inject } from '@fluojs/core';
136
140
  import { REDIS_CLIENT } from '@fluojs/redis';
@@ -146,11 +150,45 @@ export class AdvancedService {
146
150
  }
147
151
  ```
148
152
 
153
+ ```typescript
154
+ import { Inject, Module } from '@fluojs/core';
155
+ import { getRedisClientToken, RedisModule } from '@fluojs/redis';
156
+ import { RedisPubSubMicroserviceTransport } from '@fluojs/microservices';
157
+ import type Redis from 'ioredis';
158
+
159
+ const COMMAND_REDIS = getRedisClientToken();
160
+ const SUBSCRIBER_REDIS = getRedisClientToken('subscriber');
161
+
162
+ @Module({
163
+ imports: [
164
+ RedisModule.forRoot({ host: 'localhost', port: 6379 }),
165
+ RedisModule.forRoot({ name: 'subscriber', host: 'localhost', port: 6379 }),
166
+ ],
167
+ })
168
+ export class RedisConnectionsModule {}
169
+
170
+ @Inject(COMMAND_REDIS, SUBSCRIBER_REDIS)
171
+ export class PubSubTransportFactory {
172
+ constructor(
173
+ private readonly commandClient: Redis,
174
+ private readonly subscriberClient: Redis,
175
+ ) {}
176
+
177
+ createTransport() {
178
+ return new RedisPubSubMicroserviceTransport({
179
+ publishClient: this.commandClient,
180
+ subscribeClient: this.subscriberClient,
181
+ });
182
+ }
183
+ }
184
+ ```
185
+
149
186
  ## 공개 API 개요
150
187
 
151
188
  ### 핵심 구성 요소
152
189
  - `RedisModule`: Redis 클라이언트 등록 및 수명 주기 훅을 관리합니다.
153
190
  - `RedisModule.forRoot(options)`: `name`을 생략하면 기본 Redis 클라이언트와 `RedisService` 파사드를 등록하고, `name`을 제공하면 추가 이름 있는 Redis 클라이언트를 등록합니다. 기본 등록은 기본적으로 global이고, 이름 있는 등록은 scoped입니다. `lifecycle.connectTimeoutMs`와 `lifecycle.quitTimeoutMs`로 Fluo가 소유한 연결 시작/종료 시간을 제한할 수 있습니다.
191
+ - lifecycle hook은 `RedisModule.forRoot(...).lifecycle`로만 설정합니다. 내부 lifecycle service는 의도적으로 public API에 포함하지 않습니다.
154
192
  - `RedisService`: JSON 코덱 지원 및 `get`/`set`/`del` 메서드를 제공하는 파사드입니다.
155
193
  - `REDIS_CLIENT`: 내부 `ioredis` 인스턴스에 접근하기 위한 DI 토큰입니다.
156
194
  - `DEFAULT_REDIS_CLIENT_NAME`: 안정적인 기본 Redis client name입니다.
@@ -160,7 +198,10 @@ export class AdvancedService {
160
198
  - `createRedisPlatformStatusSnapshot(input)`: Redis 연결 상태를 Fluo 플랫폼 health/readiness 스냅샷으로 변환합니다.
161
199
 
162
200
  ### 타입
201
+ - `DefaultRedisModuleOptions`: 이름 없는 기본 Redis 등록이 받는 옵션입니다. 선택적 global alias visibility와 lifecycle timeout control을 포함합니다.
202
+ - `NamedRedisModuleOptions`: 추가 이름 있는 Redis 등록이 받는 옵션입니다. 필수 `name`과 scoped lifecycle timeout control을 포함합니다.
163
203
  - `RedisModuleOptions`: Fluo가 module-only `name`, `global`, `lifecycle` 필드를 제거한 뒤 `ioredis` 생성자에 전달하는 설정 옵션입니다.
204
+ - `RedisClientOptions`: Fluo가 module-only field를 제거하고 내부에서 `lazyConnect: true`를 강제하기 전의 Redis constructor option입니다.
164
205
  - `RedisLifecycleOptions`: Fluo가 소유한 `connect()`와 `quit()` lifecycle command의 timeout을 조정하는 선택적 옵션입니다.
165
206
  - `PersistencePlatformStatusSnapshot`, `RedisStatusAdapterInput`: status snapshot input/output type입니다.
166
207
 
package/README.md CHANGED
@@ -32,6 +32,8 @@ npm install @fluojs/redis ioredis
32
32
 
33
33
  Use `RedisModule.forRoot(options)` to register the default Redis client and `RedisService` facade.
34
34
 
35
+ `RedisModule.forRoot(...)` is intentionally synchronous. When migrating from NestJS async dynamic modules such as `forRootAsync(...)`, resolve secrets, environment-specific hosts, or externally constructed clients at the application boundary first, then pass the final Redis options into `forRoot(...)`. fluo does not defer Redis module wiring to an async factory hidden inside the module graph.
36
+
35
37
  ```typescript
36
38
  import { Module } from '@fluojs/core';
37
39
  import { RedisModule } from '@fluojs/redis';
@@ -131,6 +133,8 @@ If you already injected `RedisService`, call `redis.getRawClient()` to access th
131
133
 
132
134
  Redis Pub/Sub is the exception to ordinary shared-client reuse: Redis switches subscribed connections into subscribe mode, so do not use the lifecycle-managed `REDIS_CLIENT` or a `RedisService.getRawClient()` result as both publisher and subscriber. Create a dedicated subscriber connection with `client.duplicate()` (or an explicitly named `RedisModule.forRoot({ name: 'subscriber', ... })` registration) and let that connection have its own lifecycle owner.
133
135
 
136
+ If you use `client.duplicate()`, the duplicate is application-owned: connect it, subscribe with it, and close it from your own shutdown path. If you want fluo to own subscriber startup/shutdown timeouts, prefer a named registration and inject it with `getRedisClientToken(name)`.
137
+
134
138
  ```typescript
135
139
  import { Inject } from '@fluojs/core';
136
140
  import { REDIS_CLIENT } from '@fluojs/redis';
@@ -146,11 +150,45 @@ export class AdvancedService {
146
150
  }
147
151
  ```
148
152
 
153
+ ```typescript
154
+ import { Inject, Module } from '@fluojs/core';
155
+ import { getRedisClientToken, RedisModule } from '@fluojs/redis';
156
+ import { RedisPubSubMicroserviceTransport } from '@fluojs/microservices';
157
+ import type Redis from 'ioredis';
158
+
159
+ const COMMAND_REDIS = getRedisClientToken();
160
+ const SUBSCRIBER_REDIS = getRedisClientToken('subscriber');
161
+
162
+ @Module({
163
+ imports: [
164
+ RedisModule.forRoot({ host: 'localhost', port: 6379 }),
165
+ RedisModule.forRoot({ name: 'subscriber', host: 'localhost', port: 6379 }),
166
+ ],
167
+ })
168
+ export class RedisConnectionsModule {}
169
+
170
+ @Inject(COMMAND_REDIS, SUBSCRIBER_REDIS)
171
+ export class PubSubTransportFactory {
172
+ constructor(
173
+ private readonly commandClient: Redis,
174
+ private readonly subscriberClient: Redis,
175
+ ) {}
176
+
177
+ createTransport() {
178
+ return new RedisPubSubMicroserviceTransport({
179
+ publishClient: this.commandClient,
180
+ subscribeClient: this.subscriberClient,
181
+ });
182
+ }
183
+ }
184
+ ```
185
+
149
186
  ## Public API Overview
150
187
 
151
188
  ### Core
152
189
  - `RedisModule`: Registers Redis clients and lifecycle hooks.
153
190
  - `RedisModule.forRoot(options)`: Registers the default Redis client plus `RedisService` facade when `name` is omitted, or an additional named Redis client when `name` is provided. The default registration is global by default; named registrations are scoped. Use `lifecycle.connectTimeoutMs` and `lifecycle.quitTimeoutMs` to bound Fluo-owned connection startup and shutdown.
191
+ - Lifecycle hooks are configured only through `RedisModule.forRoot(...).lifecycle`; the internal lifecycle service is intentionally not part of the public API.
154
192
  - `RedisService`: Facade with JSON codec support and `get`/`set`/`del` methods.
155
193
  - `REDIS_CLIENT`: DI token for the underlying `ioredis` instance.
156
194
  - `DEFAULT_REDIS_CLIENT_NAME`: Stable default Redis client name.
@@ -160,7 +198,10 @@ export class AdvancedService {
160
198
  - `createRedisPlatformStatusSnapshot(input)`: Adapts Redis connection state into Fluo's platform health/readiness snapshot contract.
161
199
 
162
200
  ### Types
201
+ - `DefaultRedisModuleOptions`: Options accepted by the unnamed default Redis registration, including optional global alias visibility and lifecycle timeout controls.
202
+ - `NamedRedisModuleOptions`: Options accepted by additional named Redis registrations, including required `name` and scoped lifecycle timeout controls.
163
203
  - `RedisModuleOptions`: Configuration options passed to the `ioredis` constructor after Fluo removes module-only `name`, `global`, and `lifecycle` fields.
204
+ - `RedisClientOptions`: Redis constructor options after Fluo removes module-only fields and before it forces `lazyConnect: true` internally.
164
205
  - `RedisLifecycleOptions`: Optional timeout controls for Fluo-owned `connect()` and `quit()` lifecycle commands.
165
206
  - `PersistencePlatformStatusSnapshot`, `RedisStatusAdapterInput`: Status snapshot input/output types.
166
207
 
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAMhE,OAAO,KAAK,EAA6C,kBAAkB,EAAE,MAAM,YAAY,CAAC;AA8GhG,yEAAyE;AACzE,qBAAa,WAAW;IACtB;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,kBAAkB,GAAG,UAAU;CAYxD"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAMhE,OAAO,KAAK,EAA6C,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAoIhG,yEAAyE;AACzE,qBAAa,WAAW;IACtB;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,kBAAkB,GAAG,UAAU;CAYxD"}
package/dist/module.js CHANGED
@@ -29,6 +29,7 @@ function normalizeRedisModuleOptions(options) {
29
29
  ...clientOptions
30
30
  } = options;
31
31
  const normalizedName = name?.trim();
32
+ const lifecycleOptions = normalizeRedisLifecycleOptions(lifecycle);
32
33
  if (normalizedName !== undefined && normalizedName.length === 0) {
33
34
  throw new Error('Redis client name must be a non-empty string when provided.');
34
35
  }
@@ -38,10 +39,26 @@ function normalizeRedisModuleOptions(options) {
38
39
  return {
39
40
  clientOptions,
40
41
  global: normalizedName === undefined ? global ?? true : false,
41
- lifecycleOptions: lifecycle ?? {},
42
+ lifecycleOptions,
42
43
  name: normalizedName
43
44
  };
44
45
  }
46
+ function normalizeRedisLifecycleOptions(lifecycle) {
47
+ if (lifecycle === undefined) {
48
+ return {};
49
+ }
50
+ assertValidLifecycleTimeoutMs('connectTimeoutMs', lifecycle.connectTimeoutMs);
51
+ assertValidLifecycleTimeoutMs('quitTimeoutMs', lifecycle.quitTimeoutMs);
52
+ return lifecycle;
53
+ }
54
+ function assertValidLifecycleTimeoutMs(fieldName, value) {
55
+ if (value === undefined) {
56
+ return;
57
+ }
58
+ if (!Number.isFinite(value) || value < 0) {
59
+ throw new Error(`Redis lifecycle.${fieldName} must be a finite non-negative number.`);
60
+ }
61
+ }
45
62
  function createRedisProviders(options, lifecycleOptions, name) {
46
63
  const clientToken = getRedisClientToken(name);
47
64
  if (clientToken === REDIS_CLIENT) {
package/dist/service.d.ts CHANGED
@@ -15,6 +15,7 @@ export declare class RedisLifecycleService implements OnModuleInit, OnApplicatio
15
15
  private shouldConnectOnInit;
16
16
  private disconnectIfPossible;
17
17
  private quitWithDisconnectFallback;
18
+ private connectWithDisconnectFallback;
18
19
  private describeClient;
19
20
  }
20
21
  //# sourceMappingURL=service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAI3E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAiDxD;;GAEG;AACH,qBACa,qBAAsB,YAAW,YAAY,EAAE,qBAAqB;IAE7E,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBAFhB,MAAM,EAAE,KAAK,EACb,UAAU,CAAC,EAAE,MAAM,YAAA,EACnB,gBAAgB,GAAE,qBAA0B;IAGzD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAY7B,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB5C,4BAA4B;IAO5B,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,oBAAoB;YAMd,0BAA0B;IAiBxC,OAAO,CAAC,cAAc;CAGvB"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAI3E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAqDxD;;GAEG;AACH,qBACa,qBAAsB,YAAW,YAAY,EAAE,qBAAqB;IAE7E,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBAFhB,MAAM,EAAE,KAAK,EACb,UAAU,CAAC,EAAE,MAAM,YAAA,EACnB,gBAAgB,GAAE,qBAA0B;IAGzD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ7B,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB5C,4BAA4B;IAO5B,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,oBAAoB;YAMd,0BAA0B;YAiB1B,6BAA6B;IAc3C,OAAO,CAAC,cAAc;CAGvB"}
package/dist/service.js CHANGED
@@ -13,6 +13,9 @@ const DEFAULT_REDIS_LIFECYCLE_TIMEOUT_MS = 10_000;
13
13
  function isClosed(status) {
14
14
  return status === 'end';
15
15
  }
16
+ function isOpen(status) {
17
+ return QUITTABLE_STATUSES.has(status);
18
+ }
16
19
  function isConnectable(status) {
17
20
  return status === 'wait';
18
21
  }
@@ -60,7 +63,7 @@ class RedisLifecycleService {
60
63
  if (!this.shouldConnectOnInit()) {
61
64
  return;
62
65
  }
63
- await withLifecycleTimeout(this.client.connect(), normalizeTimeoutMs(this.lifecycleOptions.connectTimeoutMs), `Redis client ${this.describeClient()} connect timed out after ${String(normalizeTimeoutMs(this.lifecycleOptions.connectTimeoutMs))}ms.`);
66
+ await this.connectWithDisconnectFallback();
64
67
  }
65
68
  async onApplicationShutdown() {
66
69
  const status = this.client.status;
@@ -93,11 +96,19 @@ class RedisLifecycleService {
93
96
  return;
94
97
  } catch (error) {
95
98
  this.disconnectIfPossible(this.client.status);
96
- if (!isClosed(this.client.status)) {
99
+ if (isOpen(this.client.status)) {
97
100
  throw error;
98
101
  }
99
102
  }
100
103
  }
104
+ async connectWithDisconnectFallback() {
105
+ try {
106
+ await withLifecycleTimeout(this.client.connect(), normalizeTimeoutMs(this.lifecycleOptions.connectTimeoutMs), `Redis client ${this.describeClient()} connect timed out after ${String(normalizeTimeoutMs(this.lifecycleOptions.connectTimeoutMs))}ms.`);
107
+ } catch (error) {
108
+ this.disconnectIfPossible(this.client.status);
109
+ throw error;
110
+ }
111
+ }
101
112
  describeClient() {
102
113
  return this.clientName ?? 'default';
103
114
  }
package/dist/types.d.ts CHANGED
@@ -2,9 +2,9 @@ import type { RedisOptions } from 'ioredis';
2
2
  type RedisConnectionOptions = Omit<RedisOptions, 'lazyConnect'>;
3
3
  /** Lifecycle timeout controls for Redis connections owned by Fluo. */
4
4
  export interface RedisLifecycleOptions {
5
- /** Maximum time to wait for bootstrap `connect()` before failing startup. Defaults to `10_000`. */
5
+ /** Maximum finite non-negative time to wait for bootstrap `connect()` before failing startup. Defaults to `10_000`; `0` disables the timeout. */
6
6
  connectTimeoutMs?: number;
7
- /** Maximum time to wait for graceful shutdown `quit()` before forcing `disconnect()`. Defaults to `10_000`. */
7
+ /** Maximum finite non-negative time to wait for graceful shutdown `quit()` before forcing `disconnect()`. Defaults to `10_000`; `0` disables the timeout. */
8
8
  quitTimeoutMs?: number;
9
9
  }
10
10
  /** Options accepted by the default unnamed Redis registration. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,KAAK,sBAAsB,GAAG,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;AAEhE,sEAAsE;AACtE,MAAM,WAAW,qBAAqB;IACpC,mGAAmG;IACnG,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,+GAA+G;IAC/G,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,kEAAkE;AAClE,MAAM,MAAM,yBAAyB,GAAG,sBAAsB,GAAG;IAC/D,wFAAwF;IACxF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAClC,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB,CAAC;AAEF,kEAAkE;AAClE,MAAM,MAAM,uBAAuB,GAAG,sBAAsB,GAAG;IAC7D,2EAA2E;IAC3E,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAClC,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,MAAM,CAAC,EAAE,KAAK,CAAC;CAChB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG,yBAAyB,GAAG,uBAAuB,CAAC;AAErF,2EAA2E;AAC3E,MAAM,MAAM,kBAAkB,GAAG,sBAAsB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,KAAK,sBAAsB,GAAG,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;AAEhE,sEAAsE;AACtE,MAAM,WAAW,qBAAqB;IACpC,iJAAiJ;IACjJ,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6JAA6J;IAC7J,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,kEAAkE;AAClE,MAAM,MAAM,yBAAyB,GAAG,sBAAsB,GAAG;IAC/D,wFAAwF;IACxF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAClC,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB,CAAC;AAEF,kEAAkE;AAClE,MAAM,MAAM,uBAAuB,GAAG,sBAAsB,GAAG;IAC7D,2EAA2E;IAC3E,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAClC,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,MAAM,CAAC,EAAE,KAAK,CAAC;CAChB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG,yBAAyB,GAAG,uBAAuB,CAAC;AAErF,2EAA2E;AAC3E,MAAM,MAAM,kBAAkB,GAAG,sBAAsB,CAAC"}
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "connection",
10
10
  "lifecycle"
11
11
  ],
12
- "version": "1.0.0",
12
+ "version": "1.0.2",
13
13
  "private": false,
14
14
  "license": "MIT",
15
15
  "repository": {
@@ -36,9 +36,9 @@
36
36
  "dist"
37
37
  ],
38
38
  "dependencies": {
39
- "@fluojs/core": "^1.0.0",
40
- "@fluojs/di": "^1.0.0",
41
- "@fluojs/runtime": "^1.0.0"
39
+ "@fluojs/core": "^1.0.3",
40
+ "@fluojs/di": "^1.1.0",
41
+ "@fluojs/runtime": "^1.1.8"
42
42
  },
43
43
  "peerDependencies": {
44
44
  "ioredis": "^5.10.0"