@confect/js 10.5.0 → 10.6.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.
- package/CHANGELOG.md +6 -0
- package/dist/HttpClient.d.ts +4 -4
- package/dist/HttpClient.d.ts.map +1 -1
- package/dist/HttpClient.js +4 -4
- package/dist/HttpClient.js.map +1 -1
- package/dist/WebSocketClient.d.ts.map +1 -1
- package/dist/WebSocketClient.js +6 -9
- package/dist/WebSocketClient.js.map +1 -1
- package/dist/_virtual/_rolldown/runtime.js +5 -6
- package/dist/index.d.ts.map +1 -1
- package/package.json +8 -8
- package/src/HttpClient.ts +11 -8
- package/src/WebSocketClient.ts +17 -16
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @confect/js
|
|
2
2
|
|
|
3
|
+
## 10.6.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- e4b4828: Add an optional `{ skipQueue: true }` third argument to `HttpClient.mutation` so independent HTTP mutations can bypass the client's default queue. Mutations remain queued when the option is omitted or false.
|
|
8
|
+
|
|
3
9
|
## 10.5.0
|
|
4
10
|
|
|
5
11
|
No changes in this release.
|
package/dist/HttpClient.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as Ref from "@confect/core/Ref";
|
|
2
|
-
import { ConvexHttpClient } from "convex/browser";
|
|
2
|
+
import { ConvexHttpClient, type HttpMutationOptions } from "convex/browser";
|
|
3
3
|
import * as Context from "effect/Context";
|
|
4
4
|
import * as Effect from "effect/Effect";
|
|
5
5
|
import * as Layer from "effect/Layer";
|
|
@@ -19,14 +19,14 @@ export declare const HttpClient: Context.Service<{
|
|
|
19
19
|
setAuth: (token: string) => Effect.Effect<void, never, never>;
|
|
20
20
|
clearAuth: Effect.Effect<void, never, never>;
|
|
21
21
|
query: <Query extends Ref.AnyPublicQuery>(ref: Query, ...rest: Ref.OptionalArgs<Query>) => Effect.Effect<Ref.Returns<Query>, Ref.Error<Query> | HttpClientError | Schema.SchemaError>;
|
|
22
|
-
mutation: <Mutation extends Ref.AnyPublicMutation>(ref: Mutation, ...rest: Ref.OptionalArgs<Mutation
|
|
22
|
+
mutation: <Mutation extends Ref.AnyPublicMutation>(ref: Mutation, ...rest: [...Ref.OptionalArgs<Mutation>, options?: HttpMutationOptions]) => Effect.Effect<Ref.Returns<Mutation>, Ref.Error<Mutation> | HttpClientError | Schema.SchemaError>;
|
|
23
23
|
action: <Action extends Ref.AnyPublicAction>(ref: Action, ...rest: Ref.OptionalArgs<Action>) => Effect.Effect<Ref.Returns<Action>, Ref.Error<Action> | HttpClientError | Schema.SchemaError>;
|
|
24
24
|
}, {
|
|
25
25
|
url: string;
|
|
26
26
|
setAuth: (token: string) => Effect.Effect<void, never, never>;
|
|
27
27
|
clearAuth: Effect.Effect<void, never, never>;
|
|
28
28
|
query: <Query extends Ref.AnyPublicQuery>(ref: Query, ...rest: Ref.OptionalArgs<Query>) => Effect.Effect<Ref.Returns<Query>, Ref.Error<Query> | HttpClientError | Schema.SchemaError>;
|
|
29
|
-
mutation: <Mutation extends Ref.AnyPublicMutation>(ref: Mutation, ...rest: Ref.OptionalArgs<Mutation
|
|
29
|
+
mutation: <Mutation extends Ref.AnyPublicMutation>(ref: Mutation, ...rest: [...Ref.OptionalArgs<Mutation>, options?: HttpMutationOptions]) => Effect.Effect<Ref.Returns<Mutation>, Ref.Error<Mutation> | HttpClientError | Schema.SchemaError>;
|
|
30
30
|
action: <Action extends Ref.AnyPublicAction>(ref: Action, ...rest: Ref.OptionalArgs<Action>) => Effect.Effect<Ref.Returns<Action>, Ref.Error<Action> | HttpClientError | Schema.SchemaError>;
|
|
31
31
|
}>;
|
|
32
32
|
export type HttpClient = typeof HttpClient.Identifier;
|
|
@@ -35,7 +35,7 @@ export declare const layer: (address: string, options?: ConstructorParameters<ty
|
|
|
35
35
|
setAuth: (token: string) => Effect.Effect<void, never, never>;
|
|
36
36
|
clearAuth: Effect.Effect<void, never, never>;
|
|
37
37
|
query: <Query extends Ref.AnyPublicQuery>(ref: Query, ...rest: Ref.OptionalArgs<Query>) => Effect.Effect<Ref.Returns<Query>, Ref.Error<Query> | HttpClientError | Schema.SchemaError>;
|
|
38
|
-
mutation: <Mutation extends Ref.AnyPublicMutation>(ref: Mutation, ...rest: Ref.OptionalArgs<Mutation
|
|
38
|
+
mutation: <Mutation extends Ref.AnyPublicMutation>(ref: Mutation, ...rest: [...Ref.OptionalArgs<Mutation>, options?: HttpMutationOptions]) => Effect.Effect<Ref.Returns<Mutation>, Ref.Error<Mutation> | HttpClientError | Schema.SchemaError>;
|
|
39
39
|
action: <Action extends Ref.AnyPublicAction>(ref: Action, ...rest: Ref.OptionalArgs<Action>) => Effect.Effect<Ref.Returns<Action>, Ref.Error<Action> | HttpClientError | Schema.SchemaError>;
|
|
40
40
|
}, never, never>;
|
|
41
41
|
export {};
|
package/dist/HttpClient.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HttpClient.d.ts","
|
|
1
|
+
{"version":3,"file":"HttpClient.d.ts","sources":["../src/HttpClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;;;;AAExC,qBAAa,eAAgB,SAAQ,oBAKpC;CAAG;AAoGJ;;;;GAIG;AACH,eAAO,MAAM,UAAU;;qBAtFG,MAAM;;YAWf,KAAK,SAAS,GAAG,CAAC,cAAc,OACxC,KAAK,WACD,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,KAC/B,MAAM,CAAC,MAAM,CACd,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,EAClB,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,eAAe,GAAG,MAAM,CAAC,WAAW,CACxD;eAaiB,QAAQ,SAAS,GAAG,CAAC,iBAAiB,OACjD,QAAQ,WACJ,CAAC,GAAG,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,KACtE,MAAM,CAAC,MAAM,CACd,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EACrB,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,eAAe,GAAG,MAAM,CAAC,WAAW,CAC3D;aAgBe,MAAM,SAAS,GAAG,CAAC,eAAe,OAC3C,MAAM,WACF,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,KAChC,MAAM,CAAC,MAAM,CACd,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EACnB,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,eAAe,GAAG,MAAM,CAAC,WAAW,CACzD;;;;;;;;EA8BiE,CAAC;AAErE,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,UAAU,CAAC;AAEtD,eAAO,MAAM,KAAK,YACP,MAAM,YACL,qBAAqB,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC;;qBA9FnC,MAAM;;YAWf,KAAK,SAAS,GAAG,CAAC,cAAc,OACxC,KAAK,WACD,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,KAC/B,MAAM,CAAC,MAAM,CACd,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,EAClB,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,eAAe,GAAG,MAAM,CAAC,WAAW,CACxD;eAaiB,QAAQ,SAAS,GAAG,CAAC,iBAAiB,OACjD,QAAQ,WACJ,CAAC,GAAG,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,KACtE,MAAM,CAAC,MAAM,CACd,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EACrB,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,eAAe,GAAG,MAAM,CAAC,WAAW,CAC3D;aAgBe,MAAM,SAAS,GAAG,CAAC,eAAe,OAC3C,MAAM,WACF,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,KAChC,MAAM,CAAC,MAAM,CACd,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EACnB,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,eAAe,GAAG,MAAM,CAAC,WAAW,CACzD;gBAqCsD,CAAC"}
|
package/dist/HttpClient.js
CHANGED
|
@@ -5,7 +5,7 @@ import * as Layer from "effect/Layer";
|
|
|
5
5
|
import * as Ref from "@confect/core/Ref";
|
|
6
6
|
import * as Effect from "effect/Effect";
|
|
7
7
|
import * as Schema from "effect/Schema";
|
|
8
|
-
|
|
8
|
+
// src/HttpClient.ts
|
|
9
9
|
var HttpClient_exports = /* @__PURE__ */ __exportAll({
|
|
10
10
|
HttpClient: () => HttpClient,
|
|
11
11
|
HttpClientError: () => HttpClientError,
|
|
@@ -23,14 +23,15 @@ const make = (address, options) => {
|
|
|
23
23
|
const clearAuth = Effect.sync(() => {
|
|
24
24
|
client.clearAuth();
|
|
25
25
|
});
|
|
26
|
-
const mapUnknownError = (cause) =>
|
|
26
|
+
const mapUnknownError = (cause) => HttpClientError.make({ cause });
|
|
27
27
|
const query = (ref, ...rest) => {
|
|
28
28
|
const args = rest[0] ?? {};
|
|
29
29
|
return runQuery(Ref.runWithCodec(ref, args, (functionReference, encodedArgs) => client.query(functionReference, encodedArgs), mapUnknownError));
|
|
30
30
|
};
|
|
31
31
|
const mutation = (ref, ...rest) => {
|
|
32
32
|
const args = rest[0] ?? {};
|
|
33
|
-
|
|
33
|
+
const mutationOptions = rest[1] ?? { skipQueue: false };
|
|
34
|
+
return runMutation(Ref.runWithCodec(ref, args, (functionReference, encodedArgs) => client.mutation(functionReference, encodedArgs, mutationOptions), mapUnknownError));
|
|
34
35
|
};
|
|
35
36
|
const action = (ref, ...rest) => {
|
|
36
37
|
const args = rest[0] ?? {};
|
|
@@ -52,7 +53,6 @@ const make = (address, options) => {
|
|
|
52
53
|
*/
|
|
53
54
|
const HttpClient = Context.Service("@confect/js/HttpClient");
|
|
54
55
|
const layer = (address, options) => Layer.sync(HttpClient, () => make(address, options));
|
|
55
|
-
//#endregion
|
|
56
56
|
export { HttpClient, HttpClientError, HttpClient_exports, layer };
|
|
57
57
|
|
|
58
58
|
//# sourceMappingURL=HttpClient.js.map
|
package/dist/HttpClient.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HttpClient.js","names":[],"sources":["../src/HttpClient.ts"],"sourcesContent":["import * as Ref from \"@confect/core/Ref\";\nimport { ConvexHttpClient } from \"convex/browser\";\nimport * as Context from \"effect/Context\";\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport * as Schema from \"effect/Schema\";\n\nexport class HttpClientError extends Schema.TaggedError<HttpClientError>()(\n \"HttpClientError\",\n {\n cause: Schema.Unknown,\n },\n) {}\n\nconst runQuery = Effect.fn(\"HttpClient.query\")(\n <A, E>(effect: Effect.Effect<A, E>): Effect.Effect<A, E> => effect,\n);\n\nconst runMutation = Effect.fn(\"HttpClient.mutation\")(\n <A, E>(effect: Effect.Effect<A, E>): Effect.Effect<A, E> => effect,\n);\n\nconst runAction = Effect.fn(\"HttpClient.action\")(\n <A, E>(effect: Effect.Effect<A, E>): Effect.Effect<A, E> => effect,\n);\n\nconst make = (\n address: string,\n options?: ConstructorParameters<typeof ConvexHttpClient>[1],\n) => {\n const client = new ConvexHttpClient(address, options);\n const setAuth = (token: string) =>\n Effect.sync(() => {\n client.setAuth(token);\n });\n\n const clearAuth = Effect.sync(() => {\n client.clearAuth();\n });\n\n const mapUnknownError = (cause: unknown) =>
|
|
1
|
+
{"version":3,"file":"HttpClient.js","names":[],"sources":["../src/HttpClient.ts"],"sourcesContent":["import * as Ref from \"@confect/core/Ref\";\nimport { ConvexHttpClient, type HttpMutationOptions } from \"convex/browser\";\nimport * as Context from \"effect/Context\";\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport * as Schema from \"effect/Schema\";\n\nexport class HttpClientError extends Schema.TaggedError<HttpClientError, {}>()(\n \"HttpClientError\",\n {\n cause: Schema.Unknown,\n },\n) {}\n\nconst runQuery = Effect.fn(\"HttpClient.query\")(\n <A, E>(effect: Effect.Effect<A, E>): Effect.Effect<A, E> => effect,\n);\n\nconst runMutation = Effect.fn(\"HttpClient.mutation\")(\n <A, E>(effect: Effect.Effect<A, E>): Effect.Effect<A, E> => effect,\n);\n\nconst runAction = Effect.fn(\"HttpClient.action\")(\n <A, E>(effect: Effect.Effect<A, E>): Effect.Effect<A, E> => effect,\n);\n\nconst make = (\n address: string,\n options?: ConstructorParameters<typeof ConvexHttpClient>[1],\n) => {\n const client = new ConvexHttpClient(address, options);\n const setAuth = (token: string) =>\n Effect.sync(() => {\n client.setAuth(token);\n });\n\n const clearAuth = Effect.sync(() => {\n client.clearAuth();\n });\n\n const mapUnknownError = (cause: unknown) => HttpClientError.make({ cause });\n\n const query = <Query extends Ref.AnyPublicQuery>(\n ref: Query,\n ...rest: Ref.OptionalArgs<Query>\n ): Effect.Effect<\n Ref.Returns<Query>,\n Ref.Error<Query> | HttpClientError | Schema.SchemaError\n > => {\n const args = (rest[0] ?? {}) as Ref.Args<Query>;\n return runQuery(\n Ref.runWithCodec(\n ref,\n args,\n (functionReference, encodedArgs) =>\n client.query(functionReference, encodedArgs),\n mapUnknownError,\n ),\n );\n };\n\n const mutation = <Mutation extends Ref.AnyPublicMutation>(\n ref: Mutation,\n ...rest: [...Ref.OptionalArgs<Mutation>, options?: HttpMutationOptions]\n ): Effect.Effect<\n Ref.Returns<Mutation>,\n Ref.Error<Mutation> | HttpClientError | Schema.SchemaError\n > => {\n const args = (rest[0] ?? {}) as Ref.Args<Mutation>;\n const mutationOptions: HttpMutationOptions = rest[1] ?? {\n skipQueue: false,\n };\n return runMutation(\n Ref.runWithCodec(\n ref,\n args,\n (functionReference, encodedArgs) =>\n client.mutation(functionReference, encodedArgs, mutationOptions),\n mapUnknownError,\n ),\n );\n };\n\n const action = <Action extends Ref.AnyPublicAction>(\n ref: Action,\n ...rest: Ref.OptionalArgs<Action>\n ): Effect.Effect<\n Ref.Returns<Action>,\n Ref.Error<Action> | HttpClientError | Schema.SchemaError\n > => {\n const args = (rest[0] ?? {}) as Ref.Args<Action>;\n return runAction(\n Ref.runWithCodec(\n ref,\n args,\n (functionReference, encodedArgs) =>\n client.action(functionReference, encodedArgs),\n mapUnknownError,\n ),\n );\n };\n\n return {\n url: client.url,\n setAuth,\n clearAuth,\n query,\n mutation,\n action,\n };\n};\n\n/**\n * A Confect client which uses HTTP to communicate with your Convex backend.\n * Works in any JS runtime that supports `fetch`. Wraps\n * [ConvexHttpClient](https://docs.convex.dev/api/classes/browser.ConvexHttpClient).\n */\nexport const HttpClient =\n // oxlint-disable-next-line effecttsgo/service-not-as-class -- Preserve the public structural Identifier and Effect requirement types; class identifiers would change those contracts.\n Context.Service<ReturnType<typeof make>>(\"@confect/js/HttpClient\");\n\nexport type HttpClient = typeof HttpClient.Identifier;\n\nexport const layer = (\n address: string,\n options?: ConstructorParameters<typeof ConvexHttpClient>[1],\n) => Layer.sync(HttpClient, () => make(address, options));\n"],"mappings":";;;;;;;;;;;;;AAOA,IAAa,kBAAb,cAAqC,OAAO,YAAiC,CAAC,CAC5E,mBACA,EACE,OAAO,OAAO,QAChB,CACF,CAAC,CAAC,CAAC;AAEH,MAAM,WAAW,OAAO,GAAG,kBAAkB,CAAC,EACrC,WAAqD,MAC9D;AAEA,MAAM,cAAc,OAAO,GAAG,qBAAqB,CAAC,EAC3C,WAAqD,MAC9D;AAEA,MAAM,YAAY,OAAO,GAAG,mBAAmB,CAAC,EACvC,WAAqD,MAC9D;AAEA,MAAM,QACJ,SACA,YACG;CACH,MAAM,SAAS,IAAI,iBAAiB,SAAS,OAAO;CACpD,MAAM,WAAW,UACf,OAAO,WAAW;EAChB,OAAO,QAAQ,KAAK;CACtB,CAAC;CAEH,MAAM,YAAY,OAAO,WAAW;EAClC,OAAO,UAAU;CACnB,CAAC;CAED,MAAM,mBAAmB,UAAmB,gBAAgB,KAAK,EAAE,MAAM,CAAC;CAE1E,MAAM,SACJ,KACA,GAAG,SAIA;EACH,MAAM,OAAQ,KAAK,MAAM,CAAC;EAC1B,OAAO,SACL,IAAI,aACF,KACA,OACC,mBAAmB,gBAClB,OAAO,MAAM,mBAAmB,WAAW,GAC7C,eACF,CACF;CACF;CAEA,MAAM,YACJ,KACA,GAAG,SAIA;EACH,MAAM,OAAQ,KAAK,MAAM,CAAC;EAC1B,MAAM,kBAAuC,KAAK,MAAM,EACtD,WAAW,MACb;EACA,OAAO,YACL,IAAI,aACF,KACA,OACC,mBAAmB,gBAClB,OAAO,SAAS,mBAAmB,aAAa,eAAe,GACjE,eACF,CACF;CACF;CAEA,MAAM,UACJ,KACA,GAAG,SAIA;EACH,MAAM,OAAQ,KAAK,MAAM,CAAC;EAC1B,OAAO,UACL,IAAI,aACF,KACA,OACC,mBAAmB,gBAClB,OAAO,OAAO,mBAAmB,WAAW,GAC9C,eACF,CACF;CACF;CAEA,OAAO;EACL,KAAK,OAAO;EACZ;EACA;EACA;EACA;EACA;CACF;AACF;;;;;;AAOA,MAAa,aAEX,QAAQ,QAAiC,wBAAwB;AAInE,MAAa,SACX,SACA,YACG,MAAM,KAAK,kBAAkB,KAAK,SAAS,OAAO,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebSocketClient.d.ts","
|
|
1
|
+
{"version":3,"file":"WebSocketClient.d.ts","sources":["../src/WebSocketClient.ts"],"names":[],"mappings":"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"}
|
package/dist/WebSocketClient.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { __exportAll } from "./_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { ConvexClient } from "convex/browser";
|
|
3
3
|
import * as Context from "effect/Context";
|
|
4
|
+
import { pipe } from "effect/Function";
|
|
4
5
|
import * as Layer from "effect/Layer";
|
|
5
6
|
import * as Ref from "@confect/core/Ref";
|
|
6
7
|
import * as Effect from "effect/Effect";
|
|
@@ -8,7 +9,7 @@ import * as Queue from "effect/Queue";
|
|
|
8
9
|
import * as Result from "effect/Result";
|
|
9
10
|
import * as Schema from "effect/Schema";
|
|
10
11
|
import * as Stream from "effect/Stream";
|
|
11
|
-
|
|
12
|
+
// src/WebSocketClient.ts
|
|
12
13
|
var WebSocketClient_exports = /* @__PURE__ */ __exportAll({
|
|
13
14
|
WebSocketClient: () => WebSocketClient,
|
|
14
15
|
WebSocketClientError: () => WebSocketClientError,
|
|
@@ -24,11 +25,11 @@ const make = (address, options) => Effect.gen(function* () {
|
|
|
24
25
|
const context = yield* Effect.context();
|
|
25
26
|
const runPromise = Effect.runPromiseWith(context);
|
|
26
27
|
const runFork = Effect.runForkWith(context);
|
|
27
|
-
convexClient.setAuth((args) => runPromise(Effect.suspend(() => fetchToken(args))), ...onChange ? [(isAuthenticated) => {
|
|
28
|
+
convexClient.setAuth((args) => runPromise(Effect.suspend(() => fetchToken(args))), ...onChange !== void 0 ? [(isAuthenticated) => {
|
|
28
29
|
runFork(Effect.suspend(() => onChange(isAuthenticated)));
|
|
29
30
|
}] : []);
|
|
30
31
|
});
|
|
31
|
-
const mapUnknownError = (cause) =>
|
|
32
|
+
const mapUnknownError = (cause) => WebSocketClientError.make({ cause });
|
|
32
33
|
const query = (ref, ...rest) => {
|
|
33
34
|
const args = rest[0] ?? {};
|
|
34
35
|
return runQuery(Ref.runWithCodec(ref, args, (functionReference, encodedArgs) => convexClient.query(functionReference, encodedArgs), mapUnknownError));
|
|
@@ -46,7 +47,7 @@ const make = (address, options) => Effect.gen(function* () {
|
|
|
46
47
|
const functionReference = Ref.getFunctionReference(ref);
|
|
47
48
|
const onError = Ref.decodeErrorOrElse(ref, mapUnknownError);
|
|
48
49
|
return Stream.unwrap(Effect.match(Ref.encodeArgs(ref, args), {
|
|
49
|
-
onFailure: (error) =>
|
|
50
|
+
onFailure: (error) => pipe(error, Result.fail, Stream.succeed),
|
|
50
51
|
onSuccess: (encodedArgs) => Stream.callback((queue) => Effect.gen(function* () {
|
|
51
52
|
const unsubscribe = convexClient.onUpdate(functionReference, encodedArgs, (result) => {
|
|
52
53
|
Queue.offerUnsafe(queue, Result.succeed(result));
|
|
@@ -57,10 +58,7 @@ const make = (address, options) => Effect.gen(function* () {
|
|
|
57
58
|
}))
|
|
58
59
|
})).pipe(Stream.mapEffect((result) => Result.match(result, {
|
|
59
60
|
onFailure: (error) => Effect.succeed(Result.fail(error)),
|
|
60
|
-
onSuccess: (encodedReturns) =>
|
|
61
|
-
onFailure: Result.fail,
|
|
62
|
-
onSuccess: Result.succeed
|
|
63
|
-
})
|
|
61
|
+
onSuccess: (encodedReturns) => Ref.decodeReturns(ref, encodedReturns).pipe(Effect.result)
|
|
64
62
|
})));
|
|
65
63
|
};
|
|
66
64
|
const reactiveQuery = (ref, ...rest) => reactiveQueryResult(ref, ...rest).pipe(Stream.mapEffect(Result.match({
|
|
@@ -86,7 +84,6 @@ const make = (address, options) => Effect.gen(function* () {
|
|
|
86
84
|
*/
|
|
87
85
|
const WebSocketClient = Context.Service("@confect/js/WebSocketClient");
|
|
88
86
|
const layer = (address, options) => Layer.effect(WebSocketClient, make(address, options));
|
|
89
|
-
//#endregion
|
|
90
87
|
export { WebSocketClient, WebSocketClientError, WebSocketClient_exports, layer };
|
|
91
88
|
|
|
92
89
|
//# sourceMappingURL=WebSocketClient.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebSocketClient.js","names":[],"sources":["../src/WebSocketClient.ts"],"sourcesContent":["import { ConvexClient } from \"convex/browser\";\nimport * as Context from \"effect/Context\";\nimport * as Layer from \"effect/Layer\";\nimport * as Ref from \"@confect/core/Ref\";\nimport * as Effect from \"effect/Effect\";\nimport * as Queue from \"effect/Queue\";\nimport * as Result from \"effect/Result\";\nimport * as Schema from \"effect/Schema\";\nimport * as Stream from \"effect/Stream\";\n\nexport class WebSocketClientError extends Schema.TaggedError
|
|
1
|
+
{"version":3,"file":"WebSocketClient.js","names":[],"sources":["../src/WebSocketClient.ts"],"sourcesContent":["import { ConvexClient } from \"convex/browser\";\nimport * as Context from \"effect/Context\";\nimport { pipe } from \"effect/Function\";\nimport * as Layer from \"effect/Layer\";\nimport * as Ref from \"@confect/core/Ref\";\nimport * as Effect from \"effect/Effect\";\nimport * as Queue from \"effect/Queue\";\nimport * as Result from \"effect/Result\";\nimport * as Schema from \"effect/Schema\";\nimport * as Stream from \"effect/Stream\";\n\nexport class WebSocketClientError extends Schema.TaggedError<\n WebSocketClientError,\n {}\n>()(\"WebSocketClientError\", {\n cause: Schema.Defect(),\n}) {}\n\nconst runQuery = Effect.fn(\"WebSocketClient.query\")(\n <A, E>(effect: Effect.Effect<A, E>): Effect.Effect<A, E> => effect,\n);\n\nconst runMutation = Effect.fn(\"WebSocketClient.mutation\")(\n <A, E>(effect: Effect.Effect<A, E>): Effect.Effect<A, E> => effect,\n);\n\nconst runAction = Effect.fn(\"WebSocketClient.action\")(\n <A, E>(effect: Effect.Effect<A, E>): Effect.Effect<A, E> => effect,\n);\n\nconst make = (\n address: string,\n options?: ConstructorParameters<typeof ConvexClient>[1],\n) =>\n Effect.gen(function* () {\n const convexClient = yield* Effect.acquireRelease(\n Effect.sync(() => new ConvexClient(address, options)),\n (client) => Effect.promise(() => client.close()),\n );\n const setAuth = <R1 = never, R2 = never>(\n fetchToken: (args: {\n forceRefreshToken: boolean;\n }) => Effect.Effect<string | null | undefined, never, R1>,\n onChange?: (isAuthenticated: boolean) => Effect.Effect<void, never, R2>,\n ): Effect.Effect<void, never, R1 | R2> =>\n Effect.gen(function* () {\n const context = yield* Effect.context<R1 | R2>();\n const runPromise = Effect.runPromiseWith(context);\n const runFork = Effect.runForkWith(context);\n convexClient.setAuth(\n (args) => runPromise(Effect.suspend(() => fetchToken(args))),\n ...(onChange !== undefined\n ? [\n (isAuthenticated: boolean) => {\n runFork(Effect.suspend(() => onChange(isAuthenticated)));\n },\n ]\n : []),\n );\n });\n\n const mapUnknownError = (cause: unknown) =>\n WebSocketClientError.make({ cause });\n\n const query = <Query extends Ref.AnyPublicQuery>(\n ref: Query,\n ...rest: Ref.OptionalArgs<Query>\n ): Effect.Effect<\n Ref.Returns<Query>,\n Ref.Error<Query> | WebSocketClientError | Schema.SchemaError\n > => {\n const args = (rest[0] ?? {}) as Ref.Args<Query>;\n return runQuery(\n Ref.runWithCodec(\n ref,\n args,\n (functionReference, encodedArgs) =>\n convexClient.query(functionReference, encodedArgs),\n mapUnknownError,\n ),\n );\n };\n\n const mutation = <Mutation extends Ref.AnyPublicMutation>(\n ref: Mutation,\n ...rest: Ref.OptionalArgs<Mutation>\n ): Effect.Effect<\n Ref.Returns<Mutation>,\n Ref.Error<Mutation> | WebSocketClientError | Schema.SchemaError\n > => {\n const args = (rest[0] ?? {}) as Ref.Args<Mutation>;\n return runMutation(\n Ref.runWithCodec(\n ref,\n args,\n (functionReference, encodedArgs) =>\n convexClient.mutation(functionReference, encodedArgs),\n mapUnknownError,\n ),\n );\n };\n\n const action = <Action extends Ref.AnyPublicAction>(\n ref: Action,\n ...rest: Ref.OptionalArgs<Action>\n ): Effect.Effect<\n Ref.Returns<Action>,\n Ref.Error<Action> | WebSocketClientError | Schema.SchemaError\n > => {\n const args = (rest[0] ?? {}) as Ref.Args<Action>;\n return runAction(\n Ref.runWithCodec(\n ref,\n args,\n (functionReference, encodedArgs) =>\n convexClient.action(functionReference, encodedArgs),\n mapUnknownError,\n ),\n );\n };\n\n type ReactiveQueryError<Query extends Ref.AnyPublicQuery> =\n | Ref.Error<Query>\n | WebSocketClientError\n | Schema.SchemaError;\n\n const reactiveQueryResult = <Query extends Ref.AnyPublicQuery>(\n ref: Query,\n ...rest: Ref.OptionalArgs<Query>\n ): Stream.Stream<\n Result.Result<Ref.Returns<Query>, ReactiveQueryError<Query>>\n > => {\n type QueryResult = Result.Result<\n Ref.Returns<Query>,\n ReactiveQueryError<Query>\n >;\n const args = (rest[0] ?? {}) as Ref.Args<Query>;\n const functionReference = Ref.getFunctionReference(ref);\n const onError = Ref.decodeErrorOrElse(ref, mapUnknownError);\n\n return Stream.unwrap(\n Effect.match(Ref.encodeArgs(ref, args), {\n onFailure: (error) =>\n pipe(error, Result.fail, Stream.succeed<QueryResult>),\n onSuccess: (encodedArgs) =>\n Stream.callback<Result.Result<unknown, ReactiveQueryError<Query>>>(\n (queue) =>\n Effect.gen(function* () {\n const unsubscribe = convexClient.onUpdate(\n functionReference,\n encodedArgs,\n (result) => {\n Queue.offerUnsafe(queue, Result.succeed(result));\n },\n (error) => {\n Queue.offerUnsafe(queue, Result.fail(onError(error)));\n },\n );\n yield* Effect.addFinalizer(() =>\n Effect.sync(() => unsubscribe()),\n );\n }),\n ),\n }),\n ).pipe(\n Stream.mapEffect((result): Effect.Effect<QueryResult> =>\n Result.match(result, {\n onFailure: (error) => Effect.succeed(Result.fail(error)),\n onSuccess: (encodedReturns) =>\n Ref.decodeReturns(ref, encodedReturns).pipe(Effect.result),\n }),\n ),\n );\n };\n\n const reactiveQuery = <Query extends Ref.AnyPublicQuery>(\n ref: Query,\n ...rest: Ref.OptionalArgs<Query>\n ): Stream.Stream<Ref.Returns<Query>, ReactiveQueryError<Query>> =>\n reactiveQueryResult(ref, ...rest).pipe(\n Stream.mapEffect(\n Result.match({\n onFailure: Effect.fail,\n onSuccess: Effect.succeed,\n }),\n ),\n );\n\n return {\n url: address,\n setAuth,\n query,\n mutation,\n action,\n reactiveQuery,\n reactiveQueryResult,\n };\n });\n\n/**\n * A Confect client which uses a WebSocket to communicate with your Convex\n * backend and supports reactive query subscriptions. The WebSocket connection\n * is managed by the layer's scope and closed automatically when the scope ends.\n * Wraps\n * [ConvexClient](https://docs.convex.dev/api/classes/browser.ConvexClient).\n */\nexport const WebSocketClient =\n // oxlint-disable-next-line effecttsgo/service-not-as-class -- Preserve the public structural Identifier and Effect requirement types; class identifiers would change those contracts.\n Context.Service<Effect.Success<ReturnType<typeof make>>>(\n \"@confect/js/WebSocketClient\",\n );\n\nexport type WebSocketClient = typeof WebSocketClient.Identifier;\n\nexport const layer = (\n address: string,\n options?: ConstructorParameters<typeof ConvexClient>[1],\n) => Layer.effect(WebSocketClient, make(address, options));\n"],"mappings":"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"}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
// \0rolldown/runtime.js
|
|
2
2
|
var __defProp = Object.defineProperty;
|
|
3
|
-
var __exportAll = (all,
|
|
4
|
-
let target = {};
|
|
3
|
+
var __exportAll = (all, flags) => {
|
|
4
|
+
let target = Object.setPrototypeOf({}, null);
|
|
5
5
|
for (var name in all) __defProp(target, name, {
|
|
6
6
|
get: all[name],
|
|
7
7
|
enumerable: true
|
|
8
8
|
});
|
|
9
|
-
if (!
|
|
10
|
-
return target;
|
|
9
|
+
if (!(flags & 1)) __defProp(target, Symbol.toStringTag, { value: "Module" });
|
|
10
|
+
return flags & 2 ? target : Object.preventExtensions(target);
|
|
11
11
|
};
|
|
12
|
-
//#endregion
|
|
13
12
|
export { __exportAll };
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","
|
|
1
|
+
{"version":3,"file":"index.d.ts","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,eAAe,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,UAAU,MAAM,cAAc,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@confect/js",
|
|
3
3
|
"description": "JavaScript client bindings for any JS runtime",
|
|
4
|
-
"version": "10.
|
|
4
|
+
"version": "10.6.0",
|
|
5
5
|
"author": "RJ Dellecese",
|
|
6
6
|
"bugs": {
|
|
7
7
|
"url": "https://github.com/rjdellecese/confect/issues"
|
|
8
8
|
},
|
|
9
9
|
"devDependencies": {
|
|
10
10
|
"@effect/vitest": "4.1.0",
|
|
11
|
-
"@types/node": "26.6.
|
|
11
|
+
"@types/node": "26.6.6",
|
|
12
12
|
"confect-local-backend": "0.0.0",
|
|
13
13
|
"effect": "4.1.0",
|
|
14
|
-
"tsdown": "0.23.
|
|
15
|
-
"
|
|
14
|
+
"tsdown": "0.23.7",
|
|
15
|
+
"tsrs": "0.23.0-ts7.1.0-beta",
|
|
16
16
|
"unrun": "0.3.1",
|
|
17
|
-
"vitest": "5.0
|
|
17
|
+
"vitest": "5.1.0"
|
|
18
18
|
},
|
|
19
19
|
"engines": {
|
|
20
20
|
"node": ">=24"
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"main": "./dist/index.js",
|
|
49
49
|
"module": "./dist/index.js",
|
|
50
50
|
"peerDependencies": {
|
|
51
|
-
"@confect/core": "^10.
|
|
51
|
+
"@confect/core": "^10.6.0",
|
|
52
52
|
"convex": "^1.32.0",
|
|
53
53
|
"effect": "^4.0.0"
|
|
54
54
|
},
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
"dev": "tsdown --watch --no-clean --config-loader unrun",
|
|
65
65
|
"test": "vitest run",
|
|
66
66
|
"test:local-backend": "vitest run --config vitest.local-backend.config.ts",
|
|
67
|
-
"typecheck": "
|
|
68
|
-
"typecheck:inexact": "
|
|
67
|
+
"typecheck": "tsrs -b tsconfig.src.json",
|
|
68
|
+
"typecheck:inexact": "tsrs --noEmit --project tsconfig.json --exactOptionalPropertyTypes false"
|
|
69
69
|
}
|
|
70
70
|
}
|
package/src/HttpClient.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import * as Ref from "@confect/core/Ref";
|
|
2
|
-
import { ConvexHttpClient } from "convex/browser";
|
|
2
|
+
import { ConvexHttpClient, type HttpMutationOptions } from "convex/browser";
|
|
3
3
|
import * as Context from "effect/Context";
|
|
4
4
|
import * as Effect from "effect/Effect";
|
|
5
5
|
import * as Layer from "effect/Layer";
|
|
6
6
|
import * as Schema from "effect/Schema";
|
|
7
7
|
|
|
8
|
-
export class HttpClientError extends Schema.TaggedError<HttpClientError>()(
|
|
8
|
+
export class HttpClientError extends Schema.TaggedError<HttpClientError, {}>()(
|
|
9
9
|
"HttpClientError",
|
|
10
10
|
{
|
|
11
11
|
cause: Schema.Unknown,
|
|
@@ -38,7 +38,7 @@ const make = (
|
|
|
38
38
|
client.clearAuth();
|
|
39
39
|
});
|
|
40
40
|
|
|
41
|
-
const mapUnknownError = (cause: unknown) =>
|
|
41
|
+
const mapUnknownError = (cause: unknown) => HttpClientError.make({ cause });
|
|
42
42
|
|
|
43
43
|
const query = <Query extends Ref.AnyPublicQuery>(
|
|
44
44
|
ref: Query,
|
|
@@ -61,18 +61,21 @@ const make = (
|
|
|
61
61
|
|
|
62
62
|
const mutation = <Mutation extends Ref.AnyPublicMutation>(
|
|
63
63
|
ref: Mutation,
|
|
64
|
-
...rest: Ref.OptionalArgs<Mutation
|
|
64
|
+
...rest: [...Ref.OptionalArgs<Mutation>, options?: HttpMutationOptions]
|
|
65
65
|
): Effect.Effect<
|
|
66
66
|
Ref.Returns<Mutation>,
|
|
67
67
|
Ref.Error<Mutation> | HttpClientError | Schema.SchemaError
|
|
68
68
|
> => {
|
|
69
69
|
const args = (rest[0] ?? {}) as Ref.Args<Mutation>;
|
|
70
|
+
const mutationOptions: HttpMutationOptions = rest[1] ?? {
|
|
71
|
+
skipQueue: false,
|
|
72
|
+
};
|
|
70
73
|
return runMutation(
|
|
71
74
|
Ref.runWithCodec(
|
|
72
75
|
ref,
|
|
73
76
|
args,
|
|
74
77
|
(functionReference, encodedArgs) =>
|
|
75
|
-
client.mutation(functionReference, encodedArgs),
|
|
78
|
+
client.mutation(functionReference, encodedArgs, mutationOptions),
|
|
76
79
|
mapUnknownError,
|
|
77
80
|
),
|
|
78
81
|
);
|
|
@@ -112,9 +115,9 @@ const make = (
|
|
|
112
115
|
* Works in any JS runtime that supports `fetch`. Wraps
|
|
113
116
|
* [ConvexHttpClient](https://docs.convex.dev/api/classes/browser.ConvexHttpClient).
|
|
114
117
|
*/
|
|
115
|
-
export const HttpClient =
|
|
116
|
-
|
|
117
|
-
);
|
|
118
|
+
export const HttpClient =
|
|
119
|
+
// oxlint-disable-next-line effecttsgo/service-not-as-class -- Preserve the public structural Identifier and Effect requirement types; class identifiers would change those contracts.
|
|
120
|
+
Context.Service<ReturnType<typeof make>>("@confect/js/HttpClient");
|
|
118
121
|
|
|
119
122
|
export type HttpClient = typeof HttpClient.Identifier;
|
|
120
123
|
|
package/src/WebSocketClient.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ConvexClient } from "convex/browser";
|
|
2
2
|
import * as Context from "effect/Context";
|
|
3
|
+
import { pipe } from "effect/Function";
|
|
3
4
|
import * as Layer from "effect/Layer";
|
|
4
5
|
import * as Ref from "@confect/core/Ref";
|
|
5
6
|
import * as Effect from "effect/Effect";
|
|
@@ -8,12 +9,12 @@ import * as Result from "effect/Result";
|
|
|
8
9
|
import * as Schema from "effect/Schema";
|
|
9
10
|
import * as Stream from "effect/Stream";
|
|
10
11
|
|
|
11
|
-
export class WebSocketClientError extends Schema.TaggedError<
|
|
12
|
-
|
|
13
|
-
{
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
) {}
|
|
12
|
+
export class WebSocketClientError extends Schema.TaggedError<
|
|
13
|
+
WebSocketClientError,
|
|
14
|
+
{}
|
|
15
|
+
>()("WebSocketClientError", {
|
|
16
|
+
cause: Schema.Defect(),
|
|
17
|
+
}) {}
|
|
17
18
|
|
|
18
19
|
const runQuery = Effect.fn("WebSocketClient.query")(
|
|
19
20
|
<A, E>(effect: Effect.Effect<A, E>): Effect.Effect<A, E> => effect,
|
|
@@ -48,7 +49,7 @@ const make = (
|
|
|
48
49
|
const runFork = Effect.runForkWith(context);
|
|
49
50
|
convexClient.setAuth(
|
|
50
51
|
(args) => runPromise(Effect.suspend(() => fetchToken(args))),
|
|
51
|
-
...(onChange
|
|
52
|
+
...(onChange !== undefined
|
|
52
53
|
? [
|
|
53
54
|
(isAuthenticated: boolean) => {
|
|
54
55
|
runFork(Effect.suspend(() => onChange(isAuthenticated)));
|
|
@@ -59,7 +60,7 @@ const make = (
|
|
|
59
60
|
});
|
|
60
61
|
|
|
61
62
|
const mapUnknownError = (cause: unknown) =>
|
|
62
|
-
|
|
63
|
+
WebSocketClientError.make({ cause });
|
|
63
64
|
|
|
64
65
|
const query = <Query extends Ref.AnyPublicQuery>(
|
|
65
66
|
ref: Query,
|
|
@@ -139,7 +140,8 @@ const make = (
|
|
|
139
140
|
|
|
140
141
|
return Stream.unwrap(
|
|
141
142
|
Effect.match(Ref.encodeArgs(ref, args), {
|
|
142
|
-
onFailure: (error) =>
|
|
143
|
+
onFailure: (error) =>
|
|
144
|
+
pipe(error, Result.fail, Stream.succeed<QueryResult>),
|
|
143
145
|
onSuccess: (encodedArgs) =>
|
|
144
146
|
Stream.callback<Result.Result<unknown, ReactiveQueryError<Query>>>(
|
|
145
147
|
(queue) =>
|
|
@@ -165,10 +167,7 @@ const make = (
|
|
|
165
167
|
Result.match(result, {
|
|
166
168
|
onFailure: (error) => Effect.succeed(Result.fail(error)),
|
|
167
169
|
onSuccess: (encodedReturns) =>
|
|
168
|
-
|
|
169
|
-
onFailure: Result.fail,
|
|
170
|
-
onSuccess: Result.succeed,
|
|
171
|
-
}),
|
|
170
|
+
Ref.decodeReturns(ref, encodedReturns).pipe(Effect.result),
|
|
172
171
|
}),
|
|
173
172
|
),
|
|
174
173
|
);
|
|
@@ -205,9 +204,11 @@ const make = (
|
|
|
205
204
|
* Wraps
|
|
206
205
|
* [ConvexClient](https://docs.convex.dev/api/classes/browser.ConvexClient).
|
|
207
206
|
*/
|
|
208
|
-
export const WebSocketClient =
|
|
209
|
-
Effect.
|
|
210
|
-
|
|
207
|
+
export const WebSocketClient =
|
|
208
|
+
// oxlint-disable-next-line effecttsgo/service-not-as-class -- Preserve the public structural Identifier and Effect requirement types; class identifiers would change those contracts.
|
|
209
|
+
Context.Service<Effect.Success<ReturnType<typeof make>>>(
|
|
210
|
+
"@confect/js/WebSocketClient",
|
|
211
|
+
);
|
|
211
212
|
|
|
212
213
|
export type WebSocketClient = typeof WebSocketClient.Identifier;
|
|
213
214
|
|