@shivaedev/contract 0.18.0 → 0.19.1

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 (100) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +168 -178
  3. package/dist/automaticLive.d.ts +2 -2
  4. package/dist/automaticLive.d.ts.map +1 -1
  5. package/dist/automaticLive.js +4 -3
  6. package/dist/automaticLive.js.map +1 -1
  7. package/dist/bind.d.ts +11 -2
  8. package/dist/bind.d.ts.map +1 -1
  9. package/dist/bind.js +9 -0
  10. package/dist/bind.js.map +1 -1
  11. package/dist/clientOptions.d.ts +23 -0
  12. package/dist/clientOptions.d.ts.map +1 -0
  13. package/dist/clientOptions.js +2 -0
  14. package/dist/clientOptions.js.map +1 -0
  15. package/dist/contract.d.ts +4 -2
  16. package/dist/contract.d.ts.map +1 -1
  17. package/dist/contract.js +6 -5
  18. package/dist/contract.js.map +1 -1
  19. package/dist/internal/bindingOwner.d.ts +1 -1
  20. package/dist/internal/bindingOwner.d.ts.map +1 -1
  21. package/dist/internal/clientOperations.d.ts.map +1 -1
  22. package/dist/internal/clientOperations.js +28 -7
  23. package/dist/internal/clientOperations.js.map +1 -1
  24. package/dist/internal/httpClient.d.ts +21 -0
  25. package/dist/internal/httpClient.d.ts.map +1 -0
  26. package/dist/internal/httpClient.js +13 -0
  27. package/dist/internal/httpClient.js.map +1 -0
  28. package/dist/internal/operationDeclaration.d.ts +19 -0
  29. package/dist/internal/operationDeclaration.d.ts.map +1 -0
  30. package/dist/internal/operationDeclaration.js +20 -0
  31. package/dist/internal/operationDeclaration.js.map +1 -0
  32. package/dist/internal/queryHints.d.ts +8 -0
  33. package/dist/internal/queryHints.d.ts.map +1 -0
  34. package/dist/internal/queryHints.js +34 -0
  35. package/dist/internal/queryHints.js.map +1 -0
  36. package/dist/live.d.ts +7 -1
  37. package/dist/live.d.ts.map +1 -1
  38. package/dist/live.js +2 -2
  39. package/dist/live.js.map +1 -1
  40. package/dist/makeLiveServer.d.ts +27 -1
  41. package/dist/makeLiveServer.d.ts.map +1 -1
  42. package/dist/makeLiveServer.js +15 -8
  43. package/dist/makeLiveServer.js.map +1 -1
  44. package/dist/operation.d.ts +13 -9
  45. package/dist/operation.d.ts.map +1 -1
  46. package/dist/operation.js +5 -19
  47. package/dist/operation.js.map +1 -1
  48. package/dist/publicConfig.d.ts +9 -3
  49. package/dist/publicConfig.d.ts.map +1 -1
  50. package/dist/publicConfig.js +2 -1
  51. package/dist/publicConfig.js.map +1 -1
  52. package/dist/querySubscription.d.ts +15 -0
  53. package/dist/querySubscription.d.ts.map +1 -0
  54. package/dist/querySubscription.js +10 -0
  55. package/dist/querySubscription.js.map +1 -0
  56. package/dist/readPolicy.d.ts +11 -6
  57. package/dist/readPolicy.d.ts.map +1 -1
  58. package/dist/readPolicy.js +16 -19
  59. package/dist/readPolicy.js.map +1 -1
  60. package/dist/readPolicyErrors.d.ts +13 -0
  61. package/dist/readPolicyErrors.d.ts.map +1 -0
  62. package/dist/readPolicyErrors.js +6 -0
  63. package/dist/readPolicyErrors.js.map +1 -0
  64. package/dist/serverMetadata.d.ts +29 -11
  65. package/dist/serverMetadata.d.ts.map +1 -1
  66. package/dist/serverMetadata.js +19 -12
  67. package/dist/serverMetadata.js.map +1 -1
  68. package/dist/testing.d.ts +13 -1
  69. package/dist/testing.d.ts.map +1 -1
  70. package/dist/testing.js +1 -4
  71. package/dist/testing.js.map +1 -1
  72. package/package.json +6 -5
  73. package/src/automaticLive.ts +8 -3
  74. package/src/bind.ts +45 -3
  75. package/src/clientOptions.ts +35 -0
  76. package/src/contract.ts +11 -6
  77. package/src/internal/bindingOwner.ts +1 -1
  78. package/src/internal/clientOperations.ts +32 -11
  79. package/src/internal/httpClient.ts +21 -0
  80. package/src/internal/operationDeclaration.ts +28 -0
  81. package/src/internal/queryHints.ts +38 -0
  82. package/src/live.ts +2 -2
  83. package/src/makeLiveServer.ts +18 -12
  84. package/src/operation.ts +27 -37
  85. package/src/publicConfig.ts +2 -2
  86. package/src/querySubscription.ts +21 -0
  87. package/src/readPolicy.ts +23 -23
  88. package/src/readPolicyErrors.ts +4 -0
  89. package/src/serverMetadata.ts +35 -19
  90. package/src/testing.ts +2 -12
  91. package/dist/internal/makeHintPolicy.d.ts +0 -4
  92. package/dist/internal/makeHintPolicy.d.ts.map +0 -1
  93. package/dist/internal/makeHintPolicy.js +0 -25
  94. package/dist/internal/makeHintPolicy.js.map +0 -1
  95. package/dist/keys.d.ts +0 -34
  96. package/dist/keys.d.ts.map +0 -1
  97. package/dist/keys.js +0 -25
  98. package/dist/keys.js.map +0 -1
  99. package/src/internal/makeHintPolicy.ts +0 -40
  100. package/src/keys.ts +0 -62
package/dist/live.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import { Duration, Effect, Option, Schema, Stream } from "effect";
2
2
  import * as Atom from "effect/reactivity/Atom";
