@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.
Files changed (99) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/ActionRunner.d.ts +2 -2
  3. package/dist/ActionRunner.d.ts.map +1 -1
  4. package/dist/ActionRunner.js +9 -7
  5. package/dist/ActionRunner.js.map +1 -1
  6. package/dist/BlobNotFoundError.d.ts +17 -0
  7. package/dist/BlobNotFoundError.d.ts.map +1 -0
  8. package/dist/BlobNotFoundError.js +14 -0
  9. package/dist/BlobNotFoundError.js.map +1 -0
  10. package/dist/CronJob.d.ts +22 -0
  11. package/dist/CronJob.d.ts.map +1 -0
  12. package/dist/CronJob.js +23 -0
  13. package/dist/CronJob.js.map +1 -0
  14. package/dist/CronJobs.d.ts +28 -0
  15. package/dist/CronJobs.d.ts.map +1 -0
  16. package/dist/CronJobs.js +75 -0
  17. package/dist/CronJobs.js.map +1 -0
  18. package/dist/DatabaseWriter.d.ts +4 -4
  19. package/dist/FunctionImpl.js +2 -2
  20. package/dist/FunctionImpl.js.map +1 -1
  21. package/dist/Handler.d.ts +22 -14
  22. package/dist/Handler.d.ts.map +1 -1
  23. package/dist/Handler.js.map +1 -1
  24. package/dist/HttpApi.d.ts +3 -1
  25. package/dist/HttpApi.d.ts.map +1 -1
  26. package/dist/HttpApi.js +3 -1
  27. package/dist/HttpApi.js.map +1 -1
  28. package/dist/MutationRunner.d.ts +2 -2
  29. package/dist/MutationRunner.d.ts.map +1 -1
  30. package/dist/MutationRunner.js +9 -7
  31. package/dist/MutationRunner.js.map +1 -1
  32. package/dist/OrderedQuery.d.ts +2 -2
  33. package/dist/OrderedQuery.d.ts.map +1 -1
  34. package/dist/OrderedQuery.js +3 -2
  35. package/dist/OrderedQuery.js.map +1 -1
  36. package/dist/QueryInitializer.d.ts +1 -1
  37. package/dist/QueryInitializer.d.ts.map +1 -1
  38. package/dist/QueryRunner.d.ts +2 -2
  39. package/dist/QueryRunner.d.ts.map +1 -1
  40. package/dist/QueryRunner.js +7 -5
  41. package/dist/QueryRunner.js.map +1 -1
  42. package/dist/RegisteredConvexFunction.d.ts +11 -10
  43. package/dist/RegisteredConvexFunction.d.ts.map +1 -1
  44. package/dist/RegisteredConvexFunction.js +23 -19
  45. package/dist/RegisteredConvexFunction.js.map +1 -1
  46. package/dist/RegisteredFunction.d.ts +20 -7
  47. package/dist/RegisteredFunction.d.ts.map +1 -1
  48. package/dist/RegisteredFunction.js +3 -1
  49. package/dist/RegisteredFunction.js.map +1 -1
  50. package/dist/RegisteredFunctions.d.ts +4 -4
  51. package/dist/RegisteredFunctions.d.ts.map +1 -1
  52. package/dist/RegisteredFunctions.js.map +1 -1
  53. package/dist/RegisteredNodeFunction.d.ts +3 -3
  54. package/dist/RegisteredNodeFunction.d.ts.map +1 -1
  55. package/dist/RegisteredNodeFunction.js +6 -5
  56. package/dist/RegisteredNodeFunction.js.map +1 -1
  57. package/dist/RegistryItem.d.ts +9 -9
  58. package/dist/RegistryItem.d.ts.map +1 -1
  59. package/dist/RegistryItem.js +2 -2
  60. package/dist/RegistryItem.js.map +1 -1
  61. package/dist/StorageActionWriter.d.ts +35 -0
  62. package/dist/StorageActionWriter.d.ts.map +1 -0
  63. package/dist/StorageActionWriter.js +20 -0
  64. package/dist/StorageActionWriter.js.map +1 -0
  65. package/dist/StorageReader.d.ts +26 -0
  66. package/dist/StorageReader.d.ts.map +1 -0
  67. package/dist/StorageReader.js +17 -0
  68. package/dist/StorageReader.js.map +1 -0
  69. package/dist/StorageWriter.d.ts +29 -0
  70. package/dist/StorageWriter.d.ts.map +1 -0
  71. package/dist/StorageWriter.js +20 -0
  72. package/dist/StorageWriter.js.map +1 -0
  73. package/dist/index.d.ts +8 -3
  74. package/dist/index.js +7 -2
  75. package/package.json +4 -4
  76. package/src/ActionRunner.ts +27 -13
  77. package/src/BlobNotFoundError.ts +12 -0
  78. package/src/CronJob.ts +45 -0
  79. package/src/CronJobs.ts +161 -0
  80. package/src/FunctionImpl.ts +3 -3
  81. package/src/Handler.ts +42 -19
  82. package/src/HttpApi.ts +3 -1
  83. package/src/MutationRunner.ts +27 -13
  84. package/src/OrderedQuery.ts +15 -6
  85. package/src/QueryRunner.ts +22 -8
  86. package/src/RegisteredConvexFunction.ts +54 -42
  87. package/src/RegisteredFunction.ts +89 -2
  88. package/src/RegisteredFunctions.ts +10 -11
  89. package/src/RegisteredNodeFunction.ts +23 -13
  90. package/src/RegistryItem.ts +9 -12
  91. package/src/StorageActionWriter.ts +28 -0
  92. package/src/StorageReader.ts +27 -0
  93. package/src/StorageWriter.ts +26 -0
  94. package/src/index.ts +7 -2
  95. package/dist/Storage.d.ts +0 -69
  96. package/dist/Storage.d.ts.map +0 -1
  97. package/dist/Storage.js +0 -46
  98. package/dist/Storage.js.map +0 -1
  99. 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, StorageReader, StorageWriter } from "./Storage";
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 RegisteredFunction =
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 Function extends FunctionSpec.AnyWithProps
31
- ? FunctionSpec.RegisteredFunction<Function>
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 Function extends FunctionSpec.AnyWithProps
42
- ? FunctionSpec.RegisteredFunction<Function>
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.RegisteredFunction | AnyWithProps;
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.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
- RegistryItem.AnyWithProps,
75
- RegisteredFunction.RegisteredFunction
76
- >(functionImplItems, RegistryItem.isRegistryItem, (registryItem) =>
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
- { function_, handler }: RegistryItem.AnyWithProps,
17
- ): RegisteredFunction.RegisteredFunction => {
18
- const genericFunction = Match.value(function_.functionVisibility).pipe(
19
- Match.when("public", () => actionGeneric),
20
- Match.when("internal", () => internalActionGeneric),
21
- Match.exhaustive,
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
- return genericFunction(
25
- nodeActionFunction(api.databaseSchema, {
26
- args: function_.args,
27
- returns: function_.returns,
28
- handler,
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,
@@ -18,27 +18,24 @@ export interface RegistryItem<
18
18
  FunctionSpec_ extends FunctionSpec.AnyWithProps,
19
19
  > {
20
20
  readonly [TypeId]: TypeId;
21
- readonly function_: FunctionSpec_;
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 function_: FunctionSpec.AnyWithProps;
28
- readonly handler: Handler.AnyWithProps;
27
+ readonly functionSpec: FunctionSpec.AnyWithProps;
28
+ readonly handler: Handler.Any;
29
29
  }
30
30
 
31
- export const make = <
32
- DatabaseSchema_ extends DatabaseSchema.AnyWithProps,
33
- FunctionSpec_ extends FunctionSpec.AnyWithProps,
34
- >({
35
- function_,
31
+ export const make = ({
32
+ functionSpec,
36
33
  handler,
37
34
  }: {
38
- function_: FunctionSpec_;
39
- handler: Handler.Handler<DatabaseSchema_, FunctionSpec_>;
40
- }): RegistryItem<DatabaseSchema_, FunctionSpec_> =>
35
+ functionSpec: FunctionSpec.AnyWithProps;
36
+ handler: AnyWithProps["handler"];
37
+ }): AnyWithProps =>
41
38
  Object.assign(Object.create(RegistryItemProto), {
42
- function_,
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 Storage from "./Storage";
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
@@ -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
@@ -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
- }