@confect/server 2.0.0 → 4.0.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 +33 -0
- package/dist/ActionRunner.d.ts +2 -2
- package/dist/ActionRunner.d.ts.map +1 -1
- package/dist/ActionRunner.js +9 -7
- package/dist/ActionRunner.js.map +1 -1
- package/dist/BlobNotFoundError.d.ts +17 -0
- package/dist/BlobNotFoundError.d.ts.map +1 -0
- package/dist/BlobNotFoundError.js +14 -0
- package/dist/BlobNotFoundError.js.map +1 -0
- package/dist/CronJob.d.ts +22 -0
- package/dist/CronJob.d.ts.map +1 -0
- package/dist/CronJob.js +23 -0
- package/dist/CronJob.js.map +1 -0
- package/dist/CronJobs.d.ts +28 -0
- package/dist/CronJobs.d.ts.map +1 -0
- package/dist/CronJobs.js +75 -0
- package/dist/CronJobs.js.map +1 -0
- package/dist/DatabaseWriter.d.ts +4 -4
- package/dist/FunctionImpl.js +2 -2
- package/dist/FunctionImpl.js.map +1 -1
- package/dist/Handler.d.ts +22 -14
- package/dist/Handler.d.ts.map +1 -1
- package/dist/Handler.js.map +1 -1
- package/dist/HttpApi.d.ts +3 -1
- package/dist/HttpApi.d.ts.map +1 -1
- package/dist/HttpApi.js +3 -1
- package/dist/HttpApi.js.map +1 -1
- package/dist/MutationRunner.d.ts +2 -2
- package/dist/MutationRunner.d.ts.map +1 -1
- package/dist/MutationRunner.js +9 -7
- package/dist/MutationRunner.js.map +1 -1
- package/dist/OrderedQuery.d.ts +2 -2
- package/dist/OrderedQuery.d.ts.map +1 -1
- package/dist/OrderedQuery.js +3 -2
- package/dist/OrderedQuery.js.map +1 -1
- package/dist/QueryInitializer.d.ts +1 -1
- package/dist/QueryInitializer.d.ts.map +1 -1
- package/dist/QueryRunner.d.ts +2 -2
- package/dist/QueryRunner.d.ts.map +1 -1
- package/dist/QueryRunner.js +7 -5
- package/dist/QueryRunner.js.map +1 -1
- package/dist/RegisteredConvexFunction.d.ts +11 -10
- package/dist/RegisteredConvexFunction.d.ts.map +1 -1
- package/dist/RegisteredConvexFunction.js +23 -19
- package/dist/RegisteredConvexFunction.js.map +1 -1
- package/dist/RegisteredFunction.d.ts +20 -7
- package/dist/RegisteredFunction.d.ts.map +1 -1
- package/dist/RegisteredFunction.js +3 -1
- package/dist/RegisteredFunction.js.map +1 -1
- package/dist/RegisteredFunctions.d.ts +4 -4
- package/dist/RegisteredFunctions.d.ts.map +1 -1
- package/dist/RegisteredFunctions.js.map +1 -1
- package/dist/RegisteredNodeFunction.d.ts +3 -3
- package/dist/RegisteredNodeFunction.d.ts.map +1 -1
- package/dist/RegisteredNodeFunction.js +6 -5
- package/dist/RegisteredNodeFunction.js.map +1 -1
- package/dist/RegistryItem.d.ts +9 -9
- package/dist/RegistryItem.d.ts.map +1 -1
- package/dist/RegistryItem.js +2 -2
- package/dist/RegistryItem.js.map +1 -1
- package/dist/StorageActionWriter.d.ts +35 -0
- package/dist/StorageActionWriter.d.ts.map +1 -0
- package/dist/StorageActionWriter.js +20 -0
- package/dist/StorageActionWriter.js.map +1 -0
- package/dist/StorageReader.d.ts +26 -0
- package/dist/StorageReader.d.ts.map +1 -0
- package/dist/StorageReader.js +17 -0
- package/dist/StorageReader.js.map +1 -0
- package/dist/StorageWriter.d.ts +29 -0
- package/dist/StorageWriter.d.ts.map +1 -0
- package/dist/StorageWriter.js +20 -0
- package/dist/StorageWriter.js.map +1 -0
- package/dist/index.d.ts +8 -3
- package/dist/index.js +7 -2
- package/package.json +4 -4
- package/src/ActionRunner.ts +27 -13
- package/src/BlobNotFoundError.ts +12 -0
- package/src/CronJob.ts +45 -0
- package/src/CronJobs.ts +161 -0
- package/src/FunctionImpl.ts +3 -3
- package/src/Handler.ts +42 -19
- package/src/HttpApi.ts +3 -1
- package/src/MutationRunner.ts +27 -13
- package/src/OrderedQuery.ts +15 -6
- package/src/QueryRunner.ts +22 -8
- package/src/RegisteredConvexFunction.ts +54 -42
- package/src/RegisteredFunction.ts +89 -2
- package/src/RegisteredFunctions.ts +10 -11
- package/src/RegisteredNodeFunction.ts +23 -13
- package/src/RegistryItem.ts +9 -12
- package/src/StorageActionWriter.ts +28 -0
- package/src/StorageReader.ts +27 -0
- package/src/StorageWriter.ts +26 -0
- package/src/index.ts +7 -2
- package/dist/Storage.d.ts +0 -69
- package/dist/Storage.d.ts.map +0 -1
- package/dist/Storage.js +0 -46
- package/dist/Storage.js.map +0 -1
- package/src/Storage.ts +0 -87
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { FunctionSpec, RuntimeAndFunctionType } from "@confect/core";
|
|
2
|
+
import type * as FunctionProvenance from "@confect/core/FunctionProvenance";
|
|
1
3
|
import {
|
|
2
4
|
type DefaultFunctionArgs,
|
|
3
5
|
type FunctionVisibility,
|
|
@@ -16,14 +18,99 @@ import * as MutationRunner from "./MutationRunner";
|
|
|
16
18
|
import * as QueryRunner from "./QueryRunner";
|
|
17
19
|
import * as Scheduler from "./Scheduler";
|
|
18
20
|
import * as SchemaToValidator from "./SchemaToValidator";
|
|
19
|
-
import { StorageActionWriter
|
|
21
|
+
import { StorageActionWriter } from "./StorageActionWriter";
|
|
22
|
+
import { StorageReader } from "./StorageReader";
|
|
23
|
+
import { StorageWriter } from "./StorageWriter";
|
|
20
24
|
import * as VectorSearch from "./VectorSearch";
|
|
21
25
|
|
|
22
|
-
export type
|
|
26
|
+
export type Any =
|
|
23
27
|
| RegisteredQuery<FunctionVisibility, DefaultFunctionArgs, any>
|
|
24
28
|
| RegisteredMutation<FunctionVisibility, DefaultFunctionArgs, any>
|
|
25
29
|
| RegisteredAction<FunctionVisibility, DefaultFunctionArgs, any>;
|
|
26
30
|
|
|
31
|
+
type ConfectRegisteredFunction<
|
|
32
|
+
FunctionSpec_ extends FunctionSpec.AnyWithProps,
|
|
33
|
+
> =
|
|
34
|
+
FunctionSpec.EncodedArgs<FunctionSpec_> extends infer Args_ extends
|
|
35
|
+
DefaultFunctionArgs
|
|
36
|
+
? RuntimeAndFunctionType.GetFunctionType<
|
|
37
|
+
FunctionSpec_["runtimeAndFunctionType"]
|
|
38
|
+
> extends "query"
|
|
39
|
+
? RegisteredQuery<
|
|
40
|
+
FunctionSpec.GetFunctionVisibility<FunctionSpec_>,
|
|
41
|
+
Args_,
|
|
42
|
+
Promise<FunctionSpec.EncodedReturns<FunctionSpec_>>
|
|
43
|
+
>
|
|
44
|
+
: RuntimeAndFunctionType.GetFunctionType<
|
|
45
|
+
FunctionSpec_["runtimeAndFunctionType"]
|
|
46
|
+
> extends "mutation"
|
|
47
|
+
? RegisteredMutation<
|
|
48
|
+
FunctionSpec.GetFunctionVisibility<FunctionSpec_>,
|
|
49
|
+
Args_,
|
|
50
|
+
Promise<FunctionSpec.EncodedReturns<FunctionSpec_>>
|
|
51
|
+
>
|
|
52
|
+
: RuntimeAndFunctionType.GetFunctionType<
|
|
53
|
+
FunctionSpec_["runtimeAndFunctionType"]
|
|
54
|
+
> extends "action"
|
|
55
|
+
? RegisteredAction<
|
|
56
|
+
FunctionSpec.GetFunctionVisibility<FunctionSpec_>,
|
|
57
|
+
Args_,
|
|
58
|
+
Promise<FunctionSpec.EncodedReturns<FunctionSpec_>>
|
|
59
|
+
>
|
|
60
|
+
: never
|
|
61
|
+
: never;
|
|
62
|
+
|
|
63
|
+
export type ConvexRegisteredFunction<
|
|
64
|
+
FunctionSpec_ extends FunctionSpec.AnyWithProps,
|
|
65
|
+
> = FunctionSpec_ extends {
|
|
66
|
+
functionProvenance: {
|
|
67
|
+
_tag: "Convex";
|
|
68
|
+
_args: infer Args_ extends DefaultFunctionArgs;
|
|
69
|
+
_returns: infer Returns_;
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
? RuntimeAndFunctionType.GetFunctionType<
|
|
73
|
+
FunctionSpec_["runtimeAndFunctionType"]
|
|
74
|
+
> extends "query"
|
|
75
|
+
? RegisteredQuery<
|
|
76
|
+
FunctionSpec.GetFunctionVisibility<FunctionSpec_>,
|
|
77
|
+
Args_,
|
|
78
|
+
Returns_
|
|
79
|
+
>
|
|
80
|
+
: RuntimeAndFunctionType.GetFunctionType<
|
|
81
|
+
FunctionSpec_["runtimeAndFunctionType"]
|
|
82
|
+
> extends "mutation"
|
|
83
|
+
? RegisteredMutation<
|
|
84
|
+
FunctionSpec.GetFunctionVisibility<FunctionSpec_>,
|
|
85
|
+
Args_,
|
|
86
|
+
Returns_
|
|
87
|
+
>
|
|
88
|
+
: RuntimeAndFunctionType.GetFunctionType<
|
|
89
|
+
FunctionSpec_["runtimeAndFunctionType"]
|
|
90
|
+
> extends "action"
|
|
91
|
+
? RegisteredAction<
|
|
92
|
+
FunctionSpec.GetFunctionVisibility<FunctionSpec_>,
|
|
93
|
+
Args_,
|
|
94
|
+
Returns_
|
|
95
|
+
>
|
|
96
|
+
: never
|
|
97
|
+
: never;
|
|
98
|
+
|
|
99
|
+
export type RegisteredFunction<
|
|
100
|
+
FunctionSpec_ extends FunctionSpec.AnyWithProps,
|
|
101
|
+
> =
|
|
102
|
+
FunctionSpec_ extends FunctionSpec.WithFunctionProvenance<
|
|
103
|
+
FunctionSpec_,
|
|
104
|
+
FunctionProvenance.AnyConvex
|
|
105
|
+
>
|
|
106
|
+
? ConvexRegisteredFunction<FunctionSpec_>
|
|
107
|
+
: FunctionSpec_ extends FunctionSpec.WithFunctionProvenance<
|
|
108
|
+
FunctionSpec_,
|
|
109
|
+
FunctionProvenance.AnyConfect
|
|
110
|
+
>
|
|
111
|
+
? ConfectRegisteredFunction<FunctionSpec_>
|
|
112
|
+
: never;
|
|
113
|
+
|
|
27
114
|
export const actionFunctionBase = <
|
|
28
115
|
Schema extends DatabaseSchema.AnyWithProps,
|
|
29
116
|
Args,
|
|
@@ -27,8 +27,8 @@ type RegisteredFunctionsHelper<Groups extends GroupSpec.AnyWithProps> = {
|
|
|
27
27
|
>]: FunctionSpec.WithName<
|
|
28
28
|
GroupSpec.Functions<Group>,
|
|
29
29
|
FunctionName
|
|
30
|
-
> extends infer
|
|
31
|
-
?
|
|
30
|
+
> extends infer FunctionSpec_ extends FunctionSpec.AnyWithProps
|
|
31
|
+
? RegisteredFunction.RegisteredFunction<FunctionSpec_>
|
|
32
32
|
: never;
|
|
33
33
|
}
|
|
34
34
|
>
|
|
@@ -38,15 +38,15 @@ type RegisteredFunctionsHelper<Groups extends GroupSpec.AnyWithProps> = {
|
|
|
38
38
|
>]: FunctionSpec.WithName<
|
|
39
39
|
GroupSpec.Functions<Group>,
|
|
40
40
|
FunctionName
|
|
41
|
-
> extends infer
|
|
42
|
-
?
|
|
41
|
+
> extends infer FunctionSpec_ extends FunctionSpec.AnyWithProps
|
|
42
|
+
? RegisteredFunction.RegisteredFunction<FunctionSpec_>
|
|
43
43
|
: never;
|
|
44
44
|
}
|
|
45
45
|
: never;
|
|
46
46
|
};
|
|
47
47
|
|
|
48
48
|
export interface AnyWithProps {
|
|
49
|
-
readonly [key: string]: RegisteredFunction.
|
|
49
|
+
readonly [key: string]: RegisteredFunction.Any | AnyWithProps;
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
export const make = <Api_ extends Api.AnyWithProps>(
|
|
@@ -54,7 +54,7 @@ export const make = <Api_ extends Api.AnyWithProps>(
|
|
|
54
54
|
makeRegisteredFunction: (
|
|
55
55
|
api: Api_,
|
|
56
56
|
registryItem: RegistryItem.AnyWithProps,
|
|
57
|
-
) => RegisteredFunction.
|
|
57
|
+
) => RegisteredFunction.Any,
|
|
58
58
|
) =>
|
|
59
59
|
Effect.gen(function* () {
|
|
60
60
|
const registry = yield* Registry.Registry;
|
|
@@ -70,11 +70,10 @@ export const make = <Api_ extends Api.AnyWithProps>(
|
|
|
70
70
|
),
|
|
71
71
|
Match.when("Finalized", () =>
|
|
72
72
|
Effect.succeed(
|
|
73
|
-
mapLeaves<
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
makeRegisteredFunction(api, registryItem),
|
|
73
|
+
mapLeaves<RegistryItem.AnyWithProps, RegisteredFunction.Any>(
|
|
74
|
+
functionImplItems,
|
|
75
|
+
RegistryItem.isRegistryItem,
|
|
76
|
+
(registryItem) => makeRegisteredFunction(api, registryItem),
|
|
78
77
|
) as RegisteredFunctions<Api_["spec"]>,
|
|
79
78
|
),
|
|
80
79
|
),
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type * as FunctionSpec from "@confect/core/FunctionSpec";
|
|
1
2
|
import { NodeContext } from "@effect/platform-node";
|
|
2
3
|
import {
|
|
3
4
|
actionGeneric,
|
|
@@ -8,27 +9,36 @@ import type { Effect } from "effect";
|
|
|
8
9
|
import { Layer, Match, type Schema } from "effect";
|
|
9
10
|
import type * as Api from "./Api";
|
|
10
11
|
import type * as DatabaseSchema from "./DatabaseSchema";
|
|
12
|
+
import type * as Handler from "./Handler";
|
|
11
13
|
import * as RegisteredFunction from "./RegisteredFunction";
|
|
12
14
|
import type * as RegistryItem from "./RegistryItem";
|
|
13
15
|
|
|
14
16
|
export const make = <Api_ extends Api.AnyWithPropsWithRuntime<"Node">>(
|
|
15
17
|
api: Api_,
|
|
16
|
-
{
|
|
17
|
-
): RegisteredFunction.
|
|
18
|
-
|
|
19
|
-
Match.
|
|
20
|
-
Match.
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
{ functionSpec, handler }: RegistryItem.AnyWithProps,
|
|
19
|
+
): RegisteredFunction.Any =>
|
|
20
|
+
Match.value(functionSpec.functionProvenance).pipe(
|
|
21
|
+
Match.tag("Convex", () => handler as RegisteredFunction.Any),
|
|
22
|
+
Match.tag("Confect", () => {
|
|
23
|
+
const { functionVisibility, functionProvenance } =
|
|
24
|
+
functionSpec as FunctionSpec.AnyConfect;
|
|
23
25
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
const genericFunction = Match.value(functionVisibility).pipe(
|
|
27
|
+
Match.when("public", () => actionGeneric),
|
|
28
|
+
Match.when("internal", () => internalActionGeneric),
|
|
29
|
+
Match.exhaustive,
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
return genericFunction(
|
|
33
|
+
nodeActionFunction(api.databaseSchema, {
|
|
34
|
+
args: functionProvenance.args,
|
|
35
|
+
returns: functionProvenance.returns,
|
|
36
|
+
handler: handler as Handler.AnyConfectProvenance,
|
|
37
|
+
}),
|
|
38
|
+
);
|
|
29
39
|
}),
|
|
40
|
+
Match.exhaustive,
|
|
30
41
|
);
|
|
31
|
-
};
|
|
32
42
|
|
|
33
43
|
const nodeActionFunction = <
|
|
34
44
|
DatabaseSchema_ extends DatabaseSchema.AnyWithProps,
|
package/src/RegistryItem.ts
CHANGED
|
@@ -18,27 +18,24 @@ export interface RegistryItem<
|
|
|
18
18
|
FunctionSpec_ extends FunctionSpec.AnyWithProps,
|
|
19
19
|
> {
|
|
20
20
|
readonly [TypeId]: TypeId;
|
|
21
|
-
readonly
|
|
21
|
+
readonly functionSpec: FunctionSpec_;
|
|
22
22
|
readonly handler: Handler.Handler<DatabaseSchema_, FunctionSpec_>;
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
export interface AnyWithProps {
|
|
26
26
|
readonly [TypeId]: TypeId;
|
|
27
|
-
readonly
|
|
28
|
-
readonly handler: Handler.
|
|
27
|
+
readonly functionSpec: FunctionSpec.AnyWithProps;
|
|
28
|
+
readonly handler: Handler.Any;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
export const make =
|
|
32
|
-
|
|
33
|
-
FunctionSpec_ extends FunctionSpec.AnyWithProps,
|
|
34
|
-
>({
|
|
35
|
-
function_,
|
|
31
|
+
export const make = ({
|
|
32
|
+
functionSpec,
|
|
36
33
|
handler,
|
|
37
34
|
}: {
|
|
38
|
-
|
|
39
|
-
handler:
|
|
40
|
-
}):
|
|
35
|
+
functionSpec: FunctionSpec.AnyWithProps;
|
|
36
|
+
handler: AnyWithProps["handler"];
|
|
37
|
+
}): AnyWithProps =>
|
|
41
38
|
Object.assign(Object.create(RegistryItemProto), {
|
|
42
|
-
|
|
39
|
+
functionSpec,
|
|
43
40
|
handler,
|
|
44
41
|
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { StorageActionWriter as ConvexStorageActionWriter } from "convex/server";
|
|
2
|
+
import type { GenericId } from "convex/values";
|
|
3
|
+
import { Effect, flow, Layer, Option } from "effect";
|
|
4
|
+
import { BlobNotFoundError } from "./BlobNotFoundError";
|
|
5
|
+
|
|
6
|
+
const make = (storageActionWriter: ConvexStorageActionWriter) => ({
|
|
7
|
+
get: (storageId: GenericId<"_storage">) =>
|
|
8
|
+
Effect.promise(() => storageActionWriter.get(storageId)).pipe(
|
|
9
|
+
Effect.andThen(
|
|
10
|
+
flow(
|
|
11
|
+
Option.fromNullable,
|
|
12
|
+
Option.match({
|
|
13
|
+
onNone: () => Effect.fail(new BlobNotFoundError({ id: storageId })),
|
|
14
|
+
onSome: Effect.succeed,
|
|
15
|
+
}),
|
|
16
|
+
),
|
|
17
|
+
),
|
|
18
|
+
),
|
|
19
|
+
store: (blob: Blob, options?: { sha256?: string }) =>
|
|
20
|
+
Effect.promise(() => storageActionWriter.store(blob, options)),
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
export class StorageActionWriter extends Effect.Tag(
|
|
24
|
+
"@confect/server/StorageActionWriter",
|
|
25
|
+
)<StorageActionWriter, ReturnType<typeof make>>() {
|
|
26
|
+
static readonly layer = (storageActionWriter: ConvexStorageActionWriter) =>
|
|
27
|
+
Layer.succeed(this, make(storageActionWriter));
|
|
28
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { StorageReader as ConvexStorageReader } from "convex/server";
|
|
2
|
+
import type { GenericId } from "convex/values";
|
|
3
|
+
import { Effect, flow, Layer, Option, pipe, Schema } from "effect";
|
|
4
|
+
import { BlobNotFoundError } from "./BlobNotFoundError";
|
|
5
|
+
|
|
6
|
+
const make = (storageReader: ConvexStorageReader) => ({
|
|
7
|
+
getUrl: (storageId: GenericId<"_storage">) =>
|
|
8
|
+
Effect.promise(() => storageReader.getUrl(storageId)).pipe(
|
|
9
|
+
Effect.andThen(
|
|
10
|
+
flow(
|
|
11
|
+
Option.fromNullable,
|
|
12
|
+
Option.match({
|
|
13
|
+
onNone: () => Effect.fail(new BlobNotFoundError({ id: storageId })),
|
|
14
|
+
onSome: (doc) => pipe(doc, Schema.decode(Schema.URL), Effect.orDie),
|
|
15
|
+
}),
|
|
16
|
+
),
|
|
17
|
+
),
|
|
18
|
+
),
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
export class StorageReader extends Effect.Tag("@confect/server/StorageReader")<
|
|
22
|
+
StorageReader,
|
|
23
|
+
ReturnType<typeof make>
|
|
24
|
+
>() {
|
|
25
|
+
static readonly layer = (storageReader: ConvexStorageReader) =>
|
|
26
|
+
Layer.succeed(this, make(storageReader));
|
|
27
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { StorageWriter as ConvexStorageWriter } from "convex/server";
|
|
2
|
+
import type { GenericId } from "convex/values";
|
|
3
|
+
import { Effect, Layer, pipe, Schema } from "effect";
|
|
4
|
+
import { BlobNotFoundError } from "./BlobNotFoundError";
|
|
5
|
+
|
|
6
|
+
const make = (storageWriter: ConvexStorageWriter) => ({
|
|
7
|
+
generateUploadUrl: () =>
|
|
8
|
+
Effect.promise(() => storageWriter.generateUploadUrl()).pipe(
|
|
9
|
+
Effect.andThen((url) =>
|
|
10
|
+
pipe(url, Schema.decode(Schema.URL), Effect.orDie),
|
|
11
|
+
),
|
|
12
|
+
),
|
|
13
|
+
delete: (storageId: GenericId<"_storage">) =>
|
|
14
|
+
Effect.tryPromise({
|
|
15
|
+
try: () => storageWriter.delete(storageId),
|
|
16
|
+
catch: () => new BlobNotFoundError({ id: storageId }),
|
|
17
|
+
}),
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
export class StorageWriter extends Effect.Tag("@confect/server/StorageWriter")<
|
|
21
|
+
StorageWriter,
|
|
22
|
+
ReturnType<typeof make>
|
|
23
|
+
>() {
|
|
24
|
+
static readonly layer = (storageWriter: ConvexStorageWriter) =>
|
|
25
|
+
Layer.succeed(this, make(storageWriter));
|
|
26
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -2,12 +2,15 @@ export * as ActionCtx from "./ActionCtx";
|
|
|
2
2
|
export * as ActionRunner from "./ActionRunner";
|
|
3
3
|
export * as Api from "./Api";
|
|
4
4
|
export * as Auth from "./Auth";
|
|
5
|
+
export * as BlobNotFoundError from "./BlobNotFoundError";
|
|
6
|
+
export * as ConvexConfigProvider from "./ConvexConfigProvider";
|
|
7
|
+
export * as CronJob from "./CronJob";
|
|
8
|
+
export * as CronJobs from "./CronJobs";
|
|
5
9
|
export * as DatabaseReader from "./DatabaseReader";
|
|
6
10
|
export * as DatabaseSchema from "./DatabaseSchema";
|
|
7
11
|
export * as DatabaseWriter from "./DatabaseWriter";
|
|
8
12
|
export * as DataModel from "./DataModel";
|
|
9
13
|
export * as Document from "./Document";
|
|
10
|
-
export * as ConvexConfigProvider from "./ConvexConfigProvider";
|
|
11
14
|
export * as FunctionImpl from "./FunctionImpl";
|
|
12
15
|
export * as GroupImpl from "./GroupImpl";
|
|
13
16
|
export * as Handler from "./Handler";
|
|
@@ -26,7 +29,9 @@ export * as Registry from "./Registry";
|
|
|
26
29
|
export * as RegistryItem from "./RegistryItem";
|
|
27
30
|
export * as Scheduler from "./Scheduler";
|
|
28
31
|
export * as SchemaToValidator from "./SchemaToValidator";
|
|
29
|
-
export * as
|
|
32
|
+
export * as StorageActionWriter from "./StorageActionWriter";
|
|
33
|
+
export * as StorageReader from "./StorageReader";
|
|
34
|
+
export * as StorageWriter from "./StorageWriter";
|
|
30
35
|
export * as Table from "./Table";
|
|
31
36
|
export * as TableInfo from "./TableInfo";
|
|
32
37
|
export * as VectorSearch from "./VectorSearch";
|
package/dist/Storage.d.ts
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { Effect, Layer, Schema } from "effect";
|
|
2
|
-
import { StorageActionWriter as StorageActionWriter$1, StorageReader as StorageReader$1, StorageWriter as StorageWriter$1 } from "convex/server";
|
|
3
|
-
import { GenericId } from "convex/values";
|
|
4
|
-
import * as effect_Context0 from "effect/Context";
|
|
5
|
-
import * as effect_Cause0 from "effect/Cause";
|
|
6
|
-
|
|
7
|
-
//#region src/Storage.d.ts
|
|
8
|
-
declare namespace Storage_d_exports {
|
|
9
|
-
export { BlobNotFoundError, StorageActionWriter, StorageReader, StorageWriter };
|
|
10
|
-
}
|
|
11
|
-
declare const StorageReader_base: effect_Context0.TagClass<StorageReader, "@confect/server/Storage/StorageReader", {
|
|
12
|
-
getUrl: (storageId: GenericId<"_storage">) => Effect.Effect<URL, BlobNotFoundError, never>;
|
|
13
|
-
}> & Effect.Tag.Proxy<StorageReader, {
|
|
14
|
-
getUrl: (storageId: GenericId<"_storage">) => Effect.Effect<URL, BlobNotFoundError, never>;
|
|
15
|
-
}> & {
|
|
16
|
-
use: <X>(body: (_: {
|
|
17
|
-
getUrl: (storageId: GenericId<"_storage">) => Effect.Effect<URL, BlobNotFoundError, never>;
|
|
18
|
-
}) => X) => [X] extends [Effect.Effect<infer A, infer E, infer R>] ? Effect.Effect<A, E, R | StorageReader> : [X] extends [PromiseLike<infer A_1>] ? Effect.Effect<A_1, effect_Cause0.UnknownException, StorageReader> : Effect.Effect<X, never, StorageReader>;
|
|
19
|
-
};
|
|
20
|
-
declare class StorageReader extends StorageReader_base {
|
|
21
|
-
static readonly layer: (storageReader: StorageReader$1) => Layer.Layer<StorageReader, never, never>;
|
|
22
|
-
}
|
|
23
|
-
declare const StorageWriter_base: effect_Context0.TagClass<StorageWriter, "@confect/server/Storage/StorageWriter", {
|
|
24
|
-
generateUploadUrl: () => Effect.Effect<URL, never, never>;
|
|
25
|
-
delete: (storageId: GenericId<"_storage">) => Effect.Effect<void, BlobNotFoundError, never>;
|
|
26
|
-
}> & Effect.Tag.Proxy<StorageWriter, {
|
|
27
|
-
generateUploadUrl: () => Effect.Effect<URL, never, never>;
|
|
28
|
-
delete: (storageId: GenericId<"_storage">) => Effect.Effect<void, BlobNotFoundError, never>;
|
|
29
|
-
}> & {
|
|
30
|
-
use: <X>(body: (_: {
|
|
31
|
-
generateUploadUrl: () => Effect.Effect<URL, never, never>;
|
|
32
|
-
delete: (storageId: GenericId<"_storage">) => Effect.Effect<void, BlobNotFoundError, never>;
|
|
33
|
-
}) => X) => [X] extends [Effect.Effect<infer A, infer E, infer R>] ? Effect.Effect<A, E, R | StorageWriter> : [X] extends [PromiseLike<infer A_1>] ? Effect.Effect<A_1, effect_Cause0.UnknownException, StorageWriter> : Effect.Effect<X, never, StorageWriter>;
|
|
34
|
-
};
|
|
35
|
-
declare class StorageWriter extends StorageWriter_base {
|
|
36
|
-
static readonly layer: (storageWriter: StorageWriter$1) => Layer.Layer<StorageWriter, never, never>;
|
|
37
|
-
}
|
|
38
|
-
declare const StorageActionWriter_base: effect_Context0.TagClass<StorageActionWriter, "@confect/server/Storage/StorageActionWriter", {
|
|
39
|
-
get: (storageId: GenericId<"_storage">) => Effect.Effect<Blob, BlobNotFoundError, never>;
|
|
40
|
-
store: (blob: Blob, options?: {
|
|
41
|
-
sha256?: string;
|
|
42
|
-
}) => Effect.Effect<GenericId<"_storage">, never, never>;
|
|
43
|
-
}> & Effect.Tag.Proxy<StorageActionWriter, {
|
|
44
|
-
get: (storageId: GenericId<"_storage">) => Effect.Effect<Blob, BlobNotFoundError, never>;
|
|
45
|
-
store: (blob: Blob, options?: {
|
|
46
|
-
sha256?: string;
|
|
47
|
-
}) => Effect.Effect<GenericId<"_storage">, never, never>;
|
|
48
|
-
}> & {
|
|
49
|
-
use: <X>(body: (_: {
|
|
50
|
-
get: (storageId: GenericId<"_storage">) => Effect.Effect<Blob, BlobNotFoundError, never>;
|
|
51
|
-
store: (blob: Blob, options?: {
|
|
52
|
-
sha256?: string;
|
|
53
|
-
}) => Effect.Effect<GenericId<"_storage">, never, never>;
|
|
54
|
-
}) => X) => [X] extends [Effect.Effect<infer A, infer E, infer R>] ? Effect.Effect<A, E, R | StorageActionWriter> : [X] extends [PromiseLike<infer A_1>] ? Effect.Effect<A_1, effect_Cause0.UnknownException, StorageActionWriter> : Effect.Effect<X, never, StorageActionWriter>;
|
|
55
|
-
};
|
|
56
|
-
declare class StorageActionWriter extends StorageActionWriter_base {
|
|
57
|
-
static readonly layer: (storageActionWriter: StorageActionWriter$1) => Layer.Layer<StorageActionWriter, never, never>;
|
|
58
|
-
}
|
|
59
|
-
declare const BlobNotFoundError_base: Schema.TaggedErrorClass<BlobNotFoundError, "BlobNotFoundError", {
|
|
60
|
-
readonly _tag: Schema.tag<"BlobNotFoundError">;
|
|
61
|
-
} & {
|
|
62
|
-
id: typeof Schema.String;
|
|
63
|
-
}>;
|
|
64
|
-
declare class BlobNotFoundError extends BlobNotFoundError_base {
|
|
65
|
-
get message(): string;
|
|
66
|
-
}
|
|
67
|
-
//#endregion
|
|
68
|
-
export { BlobNotFoundError, StorageActionWriter, StorageReader, StorageWriter, Storage_d_exports };
|
|
69
|
-
//# sourceMappingURL=Storage.d.ts.map
|
package/dist/Storage.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Storage.d.ts","names":[],"sources":["../src/Storage.ts"],"mappings":";;;;;;;;;;cAMmE,kBAAA,EAGxB,eAAA,CAAA,QAAA;sBAArB,SAAA,iBAAqB,MAAA,CAAA,MAAA,CAAA,GAAA,EAAA,iBAAA;AAAA;sBAArB,SAAA,iBAAqB,MAAA,CAAA,MAAA,CAAA,GAAA,EAAA,iBAAA;AAAA;;wBAArB,SAAA,iBAAqB,MAAA,CAAA,MAAA,CAAA,GAAA,EAAA,iBAAA;EAAA;;cA+C9B,aAAA,SAAsB,kBAAA;EAAA,gBAGjB,KAAA,GAAS,aAAA,EAAe,eAAA,KAAmB,KAAA,CAAA,KAAA,CAAA,aAAA;AAAA;AAAA,cAE5D,kBAAA,EA/B0C,eAAA,CAAA,QAAA;;sBAArB,SAAA,iBAAqB,MAAA,CAAA,MAAA,OAAA,iBAAA;AAAA;;sBAArB,SAAA,iBAAqB,MAAA,CAAA,MAAA,OAAA,iBAAA;AAAA;;;wBAArB,SAAA,iBAAqB,MAAA,CAAA,MAAA,OAAA,iBAAA;EAAA;;cAiC9B,aAAA,SAAsB,kBAAA;EAAA,gBAGjB,KAAA,GAAS,aAAA,EAAe,eAAA,KAAmB,KAAA,CAAA,KAAA,CAAA,aAAA;AAAA;AAAA,cAE5D,wBAAA,EAhBkD,eAAA,CAAA,QAAA;mBAZhC,SAAA,iBAAqB,MAAA,CAAA,MAAA,CAAA,IAAA,EAAA,iBAAA;gBAYxB,IAAA,EAAI,OAAA;IAAc,MAAA;EAAA,MAAiB,MAAA,CAAA,MAAA,CAAA,SAAA;AAAA;mBAZhC,SAAA,iBAAqB,MAAA,CAAA,MAAA,CAAA,IAAA,EAAA,iBAAA;gBAYxB,IAAA,EAAI,OAAA;IAAc,MAAA;EAAA,MAAiB,MAAA,CAAA,MAAA,CAAA,SAAA;AAAA;;qBAZhC,SAAA,iBAAqB,MAAA,CAAA,MAAA,CAAA,IAAA,EAAA,iBAAA;kBAYxB,IAAA,EAAI,OAAA;MAAc,MAAA;IAAA,MAAiB,MAAA,CAAA,MAAA,CAAA,SAAA;EAAA;;cAkBtC,mBAAA,SAA4B,wBAAA;EAAA,gBAGvB,KAAA,GAAS,mBAAA,EAAqB,qBAAA,KAAyB,KAAA,CAAA,KAAA,CAAA,mBAAA;AAAA;AAAA,cAExE,sBAAA;;;;;cAEY,iBAAA,SAA0B,sBAAA;EAAA,IAMxB,OAAA,CAAA;AAAA"}
|
package/dist/Storage.js
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { __exportAll } from "./_virtual/_rolldown/runtime.js";
|
|
2
|
-
import { Effect, Layer, Option, Schema, flow, pipe } from "effect";
|
|
3
|
-
|
|
4
|
-
//#region src/Storage.ts
|
|
5
|
-
var Storage_exports = /* @__PURE__ */ __exportAll({
|
|
6
|
-
BlobNotFoundError: () => BlobNotFoundError,
|
|
7
|
-
StorageActionWriter: () => StorageActionWriter,
|
|
8
|
-
StorageReader: () => StorageReader,
|
|
9
|
-
StorageWriter: () => StorageWriter
|
|
10
|
-
});
|
|
11
|
-
const makeStorageReader = (storageReader) => ({ getUrl: (storageId) => Effect.promise(() => storageReader.getUrl(storageId)).pipe(Effect.andThen(flow(Option.fromNullable, Option.match({
|
|
12
|
-
onNone: () => Effect.fail(new BlobNotFoundError({ id: storageId })),
|
|
13
|
-
onSome: (doc) => pipe(doc, Schema.decode(Schema.URL), Effect.orDie)
|
|
14
|
-
})))) });
|
|
15
|
-
const makeStorageWriter = (storageWriter) => ({
|
|
16
|
-
generateUploadUrl: () => Effect.promise(() => storageWriter.generateUploadUrl()).pipe(Effect.andThen((url) => pipe(url, Schema.decode(Schema.URL), Effect.orDie))),
|
|
17
|
-
delete: (storageId) => Effect.tryPromise({
|
|
18
|
-
try: () => storageWriter.delete(storageId),
|
|
19
|
-
catch: () => new BlobNotFoundError({ id: storageId })
|
|
20
|
-
})
|
|
21
|
-
});
|
|
22
|
-
const makeStorageActionWriter = (storageActionWriter) => ({
|
|
23
|
-
get: (storageId) => Effect.promise(() => storageActionWriter.get(storageId)).pipe(Effect.andThen(flow(Option.fromNullable, Option.match({
|
|
24
|
-
onNone: () => Effect.fail(new BlobNotFoundError({ id: storageId })),
|
|
25
|
-
onSome: Effect.succeed
|
|
26
|
-
})))),
|
|
27
|
-
store: (blob, options) => Effect.promise(() => storageActionWriter.store(blob, options))
|
|
28
|
-
});
|
|
29
|
-
var StorageReader = class extends Effect.Tag("@confect/server/Storage/StorageReader")() {
|
|
30
|
-
static layer = (storageReader) => Layer.succeed(this, makeStorageReader(storageReader));
|
|
31
|
-
};
|
|
32
|
-
var StorageWriter = class extends Effect.Tag("@confect/server/Storage/StorageWriter")() {
|
|
33
|
-
static layer = (storageWriter) => Layer.succeed(this, makeStorageWriter(storageWriter));
|
|
34
|
-
};
|
|
35
|
-
var StorageActionWriter = class extends Effect.Tag("@confect/server/Storage/StorageActionWriter")() {
|
|
36
|
-
static layer = (storageActionWriter) => Layer.succeed(this, makeStorageActionWriter(storageActionWriter));
|
|
37
|
-
};
|
|
38
|
-
var BlobNotFoundError = class extends Schema.TaggedError()("BlobNotFoundError", { id: Schema.String }) {
|
|
39
|
-
get message() {
|
|
40
|
-
return `File with ID '${this.id}' not found`;
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
//#endregion
|
|
45
|
-
export { BlobNotFoundError, StorageActionWriter, StorageReader, StorageWriter, Storage_exports };
|
|
46
|
-
//# sourceMappingURL=Storage.js.map
|
package/dist/Storage.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Storage.js","names":[],"sources":["../src/Storage.ts"],"sourcesContent":["import type {\n StorageActionWriter as ConvexStorageActionWriter,\n StorageReader as ConvexStorageReader,\n StorageWriter as ConvexStorageWriter,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\nimport { Effect, flow, Layer, Option, pipe, Schema } from \"effect\";\n\nconst makeStorageReader = (storageReader: ConvexStorageReader) => ({\n getUrl: (storageId: GenericId<\"_storage\">) =>\n Effect.promise(() => storageReader.getUrl(storageId)).pipe(\n Effect.andThen(\n flow(\n Option.fromNullable,\n Option.match({\n onNone: () => Effect.fail(new BlobNotFoundError({ id: storageId })),\n onSome: (doc) => pipe(doc, Schema.decode(Schema.URL), Effect.orDie),\n }),\n ),\n ),\n ),\n});\n\nconst makeStorageWriter = (storageWriter: ConvexStorageWriter) => ({\n generateUploadUrl: () =>\n Effect.promise(() => storageWriter.generateUploadUrl()).pipe(\n Effect.andThen((url) =>\n pipe(url, Schema.decode(Schema.URL), Effect.orDie),\n ),\n ),\n delete: (storageId: GenericId<\"_storage\">) =>\n Effect.tryPromise({\n try: () => storageWriter.delete(storageId),\n catch: () => new BlobNotFoundError({ id: storageId }),\n }),\n});\n\nconst makeStorageActionWriter = (\n storageActionWriter: ConvexStorageActionWriter,\n) => ({\n get: (storageId: GenericId<\"_storage\">) =>\n Effect.promise(() => storageActionWriter.get(storageId)).pipe(\n Effect.andThen(\n flow(\n Option.fromNullable,\n Option.match({\n onNone: () => Effect.fail(new BlobNotFoundError({ id: storageId })),\n onSome: Effect.succeed,\n }),\n ),\n ),\n ),\n store: (blob: Blob, options?: { sha256?: string }) =>\n Effect.promise(() => storageActionWriter.store(blob, options)),\n});\n\nexport class StorageReader extends Effect.Tag(\n \"@confect/server/Storage/StorageReader\",\n)<StorageReader, ReturnType<typeof makeStorageReader>>() {\n static readonly layer = (storageReader: ConvexStorageReader) =>\n Layer.succeed(this, makeStorageReader(storageReader));\n}\n\nexport class StorageWriter extends Effect.Tag(\n \"@confect/server/Storage/StorageWriter\",\n)<StorageWriter, ReturnType<typeof makeStorageWriter>>() {\n static readonly layer = (storageWriter: ConvexStorageWriter) =>\n Layer.succeed(this, makeStorageWriter(storageWriter));\n}\n\nexport class StorageActionWriter extends Effect.Tag(\n \"@confect/server/Storage/StorageActionWriter\",\n)<StorageActionWriter, ReturnType<typeof makeStorageActionWriter>>() {\n static readonly layer = (storageActionWriter: ConvexStorageActionWriter) =>\n Layer.succeed(this, makeStorageActionWriter(storageActionWriter));\n}\n\nexport class BlobNotFoundError extends Schema.TaggedError<BlobNotFoundError>()(\n \"BlobNotFoundError\",\n {\n id: Schema.String,\n },\n) {\n override get message(): string {\n return `File with ID '${this.id}' not found`;\n }\n}\n"],"mappings":";;;;;;;;;;AAQA,MAAM,qBAAqB,mBAAwC,EACjE,SAAS,cACP,OAAO,cAAc,cAAc,OAAO,UAAU,CAAC,CAAC,KACpD,OAAO,QACL,KACE,OAAO,cACP,OAAO,MAAM;CACX,cAAc,OAAO,KAAK,IAAI,kBAAkB,EAAE,IAAI,WAAW,CAAC,CAAC;CACnE,SAAS,QAAQ,KAAK,KAAK,OAAO,OAAO,OAAO,IAAI,EAAE,OAAO,MAAM;CACpE,CAAC,CACH,CACF,CACF,EACJ;AAED,MAAM,qBAAqB,mBAAwC;CACjE,yBACE,OAAO,cAAc,cAAc,mBAAmB,CAAC,CAAC,KACtD,OAAO,SAAS,QACd,KAAK,KAAK,OAAO,OAAO,OAAO,IAAI,EAAE,OAAO,MAAM,CACnD,CACF;CACH,SAAS,cACP,OAAO,WAAW;EAChB,WAAW,cAAc,OAAO,UAAU;EAC1C,aAAa,IAAI,kBAAkB,EAAE,IAAI,WAAW,CAAC;EACtD,CAAC;CACL;AAED,MAAM,2BACJ,yBACI;CACJ,MAAM,cACJ,OAAO,cAAc,oBAAoB,IAAI,UAAU,CAAC,CAAC,KACvD,OAAO,QACL,KACE,OAAO,cACP,OAAO,MAAM;EACX,cAAc,OAAO,KAAK,IAAI,kBAAkB,EAAE,IAAI,WAAW,CAAC,CAAC;EACnE,QAAQ,OAAO;EAChB,CAAC,CACH,CACF,CACF;CACH,QAAQ,MAAY,YAClB,OAAO,cAAc,oBAAoB,MAAM,MAAM,QAAQ,CAAC;CACjE;AAED,IAAa,gBAAb,cAAmC,OAAO,IACxC,wCACD,EAAuD,CAAC;CACvD,OAAgB,SAAS,kBACvB,MAAM,QAAQ,MAAM,kBAAkB,cAAc,CAAC;;AAGzD,IAAa,gBAAb,cAAmC,OAAO,IACxC,wCACD,EAAuD,CAAC;CACvD,OAAgB,SAAS,kBACvB,MAAM,QAAQ,MAAM,kBAAkB,cAAc,CAAC;;AAGzD,IAAa,sBAAb,cAAyC,OAAO,IAC9C,8CACD,EAAmE,CAAC;CACnE,OAAgB,SAAS,wBACvB,MAAM,QAAQ,MAAM,wBAAwB,oBAAoB,CAAC;;AAGrE,IAAa,oBAAb,cAAuC,OAAO,aAAgC,CAC5E,qBACA,EACE,IAAI,OAAO,QACZ,CACF,CAAC;CACA,IAAa,UAAkB;AAC7B,SAAO,iBAAiB,KAAK,GAAG"}
|
package/src/Storage.ts
DELETED
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
StorageActionWriter as ConvexStorageActionWriter,
|
|
3
|
-
StorageReader as ConvexStorageReader,
|
|
4
|
-
StorageWriter as ConvexStorageWriter,
|
|
5
|
-
} from "convex/server";
|
|
6
|
-
import type { GenericId } from "convex/values";
|
|
7
|
-
import { Effect, flow, Layer, Option, pipe, Schema } from "effect";
|
|
8
|
-
|
|
9
|
-
const makeStorageReader = (storageReader: ConvexStorageReader) => ({
|
|
10
|
-
getUrl: (storageId: GenericId<"_storage">) =>
|
|
11
|
-
Effect.promise(() => storageReader.getUrl(storageId)).pipe(
|
|
12
|
-
Effect.andThen(
|
|
13
|
-
flow(
|
|
14
|
-
Option.fromNullable,
|
|
15
|
-
Option.match({
|
|
16
|
-
onNone: () => Effect.fail(new BlobNotFoundError({ id: storageId })),
|
|
17
|
-
onSome: (doc) => pipe(doc, Schema.decode(Schema.URL), Effect.orDie),
|
|
18
|
-
}),
|
|
19
|
-
),
|
|
20
|
-
),
|
|
21
|
-
),
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
const makeStorageWriter = (storageWriter: ConvexStorageWriter) => ({
|
|
25
|
-
generateUploadUrl: () =>
|
|
26
|
-
Effect.promise(() => storageWriter.generateUploadUrl()).pipe(
|
|
27
|
-
Effect.andThen((url) =>
|
|
28
|
-
pipe(url, Schema.decode(Schema.URL), Effect.orDie),
|
|
29
|
-
),
|
|
30
|
-
),
|
|
31
|
-
delete: (storageId: GenericId<"_storage">) =>
|
|
32
|
-
Effect.tryPromise({
|
|
33
|
-
try: () => storageWriter.delete(storageId),
|
|
34
|
-
catch: () => new BlobNotFoundError({ id: storageId }),
|
|
35
|
-
}),
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
const makeStorageActionWriter = (
|
|
39
|
-
storageActionWriter: ConvexStorageActionWriter,
|
|
40
|
-
) => ({
|
|
41
|
-
get: (storageId: GenericId<"_storage">) =>
|
|
42
|
-
Effect.promise(() => storageActionWriter.get(storageId)).pipe(
|
|
43
|
-
Effect.andThen(
|
|
44
|
-
flow(
|
|
45
|
-
Option.fromNullable,
|
|
46
|
-
Option.match({
|
|
47
|
-
onNone: () => Effect.fail(new BlobNotFoundError({ id: storageId })),
|
|
48
|
-
onSome: Effect.succeed,
|
|
49
|
-
}),
|
|
50
|
-
),
|
|
51
|
-
),
|
|
52
|
-
),
|
|
53
|
-
store: (blob: Blob, options?: { sha256?: string }) =>
|
|
54
|
-
Effect.promise(() => storageActionWriter.store(blob, options)),
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
export class StorageReader extends Effect.Tag(
|
|
58
|
-
"@confect/server/Storage/StorageReader",
|
|
59
|
-
)<StorageReader, ReturnType<typeof makeStorageReader>>() {
|
|
60
|
-
static readonly layer = (storageReader: ConvexStorageReader) =>
|
|
61
|
-
Layer.succeed(this, makeStorageReader(storageReader));
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export class StorageWriter extends Effect.Tag(
|
|
65
|
-
"@confect/server/Storage/StorageWriter",
|
|
66
|
-
)<StorageWriter, ReturnType<typeof makeStorageWriter>>() {
|
|
67
|
-
static readonly layer = (storageWriter: ConvexStorageWriter) =>
|
|
68
|
-
Layer.succeed(this, makeStorageWriter(storageWriter));
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export class StorageActionWriter extends Effect.Tag(
|
|
72
|
-
"@confect/server/Storage/StorageActionWriter",
|
|
73
|
-
)<StorageActionWriter, ReturnType<typeof makeStorageActionWriter>>() {
|
|
74
|
-
static readonly layer = (storageActionWriter: ConvexStorageActionWriter) =>
|
|
75
|
-
Layer.succeed(this, makeStorageActionWriter(storageActionWriter));
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
export class BlobNotFoundError extends Schema.TaggedError<BlobNotFoundError>()(
|
|
79
|
-
"BlobNotFoundError",
|
|
80
|
-
{
|
|
81
|
-
id: Schema.String,
|
|
82
|
-
},
|
|
83
|
-
) {
|
|
84
|
-
override get message(): string {
|
|
85
|
-
return `File with ID '${this.id}' not found`;
|
|
86
|
-
}
|
|
87
|
-
}
|