@effect/platform-node 4.0.0-rc.109 → 4.0.0-rc.111

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.
@@ -27,8 +27,8 @@
27
27
  "@effect/sql-sqlite-wasm": "workspace:*",
28
28
  "@effect/vitest": "workspace:*",
29
29
  "effect": "workspace:*",
30
- "hono": "^4.12.28",
31
- "nodemailer": "^9.0.3"
30
+ "hono": "^4.13.2",
31
+ "nodemailer": "^9.0.5"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@types/nodemailer": "^8.0.1"
@@ -23,7 +23,8 @@ const tasks = Command.make("tasks").pipe(
23
23
  workspace,
24
24
  verbose: Flag.boolean("verbose").pipe(
25
25
  Flag.withAlias("v"),
26
- Flag.withDescription("Print diagnostic output")
26
+ Flag.withDescription("Print diagnostic output"),
27
+ Flag.withDefault(false)
27
28
  )
28
29
  }),
29
30
  Command.withDescription("Track and manage tasks")
@@ -92,7 +93,8 @@ const list = Command.make(
92
93
  Flag.withDefault("open")
93
94
  ),
94
95
  json: Flag.boolean("json").pipe(
95
- Flag.withDescription("Print machine-readable output")
96
+ Flag.withDescription("Print machine-readable output"),
97
+ Flag.withDefault(false)
96
98
  )
97
99
  },