3
3
  import * as Reactivity from "effect/reactivity/Reactivity";
4
+ import { invalidationKeys, Key, readKeys } from "@shivaedev/changes/keys.ts";
4
5
  import { invalidateLive } from "#internal/liveInvalidation.ts";
5
- import { invalidationKeys, Key, readKeys } from "#keys.ts";
6
6
  export const LiveHint = Schema.Union([
7
- Schema.Struct({ _tag: Schema.Literal("Changed"), keys: Schema.Array(Key) }),
7
+ Schema.Struct({ _tag: Schema.Literal("Changed"), keys: Schema.Array(Key), queryIndexes: Schema.optional(Schema.Array(Schema.Number)) }),
8
8
  Schema.Struct({ _tag: Schema.Literal("Resync") }),
9
9
  ]);
10
10
  const MAX_PENDING = 256;
package/dist/live.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"live.js","sourceRoot":"","sources":["../src/live.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"live.js","sourceRoot":"","sources":["../src/live.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,36 @@
1
1
  import { Effect, Stream } from "effect";
2
2
  import * as Reactivity from "effect/reactivity/Reactivity";
3
- import { type Key, type KeyContext } from "#keys.ts";
3
+ import { type Key, type KeyContext } from "@shivaedev/changes/keys.ts";
4
+ import type { QuerySubscription } from "#querySubscription.ts";
4
5
  export declare const makeLiveServer: Effect.Effect<{
5
6
  resync: Effect.Effect<number, never, never>;
6
7
  stream: (keys: readonly Key[], context?: KeyContext) => Stream.Stream<{
7
8
  readonly _tag: "Changed";
8
9
  readonly keys: readonly ({
10
+ readonly _tag: "Bucket";
11
+ readonly collection: string;
12
+ readonly field: string;
13
+ readonly value: string | number;
14
+ } | {
15
+ readonly _tag: "List";
16
+ readonly collection: string;
17
+ } | {
18
+ readonly _tag: "Item";
19
+ readonly collection: string;
20
+ readonly id: string | number;
21
+ })[];
22
+ readonly queryIndexes?: readonly number[] | undefined;
23
+ } | {
24
+ readonly _tag: "Resync";
25
+ }, never, never>;
26
+ subscribe: (subscription: QuerySubscription, context?: KeyContext) => Stream.Stream<{
27
+ readonly _tag: "Changed";
28
+ readonly keys: readonly ({
29
+ readonly _tag: "Bucket";
30
+ readonly collection: string;
31
+ readonly field: string;
32
+ readonly value: string | number;
33
+ } | {
9
34
  readonly _tag: "List";
10
35
  readonly collection: string;
11
36
  } | {
@@ -13,6 +38,7 @@ export declare const makeLiveServer: Effect.Effect<{
13
38
  readonly collection: string;
14
39
  readonly id: string | number;
15
40
  })[];
41
+ readonly queryIndexes?: readonly number[] | undefined;
16
42
  } | {
17
43
  readonly _tag: "Resync";
18
44
  }, never, never>;
@@ -1 +1 @@
1
- {"version":3,"file":"makeLiveServer.d.ts","sourceRoot":"","sources":["../src/makeLiveServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAS,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,KAAK,UAAU,MAAM,8BAA8B,CAAC;AAE3D,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,UAAU,EAAY,MAAM,UAAU,CAAC;AAG/D,eAAO,MAAM,cAAc;;mBAIJ,SAAS,GAAG,EAAE,YAAY,UAAU;;;;;;;;;;;;;gCAiEzD,CAAC"}
1
+ {"version":3,"file":"makeLiveServer.d.ts","sourceRoot":"","sources":["../src/makeLiveServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAS,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,KAAK,UAAU,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,UAAU,EAAY,MAAM,4BAA4B,CAAC;AAGjF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,eAAO,MAAM,cAAc;;mBAuEV,SAAS,GAAG,EAAE,YAAY,UAAU;;;;;;;;;;;;;;;;;;;8BACzB,iBAAiB,YAAY,UAAU;;;;;;;;;;;;;;;;;;;gCAEjE,CAAC"}
@@ -1,15 +1,14 @@
1
1
  import { Effect, Queue, Stream } from "effect";
2
2
  import * as Reactivity from "effect/reactivity/Reactivity";
3
- import { makeHintPolicy } from "#internal/makeHintPolicy.ts";
4
- import { readKeys } from "#keys.ts";
3
+ import { readKeys } from "@shivaedev/changes/keys.ts";
4
+ import { changedHint } from "#internal/queryHints.ts";
5
5
  export const makeLiveServer = Effect.gen(function* () {
6
6
  const reactivity = yield* Reactivity.Reactivity;
7
7
  let openStreams = 0;
8
8
  const resyncKey = `@shivaedev/contract/resync/${crypto.randomUUID()}`;
9
- function stream(keys, context) {
9
+ function open(keys, context, subscription) {
10
10
  return Stream.unwrap(Effect.gen(function* () {
11
11
  const queue = yield* Queue.unbounded();
12
- const allowedKeys = yield* makeHintPolicy(keys.length, (retryKeys) => Queue.offer(queue, { _tag: "Changed", keys: retryKeys }).pipe(Effect.asVoid));
13
12
  const pending = new Map();
14
13
  let scheduled = false;
15
14
  let resync = false;
@@ -48,15 +47,23 @@ export const makeLiveServer = Effect.gen(function* () {
48
47
  }
49
48
  }));
50
49
  yield* Queue.offer(queue, { _tag: "Resync" });
51
- return Stream.fromQueue(queue).pipe(Stream.mapEffect((hint) => hint._tag === "Resync"
52
- ? Effect.succeed(hint)
53
- : Effect.map(allowedKeys(hint.keys), (allowed) => ({ _tag: "Changed", keys: allowed }))), Stream.filter((hint) => hint._tag === "Resync" || hint.keys.length > 0));
50
+ function authorizeHint(hint) {
51
+ if (hint._tag === "Resync") {
52
+ return Effect.succeed(hint);
53
+ }
54
+ return Effect.map(subscription?.authorized ?? Effect.succeed(true), (allowed) => changedHint(allowed ? hint.keys : [], subscription?.scopes));
55
+ }
56
+ return Stream.fromQueue(queue).pipe(Stream.mapEffect(authorizeHint), Stream.filter((hint) => hint._tag === "Resync" || hint.keys.length > 0));
54
57
  }));
55
58
  }
56
59
  const resync = Effect.sync(() => {
57
60
  reactivity.invalidateUnsafe([resyncKey]);
58
61
  return openStreams;
59
62
  });
60
- return { resync, stream };
63
+ return {
64
+ resync,
65
+ stream: (keys, context) => open(keys, context),
66
+ subscribe: (subscription, context) => open(subscription.keys, context, subscription),
67
+ };
61
68
  });
62
69
  //# sourceMappingURL=makeLiveServer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"makeLiveServer.js","sourceRoot":"","sources":["../src/makeLiveServer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"makeLiveServer.js","sourceRoot":"","sources":["../src/makeLiveServer.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
- import { Schema } from "effect";
1
+ import type { Option, Schema } from "effect";
2
+ import type { Key } from "@shivaedev/changes/keys.ts";
2
3
  import type { Bivariant } from "@shivaedev/types/Bivariant.ts";
3
- import type { Key } from "./keys.ts";
4
- import { type MatchingTags, type Reject, type RejectionSpecs, type Rejections, type RejectionUnion } from "./rejection.ts";
4
+ import type { QueryReadPolicy, Viewer } from "#readPolicy.ts";
5
+ import type { MatchingTags, Reject, RejectionSpecs, Rejections, RejectionUnion } from "./rejection.ts";
5
6
  export type PayloadSchema<TPayload extends Schema.Top | Schema.Struct.Fields> = TPayload extends Schema.Struct.Fields ? Schema.Struct<TPayload> : TPayload;
6
7
  type NoRejections = Record<never, never>;
7
8
  export interface OperationShape {
@@ -16,14 +17,15 @@ export interface OperationShape {
16
17
  }
17
18
  export interface QueryShape extends OperationShape {
18
19
  readonly kind: "query";
19
- reads: Bivariant<(payload: unknown) => readonly Key[]>;
20
+ readonly readPolicy?: Bivariant<QueryReadPolicy<unknown>>;
21
+ reads: Bivariant<(payload: unknown, viewer: Option.Option<Viewer>) => readonly Key[]>;
20
22
  }
21
23
  export interface StreamShape extends OperationShape {
22
24
  readonly kind: "stream";
23
25
  reads: Bivariant<(payload: unknown) => readonly Key[]>;
24
26
  }
25
27
  export interface CommandShape extends OperationShape {
26
- invalidates: Bivariant<(payload: unknown, result: unknown) => readonly Key[]>;
28
+ invalidates: Bivariant<(payload: unknown, result: unknown, viewer?: Option.Option<Viewer>) => readonly Key[]>;
27
29
  readonly kind: "command";
28
30
  }
29
31
  interface Operation<TName extends string, TPayload extends Schema.Top, TSuccess extends Schema.Top, TSpecs extends RejectionSpecs> extends OperationShape {
@@ -37,14 +39,15 @@ interface Operation<TName extends string, TPayload extends Schema.Top, TSuccess
37
39
  }
38
40
  export interface Query<TName extends string, TPayload extends Schema.Top, TSuccess extends Schema.Top, TSpecs extends RejectionSpecs> extends Operation<TName, TPayload, TSuccess, TSpecs> {
39
41
  readonly kind: "query";
40
- reads: (payload: TPayload["Type"]) => readonly Key[];
42
+ readonly readPolicy?: QueryReadPolicy<TPayload["Type"]>;
43
+ reads: (payload: TPayload["Type"], viewer: Option.Option<Viewer>) => readonly Key[];
41
44
  }
42
45
  export interface Streaming<TName extends string, TPayload extends Schema.Top, TSuccess extends Schema.Top, TSpecs extends RejectionSpecs> extends Operation<TName, TPayload, TSuccess, TSpecs> {
43
46
  readonly kind: "stream";
44
47
  reads: (payload: TPayload["Type"]) => readonly Key[];
45
48
  }
46
49
  export interface Command<TName extends string, TPayload extends Schema.Top, TSuccess extends Schema.Top, TSpecs extends RejectionSpecs> extends Operation<TName, TPayload, TSuccess, TSpecs> {
47
- invalidates: (payload: TPayload["Type"], result: TSuccess["Type"]) => readonly Key[];
50
+ invalidates: (payload: TPayload["Type"], result: TSuccess["Type"], viewer?: Option.Option<Viewer>) => readonly Key[];
48
51
  readonly kind: "command";
49
52
  }
50
53
  interface Declaration<TPayload extends Schema.Top | Schema.Struct.Fields, TSuccess extends Schema.Top, TSpecs extends RejectionSpecs> {
@@ -53,10 +56,11 @@ interface Declaration<TPayload extends Schema.Top | Schema.Struct.Fields, TSucce
53
56
  readonly success?: TSuccess;
54
57
  }
55
58
  export declare function query<const TName extends string, TPayload extends Schema.Top | Schema.Struct.Fields = Schema.Void, TSuccess extends Schema.Top = Schema.Void, const TSpecs extends RejectionSpecs = NoRejections>(name: TName, declaration: Declaration<TPayload, TSuccess, TSpecs> & {
56
- readonly reads: (payload: PayloadSchema<TPayload>["Type"]) => readonly Key[];
59
+ readonly reads: (payload: PayloadSchema<TPayload>["Type"], viewer: Option.Option<Viewer>) => readonly Key[];
60
+ readonly readPolicy?: QueryReadPolicy<PayloadSchema<TPayload>["Type"]>;
57
61
  }): NoInfer<Query<TName, PayloadSchema<TPayload>, TSuccess, TSpecs>>;
58
62
  export declare function command<const TName extends string, TPayload extends Schema.Top | Schema.Struct.Fields = Schema.Void, TSuccess extends Schema.Top = Schema.Void, const TSpecs extends RejectionSpecs = NoRejections>(name: TName, declaration: Declaration<TPayload, TSuccess, TSpecs> & {
59
- readonly invalidates: (payload: PayloadSchema<TPayload>["Type"], result: TSuccess["Type"]) => readonly Key[];
63
+ readonly invalidates: (payload: PayloadSchema<TPayload>["Type"], result: TSuccess["Type"], viewer?: Option.Option<Viewer>) => readonly Key[];
60
64
  }): NoInfer<Command<TName, PayloadSchema<TPayload>, TSuccess, TSpecs>>;
61
65
  export declare function stream<const TName extends string, TPayload extends Schema.Top | Schema.Struct.Fields = Schema.Void, TSuccess extends Schema.Top = Schema.Void, const TSpecs extends RejectionSpecs = NoRejections>(name: TName, declaration: Declaration<TPayload, TSuccess, TSpecs> & {
62
66
  readonly success: TSuccess;
@@ -1 +1 @@
1
- {"version":3,"file":"operation.d.ts","sourceRoot":"","sources":["../src/operation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"operation.d.ts","sourceRoot":"","sources":["../src/operation.ts"],"names":[],"mappings":"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"}
package/dist/operation.js CHANGED
@@ -1,25 +1,11 @@
1
- import { Schema } from "effect";
2
- import { rejectionSet } from "./rejection.js";
3
- function payloadSchema(payload) {
4
- if (payload === undefined) {
5
- return Schema.Void;
6
- }
7
- return Schema.isSchema(payload) ? payload : Schema.Struct(payload);
8
- }
9
- function operation(kind, name, declaration) {
10
- const { payload, success, rejections = {} } = declaration;
1
+ import { operation } from "#internal/operationDeclaration.ts";
2
+ export function query(name, declaration) {
11
3
  return {
12
- kind,
13
- name,
14
- payload: payloadSchema(payload),
15
- rejections,
16
- success: success ?? Schema.Void,
17
- ...rejectionSet(rejections),
4
+ ...operation("query", name, declaration),
5
+ reads: declaration.reads,
6
+ ...(declaration.readPolicy === undefined ? {} : { readPolicy: declaration.readPolicy }),
18
7
  };
19
8
  }
20
- export function query(name, declaration) {
21
- return { ...operation("query", name, declaration), reads: declaration.reads };
22
- }
23
9
  export function command(name, declaration) {
24
10
  return { ...operation("command", name, declaration), invalidates: declaration.invalidates };
25
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"operation.js","sourceRoot":"","sources":["../src/operation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,OAAO,EAA6F,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA2EzI,SAAS,aAAa,CAAC,OAAyB;IAC/C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,MAAM,CAAC,IAAI,CAAC;IACpB,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,SAAS,CAAuC,IAAW,EAAE,IAAY,EAAE,WAAkB;IACrG,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG,EAAE,EAAE,GAAG,WAAW,CAAC;IAC1D,OAAO;QACN,IAAI;QACJ,IAAI;QACJ,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC;QAC/B,UAAU;QACV,OAAO,EAAE,OAAO,IAAI,MAAM,CAAC,IAAI;QAC/B,GAAG,YAAY,CAAC,UAAU,CAAC;KAC3B,CAAC;AACH,CAAC;AAaD,MAAM,UAAU,KAAK,CAAC,IAAY,EAAE,WAA6E;IAChH,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC;AAC/E,CAAC;AAaD,MAAM,UAAU,OAAO,CACtB,IAAY,EACZ,WAAoG;IAEpG,OAAO,EAAE,GAAG,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,WAAW,EAAE,CAAC;AAC7F,CAAC;AAcD,MAAM,UAAU,MAAM,CAAC,IAAY,EAAE,WAA6E;IACjH,OAAO,EAAE,GAAG,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC;AAChF,CAAC"}
1
+ {"version":3,"file":"operation.js","sourceRoot":"","sources":["../src/operation.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAqF1E,MAAM,UAAU,KAAK,CACpB,IAAY,EACZ,WAGC;IAED,OAAO;QACN,GAAG,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC;QACxC,KAAK,EAAE,WAAW,CAAC,KAAK;QACxB,GAAG,CAAC,WAAW,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,WAAW,CAAC,UAAU,EAAE,CAAC;KACvF,CAAC;AACH,CAAC;AAaD,MAAM,UAAU,OAAO,CACtB,IAAY,EACZ,WAAoI;IAEpI,OAAO,EAAE,GAAG,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,WAAW,EAAE,CAAC;AAC7F,CAAC;AAcD,MAAM,UAAU,MAAM,CAAC,IAAY,EAAE,WAA6E;IACjH,OAAO,EAAE,GAAG,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC;AAChF,CAAC"}
@@ -1,5 +1,5 @@
1
- import type { Schema } from "effect";
2
- export declare function publicConfig<T, E>(schema: Schema.Codec<T, E>): import("#contract.ts").Contract<"platform.publicConfig", readonly [NoInfer<import("#operation.ts").Query<"get", Schema.Void, Schema.Codec<T, E, never, never>, {}>>], readonly [], import("effect/rpc/Rpc").Rpc<"platform.publicConfig.get", Schema.Void, Schema.Codec<T, E, never, never>, Schema.Never, never, never> | import("effect/rpc/Rpc").Rpc<"platform.publicConfig.$changes", Schema.Struct<{
1
+ import { type Schema } from "effect";
2
+ export declare function publicConfig<T, E>(schema: Schema.Codec<T, E>): import("#contract.ts").Contract<"platform.publicConfig", readonly [NoInfer<import("#operation.ts").Query<"get", Schema.Void, Schema.Codec<T, E, never, never>, {}>>], readonly [], import("effect/rpc/Rpc").Rpc<"platform.publicConfig.get", Schema.Void, Schema.Codec<T, E, never, never>, Schema.Union<readonly [Schema.Never, typeof import("./readPolicyErrors.ts").QueryReadDenied]>, never, never> | import("effect/rpc/Rpc").Rpc<"platform.publicConfig.$changes", Schema.Struct<{
3
3
  queries: Schema.$Array<Schema.Union<readonly Schema.Struct<{
4
4
  query: Schema.Literal<"get">;
5
5
  payload: Schema.Void;
@@ -7,6 +7,11 @@ export declare function publicConfig<T, E>(schema: Schema.Codec<T, E>): import("
7
7
  }>, import("effect/rpc/RpcSchema").Stream<Schema.Union<readonly [Schema.Struct<{
8
8
  readonly _tag: Schema.Literal<"Changed">;
9
9
  readonly keys: Schema.$Array<Schema.Union<readonly [Schema.Struct<{
10
+ readonly _tag: Schema.Literal<"Bucket">;
11
+ readonly collection: Schema.String;
12
+ readonly field: Schema.String;
13
+ readonly value: Schema.Union<readonly [Schema.String, Schema.Number]>;
14
+ }>, Schema.Struct<{
10
15
  readonly _tag: Schema.Literal<"List">;
11
16
  readonly collection: Schema.String;
12
17
  }>, Schema.Struct<{
@@ -14,7 +19,8 @@ export declare function publicConfig<T, E>(schema: Schema.Codec<T, E>): import("
14
19
  readonly collection: Schema.String;
15
20
  readonly id: Schema.Union<readonly [Schema.String, Schema.Number]>;
16
21
  }>]>>;
22
+ readonly queryIndexes: Schema.optional<Schema.$Array<Schema.Number>>;
17
23
  }>, Schema.Struct<{
18
24
  readonly _tag: Schema.Literal<"Resync">;
19
- }>]>, Schema.Never>, Schema.Never, never, never>, readonly [], undefined>;
25
+ }>]>, Schema.Union<readonly [typeof import("./readPolicyErrors.ts").MissingReadPolicy, typeof import("./readPolicyErrors.ts").QueryReadDenied]>>, Schema.Never, never, never>, readonly [], undefined>;
20
26
  //# sourceMappingURL=publicConfig.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"publicConfig.d.ts","sourceRoot":"","sources":["../src/publicConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIrC,wBAAgB,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;;;;;;;;;;;;;;;;;0EAI5D"}
1
+ {"version":3,"file":"publicConfig.d.ts","sourceRoot":"","sources":["../src/publicConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AAI7C,wBAAgB,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;uMAI5D"}
@@ -1,8 +1,9 @@
1
+ import { Effect } from "effect";
1
2
  import { contract } from "#contract.ts";
2
3
  import { query } from "#operation.ts";
3
4
  export function publicConfig(schema) {
4
5
  return contract("platform.publicConfig", {
5
- queries: [query("get", { reads: () => [], success: schema })],
6
+ queries: [query("get", { readPolicy: () => Effect.succeed(true), reads: () => [], success: schema })],
6
7
  });
7
8
  }
8
9
  //# sourceMappingURL=publicConfig.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"publicConfig.js","sourceRoot":"","sources":["../src/publicConfig.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,MAAM,UAAU,YAAY,CAAO,MAA0B;IAC5D,OAAO,QAAQ,CAAC,uBAAuB,EAAE;QACxC,OAAO,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;KAC7D,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"publicConfig.js","sourceRoot":"","sources":["../src/publicConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAe,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,MAAM,UAAU,YAAY,CAAO,MAA0B;IAC5D,OAAO,QAAQ,CAAC,uBAAuB,EAAE;QACxC,OAAO,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;KACrG,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { Effect, type Option } from "effect";
2
+ import type { Key } from "@shivaedev/changes/keys.ts";
3
+ import { type Viewer } from "#readPolicy.ts";
4
+ import type { QueryRequest } from "#serverMetadata.ts";
5
+ export interface QuerySubscription {
6
+ readonly authorized: Effect.Effect<boolean>;
7
+ readonly keys: readonly Key[];
8
+ readonly scopes: readonly (readonly Key[])[];
9
+ }
10
+ export declare const querySubscription: (queries: readonly QueryRequest[], viewer: Option.Option<Viewer>) => Effect.Effect<{
11
+ authorized: Effect.Effect<boolean, never, never>;
12
+ keys: Key[];
13
+ scopes: (readonly Key[])[];
14
+ }, import("./readPolicyErrors.ts").MissingReadPolicy | import("./readPolicyErrors.ts").QueryReadDenied, never>;
15
+ //# sourceMappingURL=querySubscription.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"querySubscription.d.ts","sourceRoot":"","sources":["../src/querySubscription.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAc,KAAK,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5C,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,EAAE,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,GAAG,EAAE,CAAC,EAAE,CAAC;CAC7C;AAED,eAAO,MAAM,iBAAiB;;;;8GAS5B,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { Context, Effect } from "effect";
2
+ import { checkQuery } from "#readPolicy.ts";
3
+ export const querySubscription = Effect.fnUntraced(function* (queries, viewer) {
4
+ yield* Effect.forEach(queries, ({ query, payload }) => checkQuery(query, payload, viewer));
5
+ const context = Context.makeUnsafe((yield* Effect.context()).mapUnsafe);
6
+ const scopes = queries.map(({ query, payload }) => query.reads(payload, viewer));
7
+ const authorized = Effect.map(Effect.forEach(queries, ({ query, payload }) => Effect.provideContext(query.readPolicy?.(payload, viewer) ?? Effect.succeed(false), context)), (permissions) => permissions.every(Boolean));
8
+ return { authorized, keys: scopes.flat(), scopes };
9
+ });
10
+ //# sourceMappingURL=querySubscription.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"querySubscription.js","sourceRoot":"","sources":["../src/querySubscription.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAe,MAAM,QAAQ,CAAC;AAEtD,OAAO,EAAE,UAAU,EAAe,MAAM,gBAAgB,CAAC;AASzD,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,OAAgC,EAAE,MAA6B;IAC5H,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3F,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAS,CAAC,CAAC,SAAS,CAAC,CAAC;IACxF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IACjF,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAC5B,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC,EAC7I,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAC3C,CAAC;IACF,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAA8B,CAAC;AAChF,CAAC,CAAC,CAAC"}
@@ -1,10 +1,15 @@
1
- import { Context, type Duration, Effect } from "effect";
1
+ import { Context, Effect, Option } from "effect";
2
2
  import type { Rpc } from "effect/rpc";
3
- import type { Key } from "./keys.ts";
4
- export declare const ReadPolicy: Context.Reference<(key: Key) => Effect.Effect<boolean, unknown>>;
5
- export declare const ReadPolicyMemoWindow: Context.Reference<Duration.Input>;
6
- export declare const authorizeReads: <A, E, R, TPolicyServices, TDenied, TPolicyError>(effect: Effect.Effect<A, E, R>, request: {
3
+ import type { QueryShape } from "#operation.ts";
4
+ import { MissingReadPolicy, QueryReadDenied } from "#readPolicyErrors.ts";
5
+ export interface Viewer {
6
+ readonly id: string;
7
+ }
8
+ export type QueryReadPolicy<TPayload> = (payload: TPayload, viewer: Option.Option<Viewer>) => Effect.Effect<boolean, never, unknown>;
9
+ export declare const CurrentViewer: Context.Reference<Option.Option<Viewer>>;
10
+ export declare const checkQuery: (query: QueryShape, payload: unknown, viewer: Option.Option<Viewer>) => Effect.Effect<undefined, MissingReadPolicy | QueryReadDenied, never>;
11
+ export declare const authorizeReads: <A, E, R>(effect: Effect.Effect<A, E, R>, request: {
7
12
  readonly rpc: Rpc.AnyWithProps;
8
13
  readonly payload: unknown;
9
- }, policy: (key: Key) => Effect.Effect<boolean, TPolicyError, TPolicyServices>, denied: Effect.Effect<never, TDenied, never>) => Effect.Effect<A, E | TDenied | TPolicyError, TPolicyServices | Exclude<R, never>>;
14
+ }, viewer: Option.Option<Viewer>) => Effect.Effect<A, E | MissingReadPolicy | QueryReadDenied, Exclude<R, never>>;
10
15
  //# sourceMappingURL=readPolicy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"readPolicy.d.ts","sourceRoot":"","sources":["../src/readPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAC;AAChE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAGrC,eAAO,MAAM,UAAU,0BAA2B,GAAG,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAEvF,CAAC;AAEH,eAAO,MAAM,oBAAoB,mCAE/B,CAAC;AAEH,eAAO,MAAM,cAAc,GAAgC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,eAAe,EAAE,OAAO,EAAE,YAAY;kBAEhF,GAAG,CAAC,YAAY;sBAAoB,OAAO;iBACtD,GAAG,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,eAAe,CAAC,oIAgB1E,CAAC"}
1
+ {"version":3,"file":"readPolicy.d.ts","sourceRoot":"","sources":["../src/readPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG1E,MAAM,WAAW,MAAM;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACpB;AACD,MAAM,MAAM,eAAe,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAErI,eAAO,MAAM,aAAa,0CAA+G,CAAC;AAC1I,eAAO,MAAM,UAAU,8IAQrB,CAAC;AAEH,eAAO,MAAM,cAAc,GAAgC,CAAC,EAAE,CAAC,EAAE,CAAC;kBAExC,GAAG,CAAC,YAAY;sBAAoB,OAAO;iHAQnE,CAAC"}
@@ -1,24 +1,21 @@
1
1
  import { Context, Effect, Option } from "effect";
2
- import { QueryReads } from "./serverMetadata.js";
3
- export const ReadPolicy = Context.Reference("@shivaedev/contract/ReadPolicy", {
4
- defaultValue: () => () => Effect.succeed(true),
5
- });
6
- export const ReadPolicyMemoWindow = Context.Reference("@shivaedev/contract/ReadPolicyMemoWindow", {
7
- defaultValue: () => "1 second",
8
- });
9
- export const authorizeReads = Effect.fnUntraced(function* (effect, request, policy, denied) {
10
- const context = yield* Effect.context();
11
- function canRead(key) {
12
- return Effect.provideContext(policy(key), context);
2
+ import { MissingReadPolicy, QueryReadDenied } from "#readPolicyErrors.ts";
3
+ import { QueryDefinition } from "#serverMetadata.ts";
4
+ export const CurrentViewer = Context.Reference("@shivaedev/contract/CurrentViewer", { defaultValue: Option.none });
5
+ export const checkQuery = Effect.fnUntraced(function* (query, payload, viewer) {
6
+ if (query.readPolicy === undefined) {
7
+ return yield* new MissingReadPolicy({ message: `Declare a readPolicy on query ${query.name} before running it live or subscribing` });
13
8
  }
14
- const reads = Context.getOption(request.rpc.annotations, QueryReads);
15
- if (Option.isSome(reads)) {
16
- for (const key of reads.value(request.payload)) {
17
- if (!(yield* canRead(key))) {
18
- return yield* denied;
19
- }
20
- }
9
+ const context = Context.makeUnsafe((yield* Effect.context()).mapUnsafe);
10
+ if (!(yield* Effect.provideContext(query.readPolicy(payload, viewer), context))) {
11
+ return yield* new QueryReadDenied({ message: `Read not allowed for query ${query.name}` });
12
+ }
13
+ });
14
+ export const authorizeReads = Effect.fnUntraced(function* (effect, request, viewer) {
15
+ const definition = Context.getOption(request.rpc.annotations, QueryDefinition);
16
+ if (Option.isSome(definition) && definition.value.definition.readPolicy !== undefined) {
17
+ yield* checkQuery(definition.value.definition, request.payload, viewer);
21
18
  }
22
- return yield* Effect.provideService(effect, ReadPolicy, canRead);
19
+ return yield* Effect.provideService(effect, CurrentViewer, viewer);
23
20
  });
24
21
  //# sourceMappingURL=readPolicy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"readPolicy.js","sourceRoot":"","sources":["../src/readPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAiB,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,CAAC,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAgD,gCAAgC,EAAE;IAC5H,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;CAC9C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAC,SAAS,CAAiB,0CAA0C,EAAE;IACjH,YAAY,EAAE,GAAG,EAAE,CAAC,UAAU;CAC9B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EACxD,MAA8B,EAC9B,OAAsE,EACtE,MAA2E,EAC3E,MAAqC;IAErC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAmB,CAAC;IACzD,SAAS,OAAO,CAAC,GAAQ;QACxB,OAAO,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACrE,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC5B,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC;YACtB,CAAC;QACF,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;AAClE,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"readPolicy.js","sourceRoot":"","sources":["../src/readPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGjD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAOrD,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAwB,mCAAmC,EAAE,EAAE,YAAY,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1I,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,KAAiB,EAAE,OAAgB,EAAE,MAA6B;IACxH,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC,CAAC,IAAI,iBAAiB,CAAC,EAAE,OAAO,EAAE,iCAAiC,KAAK,CAAC,IAAI,wCAAwC,EAAE,CAAC,CAAC;IACvI,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAS,CAAC,CAAC,SAAS,CAAC,CAAC;IACxF,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;QACjF,OAAO,KAAK,CAAC,CAAC,IAAI,eAAe,CAAC,EAAE,OAAO,EAAE,8BAA8B,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC5F,CAAC;AACF,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EACxD,MAA8B,EAC9B,OAAsE,EACtE,MAA6B;IAE7B,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IAC/E,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACvF,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;AACpE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { Schema } from "effect";
2
+ declare const MissingReadPolicy_base: Schema.Class<MissingReadPolicy, Schema.TaggedStruct<"MissingReadPolicy", {
3
+ readonly message: Schema.String;
4
+ }>, import("effect/Cause").YieldableError>;
5
+ export declare class MissingReadPolicy extends MissingReadPolicy_base {
6
+ }
7
+ declare const QueryReadDenied_base: Schema.Class<QueryReadDenied, Schema.TaggedStruct<"QueryReadDenied", {
8
+ readonly message: Schema.String;
9
+ }>, import("effect/Cause").YieldableError>;
10
+ export declare class QueryReadDenied extends QueryReadDenied_base {
11
+ }
12
+ export {};
13
+ //# sourceMappingURL=readPolicyErrors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readPolicyErrors.d.ts","sourceRoot":"","sources":["../src/readPolicyErrors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;;;;AAEhC,qBAAa,iBAAkB,SAAQ,sBAAwF;CAAG;;;;AAClI,qBAAa,eAAgB,SAAQ,oBAAoF;CAAG"}
@@ -0,0 +1,6 @@
1
+ import { Schema } from "effect";
2
+ export class MissingReadPolicy extends Schema.TaggedError()("MissingReadPolicy", { message: Schema.String }) {
3
+ }
4
+ export class QueryReadDenied extends Schema.TaggedError()("QueryReadDenied", { message: Schema.String }) {
5
+ }
6
+ //# sourceMappingURL=readPolicyErrors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readPolicyErrors.js","sourceRoot":"","sources":["../src/readPolicyErrors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,OAAO,iBAAkB,SAAQ,MAAM,CAAC,WAAW,EAAqB,CAAC,mBAAmB,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;CAAG;AAClI,MAAM,OAAO,eAAgB,SAAQ,MAAM,CAAC,WAAW,EAAmB,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;CAAG"}
@@ -1,11 +1,26 @@
1
- import { Context, Schema } from "effect";
1
+ import { Context, Effect, Option, Schema } from "effect";
2
2
  import { Rpc } from "effect/rpc";
3
- import type { Key } from "#keys.ts";
4
- import type { QueryShape } from "#operation.ts";
5
- declare const QueryReads_base: Context.ServiceClass<QueryReads, "@shivaedev/contract/QueryReads", import("@shivaedev/types/Bivariant.ts").Bivariant<(payload: unknown) => readonly Key[]>>;
6
- export declare class QueryReads extends QueryReads_base {
3
+ import type { Key } from "@shivaedev/changes/keys.ts";
4
+ import type { CommandShape, QueryShape } from "#operation.ts";
5
+ import type { Viewer } from "#readPolicy.ts";
6
+ import { MissingReadPolicy, QueryReadDenied } from "#readPolicyErrors.ts";
7
+ declare const QueryDefinition_base: Context.ServiceClass<QueryDefinition, "@shivaedev/contract/QueryDefinition", {
8
+ readonly definition: QueryShape;
9
+ }>;
10
+ export declare class QueryDefinition extends QueryDefinition_base {
7
11
  }
8
- declare const CommandInvalidation_base: Context.ServiceClass<CommandInvalidation, "@shivaedev/contract/CommandInvalidation", import("@shivaedev/types/Bivariant.ts").Bivariant<(payload: unknown, result: unknown) => readonly Key[]>>;
12
+ export interface QueryRequest {
13
+ readonly payload: unknown;
14
+ readonly query: QueryShape;
15
+ }
16
+ declare const ChangesQueries_base: Context.ServiceClass<ChangesQueries, "@shivaedev/contract/ChangesQueries", {
17
+ readonly resolve: (references: readonly QueryReference[]) => Effect.Effect<readonly QueryRequest[]>;
18
+ }>;
19
+ export declare class ChangesQueries extends ChangesQueries_base {
20
+ }
21
+ declare const CommandInvalidation_base: Context.ServiceClass<CommandInvalidation, "@shivaedev/contract/CommandInvalidation", {
22
+ readonly invalidates: CommandShape["invalidates"];
23
+ }>;
9
24
  export declare class CommandInvalidation extends CommandInvalidation_base {
10
25
  }
11
26
  declare const KeyScope_base: Context.ServiceClass<KeyScope, "@shivaedev/contract/KeyScope", "session">;
@@ -19,15 +34,17 @@ type ReferenceSchema<TQuery extends QueryShape> = TQuery extends QueryShape ? Sc
19
34
  query: Schema.Literal<TQuery["name"]>;
20
35
  payload: TQuery["payload"];
21
36
  }> : never;
22
- declare const ChangesReads_base: Context.ServiceClass<ChangesReads, "@shivaedev/contract/ChangesReads", (references: readonly QueryReference[]) => readonly Key[]>;
23
- export declare class ChangesReads extends ChangesReads_base {
24
- }
25
- export declare function queryKeys(queries: readonly QueryShape[], requested: readonly QueryReference[]): readonly Key[];
37
+ export declare const queryKeys: (queries: readonly QueryShape[], requested: readonly QueryReference[], viewer?: Option.Option<Viewer> | undefined) => Effect.Effect<readonly Key[], never, never>;
26
38
  export declare function changesRpc<const TName extends string, const TQueries extends readonly QueryShape[]>(name: TName, queries: TQueries): Rpc.Rpc<`${TName}.$changes`, Schema.Struct<{
27
39
  queries: Schema.$Array<Schema.Union<readonly ReferenceSchema<TQueries[number]>[]>>;
28
40
  }>, import("effect/rpc/RpcSchema").Stream<Schema.Union<readonly [Schema.Struct<{
29
41
  readonly _tag: Schema.Literal<"Changed">;
30
42
  readonly keys: Schema.$Array<Schema.Union<readonly [Schema.Struct<{
43
+ readonly _tag: Schema.Literal<"Bucket">;
44
+ readonly collection: Schema.String;
45
+ readonly field: Schema.String;
46
+ readonly value: Schema.Union<readonly [Schema.String, Schema.Number]>;
47
+ }>, Schema.Struct<{
31
48
  readonly _tag: Schema.Literal<"List">;
32
49
  readonly collection: Schema.String;
33
50
  }>, Schema.Struct<{
@@ -35,8 +52,9 @@ export declare function changesRpc<const TName extends string, const TQueries ex
35
52
  readonly collection: Schema.String;
36
53
  readonly id: Schema.Union<readonly [Schema.String, Schema.Number]>;
37
54
  }>]>>;
55
+ readonly queryIndexes: Schema.optional<Schema.$Array<Schema.Number>>;
38
56
  }>, Schema.Struct<{
39
57
  readonly _tag: Schema.Literal<"Resync">;
40
- }>]>, Schema.Never>, Schema.Never, never, never>;
58
+ }>]>, Schema.Union<readonly [typeof MissingReadPolicy, typeof QueryReadDenied]>>, Schema.Never, never, never>;
41
59
  export {};
42
60
  //# sourceMappingURL=serverMetadata.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"serverMetadata.d.ts","sourceRoot":"","sources":["../src/serverMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEpC,OAAO,KAAK,EAAgB,UAAU,EAAE,MAAM,eAAe,CAAC;;AAE9D,qBAAa,UAAW,SAAQ,eAAoF;CAAG;;AAEvH,qBAAa,mBAAoB,SAAQ,wBAExC;CAAG;;AAEJ,qBAAa,QAAS,SAAQ,aAAsE;CAAG;AAEvG,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAED,KAAK,eAAe,CAAC,MAAM,SAAS,UAAU,IAAI,MAAM,SAAS,UAAU,GACxE,MAAM,CAAC,MAAM,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;CAAE,CAAC,GACpF,KAAK,CAAC;qHAEoE,SAAS,cAAc,EAAE,KAAK,SAAS,GAAG,EAAE;AAAzH,qBAAa,YAAa,SAAQ,iBAEjC;CAAG;AAEJ,wBAAgB,SAAS,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,cAAc,EAAE,GAAG,SAAS,GAAG,EAAE,CAQ9G;AASD,wBAAgB,UAAU,CAAC,KAAK,CAAC,KAAK,SAAS,MAAM,EAAE,KAAK,CAAC,QAAQ,SAAS,SAAS,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ;;;;;;;;;;;;;;iDAKlI"}
1
+ {"version":3,"file":"serverMetadata.d.ts","sourceRoot":"","sources":["../src/serverMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,4BAA4B,CAAC;AAEtD,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;;yBAEmB,UAAU;;AAAvG,qBAAa,eAAgB,SAAQ,oBAA8G;CAAG;AACtJ,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC3B;;sBAImB,CAAC,UAAU,EAAE,SAAS,cAAc,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,YAAY,EAAE,CAAC;;AAHrG,qBAAa,cAAe,SAAQ,mBAKK;CAAG;;0BAE0D,YAAY,CAAC,aAAa,CAAC;;AAAjI,qBAAa,mBAAoB,SAAQ,wBAExC;CAAG;;AAEJ,qBAAa,QAAS,SAAQ,aAAsE;CAAG;AAEvG,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAED,KAAK,eAAe,CAAC,MAAM,SAAS,UAAU,IAAI,MAAM,SAAS,UAAU,GACxE,MAAM,CAAC,MAAM,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;CAAE,CAAC,GACpF,KAAK,CAAC;AAST,eAAO,MAAM,SAAS,mKAOpB,CAAC;AASH,wBAAgB,UAAU,CAAC,KAAK,CAAC,KAAK,SAAS,MAAM,EAAE,KAAK,CAAC,QAAQ,SAAS,SAAS,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ;;;;;;;;;;;;;;;;;;;;8GAOlI"}