@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/src/WebSocketClient.ts
CHANGED
|
@@ -1,41 +1,202 @@
|
|
|
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
|
|
4
|
+
import * as Ref from "@confect/core/Ref";
|
|
5
|
+
import * as Effect from "effect/Effect";
|
|
6
|
+
import * as Queue from "effect/Queue";
|
|
7
|
+
import * as Result from "effect/Result";
|
|
8
|
+
import * as Schema from "effect/Schema";
|
|
9
|
+
import * as Stream from "effect/Stream";
|
|
10
|
+
|
|
11
|
+
export class WebSocketClientError extends Schema.TaggedError<WebSocketClientError>()(
|
|
12
|
+
"WebSocketClientError",
|
|
13
|
+
{
|
|
14
|
+
cause: Schema.Defect(),
|
|
15
|
+
},
|
|
16
|
+
) {}
|
|
17
|
+
|
|
18
|
+
const runQuery = Effect.fn("WebSocketClient.query")(
|
|
19
|
+
<A, E>(effect: Effect.Effect<A, E>): Effect.Effect<A, E> => effect,
|
|
20
|
+
);
|
|
6
21
|
|
|
7
|
-
|
|
22
|
+
const runMutation = Effect.fn("WebSocketClient.mutation")(
|
|
23
|
+
<A, E>(effect: Effect.Effect<A, E>): Effect.Effect<A, E> => effect,
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
const runAction = Effect.fn("WebSocketClient.action")(
|
|
27
|
+
<A, E>(effect: Effect.Effect<A, E>): Effect.Effect<A, E> => effect,
|
|
28
|
+
);
|
|
8
29
|
|
|
9
30
|
const make = (
|
|
10
31
|
address: string,
|
|
11
32
|
options?: ConstructorParameters<typeof ConvexClient>[1],
|
|
12
33
|
) =>
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
34
|
+
Effect.gen(function* () {
|
|
35
|
+
const convexClient = yield* Effect.acquireRelease(
|
|
36
|
+
Effect.sync(() => new ConvexClient(address, options)),
|
|
37
|
+
(client) => Effect.promise(() => client.close()),
|
|
38
|
+
);
|
|
39
|
+
const setAuth = <R1 = never, R2 = never>(
|
|
40
|
+
fetchToken: (args: {
|
|
41
|
+
forceRefreshToken: boolean;
|
|
42
|
+
}) => Effect.Effect<string | null | undefined, never, R1>,
|
|
43
|
+
onChange?: (isAuthenticated: boolean) => Effect.Effect<void, never, R2>,
|
|
44
|
+
): Effect.Effect<void, never, R1 | R2> =>
|
|
45
|
+
Effect.gen(function* () {
|
|
46
|
+
const context = yield* Effect.context<R1 | R2>();
|
|
47
|
+
const runPromise = Effect.runPromiseWith(context);
|
|
48
|
+
const runFork = Effect.runForkWith(context);
|
|
49
|
+
convexClient.setAuth(
|
|
50
|
+
(args) => runPromise(Effect.suspend(() => fetchToken(args))),
|
|
51
|
+
...(onChange
|
|
52
|
+
? [
|
|
53
|
+
(isAuthenticated: boolean) => {
|
|
54
|
+
runFork(Effect.suspend(() => onChange(isAuthenticated)));
|
|
55
|
+
},
|
|
56
|
+
]
|
|
57
|
+
: []),
|
|
58
|
+
);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
const mapUnknownError = (cause: unknown) =>
|
|
62
|
+
new WebSocketClientError({ cause });
|
|
63
|
+
|
|
64
|
+
const query = <Query extends Ref.AnyPublicQuery>(
|
|
65
|
+
ref: Query,
|
|
66
|
+
...rest: Ref.OptionalArgs<Query>
|
|
67
|
+
): Effect.Effect<
|
|
68
|
+
Ref.Returns<Query>,
|
|
69
|
+
Ref.Error<Query> | WebSocketClientError | Schema.SchemaError
|
|
70
|
+
> => {
|
|
71
|
+
const args = (rest[0] ?? {}) as Ref.Args<Query>;
|
|
72
|
+
return runQuery(
|
|
73
|
+
Ref.runWithCodec(
|
|
74
|
+
ref,
|
|
75
|
+
args,
|
|
76
|
+
(functionReference, encodedArgs) =>
|
|
77
|
+
convexClient.query(functionReference, encodedArgs),
|
|
78
|
+
mapUnknownError,
|
|
79
|
+
),
|
|
80
|
+
);
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
const mutation = <Mutation extends Ref.AnyPublicMutation>(
|
|
84
|
+
ref: Mutation,
|
|
85
|
+
...rest: Ref.OptionalArgs<Mutation>
|
|
86
|
+
): Effect.Effect<
|
|
87
|
+
Ref.Returns<Mutation>,
|
|
88
|
+
Ref.Error<Mutation> | WebSocketClientError | Schema.SchemaError
|
|
89
|
+
> => {
|
|
90
|
+
const args = (rest[0] ?? {}) as Ref.Args<Mutation>;
|
|
91
|
+
return runMutation(
|
|
92
|
+
Ref.runWithCodec(
|
|
93
|
+
ref,
|
|
94
|
+
args,
|
|
95
|
+
(functionReference, encodedArgs) =>
|
|
96
|
+
convexClient.mutation(functionReference, encodedArgs),
|
|
97
|
+
mapUnknownError,
|
|
98
|
+
),
|
|
99
|
+
);
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
const action = <Action extends Ref.AnyPublicAction>(
|
|
103
|
+
ref: Action,
|
|
104
|
+
...rest: Ref.OptionalArgs<Action>
|
|
105
|
+
): Effect.Effect<
|
|
106
|
+
Ref.Returns<Action>,
|
|
107
|
+
Ref.Error<Action> | WebSocketClientError | Schema.SchemaError
|
|
108
|
+
> => {
|
|
109
|
+
const args = (rest[0] ?? {}) as Ref.Args<Action>;
|
|
110
|
+
return runAction(
|
|
111
|
+
Ref.runWithCodec(
|
|
112
|
+
ref,
|
|
113
|
+
args,
|
|
114
|
+
(functionReference, encodedArgs) =>
|
|
115
|
+
convexClient.action(functionReference, encodedArgs),
|
|
116
|
+
mapUnknownError,
|
|
117
|
+
),
|
|
118
|
+
);
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
type ReactiveQueryError<Query extends Ref.AnyPublicQuery> =
|
|
122
|
+
| Ref.Error<Query>
|
|
123
|
+
| WebSocketClientError
|
|
124
|
+
| Schema.SchemaError;
|
|
125
|
+
|
|
126
|
+
const reactiveQueryResult = <Query extends Ref.AnyPublicQuery>(
|
|
127
|
+
ref: Query,
|
|
128
|
+
...rest: Ref.OptionalArgs<Query>
|
|
129
|
+
): Stream.Stream<
|
|
130
|
+
Result.Result<Ref.Returns<Query>, ReactiveQueryError<Query>>
|
|
131
|
+
> => {
|
|
132
|
+
type QueryResult = Result.Result<
|
|
133
|
+
Ref.Returns<Query>,
|
|
134
|
+
ReactiveQueryError<Query>
|
|
135
|
+
>;
|
|
136
|
+
const args = (rest[0] ?? {}) as Ref.Args<Query>;
|
|
137
|
+
const functionReference = Ref.getFunctionReference(ref);
|
|
138
|
+
const onError = Ref.decodeErrorOrElse(ref, mapUnknownError);
|
|
139
|
+
|
|
140
|
+
return Stream.unwrap(
|
|
141
|
+
Effect.match(Ref.encodeArgs(ref, args), {
|
|
142
|
+
onFailure: (error) => Stream.succeed<QueryResult>(Result.fail(error)),
|
|
143
|
+
onSuccess: (encodedArgs) =>
|
|
144
|
+
Stream.callback<Result.Result<unknown, ReactiveQueryError<Query>>>(
|
|
145
|
+
(queue) =>
|
|
146
|
+
Effect.gen(function* () {
|
|
147
|
+
const unsubscribe = convexClient.onUpdate(
|
|
148
|
+
functionReference,
|
|
149
|
+
encodedArgs,
|
|
150
|
+
(result) => {
|
|
151
|
+
Queue.offerUnsafe(queue, Result.succeed(result));
|
|
152
|
+
},
|
|
153
|
+
(error) => {
|
|
154
|
+
Queue.offerUnsafe(queue, Result.fail(onError(error)));
|
|
155
|
+
},
|
|
156
|
+
);
|
|
157
|
+
yield* Effect.addFinalizer(() =>
|
|
158
|
+
Effect.sync(() => unsubscribe()),
|
|
159
|
+
);
|
|
160
|
+
}),
|
|
161
|
+
),
|
|
162
|
+
}),
|
|
163
|
+
).pipe(
|
|
164
|
+
Stream.mapEffect((result): Effect.Effect<QueryResult> =>
|
|
165
|
+
Result.match(result, {
|
|
166
|
+
onFailure: (error) => Effect.succeed(Result.fail(error)),
|
|
167
|
+
onSuccess: (encodedReturns) =>
|
|
168
|
+
Effect.match(Ref.decodeReturns(ref, encodedReturns), {
|
|
169
|
+
onFailure: Result.fail,
|
|
170
|
+
onSuccess: Result.succeed,
|
|
171
|
+
}),
|
|
172
|
+
}),
|
|
173
|
+
),
|
|
174
|
+
);
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
const reactiveQuery = <Query extends Ref.AnyPublicQuery>(
|
|
178
|
+
ref: Query,
|
|
179
|
+
...rest: Ref.OptionalArgs<Query>
|
|
180
|
+
): Stream.Stream<Ref.Returns<Query>, ReactiveQueryError<Query>> =>
|
|
181
|
+
reactiveQueryResult(ref, ...rest).pipe(
|
|
182
|
+
Stream.mapEffect(
|
|
183
|
+
Result.match({
|
|
184
|
+
onFailure: Effect.fail,
|
|
185
|
+
onSuccess: Effect.succeed,
|
|
186
|
+
}),
|
|
187
|
+
),
|
|
188
|
+
);
|
|
189
|
+
|
|
190
|
+
return {
|
|
191
|
+
url: address,
|
|
192
|
+
setAuth,
|
|
193
|
+
query,
|
|
194
|
+
mutation,
|
|
195
|
+
action,
|
|
196
|
+
reactiveQuery,
|
|
197
|
+
reactiveQueryResult,
|
|
198
|
+
};
|
|
199
|
+
});
|
|
39
200
|
|
|
40
201
|
/**
|
|
41
202
|
* A Confect client which uses a WebSocket to communicate with your Convex
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import * as Ref from "@confect/core/Ref";
|
|
2
|
-
import * as Effect from "effect/Effect";
|
|
3
|
-
import * as Schema from "effect/Schema";
|
|
4
|
-
declare const HttpClientError_base: Schema.Class<HttpClientError, Schema.TaggedStruct<"HttpClientError", {
|
|
5
|
-
readonly cause: Schema.Unknown;
|
|
6
|
-
}>, import("effect/Cause").YieldableError>;
|
|
7
|
-
export declare class HttpClientError extends HttpClientError_base {
|
|
8
|
-
}
|
|
9
|
-
export interface Transport {
|
|
10
|
-
readonly url: string;
|
|
11
|
-
readonly setAuth: (token: string) => void;
|
|
12
|
-
readonly clearAuth: () => void;
|
|
13
|
-
readonly query: (functionReference: Ref.FunctionReference<Ref.AnyPublicQuery>, encodedArgs: unknown) => PromiseLike<unknown>;
|
|
14
|
-
readonly mutation: (functionReference: Ref.FunctionReference<Ref.AnyPublicMutation>, encodedArgs: unknown) => PromiseLike<unknown>;
|
|
15
|
-
readonly action: (functionReference: Ref.FunctionReference<Ref.AnyPublicAction>, encodedArgs: unknown) => PromiseLike<unknown>;
|
|
16
|
-
}
|
|
17
|
-
export declare const make: (client: Transport) => {
|
|
18
|
-
url: string;
|
|
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>;
|
|
24
|
-
};
|
|
25
|
-
export {};
|
|
26
|
-
//# sourceMappingURL=HttpClient.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"HttpClient.d.ts","sourceRoot":"","sources":["../../src/internal/HttpClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,mBAAmB,CAAC;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;;;;AAExC,qBAAa,eAAgB,SAAQ,oBAKpC;CAAG;AAEJ,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,CACd,iBAAiB,EAAE,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,cAAc,CAAC,EAC5D,WAAW,EAAE,OAAO,KACjB,WAAW,CAAC,OAAO,CAAC,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,CACjB,iBAAiB,EAAE,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAC/D,WAAW,EAAE,OAAO,KACjB,WAAW,CAAC,OAAO,CAAC,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,CACf,iBAAiB,EAAE,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,eAAe,CAAC,EAC7D,WAAW,EAAE,OAAO,KACjB,WAAW,CAAC,OAAO,CAAC,CAAC;CAC3B;AAcD,eAAO,MAAM,IAAI,WAAY,SAAS;;qBACZ,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;CAqBF,CAAC"}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import * as Effect from "effect/Effect";
|
|
2
|
-
import * as Ref from "@confect/core/Ref";
|
|
3
|
-
import * as Schema from "effect/Schema";
|
|
4
|
-
//#region src/internal/HttpClient.ts
|
|
5
|
-
var HttpClientError = class extends Schema.TaggedError()("HttpClientError", { cause: Schema.Unknown }) {};
|
|
6
|
-
const runQuery = Effect.fn("HttpClient.query")((effect) => effect);
|
|
7
|
-
const runMutation = Effect.fn("HttpClient.mutation")((effect) => effect);
|
|
8
|
-
const runAction = Effect.fn("HttpClient.action")((effect) => effect);
|
|
9
|
-
const make = (client) => {
|
|
10
|
-
const setAuth = (token) => Effect.sync(() => {
|
|
11
|
-
client.setAuth(token);
|
|
12
|
-
});
|
|
13
|
-
const clearAuth = Effect.sync(() => {
|
|
14
|
-
client.clearAuth();
|
|
15
|
-
});
|
|
16
|
-
const mapUnknownError = (cause) => new HttpClientError({ cause });
|
|
17
|
-
const query = (ref, ...rest) => {
|
|
18
|
-
const args = rest[0] ?? {};
|
|
19
|
-
return runQuery(Ref.runWithCodec(ref, args, (functionReference, encodedArgs) => client.query(functionReference, encodedArgs), mapUnknownError));
|
|
20
|
-
};
|
|
21
|
-
const mutation = (ref, ...rest) => {
|
|
22
|
-
const args = rest[0] ?? {};
|
|
23
|
-
return runMutation(Ref.runWithCodec(ref, args, (functionReference, encodedArgs) => client.mutation(functionReference, encodedArgs), mapUnknownError));
|
|
24
|
-
};
|
|
25
|
-
const action = (ref, ...rest) => {
|
|
26
|
-
const args = rest[0] ?? {};
|
|
27
|
-
return runAction(Ref.runWithCodec(ref, args, (functionReference, encodedArgs) => client.action(functionReference, encodedArgs), mapUnknownError));
|
|
28
|
-
};
|
|
29
|
-
return {
|
|
30
|
-
url: client.url,
|
|
31
|
-
setAuth,
|
|
32
|
-
clearAuth,
|
|
33
|
-
query,
|
|
34
|
-
mutation,
|
|
35
|
-
action
|
|
36
|
-
};
|
|
37
|
-
};
|
|
38
|
-
//#endregion
|
|
39
|
-
export { HttpClientError, make };
|
|
40
|
-
|
|
41
|
-
//# sourceMappingURL=HttpClient.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"HttpClient.js","names":[],"sources":["../../src/internal/HttpClient.ts"],"sourcesContent":["import * as Ref from \"@confect/core/Ref\";\nimport * as Effect from \"effect/Effect\";\nimport * as Schema from \"effect/Schema\";\n\nexport class HttpClientError extends Schema.TaggedError<HttpClientError>()(\n \"HttpClientError\",\n {\n cause: Schema.Unknown,\n },\n) {}\n\nexport interface Transport {\n readonly url: string;\n readonly setAuth: (token: string) => void;\n readonly clearAuth: () => void;\n readonly query: (\n functionReference: Ref.FunctionReference<Ref.AnyPublicQuery>,\n encodedArgs: unknown,\n ) => PromiseLike<unknown>;\n readonly mutation: (\n functionReference: Ref.FunctionReference<Ref.AnyPublicMutation>,\n encodedArgs: unknown,\n ) => PromiseLike<unknown>;\n readonly action: (\n functionReference: Ref.FunctionReference<Ref.AnyPublicAction>,\n encodedArgs: unknown,\n ) => PromiseLike<unknown>;\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\nexport const make = (client: Transport) => {\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"],"mappings":";;;;AAIA,IAAa,kBAAb,cAAqC,OAAO,YAA6B,CAAC,CACxE,mBACA,EACE,OAAO,OAAO,QAChB,CACF,CAAC,CAAC,CAAC;AAoBH,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,MAAa,QAAQ,WAAsB;CACzC,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"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import * as Ref from "@confect/core/Ref";
|
|
2
|
-
import * as Effect from "effect/Effect";
|
|
3
|
-
import * as Result from "effect/Result";
|
|
4
|
-
import * as Schema from "effect/Schema";
|
|
5
|
-
import * as Stream from "effect/Stream";
|
|
6
|
-
declare const WebSocketClientError_base: Schema.Class<WebSocketClientError, Schema.TaggedStruct<"WebSocketClientError", {
|
|
7
|
-
readonly cause: Schema.Defect;
|
|
8
|
-
}>, import("effect/Cause").YieldableError>;
|
|
9
|
-
export declare class WebSocketClientError extends WebSocketClientError_base {
|
|
10
|
-
}
|
|
11
|
-
export interface Transport {
|
|
12
|
-
readonly setAuth: (fetchToken: (args: {
|
|
13
|
-
readonly forceRefreshToken: boolean;
|
|
14
|
-
}) => Promise<string | null | undefined>, onChange?: (isAuthenticated: boolean) => void) => void;
|
|
15
|
-
readonly close: () => Promise<void>;
|
|
16
|
-
readonly query: (functionReference: Ref.FunctionReference<Ref.AnyPublicQuery>, encodedArgs: unknown) => PromiseLike<unknown>;
|
|
17
|
-
readonly mutation: (functionReference: Ref.FunctionReference<Ref.AnyPublicMutation>, encodedArgs: unknown) => PromiseLike<unknown>;
|
|
18
|
-
readonly action: (functionReference: Ref.FunctionReference<Ref.AnyPublicAction>, encodedArgs: unknown) => PromiseLike<unknown>;
|
|
19
|
-
readonly onUpdate: (functionReference: Ref.FunctionReference<Ref.AnyPublicQuery>, encodedArgs: unknown, onUpdate: (result: unknown) => void, onError: (error: Error) => void) => () => void;
|
|
20
|
-
}
|
|
21
|
-
export declare const make: (address: string, convexClient: Transport) => {
|
|
22
|
-
url: string;
|
|
23
|
-
setAuth: <R1 = never, R2 = never>(fetchToken: (args: {
|
|
24
|
-
forceRefreshToken: boolean;
|
|
25
|
-
}) => Effect.Effect<string | null | undefined, never, R1>, onChange?: (isAuthenticated: boolean) => Effect.Effect<void, never, R2>) => Effect.Effect<void, never, R1 | R2>;
|
|
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>>>;
|
|
31
|
-
};
|
|
32
|
-
export declare const makeScoped: <E, R>(address: string, acquire: Effect.Effect<Transport, E, R>) => Effect.Effect<{
|
|
33
|
-
url: string;
|
|
34
|
-
setAuth: <R1 = never, R2 = never>(fetchToken: (args: {
|
|
35
|
-
forceRefreshToken: boolean;
|
|
36
|
-
}) => Effect.Effect<string | null | undefined, never, R1>, onChange?: (isAuthenticated: boolean) => Effect.Effect<void, never, R2>) => Effect.Effect<void, never, R1 | R2>;
|
|
37
|
-
query: <Query extends Ref.AnyPublicQuery>(ref: Query, ...rest: Ref.OptionalArgs<Query>) => Effect.Effect<Ref.Returns<Query>, Ref.Error<Query> | WebSocketClientError | Schema.SchemaError>;
|
|
38
|
-
mutation: <Mutation extends Ref.AnyPublicMutation>(ref: Mutation, ...rest: Ref.OptionalArgs<Mutation>) => Effect.Effect<Ref.Returns<Mutation>, Ref.Error<Mutation> | WebSocketClientError | Schema.SchemaError>;
|
|
39
|
-
action: <Action extends Ref.AnyPublicAction>(ref: Action, ...rest: Ref.OptionalArgs<Action>) => Effect.Effect<Ref.Returns<Action>, Ref.Error<Action> | WebSocketClientError | Schema.SchemaError>;
|
|
40
|
-
reactiveQuery: <Query extends Ref.AnyPublicQuery>(ref: Query, ...rest: Ref.OptionalArgs<Query>) => Stream.Stream<Ref.Returns<Query>, Schema.SchemaError | WebSocketClientError | Ref.Error<Query>>;
|
|
41
|
-
reactiveQueryResult: <Query extends Ref.AnyPublicQuery>(ref: Query, ...rest: Ref.OptionalArgs<Query>) => Stream.Stream<Result.Result<Ref.Returns<Query>, Schema.SchemaError | WebSocketClientError | Ref.Error<Query>>>;
|
|
42
|
-
}, E, R | import("effect/Scope").Scope>;
|
|
43
|
-
export {};
|
|
44
|
-
//# sourceMappingURL=WebSocketClient.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WebSocketClient.d.ts","sourceRoot":"","sources":["../../src/internal/WebSocketClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import * as Effect from "effect/Effect";
|
|
2
|
-
import * as Ref from "@confect/core/Ref";
|
|
3
|
-
import * as Queue from "effect/Queue";
|
|
4
|
-
import * as Result from "effect/Result";
|
|
5
|
-
import * as Schema from "effect/Schema";
|
|
6
|
-
import * as Stream from "effect/Stream";
|
|
7
|
-
//#region src/internal/WebSocketClient.ts
|
|
8
|
-
var WebSocketClientError = class extends Schema.TaggedError()("WebSocketClientError", { cause: Schema.Defect() }) {};
|
|
9
|
-
const runQuery = Effect.fn("WebSocketClient.query")((effect) => effect);
|
|
10
|
-
const runMutation = Effect.fn("WebSocketClient.mutation")((effect) => effect);
|
|
11
|
-
const runAction = Effect.fn("WebSocketClient.action")((effect) => effect);
|
|
12
|
-
const make = (address, convexClient) => {
|
|
13
|
-
const setAuth = (fetchToken, onChange) => Effect.gen(function* () {
|
|
14
|
-
const context = yield* Effect.context();
|
|
15
|
-
const runPromise = Effect.runPromiseWith(context);
|
|
16
|
-
const runFork = Effect.runForkWith(context);
|
|
17
|
-
convexClient.setAuth((args) => runPromise(Effect.suspend(() => fetchToken(args))), ...onChange ? [(isAuthenticated) => {
|
|
18
|
-
runFork(Effect.suspend(() => onChange(isAuthenticated)));
|
|
19
|
-
}] : []);
|
|
20
|
-
});
|
|
21
|
-
const mapUnknownError = (cause) => new WebSocketClientError({ cause });
|
|
22
|
-
const query = (ref, ...rest) => {
|
|
23
|
-
const args = rest[0] ?? {};
|
|
24
|
-
return runQuery(Ref.runWithCodec(ref, args, (functionReference, encodedArgs) => convexClient.query(functionReference, encodedArgs), mapUnknownError));
|
|
25
|
-
};
|
|
26
|
-
const mutation = (ref, ...rest) => {
|
|
27
|
-
const args = rest[0] ?? {};
|
|
28
|
-
return runMutation(Ref.runWithCodec(ref, args, (functionReference, encodedArgs) => convexClient.mutation(functionReference, encodedArgs), mapUnknownError));
|
|
29
|
-
};
|
|
30
|
-
const action = (ref, ...rest) => {
|
|
31
|
-
const args = rest[0] ?? {};
|
|
32
|
-
return runAction(Ref.runWithCodec(ref, args, (functionReference, encodedArgs) => convexClient.action(functionReference, encodedArgs), mapUnknownError));
|
|
33
|
-
};
|
|
34
|
-
const reactiveQueryResult = (ref, ...rest) => {
|
|
35
|
-
const args = rest[0] ?? {};
|
|
36
|
-
const functionReference = Ref.getFunctionReference(ref);
|
|
37
|
-
const onError = Ref.decodeErrorOrElse(ref, mapUnknownError);
|
|
38
|
-
return Stream.unwrap(Effect.match(Ref.encodeArgs(ref, args), {
|
|
39
|
-
onFailure: (error) => Stream.succeed(Result.fail(error)),
|
|
40
|
-
onSuccess: (encodedArgs) => Stream.callback((queue) => Effect.gen(function* () {
|
|
41
|
-
const unsubscribe = convexClient.onUpdate(functionReference, encodedArgs, (result) => {
|
|
42
|
-
Queue.offerUnsafe(queue, Result.succeed(result));
|
|
43
|
-
}, (error) => {
|
|
44
|
-
Queue.offerUnsafe(queue, Result.fail(onError(error)));
|
|
45
|
-
});
|
|
46
|
-
yield* Effect.addFinalizer(() => Effect.sync(() => unsubscribe()));
|
|
47
|
-
}))
|
|
48
|
-
})).pipe(Stream.mapEffect((result) => Result.match(result, {
|
|
49
|
-
onFailure: (error) => Effect.succeed(Result.fail(error)),
|
|
50
|
-
onSuccess: (encodedReturns) => Effect.match(Ref.decodeReturns(ref, encodedReturns), {
|
|
51
|
-
onFailure: Result.fail,
|
|
52
|
-
onSuccess: Result.succeed
|
|
53
|
-
})
|
|
54
|
-
})));
|
|
55
|
-
};
|
|
56
|
-
const reactiveQuery = (ref, ...rest) => reactiveQueryResult(ref, ...rest).pipe(Stream.mapEffect(Result.match({
|
|
57
|
-
onFailure: Effect.fail,
|
|
58
|
-
onSuccess: Effect.succeed
|
|
59
|
-
})));
|
|
60
|
-
return {
|
|
61
|
-
url: address,
|
|
62
|
-
setAuth,
|
|
63
|
-
query,
|
|
64
|
-
mutation,
|
|
65
|
-
action,
|
|
66
|
-
reactiveQuery,
|
|
67
|
-
reactiveQueryResult
|
|
68
|
-
};
|
|
69
|
-
};
|
|
70
|
-
const makeScoped = (address, acquire) => Effect.acquireRelease(acquire, (convexClient) => Effect.promise(() => convexClient.close())).pipe(Effect.map((convexClient) => make(address, convexClient)));
|
|
71
|
-
//#endregion
|
|
72
|
-
export { WebSocketClientError, make, makeScoped };
|
|
73
|
-
|
|
74
|
-
//# sourceMappingURL=WebSocketClient.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WebSocketClient.js","names":[],"sources":["../../src/internal/WebSocketClient.ts"],"sourcesContent":["import * 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\nexport interface Transport {\n readonly setAuth: (\n fetchToken: (args: {\n readonly forceRefreshToken: boolean;\n }) => Promise<string | null | undefined>,\n onChange?: (isAuthenticated: boolean) => void,\n ) => void;\n readonly close: () => Promise<void>;\n readonly query: (\n functionReference: Ref.FunctionReference<Ref.AnyPublicQuery>,\n encodedArgs: unknown,\n ) => PromiseLike<unknown>;\n readonly mutation: (\n functionReference: Ref.FunctionReference<Ref.AnyPublicMutation>,\n encodedArgs: unknown,\n ) => PromiseLike<unknown>;\n readonly action: (\n functionReference: Ref.FunctionReference<Ref.AnyPublicAction>,\n encodedArgs: unknown,\n ) => PromiseLike<unknown>;\n readonly onUpdate: (\n functionReference: Ref.FunctionReference<Ref.AnyPublicQuery>,\n encodedArgs: unknown,\n onUpdate: (result: unknown) => void,\n onError: (error: Error) => void,\n ) => () => void;\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\nexport const make = (address: string, convexClient: Transport) => {\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\nexport const makeScoped = <E, R>(\n address: string,\n acquire: Effect.Effect<Transport, E, R>,\n) =>\n Effect.acquireRelease(acquire, (convexClient) =>\n Effect.promise(() => convexClient.close()),\n ).pipe(Effect.map((convexClient) => make(address, convexClient)));\n"],"mappings":"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"}
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
import * as Ref from "@confect/core/Ref";
|
|
2
|
-
import * as Effect from "effect/Effect";
|
|
3
|
-
import * as Schema from "effect/Schema";
|
|
4
|
-
|
|
5
|
-
export class HttpClientError extends Schema.TaggedError<HttpClientError>()(
|
|
6
|
-
"HttpClientError",
|
|
7
|
-
{
|
|
8
|
-
cause: Schema.Unknown,
|
|
9
|
-
},
|
|
10
|
-
) {}
|
|
11
|
-
|
|
12
|
-
export interface Transport {
|
|
13
|
-
readonly url: string;
|
|
14
|
-
readonly setAuth: (token: string) => void;
|
|
15
|
-
readonly clearAuth: () => void;
|
|
16
|
-
readonly query: (
|
|
17
|
-
functionReference: Ref.FunctionReference<Ref.AnyPublicQuery>,
|
|
18
|
-
encodedArgs: unknown,
|
|
19
|
-
) => PromiseLike<unknown>;
|
|
20
|
-
readonly mutation: (
|
|
21
|
-
functionReference: Ref.FunctionReference<Ref.AnyPublicMutation>,
|
|
22
|
-
encodedArgs: unknown,
|
|
23
|
-
) => PromiseLike<unknown>;
|
|
24
|
-
readonly action: (
|
|
25
|
-
functionReference: Ref.FunctionReference<Ref.AnyPublicAction>,
|
|
26
|
-
encodedArgs: unknown,
|
|
27
|
-
) => PromiseLike<unknown>;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const runQuery = Effect.fn("HttpClient.query")(
|
|
31
|
-
<A, E>(effect: Effect.Effect<A, E>): Effect.Effect<A, E> => effect,
|
|
32
|
-
);
|
|
33
|
-
|
|
34
|
-
const runMutation = Effect.fn("HttpClient.mutation")(
|
|
35
|
-
<A, E>(effect: Effect.Effect<A, E>): Effect.Effect<A, E> => effect,
|
|
36
|
-
);
|
|
37
|
-
|
|
38
|
-
const runAction = Effect.fn("HttpClient.action")(
|
|
39
|
-
<A, E>(effect: Effect.Effect<A, E>): Effect.Effect<A, E> => effect,
|
|
40
|
-
);
|
|
41
|
-
|
|
42
|
-
export const make = (client: Transport) => {
|
|
43
|
-
const setAuth = (token: string) =>
|
|
44
|
-
Effect.sync(() => {
|
|
45
|
-
client.setAuth(token);
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
const clearAuth = Effect.sync(() => {
|
|
49
|
-
client.clearAuth();
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
const mapUnknownError = (cause: unknown) => new HttpClientError({ cause });
|
|
53
|
-
|
|
54
|
-
const query = <Query extends Ref.AnyPublicQuery>(
|
|
55
|
-
ref: Query,
|
|
56
|
-
...rest: Ref.OptionalArgs<Query>
|
|
57
|
-
): Effect.Effect<
|
|
58
|
-
Ref.Returns<Query>,
|
|
59
|
-
Ref.Error<Query> | HttpClientError | Schema.SchemaError
|
|
60
|
-
> => {
|
|
61
|
-
const args = (rest[0] ?? {}) as Ref.Args<Query>;
|
|
62
|
-
return runQuery(
|
|
63
|
-
Ref.runWithCodec(
|
|
64
|
-
ref,
|
|
65
|
-
args,
|
|
66
|
-
(functionReference, encodedArgs) =>
|
|
67
|
-
client.query(functionReference, encodedArgs),
|
|
68
|
-
mapUnknownError,
|
|
69
|
-
),
|
|
70
|
-
);
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
const mutation = <Mutation extends Ref.AnyPublicMutation>(
|
|
74
|
-
ref: Mutation,
|
|
75
|
-
...rest: Ref.OptionalArgs<Mutation>
|
|
76
|
-
): Effect.Effect<
|
|
77
|
-
Ref.Returns<Mutation>,
|
|
78
|
-
Ref.Error<Mutation> | HttpClientError | Schema.SchemaError
|
|
79
|
-
> => {
|
|
80
|
-
const args = (rest[0] ?? {}) as Ref.Args<Mutation>;
|
|
81
|
-
return runMutation(
|
|
82
|
-
Ref.runWithCodec(
|
|
83
|
-
ref,
|
|
84
|
-
args,
|
|
85
|
-
(functionReference, encodedArgs) =>
|
|
86
|
-
client.mutation(functionReference, encodedArgs),
|
|
87
|
-
mapUnknownError,
|
|
88
|
-
),
|
|
89
|
-
);
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
const action = <Action extends Ref.AnyPublicAction>(
|
|
93
|
-
ref: Action,
|
|
94
|
-
...rest: Ref.OptionalArgs<Action>
|
|
95
|
-
): Effect.Effect<
|
|
96
|
-
Ref.Returns<Action>,
|
|
97
|
-
Ref.Error<Action> | HttpClientError | Schema.SchemaError
|
|
98
|
-
> => {
|
|
99
|
-
const args = (rest[0] ?? {}) as Ref.Args<Action>;
|
|
100
|
-
return runAction(
|
|
101
|
-
Ref.runWithCodec(
|
|
102
|
-
ref,
|
|
103
|
-
args,
|
|
104
|
-
(functionReference, encodedArgs) =>
|
|
105
|
-
client.action(functionReference, encodedArgs),
|
|
106
|
-
mapUnknownError,
|
|
107
|
-
),
|
|
108
|
-
);
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
return {
|
|
112
|
-
url: client.url,
|
|
113
|
-
setAuth,
|
|
114
|
-
clearAuth,
|
|
115
|
-
query,
|
|
116
|
-
mutation,
|
|
117
|
-
action,
|
|
118
|
-
};
|
|
119
|
-
};
|