98
100
  Effect.fn(function*({ status, json }) {
@@ -1 +1 @@
1
- {"version":3,"file":"NodeRedis.d.ts","sourceRoot":"","sources":["../src/NodeRedis.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,KAAK,MAAM,mCAAmC,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAsB,MAAM,OAAO,CAAA;AAExD,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAA;AACtD,KAAK,sBAAsB,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;;qBAW1D,eAAe;kBAClB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC;;AAVrG;;;;;;;GAOG;AACH,qBAAa,SAAU,SAAQ,cAGQ;CAAG;AAoE1C;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,KAAK,aACN,sBAAsB,GAAG,SAAS,KAC3C,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,EAAE,KAAK,CAAC,UAAU,CAAuC,CAAA;AAE/F;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,WAAW,EAAE,CACxB,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,KACzC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,EAAE,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,WAAW,CAO5E,CAAA"}
1
+ {"version":3,"file":"NodeRedis.d.ts","sourceRoot":"","sources":["../src/NodeRedis.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAEzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,KAAK,MAAM,mCAAmC,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAsB,MAAM,OAAO,CAAA;AAExD,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAA;AACtD,KAAK,sBAAsB,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;;qBAW1D,eAAe;kBAClB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC;;AAVrG;;;;;;;GAOG;AACH,qBAAa,SAAU,SAAQ,cAGQ;CAAG;AAwH1C;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,KAAK,aACN,sBAAsB,GAAG,SAAS,KAC3C,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,EAAE,KAAK,CAAC,UAAU,CAAuC,CAAA;AAE/F;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,WAAW,EAAE,CACxB,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,KACzC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,EAAE,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,WAAW,CAO5E,CAAA"}
package/dist/NodeRedis.js CHANGED
@@ -12,6 +12,7 @@
12
12
  */
13
13
  import * as Config from "effect/Config";
14
14
  import * as Context from "effect/Context";
15
+ import * as Deferred from "effect/Deferred";
15
16
  import * as Effect from "effect/Effect";
16
17
  import * as Fn from "effect/Function";
17
18
  import * as Layer from "effect/Layer";
@@ -70,6 +71,56 @@ const make = /*#__PURE__*/Effect.fnUntraced(function* (options) {
70
71
  catch: cause => new Redis.RedisError({
71
72
  cause
72
73
  })
74
+ }),
75
+ subscribe: (channel, onMessage) => Effect.gen(function* () {
76
+ const terminal = yield* Deferred.make();
77
+ yield* Effect.acquireRelease(Effect.tryPromise({
78
+ try: async () => {
79
+ let subscriberReady = false;
80
+ const subscriber = client.duplicate(socket?.reconnectStrategy === undefined ? {
81
+ socket: {
82
+ ...socket,
83
+ reconnectStrategy: (retries, cause) => {
84
+ if (!subscriberReady) return cause;
85
+ if (cause instanceof SocketTimeoutError) return false;
86
+ const jitter = Math.floor(Math.random() * 200);
87
+ const delay = Math.min(2 ** retries * 50, 2000);
88
+ return delay + jitter;
89
+ }
90
+ }
91
+ } : {});
92
+ subscriber.once("ready", () => {
93
+ subscriberReady = true;
94
+ });
95
+ subscriber.on("error", cause => {
96
+ runSync(Effect.logWarning("NodeRedis subscriber error", cause));
97
+ if (!subscriber.isOpen) {
98
+ runSync(Deferred.fail(terminal, new Redis.RedisError({
99
+ cause
100
+ })));
101
+ }
102
+ });
103
+ try {
104
+ await subscriber.connect();
105
+ await subscriber.subscribe(channel, (message, channel) => {
106
+ onMessage({
107
+ channel,
108
+ message
109
+ });
110
+ });
111
+ return subscriber;
112
+ } catch (cause) {
113
+ if (subscriber.isOpen) subscriber.destroy();
114
+ throw cause;
115
+ }
116
+ },
117
+ catch: cause => new Redis.RedisError({
118
+ cause
119
+ })
120
+ }), subscriber => Effect.sync(() => {
121
+ if (subscriber.isOpen) subscriber.destroy();
122
+ }));
123
+ return Deferred.await(terminal);
73
124
  })
74
125
  });
75
126
  const nodeRedis = Fn.identity({
@@ -1 +1 @@
1
- {"version":3,"file":"NodeRedis.js","names":[],"sources":["../src/NodeRedis.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"NodeRedis.js","names":[],"sources":["../src/NodeRedis.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@effect/platform-node",
3
3
  "type": "module",
4
- "version": "4.0.0-rc.109",
4
+ "version": "4.0.0-rc.111",
5
5
  "license": "MIT",
6
6
  "description": "Platform specific implementations for the Node.js runtime",
7
7
  "homepage": "https://effect.website",
@@ -53,20 +53,20 @@
53
53
  },
54
54
  "dependencies": {
55
55
  "mime": "^4.1.0",
56
- "undici": "^8.7.0",
57
- "@effect/platform-node-shared": "^4.0.0-rc.109"
56
+ "undici": "^8.10.0",
57
+ "@effect/platform-node-shared": "^4.0.0-rc.111"
58
58
  },
59
59
  "peerDependencies": {
60
60
  "redis": ">=5.0.0 <7.0.0",
61
- "effect": "^4.0.0-rc.109"
61
+ "effect": "^4.0.0-rc.111"
62
62
  },
63
63
  "devDependencies": {
64
- "@testcontainers/mysql": "^12.0.4",
65
- "@testcontainers/postgresql": "^12.0.4",
66
- "@testcontainers/redis": "^12.0.4",
67
- "@types/node": "^26.1.2",
64
+ "@testcontainers/mysql": "^12.1.0",
65
+ "@testcontainers/postgresql": "^12.1.0",
66
+ "@testcontainers/redis": "^12.1.0",
67
+ "@types/node": "^26.2.0",
68
68
  "redis": "^6.2.1",
69
- "effect": "^4.0.0-rc.109"
69
+ "effect": "^4.0.0-rc.111"
70
70
  },
71
71
  "scripts": {
72
72
  "codegen": "effect-utils codegen",
package/src/NodeRedis.ts CHANGED
@@ -12,6 +12,7 @@
12
12
  */
13
13
  import * as Config from "effect/Config"
14
14
  import * as Context from "effect/Context"
15
+ import * as Deferred from "effect/Deferred"
15
16
  import * as Effect from "effect/Effect"
16
17
  import * as Fn from "effect/Function"
17
18
  import * as Layer from "effect/Layer"
@@ -87,6 +88,58 @@ const make = Effect.fnUntraced(function*(
87
88
  Effect.tryPromise({
88
89
  try: () => client.sendCommand([command, ...args]) as Promise<A>,
89
90
  catch: (cause) => new Redis.RedisError({ cause })
91
+ }),
92
+ subscribe: (channel, onMessage) =>
93
+ Effect.gen(function*() {
94
+ const terminal = yield* Deferred.make<void, Redis.RedisError>()
95
+ yield* Effect.acquireRelease(
96
+ Effect.tryPromise({
97
+ try: async () => {
98
+ let subscriberReady = false
99
+ const subscriber = client.duplicate(
100
+ socket?.reconnectStrategy === undefined
101
+ ? {
102
+ socket: {
103
+ ...socket,
104
+ reconnectStrategy: (retries, cause) => {
105
+ if (!subscriberReady) return cause
106
+ if (cause instanceof SocketTimeoutError) return false
107
+ const jitter = Math.floor(Math.random() * 200)
108
+ const delay = Math.min(2 ** retries * 50, 2000)
109
+ return delay + jitter
110
+ }
111
+ }
112
+ }
113
+ : {}
114
+ )
115
+ subscriber.once("ready", () => {
116
+ subscriberReady = true
117
+ })
118
+ subscriber.on("error", (cause) => {
119
+ runSync(Effect.logWarning("NodeRedis subscriber error", cause))
120
+ if (!subscriber.isOpen) {
121
+ runSync(Deferred.fail(terminal, new Redis.RedisError({ cause })))
122
+ }
123
+ })
124
+ try {
125
+ await subscriber.connect()
126
+ await subscriber.subscribe(channel, (message, channel) => {
127
+ onMessage({ channel, message })
128
+ })
129
+ return subscriber
130
+ } catch (cause) {
131
+ if (subscriber.isOpen) subscriber.destroy()
132
+ throw cause
133
+ }
134
+ },
135
+ catch: (cause) => new Redis.RedisError({ cause })
136
+ }),
137
+ (subscriber) =>
138
+ Effect.sync(() => {
139
+ if (subscriber.isOpen) subscriber.destroy()
140
+ })
141
+ )
142
+ return Deferred.await(terminal)
90
143
  })
91
144
  })
92
145