@confect/js 10.3.1 → 10.4.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 +8 -0
- package/dist/HttpClient.d.ts +24 -17
- package/dist/HttpClient.d.ts.map +1 -1
- package/dist/HttpClient.js +33 -8
- package/dist/HttpClient.js.map +1 -1
- package/dist/WebSocketClient.d.ts +26 -18
- package/dist/WebSocketClient.d.ts.map +1 -1
- package/dist/WebSocketClient.js +67 -11
- package/dist/WebSocketClient.js.map +1 -1
- package/package.json +4 -2
- package/src/HttpClient.ts +96 -12
- package/src/WebSocketClient.ts +190 -29
- package/dist/internal/HttpClient.d.ts +0 -26
- package/dist/internal/HttpClient.d.ts.map +0 -1
- package/dist/internal/HttpClient.js +0 -41
- package/dist/internal/HttpClient.js.map +0 -1
- package/dist/internal/WebSocketClient.d.ts +0 -44
- package/dist/internal/WebSocketClient.d.ts.map +0 -1
- package/dist/internal/WebSocketClient.js +0 -74
- package/dist/internal/WebSocketClient.js.map +0 -1
- package/src/internal/HttpClient.ts +0 -119
- package/src/internal/WebSocketClient.ts +0 -224
package/CHANGELOG.md
CHANGED
package/dist/HttpClient.d.ts
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
|
+
import * as Ref from "@confect/core/Ref";
|
|
1
2
|
import { ConvexHttpClient } from "convex/browser";
|
|
2
3
|
import * as Context from "effect/Context";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
3
5
|
import * as Layer from "effect/Layer";
|
|
4
|
-
import * as
|
|
5
|
-
|
|
6
|
+
import * as Schema from "effect/Schema";
|
|
7
|
+
declare const HttpClientError_base: Schema.Class<HttpClientError, Schema.TaggedStruct<"HttpClientError", {
|
|
8
|
+
readonly cause: Schema.Unknown;
|
|
9
|
+
}>, import("effect/Cause").YieldableError>;
|
|
10
|
+
export declare class HttpClientError extends HttpClientError_base {
|
|
11
|
+
}
|
|
6
12
|
/**
|
|
7
13
|
* A Confect client which uses HTTP to communicate with your Convex backend.
|
|
8
14
|
* Works in any JS runtime that supports `fetch`. Wraps
|
|
@@ -10,26 +16,27 @@ export { HttpClientError } from "./internal/HttpClient";
|
|
|
10
16
|
*/
|
|
11
17
|
export declare const HttpClient: Context.Service<{
|
|
12
18
|
url: string;
|
|
13
|
-
setAuth: (token: string) =>
|
|
14
|
-
clearAuth:
|
|
15
|
-
query: <Query extends
|
|
16
|
-
mutation: <Mutation extends
|
|
17
|
-
action: <Action extends
|
|
19
|
+
setAuth: (token: string) => Effect.Effect<void, never, never>;
|
|
20
|
+
clearAuth: Effect.Effect<void, never, never>;
|
|
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>) => Effect.Effect<Ref.Returns<Mutation>, Ref.Error<Mutation> | HttpClientError | Schema.SchemaError>;
|
|
23
|
+
action: <Action extends Ref.AnyPublicAction>(ref: Action, ...rest: Ref.OptionalArgs<Action>) => Effect.Effect<Ref.Returns<Action>, Ref.Error<Action> | HttpClientError | Schema.SchemaError>;
|
|
18
24
|
}, {
|
|
19
25
|
url: string;
|
|
20
|
-
setAuth: (token: string) =>
|
|
21
|
-
clearAuth:
|
|
22
|
-
query: <Query extends
|
|
23
|
-
mutation: <Mutation extends
|
|
24
|
-
action: <Action extends
|
|
26
|
+
setAuth: (token: string) => Effect.Effect<void, never, never>;
|
|
27
|
+
clearAuth: Effect.Effect<void, never, never>;
|
|
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>) => Effect.Effect<Ref.Returns<Mutation>, Ref.Error<Mutation> | HttpClientError | Schema.SchemaError>;
|
|
30
|
+
action: <Action extends Ref.AnyPublicAction>(ref: Action, ...rest: Ref.OptionalArgs<Action>) => Effect.Effect<Ref.Returns<Action>, Ref.Error<Action> | HttpClientError | Schema.SchemaError>;
|
|
25
31
|
}>;
|
|
26
32
|
export type HttpClient = typeof HttpClient.Identifier;
|
|
27
33
|
export declare const layer: (address: string, options?: ConstructorParameters<typeof ConvexHttpClient>[1]) => Layer.Layer<{
|
|
28
34
|
url: string;
|
|
29
|
-
setAuth: (token: string) =>
|
|
30
|
-
clearAuth:
|
|
31
|
-
query: <Query extends
|
|
32
|
-
mutation: <Mutation extends
|
|
33
|
-
action: <Action extends
|
|
35
|
+
setAuth: (token: string) => Effect.Effect<void, never, never>;
|
|
36
|
+
clearAuth: Effect.Effect<void, never, never>;
|
|
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>) => Effect.Effect<Ref.Returns<Mutation>, Ref.Error<Mutation> | HttpClientError | Schema.SchemaError>;
|
|
39
|
+
action: <Action extends Ref.AnyPublicAction>(ref: Action, ...rest: Ref.OptionalArgs<Action>) => Effect.Effect<Ref.Returns<Action>, Ref.Error<Action> | HttpClientError | Schema.SchemaError>;
|
|
34
40
|
}, never, never>;
|
|
41
|
+
export {};
|
|
35
42
|
//# sourceMappingURL=HttpClient.d.ts.map
|
package/dist/HttpClient.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HttpClient.d.ts","sourceRoot":"","sources":["../src/HttpClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"HttpClient.d.ts","sourceRoot":"","sources":["../src/HttpClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,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;AAiGJ;;;;GAIG;AACH,eAAO,MAAM,UAAU;;qBAnFG,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,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,KAClC,MAAM,CAAC,MAAM,CACd,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EACrB,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,eAAe,GAAG,MAAM,CAAC,WAAW,CAC3D;aAae,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;;;;;;;;EA8BF,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,UAAU,CAAC;AAEtD,eAAO,MAAM,KAAK,YACP,MAAM,YACL,qBAAqB,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC;;qBA3FnC,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,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,KAClC,MAAM,CAAC,MAAM,CACd,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EACrB,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,eAAe,GAAG,MAAM,CAAC,WAAW,CAC3D;aAae,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
|
@@ -1,24 +1,49 @@
|
|
|
1
1
|
import { __exportAll } from "./_virtual/_rolldown/runtime.js";
|
|
2
|
-
import { HttpClientError, make as make$1 } from "./internal/HttpClient.js";
|
|
3
2
|
import { ConvexHttpClient } from "convex/browser";
|
|
4
3
|
import * as Context from "effect/Context";
|
|
5
4
|
import * as Layer from "effect/Layer";
|
|
5
|
+
import * as Ref from "@confect/core/Ref";
|
|
6
|
+
import * as Effect from "effect/Effect";
|
|
7
|
+
import * as Schema from "effect/Schema";
|
|
6
8
|
//#region src/HttpClient.ts
|
|
7
9
|
var HttpClient_exports = /* @__PURE__ */ __exportAll({
|
|
8
10
|
HttpClient: () => HttpClient,
|
|
9
11
|
HttpClientError: () => HttpClientError,
|
|
10
12
|
layer: () => layer
|
|
11
13
|
});
|
|
14
|
+
var HttpClientError = class extends Schema.TaggedError()("HttpClientError", { cause: Schema.Unknown }) {};
|
|
15
|
+
const runQuery = Effect.fn("HttpClient.query")((effect) => effect);
|
|
16
|
+
const runMutation = Effect.fn("HttpClient.mutation")((effect) => effect);
|
|
17
|
+
const runAction = Effect.fn("HttpClient.action")((effect) => effect);
|
|
12
18
|
const make = (address, options) => {
|
|
13
19
|
const client = new ConvexHttpClient(address, options);
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
mutation: (functionReference, encodedArgs) => client.mutation(functionReference, encodedArgs),
|
|
20
|
-
action: (functionReference, encodedArgs) => client.action(functionReference, encodedArgs)
|
|
20
|
+
const setAuth = (token) => Effect.sync(() => {
|
|
21
|
+
client.setAuth(token);
|
|
22
|
+
});
|
|
23
|
+
const clearAuth = Effect.sync(() => {
|
|
24
|
+
client.clearAuth();
|
|
21
25
|
});
|
|
26
|
+
const mapUnknownError = (cause) => new HttpClientError({ cause });
|
|
27
|
+
const query = (ref, ...rest) => {
|
|
28
|
+
const args = rest[0] ?? {};
|
|
29
|
+
return runQuery(Ref.runWithCodec(ref, args, (functionReference, encodedArgs) => client.query(functionReference, encodedArgs), mapUnknownError));
|
|
30
|
+
};
|
|
31
|
+
const mutation = (ref, ...rest) => {
|
|
32
|
+
const args = rest[0] ?? {};
|
|
33
|
+
return runMutation(Ref.runWithCodec(ref, args, (functionReference, encodedArgs) => client.mutation(functionReference, encodedArgs), mapUnknownError));
|
|
34
|
+
};
|
|
35
|
+
const action = (ref, ...rest) => {
|
|
36
|
+
const args = rest[0] ?? {};
|
|
37
|
+
return runAction(Ref.runWithCodec(ref, args, (functionReference, encodedArgs) => client.action(functionReference, encodedArgs), mapUnknownError));
|
|
38
|
+
};
|
|
39
|
+
return {
|
|
40
|
+
url: client.url,
|
|
41
|
+
setAuth,
|
|
42
|
+
clearAuth,
|
|
43
|
+
query,
|
|
44
|
+
mutation,
|
|
45
|
+
action
|
|
46
|
+
};
|
|
22
47
|
};
|
|
23
48
|
/**
|
|
24
49
|
* A Confect client which uses HTTP to communicate with your Convex backend.
|
package/dist/HttpClient.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HttpClient.js","names":[
|
|
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) => new HttpClientError({ 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>\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 return runMutation(\n Ref.runWithCodec(\n ref,\n args,\n (functionReference, encodedArgs) =>\n client.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> | 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 = Context.Service<ReturnType<typeof make>>(\n \"@confect/js/HttpClient\",\n);\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,YAA6B,CAAC,CACxE,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,IAAI,gBAAgB,EAAE,MAAM,CAAC;CAEzE,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,OAAO,YACL,IAAI,aACF,KACA,OACC,mBAAmB,gBAClB,OAAO,SAAS,mBAAmB,WAAW,GAChD,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,aAAa,QAAQ,QAChC,wBACF;AAIA,MAAa,SACX,SACA,YACG,MAAM,KAAK,kBAAkB,KAAK,SAAS,OAAO,CAAC"}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import { ConvexClient } from "convex/browser";
|
|
2
2
|
import * as Context from "effect/Context";
|
|
3
|
-
import * as Effect from "effect/Effect";
|
|
4
3
|
import * as Layer from "effect/Layer";
|
|
5
|
-
import * as
|
|
6
|
-
|
|
4
|
+
import * as Ref from "@confect/core/Ref";
|
|
5
|
+
import * as Effect from "effect/Effect";
|
|
6
|
+
import * as Result from "effect/Result";
|
|
7
|
+
import * as Schema from "effect/Schema";
|
|
8
|
+
import * as Stream from "effect/Stream";
|
|
9
|
+
declare const WebSocketClientError_base: Schema.Class<WebSocketClientError, Schema.TaggedStruct<"WebSocketClientError", {
|
|
10
|
+
readonly cause: Schema.Defect;
|
|
11
|
+
}>, import("effect/Cause").YieldableError>;
|
|
12
|
+
export declare class WebSocketClientError extends WebSocketClientError_base {
|
|
13
|
+
}
|
|
7
14
|
/**
|
|
8
15
|
* A Confect client which uses a WebSocket to communicate with your Convex
|
|
9
16
|
* backend and supports reactive query subscriptions. The WebSocket connection
|
|
@@ -16,21 +23,21 @@ export declare const WebSocketClient: Context.Service<{
|
|
|
16
23
|
setAuth: <R1 = never, R2 = never>(fetchToken: (args: {
|
|
17
24
|
forceRefreshToken: boolean;
|
|
18
25
|
}) => Effect.Effect<string | null | undefined, never, R1>, onChange?: (isAuthenticated: boolean) => Effect.Effect<void, never, R2>) => Effect.Effect<void, never, R1 | R2>;
|
|
19
|
-
query: <Query extends
|
|
20
|
-
mutation: <Mutation extends
|
|
21
|
-
action: <Action extends
|
|
22
|
-
reactiveQuery: <Query extends
|
|
23
|
-
reactiveQueryResult: <Query extends
|
|
26
|
+
query: <Query extends Ref.AnyPublicQuery>(ref: Query, ...rest: Ref.OptionalArgs<Query>) => Effect.Effect<Ref.Returns<Query>, Ref.Error<Query> | WebSocketClientError | Schema.SchemaError>;
|
|
27
|
+
mutation: <Mutation extends Ref.AnyPublicMutation>(ref: Mutation, ...rest: Ref.OptionalArgs<Mutation>) => Effect.Effect<Ref.Returns<Mutation>, Ref.Error<Mutation> | WebSocketClientError | Schema.SchemaError>;
|
|
28
|
+
action: <Action extends Ref.AnyPublicAction>(ref: Action, ...rest: Ref.OptionalArgs<Action>) => Effect.Effect<Ref.Returns<Action>, Ref.Error<Action> | WebSocketClientError | Schema.SchemaError>;
|
|
29
|
+
reactiveQuery: <Query extends Ref.AnyPublicQuery>(ref: Query, ...rest: Ref.OptionalArgs<Query>) => Stream.Stream<Ref.Returns<Query>, Schema.SchemaError | WebSocketClientError | Ref.Error<Query>>;
|
|
30
|
+
reactiveQueryResult: <Query extends Ref.AnyPublicQuery>(ref: Query, ...rest: Ref.OptionalArgs<Query>) => Stream.Stream<Result.Result<Ref.Returns<Query>, Schema.SchemaError | WebSocketClientError | Ref.Error<Query>>>;
|
|
24
31
|
}, {
|
|
25
32
|
url: string;
|
|
26
33
|
setAuth: <R1 = never, R2 = never>(fetchToken: (args: {
|
|
27
34
|
forceRefreshToken: boolean;
|
|
28
35
|
}) => Effect.Effect<string | null | undefined, never, R1>, onChange?: (isAuthenticated: boolean) => Effect.Effect<void, never, R2>) => Effect.Effect<void, never, R1 | R2>;
|
|
29
|
-
query: <Query extends
|
|
30
|
-
mutation: <Mutation extends
|
|
31
|
-
action: <Action extends
|
|
32
|
-
reactiveQuery: <Query extends
|
|
33
|
-
reactiveQueryResult: <Query extends
|
|
36
|
+
query: <Query extends Ref.AnyPublicQuery>(ref: Query, ...rest: Ref.OptionalArgs<Query>) => Effect.Effect<Ref.Returns<Query>, Ref.Error<Query> | WebSocketClientError | Schema.SchemaError>;
|
|
37
|
+
mutation: <Mutation extends Ref.AnyPublicMutation>(ref: Mutation, ...rest: Ref.OptionalArgs<Mutation>) => Effect.Effect<Ref.Returns<Mutation>, Ref.Error<Mutation> | WebSocketClientError | Schema.SchemaError>;
|
|
38
|
+
action: <Action extends Ref.AnyPublicAction>(ref: Action, ...rest: Ref.OptionalArgs<Action>) => Effect.Effect<Ref.Returns<Action>, Ref.Error<Action> | WebSocketClientError | Schema.SchemaError>;
|
|
39
|
+
reactiveQuery: <Query extends Ref.AnyPublicQuery>(ref: Query, ...rest: Ref.OptionalArgs<Query>) => Stream.Stream<Ref.Returns<Query>, Schema.SchemaError | WebSocketClientError | Ref.Error<Query>>;
|
|
40
|
+
reactiveQueryResult: <Query extends Ref.AnyPublicQuery>(ref: Query, ...rest: Ref.OptionalArgs<Query>) => Stream.Stream<Result.Result<Ref.Returns<Query>, Schema.SchemaError | WebSocketClientError | Ref.Error<Query>>>;
|
|
34
41
|
}>;
|
|
35
42
|
export type WebSocketClient = typeof WebSocketClient.Identifier;
|
|
36
43
|
export declare const layer: (address: string, options?: ConstructorParameters<typeof ConvexClient>[1]) => Layer.Layer<{
|
|
@@ -38,10 +45,11 @@ export declare const layer: (address: string, options?: ConstructorParameters<ty
|
|
|
38
45
|
setAuth: <R1 = never, R2 = never>(fetchToken: (args: {
|
|
39
46
|
forceRefreshToken: boolean;
|
|
40
47
|
}) => Effect.Effect<string | null | undefined, never, R1>, onChange?: (isAuthenticated: boolean) => Effect.Effect<void, never, R2>) => Effect.Effect<void, never, R1 | R2>;
|
|
41
|
-
query: <Query extends
|
|
42
|
-
mutation: <Mutation extends
|
|
43
|
-
action: <Action extends
|
|
44
|
-
reactiveQuery: <Query extends
|
|
45
|
-
reactiveQueryResult: <Query extends
|
|
48
|
+
query: <Query extends Ref.AnyPublicQuery>(ref: Query, ...rest: Ref.OptionalArgs<Query>) => Effect.Effect<Ref.Returns<Query>, Ref.Error<Query> | WebSocketClientError | Schema.SchemaError>;
|
|
49
|
+
mutation: <Mutation extends Ref.AnyPublicMutation>(ref: Mutation, ...rest: Ref.OptionalArgs<Mutation>) => Effect.Effect<Ref.Returns<Mutation>, Ref.Error<Mutation> | WebSocketClientError | Schema.SchemaError>;
|
|
50
|
+
action: <Action extends Ref.AnyPublicAction>(ref: Action, ...rest: Ref.OptionalArgs<Action>) => Effect.Effect<Ref.Returns<Action>, Ref.Error<Action> | WebSocketClientError | Schema.SchemaError>;
|
|
51
|
+
reactiveQuery: <Query extends Ref.AnyPublicQuery>(ref: Query, ...rest: Ref.OptionalArgs<Query>) => Stream.Stream<Ref.Returns<Query>, Schema.SchemaError | WebSocketClientError | Ref.Error<Query>>;
|
|
52
|
+
reactiveQueryResult: <Query extends Ref.AnyPublicQuery>(ref: Query, ...rest: Ref.OptionalArgs<Query>) => Stream.Stream<Result.Result<Ref.Returns<Query>, Schema.SchemaError | WebSocketClientError | Ref.Error<Query>>>;
|
|
46
53
|
}, never, never>;
|
|
54
|
+
export {};
|
|
47
55
|
//# sourceMappingURL=WebSocketClient.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebSocketClient.d.ts","sourceRoot":"","sources":["../src/WebSocketClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"WebSocketClient.d.ts","sourceRoot":"","sources":["../src/WebSocketClient.ts"],"names":[],"mappings":"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"}
|
package/dist/WebSocketClient.js
CHANGED
|
@@ -1,26 +1,82 @@
|
|
|
1
1
|
import { __exportAll } from "./_virtual/_rolldown/runtime.js";
|
|
2
|
-
import { WebSocketClientError, makeScoped } from "./internal/WebSocketClient.js";
|
|
3
2
|
import { ConvexClient } from "convex/browser";
|
|
4
3
|
import * as Context from "effect/Context";
|
|
5
|
-
import * as Effect from "effect/Effect";
|
|
6
4
|
import * as Layer from "effect/Layer";
|
|
5
|
+
import * as Ref from "@confect/core/Ref";
|
|
6
|
+
import * as Effect from "effect/Effect";
|
|
7
|
+
import * as Queue from "effect/Queue";
|
|
8
|
+
import * as Result from "effect/Result";
|
|
9
|
+
import * as Schema from "effect/Schema";
|
|
10
|
+
import * as Stream from "effect/Stream";
|
|
7
11
|
//#region src/WebSocketClient.ts
|
|
8
12
|
var WebSocketClient_exports = /* @__PURE__ */ __exportAll({
|
|
9
13
|
WebSocketClient: () => WebSocketClient,
|
|
10
14
|
WebSocketClientError: () => WebSocketClientError,
|
|
11
15
|
layer: () => layer
|
|
12
16
|
});
|
|
13
|
-
|
|
14
|
-
|
|
17
|
+
var WebSocketClientError = class extends Schema.TaggedError()("WebSocketClientError", { cause: Schema.Defect() }) {};
|
|
18
|
+
const runQuery = Effect.fn("WebSocketClient.query")((effect) => effect);
|
|
19
|
+
const runMutation = Effect.fn("WebSocketClient.mutation")((effect) => effect);
|
|
20
|
+
const runAction = Effect.fn("WebSocketClient.action")((effect) => effect);
|
|
21
|
+
const make = (address, options) => Effect.gen(function* () {
|
|
22
|
+
const convexClient = yield* Effect.acquireRelease(Effect.sync(() => new ConvexClient(address, options)), (client) => Effect.promise(() => client.close()));
|
|
23
|
+
const setAuth = (fetchToken, onChange) => Effect.gen(function* () {
|
|
24
|
+
const context = yield* Effect.context();
|
|
25
|
+
const runPromise = Effect.runPromiseWith(context);
|
|
26
|
+
const runFork = Effect.runForkWith(context);
|
|
27
|
+
convexClient.setAuth((args) => runPromise(Effect.suspend(() => fetchToken(args))), ...onChange ? [(isAuthenticated) => {
|
|
28
|
+
runFork(Effect.suspend(() => onChange(isAuthenticated)));
|
|
29
|
+
}] : []);
|
|
30
|
+
});
|
|
31
|
+
const mapUnknownError = (cause) => new WebSocketClientError({ cause });
|
|
32
|
+
const query = (ref, ...rest) => {
|
|
33
|
+
const args = rest[0] ?? {};
|
|
34
|
+
return runQuery(Ref.runWithCodec(ref, args, (functionReference, encodedArgs) => convexClient.query(functionReference, encodedArgs), mapUnknownError));
|
|
35
|
+
};
|
|
36
|
+
const mutation = (ref, ...rest) => {
|
|
37
|
+
const args = rest[0] ?? {};
|
|
38
|
+
return runMutation(Ref.runWithCodec(ref, args, (functionReference, encodedArgs) => convexClient.mutation(functionReference, encodedArgs), mapUnknownError));
|
|
39
|
+
};
|
|
40
|
+
const action = (ref, ...rest) => {
|
|
41
|
+
const args = rest[0] ?? {};
|
|
42
|
+
return runAction(Ref.runWithCodec(ref, args, (functionReference, encodedArgs) => convexClient.action(functionReference, encodedArgs), mapUnknownError));
|
|
43
|
+
};
|
|
44
|
+
const reactiveQueryResult = (ref, ...rest) => {
|
|
45
|
+
const args = rest[0] ?? {};
|
|
46
|
+
const functionReference = Ref.getFunctionReference(ref);
|
|
47
|
+
const onError = Ref.decodeErrorOrElse(ref, mapUnknownError);
|
|
48
|
+
return Stream.unwrap(Effect.match(Ref.encodeArgs(ref, args), {
|
|
49
|
+
onFailure: (error) => Stream.succeed(Result.fail(error)),
|
|
50
|
+
onSuccess: (encodedArgs) => Stream.callback((queue) => Effect.gen(function* () {
|
|
51
|
+
const unsubscribe = convexClient.onUpdate(functionReference, encodedArgs, (result) => {
|
|
52
|
+
Queue.offerUnsafe(queue, Result.succeed(result));
|
|
53
|
+
}, (error) => {
|
|
54
|
+
Queue.offerUnsafe(queue, Result.fail(onError(error)));
|
|
55
|
+
});
|
|
56
|
+
yield* Effect.addFinalizer(() => Effect.sync(() => unsubscribe()));
|
|
57
|
+
}))
|
|
58
|
+
})).pipe(Stream.mapEffect((result) => Result.match(result, {
|
|
59
|
+
onFailure: (error) => Effect.succeed(Result.fail(error)),
|
|
60
|
+
onSuccess: (encodedReturns) => Effect.match(Ref.decodeReturns(ref, encodedReturns), {
|
|
61
|
+
onFailure: Result.fail,
|
|
62
|
+
onSuccess: Result.succeed
|
|
63
|
+
})
|
|
64
|
+
})));
|
|
65
|
+
};
|
|
66
|
+
const reactiveQuery = (ref, ...rest) => reactiveQueryResult(ref, ...rest).pipe(Stream.mapEffect(Result.match({
|
|
67
|
+
onFailure: Effect.fail,
|
|
68
|
+
onSuccess: Effect.succeed
|
|
69
|
+
})));
|
|
15
70
|
return {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
query
|
|
19
|
-
mutation
|
|
20
|
-
action
|
|
21
|
-
|
|
71
|
+
url: address,
|
|
72
|
+
setAuth,
|
|
73
|
+
query,
|
|
74
|
+
mutation,
|
|
75
|
+
action,
|
|
76
|
+
reactiveQuery,
|
|
77
|
+
reactiveQueryResult
|
|
22
78
|
};
|
|
23
|
-
})
|
|
79
|
+
});
|
|
24
80
|
/**
|
|
25
81
|
* A Confect client which uses a WebSocket to communicate with your Convex
|
|
26
82
|
* backend and supports reactive query subscriptions. The WebSocket connection
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebSocketClient.js","names":[
|
|
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<WebSocketClientError>()(\n \"WebSocketClientError\",\n {\n cause: Schema.Defect(),\n },\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\n ? [\n (isAuthenticated: boolean) => {\n runFork(Effect.suspend(() => onChange(isAuthenticated)));\n },\n ]\n : []),\n );\n });\n\n const mapUnknownError = (cause: unknown) =>\n new WebSocketClientError({ 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) => Stream.succeed<QueryResult>(Result.fail(error)),\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 Effect.match(Ref.decodeReturns(ref, encodedReturns), {\n onFailure: Result.fail,\n onSuccess: Result.succeed,\n }),\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 = Context.Service<\n Effect.Success<ReturnType<typeof make>>\n>(\"@confect/js/WebSocketClient\");\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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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@confect/js",
|
|
3
3
|
"description": "JavaScript client bindings for any JS runtime",
|
|
4
|
-
"version": "10.
|
|
4
|
+
"version": "10.4.0",
|
|
5
5
|
"author": "RJ Dellecese",
|
|
6
6
|
"bugs": {
|
|
7
7
|
"url": "https://github.com/rjdellecese/confect/issues"
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"devDependencies": {
|
|
10
10
|
"@effect/vitest": "4.0.4",
|
|
11
11
|
"@types/node": "26.6.5",
|
|
12
|
+
"confect-local-backend": "0.0.0",
|
|
12
13
|
"effect": "4.0.4",
|
|
13
14
|
"tsdown": "0.23.1",
|
|
14
15
|
"typescript": "7.0.2",
|
|
@@ -47,7 +48,7 @@
|
|
|
47
48
|
"main": "./dist/index.js",
|
|
48
49
|
"module": "./dist/index.js",
|
|
49
50
|
"peerDependencies": {
|
|
50
|
-
"@confect/core": "^10.
|
|
51
|
+
"@confect/core": "^10.4.0",
|
|
51
52
|
"convex": "^1.32.0",
|
|
52
53
|
"effect": "^4.0.0"
|
|
53
54
|
},
|
|
@@ -62,6 +63,7 @@
|
|
|
62
63
|
"clean": "shx rm -rf dist coverage node_modules",
|
|
63
64
|
"dev": "tsdown --watch --no-clean --config-loader unrun",
|
|
64
65
|
"test": "vitest run",
|
|
66
|
+
"test:local-backend": "vitest run --config vitest.local-backend.config.ts",
|
|
65
67
|
"typecheck": "tsc -b tsconfig.src.json",
|
|
66
68
|
"typecheck:inexact": "tsc --noEmit --project tsconfig.json --exactOptionalPropertyTypes false"
|
|
67
69
|
}
|
package/src/HttpClient.ts
CHANGED
|
@@ -1,26 +1,110 @@
|
|
|
1
|
+
import * as Ref from "@confect/core/Ref";
|
|
1
2
|
import { ConvexHttpClient } from "convex/browser";
|
|
2
3
|
import * as Context from "effect/Context";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
3
5
|
import * as Layer from "effect/Layer";
|
|
4
|
-
import * as
|
|
6
|
+
import * as Schema from "effect/Schema";
|
|
5
7
|
|
|
6
|
-
export
|
|
8
|
+
export class HttpClientError extends Schema.TaggedError<HttpClientError>()(
|
|
9
|
+
"HttpClientError",
|
|
10
|
+
{
|
|
11
|
+
cause: Schema.Unknown,
|
|
12
|
+
},
|
|
13
|
+
) {}
|
|
14
|
+
|
|
15
|
+
const runQuery = Effect.fn("HttpClient.query")(
|
|
16
|
+
<A, E>(effect: Effect.Effect<A, E>): Effect.Effect<A, E> => effect,
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
const runMutation = Effect.fn("HttpClient.mutation")(
|
|
20
|
+
<A, E>(effect: Effect.Effect<A, E>): Effect.Effect<A, E> => effect,
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
const runAction = Effect.fn("HttpClient.action")(
|
|
24
|
+
<A, E>(effect: Effect.Effect<A, E>): Effect.Effect<A, E> => effect,
|
|
25
|
+
);
|
|
7
26
|
|
|
8
27
|
const make = (
|
|
9
28
|
address: string,
|
|
10
29
|
options?: ConstructorParameters<typeof ConvexHttpClient>[1],
|
|
11
30
|
) => {
|
|
12
31
|
const client = new ConvexHttpClient(address, options);
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
client.mutation(functionReference, encodedArgs),
|
|
21
|
-
action: (functionReference, encodedArgs) =>
|
|
22
|
-
client.action(functionReference, encodedArgs),
|
|
32
|
+
const setAuth = (token: string) =>
|
|
33
|
+
Effect.sync(() => {
|
|
34
|
+
client.setAuth(token);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
const clearAuth = Effect.sync(() => {
|
|
38
|
+
client.clearAuth();
|
|
23
39
|
});
|
|
40
|
+
|
|
41
|
+
const mapUnknownError = (cause: unknown) => new HttpClientError({ cause });
|
|
42
|
+
|
|
43
|
+
const query = <Query extends Ref.AnyPublicQuery>(
|
|
44
|
+
ref: Query,
|
|
45
|
+
...rest: Ref.OptionalArgs<Query>
|
|
46
|
+
): Effect.Effect<
|
|
47
|
+
Ref.Returns<Query>,
|
|
48
|
+
Ref.Error<Query> | HttpClientError | Schema.SchemaError
|
|
49
|
+
> => {
|
|
50
|
+
const args = (rest[0] ?? {}) as Ref.Args<Query>;
|
|
51
|
+
return runQuery(
|
|
52
|
+
Ref.runWithCodec(
|
|
53
|
+
ref,
|
|
54
|
+
args,
|
|
55
|
+
(functionReference, encodedArgs) =>
|
|
56
|
+
client.query(functionReference, encodedArgs),
|
|
57
|
+
mapUnknownError,
|
|
58
|
+
),
|
|
59
|
+
);
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const mutation = <Mutation extends Ref.AnyPublicMutation>(
|
|
63
|
+
ref: Mutation,
|
|
64
|
+
...rest: Ref.OptionalArgs<Mutation>
|
|
65
|
+
): Effect.Effect<
|
|
66
|
+
Ref.Returns<Mutation>,
|
|
67
|
+
Ref.Error<Mutation> | HttpClientError | Schema.SchemaError
|
|
68
|
+
> => {
|
|
69
|
+
const args = (rest[0] ?? {}) as Ref.Args<Mutation>;
|
|
70
|
+
return runMutation(
|
|
71
|
+
Ref.runWithCodec(
|
|
72
|
+
ref,
|
|
73
|
+
args,
|
|
74
|
+
(functionReference, encodedArgs) =>
|
|
75
|
+
client.mutation(functionReference, encodedArgs),
|
|
76
|
+
mapUnknownError,
|
|
77
|
+
),
|
|
78
|
+
);
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const action = <Action extends Ref.AnyPublicAction>(
|
|
82
|
+
ref: Action,
|
|
83
|
+
...rest: Ref.OptionalArgs<Action>
|
|
84
|
+
): Effect.Effect<
|
|
85
|
+
Ref.Returns<Action>,
|
|
86
|
+
Ref.Error<Action> | HttpClientError | Schema.SchemaError
|
|
87
|
+
> => {
|
|
88
|
+
const args = (rest[0] ?? {}) as Ref.Args<Action>;
|
|
89
|
+
return runAction(
|
|
90
|
+
Ref.runWithCodec(
|
|
91
|
+
ref,
|
|
92
|
+
args,
|
|
93
|
+
(functionReference, encodedArgs) =>
|
|
94
|
+
client.action(functionReference, encodedArgs),
|
|
95
|
+
mapUnknownError,
|
|
96
|
+
),
|
|
97
|
+
);
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
return {
|
|
101
|
+
url: client.url,
|
|
102
|
+
setAuth,
|
|
103
|
+
clearAuth,
|
|
104
|
+
query,
|
|
105
|
+
mutation,
|
|
106
|
+
action,
|
|
107
|
+
};
|
|
24
108
|
};
|
|
25
109
|
|
|
26
110
|
/**
|