@shivaedev/contract 0.0.0 → 0.16.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 (94) hide show
  1. package/CHANGELOG.md +210 -0
  2. package/LICENSE +21 -0
  3. package/README.md +510 -1
  4. package/dist/automaticLive.d.ts +28 -0
  5. package/dist/automaticLive.d.ts.map +1 -0
  6. package/dist/automaticLive.js +63 -0
  7. package/dist/automaticLive.js.map +1 -0
  8. package/dist/bind.d.ts +51 -0
  9. package/dist/bind.d.ts.map +1 -0
  10. package/dist/bind.js +14 -0
  11. package/dist/bind.js.map +1 -0
  12. package/dist/contract.d.ts +33 -0
  13. package/dist/contract.d.ts.map +1 -0
  14. package/dist/contract.js +44 -0
  15. package/dist/contract.js.map +1 -0
  16. package/dist/internal/bindingOwner.d.ts +8 -0
  17. package/dist/internal/bindingOwner.d.ts.map +1 -0
  18. package/dist/internal/bindingOwner.js +16 -0
  19. package/dist/internal/bindingOwner.js.map +1 -0
  20. package/dist/internal/clientOperations.d.ts +21 -0
  21. package/dist/internal/clientOperations.d.ts.map +1 -0
  22. package/dist/internal/clientOperations.js +36 -0
  23. package/dist/internal/clientOperations.js.map +1 -0
  24. package/dist/internal/liveInvalidation.d.ts +12 -0
  25. package/dist/internal/liveInvalidation.d.ts.map +1 -0
  26. package/dist/internal/liveInvalidation.js +14 -0
  27. package/dist/internal/liveInvalidation.js.map +1 -0
  28. package/dist/internal/makeHintPolicy.d.ts +4 -0
  29. package/dist/internal/makeHintPolicy.d.ts.map +1 -0
  30. package/dist/internal/makeHintPolicy.js +25 -0
  31. package/dist/internal/makeHintPolicy.js.map +1 -0
  32. package/dist/internal/queryReactivity.d.ts +5 -0
  33. package/dist/internal/queryReactivity.d.ts.map +1 -0
  34. package/dist/internal/queryReactivity.js +96 -0
  35. package/dist/internal/queryReactivity.js.map +1 -0
  36. package/dist/keys.d.ts +34 -0
  37. package/dist/keys.d.ts.map +1 -0
  38. package/dist/keys.js +25 -0
  39. package/dist/keys.js.map +1 -0
  40. package/dist/live.d.ts +39 -0
  41. package/dist/live.d.ts.map +1 -0
  42. package/dist/live.js +98 -0
  43. package/dist/live.js.map +1 -0
  44. package/dist/makeLiveServer.d.ts +20 -0
  45. package/dist/makeLiveServer.d.ts.map +1 -0
  46. package/dist/makeLiveServer.js +62 -0
  47. package/dist/makeLiveServer.js.map +1 -0
  48. package/dist/operation.d.ts +66 -0
  49. package/dist/operation.d.ts.map +1 -0
  50. package/dist/operation.js +29 -0
  51. package/dist/operation.js.map +1 -0
  52. package/dist/publicConfig.d.ts +20 -0
  53. package/dist/publicConfig.d.ts.map +1 -0
  54. package/dist/publicConfig.js +8 -0
  55. package/dist/publicConfig.js.map +1 -0
  56. package/dist/queryCoalesceWindow.d.ts +4 -0
  57. package/dist/queryCoalesceWindow.d.ts.map +1 -0
  58. package/dist/queryCoalesceWindow.js +11 -0
  59. package/dist/queryCoalesceWindow.js.map +1 -0
  60. package/dist/readPolicy.d.ts +10 -0
  61. package/dist/readPolicy.d.ts.map +1 -0
  62. package/dist/readPolicy.js +24 -0
  63. package/dist/readPolicy.js.map +1 -0
  64. package/dist/rejection.d.ts +41 -0
  65. package/dist/rejection.d.ts.map +1 -0
  66. package/dist/rejection.js +16 -0
  67. package/dist/rejection.js.map +1 -0
  68. package/dist/resume.d.ts +17 -0
  69. package/dist/resume.d.ts.map +1 -0
  70. package/dist/resume.js +28 -0
  71. package/dist/resume.js.map +1 -0
  72. package/dist/serverMetadata.d.ts +42 -0
  73. package/dist/serverMetadata.d.ts.map +1 -0
  74. package/dist/serverMetadata.js +27 -0
  75. package/dist/serverMetadata.js.map +1 -0
  76. package/package.json +73 -4
  77. package/src/automaticLive.ts +93 -0
  78. package/src/bind.ts +103 -0
  79. package/src/contract.ts +140 -0
  80. package/src/internal/bindingOwner.ts +24 -0
  81. package/src/internal/clientOperations.ts +74 -0
  82. package/src/internal/liveInvalidation.ts +21 -0
  83. package/src/internal/makeHintPolicy.ts +40 -0
  84. package/src/internal/queryReactivity.ts +109 -0
  85. package/src/keys.ts +62 -0
  86. package/src/live.ts +122 -0
  87. package/src/makeLiveServer.ts +76 -0
  88. package/src/operation.ts +145 -0
  89. package/src/publicConfig.ts +9 -0
  90. package/src/queryCoalesceWindow.ts +13 -0
  91. package/src/readPolicy.ts +33 -0
  92. package/src/rejection.ts +91 -0
  93. package/src/resume.ts +44 -0
  94. package/src/serverMetadata.ts +50 -0
package/dist/live.js ADDED
@@ -0,0 +1,98 @@
1
+ import { Duration, Effect, Option, Schema, Stream } from "effect";
2
+ import * as Atom from "effect/reactivity/Atom";
3
+ import * as Reactivity from "effect/reactivity/Reactivity";
4
+ import { invalidateLive } from "#internal/liveInvalidation.ts";
5
+ import { invalidationKeys, Key, readKeys } from "#keys.ts";
6
+ export const LiveHint = Schema.Union([
7
+ Schema.Struct({ _tag: Schema.Literal("Changed"), keys: Schema.Array(Key) }),
8
+ Schema.Struct({ _tag: Schema.Literal("Resync") }),
9
+ ]);
10
+ const MAX_PENDING = 256;
11
+ export function live(runtime, options) {
12
+ const coalesceWindow = Atom.keepAlive(Atom.make(options.coalesceWindow ?? "20 millis"));
13
+ const paused = Atom.make(false);
14
+ const status = Atom.make({ connection: "connecting", failure: Option.none(), needsResync: true, pending: 0 });
15
+ const connection = runtime
16
+ .atom((get) => Effect.gen(function* () {
17
+ get.mount(status);
18
+ const reactivity = yield* Reactivity.Reactivity;
19
+ function update(value) {
20
+ get.set(status, { ...get.once(status), ...value });
21
+ }
22
+ const pending = new Set();
23
+ let timer;
24
+ function clear() {
25
+ clearTimeout(timer);
26
+ timer = undefined;
27
+ pending.clear();
28
+ }
29
+ let active = true;
30
+ get.addFinalizer(() => {
31
+ active = false;
32
+ clear();
33
+ });
34
+ function changed(changedKeys) {
35
+ const window = get.once(coalesceWindow);
36
+ const keys = invalidationKeys(changedKeys, options.keyContext);
37
+ invalidateLive(reactivity, keys, () => active && !get.once(paused), window);
38
+ const delay = Duration.toMillis(Duration.fromInputUnsafe(window));
39
+ if (delay === 0) {
40
+ invalidateLive(reactivity, keys, () => active && !get.once(paused));
41
+ return;
42
+ }
43
+ for (const key of invalidationKeys(changedKeys, options.keyContext)) {
44
+ pending.add(key);
45
+ }
46
+ timer ??= setTimeout(() => {
47
+ const queued = [...pending];
48
+ clear();
49
+ if (!get.once(paused)) {
50
+ invalidateLive(reactivity, queued, () => active && !get.once(paused));
51
+ }
52
+ }, delay);
53
+ }
54
+ function resync() {
55
+ clear();
56
+ if (get.once(paused)) {
57
+ update({ needsResync: true });
58
+ return;
59
+ }
60
+ const keys = typeof options.resyncKeys === "function" ? options.resyncKeys(get.registry) : options.resyncKeys;
61
+ reactivity.invalidateUnsafe(keys.map((key) => readKeys([key], options.keyContext)[0] ?? ""));
62
+ update({ needsResync: false, pending: 0 });
63
+ }
64
+ // A subscription alone does not build the flag, so its first read would otherwise announce a change.
65
+ get.once(paused);
66
+ get.subscribe(paused, (value) => {
67
+ if (!value) {
68
+ resync();
69
+ }
70
+ });
71
+ if (options.resume !== undefined) {
72
+ // A subscription alone does not initialize a derived signal's dependencies.
73
+ get.once(options.resume);
74
+ get.subscribe(options.resume, resync);
75
+ }
76
+ const attempt = Effect.suspend(() => {
77
+ let isFirst = true;
78
+ function observe(hint) {
79
+ update({ connection: "live", failure: Option.none() });
80
+ if (get.once(paused)) {
81
+ update({ needsResync: true, pending: Math.min(MAX_PENDING, get.once(status).pending + 1) });
82
+ }
83
+ else if (isFirst || hint._tag === "Resync") {
84
+ resync();
85
+ }
86
+ else {
87
+ changed(hint.keys);
88
+ }
89
+ isFirst = false;
90
+ }
91
+ return options.stream.pipe(Stream.runForEach((hint) => Effect.sync(() => observe(hint))), Effect.scoped, Effect.catchCause((failure) => Effect.sync(() => update({ failure: Option.some(failure) }))), Effect.andThen(Effect.sync(() => update({ connection: "reconnecting", needsResync: true }))), Effect.andThen(Effect.sleep(options.retryDelay ?? "1 second")));
92
+ });
93
+ yield* Effect.forever(attempt);
94
+ }))
95
+ .pipe(Atom.setIdleTTL(0));
96
+ return { coalesceWindow, connection, paused, status };
97
+ }
98
+ //# sourceMappingURL=live.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live.js","sourceRoot":"","sources":["../src/live.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { Effect, Stream } from "effect";
2
+ import * as Reactivity from "effect/reactivity/Reactivity";
3
+ import { type Key, type KeyContext } from "#keys.ts";
4
+ export declare const makeLiveServer: Effect.Effect<{
5
+ resync: Effect.Effect<number, never, never>;
6
+ stream: (keys: readonly Key[], context?: KeyContext) => Stream.Stream<{
7
+ readonly _tag: "Changed";
8
+ readonly keys: readonly ({
9
+ readonly _tag: "List";
10
+ readonly collection: string;
11
+ } | {
12
+ readonly _tag: "Item";
13
+ readonly collection: string;
14
+ readonly id: string | number;
15
+ })[];
16
+ } | {
17
+ readonly _tag: "Resync";
18
+ }, never, never>;
19
+ }, never, Reactivity.Reactivity>;
20
+ //# sourceMappingURL=makeLiveServer.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,62 @@
1
+ import { Effect, Queue, Stream } from "effect";
2
+ import * as Reactivity from "effect/reactivity/Reactivity";
3
+ import { makeHintPolicy } from "#internal/makeHintPolicy.ts";
4
+ import { readKeys } from "#keys.ts";
5
+ export const makeLiveServer = Effect.gen(function* () {
6
+ const reactivity = yield* Reactivity.Reactivity;
7
+ let openStreams = 0;
8
+ const resyncKey = `@shivaedev/contract/resync/${crypto.randomUUID()}`;
9
+ function stream(keys, context) {
10
+ return Stream.unwrap(Effect.gen(function* () {
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
+ const pending = new Map();
14
+ let scheduled = false;
15
+ let resync = false;
16
+ let active = true;
17
+ function flush() {
18
+ if (scheduled) {
19
+ return;
20
+ }
21
+ scheduled = true;
22
+ queueMicrotask(() => {
23
+ scheduled = false;
24
+ if (active) {
25
+ Queue.offerUnsafe(queue, resync ? { _tag: "Resync" } : { _tag: "Changed", keys: [...pending.values()] });
26
+ }
27
+ pending.clear();
28
+ resync = false;
29
+ });
30
+ }
31
+ const cancel = keys.map((key) => {
32
+ const own = readKeys([key], context);
33
+ return reactivity.registerUnsafe(own, () => {
34
+ pending.set(own[0] ?? "", key);
35
+ flush();
36
+ });
37
+ });
38
+ cancel.push(reactivity.registerUnsafe([resyncKey], () => {
39
+ resync = true;
40
+ flush();
41
+ }));
42
+ openStreams += 1;
43
+ yield* Effect.addFinalizer(() => Effect.sync(() => {
44
+ active = false;
45
+ openStreams -= 1;
46
+ for (const stop of cancel) {
47
+ stop();
48
+ }
49
+ }));
50
+ 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));
54
+ }));
55
+ }
56
+ const resync = Effect.sync(() => {
57
+ reactivity.invalidateUnsafe([resyncKey]);
58
+ return openStreams;
59
+ });
60
+ return { resync, stream };
61
+ });
62
+ //# sourceMappingURL=makeLiveServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makeLiveServer.js","sourceRoot":"","sources":["../src/makeLiveServer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { Schema } from "effect";
2
+ 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";
5
+ export type PayloadSchema<TPayload extends Schema.Top | Schema.Struct.Fields> = TPayload extends Schema.Struct.Fields ? Schema.Struct<TPayload> : TPayload;
6
+ type NoRejections = Record<never, never>;
7
+ export interface OperationShape {
8
+ readonly error: Schema.Top;
9
+ readonly kind: "query" | "command" | "stream";
10
+ readonly name: string;
11
+ readonly payload: Schema.Top;
12
+ readonly Rejection: object;
13
+ readonly reject: object;
14
+ readonly rejections: RejectionSpecs;
15
+ readonly success: Schema.Top;
16
+ }
17
+ export interface QueryShape extends OperationShape {
18
+ readonly kind: "query";
19
+ reads: Bivariant<(payload: unknown) => readonly Key[]>;
20
+ }
21
+ export interface StreamShape extends OperationShape {
22
+ readonly kind: "stream";
23
+ reads: Bivariant<(payload: unknown) => readonly Key[]>;
24
+ }
25
+ export interface CommandShape extends OperationShape {
26
+ invalidates: Bivariant<(payload: unknown, result: unknown) => readonly Key[]>;
27
+ readonly kind: "command";
28
+ }
29
+ interface Operation<TName extends string, TPayload extends Schema.Top, TSuccess extends Schema.Top, TSpecs extends RejectionSpecs> extends OperationShape {
30
+ readonly error: RejectionUnion<TSpecs>;
31
+ readonly name: TName;
32
+ readonly payload: TPayload;
33
+ readonly Rejection: Rejections<TSpecs>;
34
+ readonly reject: Reject<TSpecs>;
35
+ readonly rejections: TSpecs;
36
+ readonly success: TSuccess;
37
+ }
38
+ export interface Query<TName extends string, TPayload extends Schema.Top, TSuccess extends Schema.Top, TSpecs extends RejectionSpecs> extends Operation<TName, TPayload, TSuccess, TSpecs> {
39
+ readonly kind: "query";
40
+ reads: (payload: TPayload["Type"]) => readonly Key[];
41
+ }
42
+ export interface Streaming<TName extends string, TPayload extends Schema.Top, TSuccess extends Schema.Top, TSpecs extends RejectionSpecs> extends Operation<TName, TPayload, TSuccess, TSpecs> {
43
+ readonly kind: "stream";
44
+ reads: (payload: TPayload["Type"]) => readonly Key[];
45
+ }
46
+ 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[];
48
+ readonly kind: "command";
49
+ }
50
+ interface Declaration<TPayload extends Schema.Top | Schema.Struct.Fields, TSuccess extends Schema.Top, TSpecs extends RejectionSpecs> {
51
+ readonly payload?: TPayload;
52
+ readonly rejections?: TSpecs & MatchingTags<TSpecs>;
53
+ readonly success?: TSuccess;
54
+ }
55
+ 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[];
57
+ }): NoInfer<Query<TName, PayloadSchema<TPayload>, TSuccess, TSpecs>>;
58
+ 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[];
60
+ }): NoInfer<Command<TName, PayloadSchema<TPayload>, TSuccess, TSpecs>>;
61
+ 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
+ readonly success: TSuccess;
63
+ readonly reads: (payload: PayloadSchema<TPayload>["Type"]) => readonly Key[];
64
+ }): NoInfer<Streaming<TName, PayloadSchema<TPayload>, TSuccess, TSpecs>>;
65
+ export {};
66
+ //# sourceMappingURL=operation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation.d.ts","sourceRoot":"","sources":["../src/operation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
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;
11
+ return {
12
+ kind,
13
+ name,
14
+ payload: payloadSchema(payload),
15
+ rejections,
16
+ success: success ?? Schema.Void,
17
+ ...rejectionSet(rejections),
18
+ };
19
+ }
20
+ export function query(name, declaration) {
21
+ return { ...operation("query", name, declaration), reads: declaration.reads };
22
+ }
23
+ export function command(name, declaration) {
24
+ return { ...operation("command", name, declaration), invalidates: declaration.invalidates };
25
+ }
26
+ export function stream(name, declaration) {
27
+ return { ...operation("stream", name, declaration), reads: declaration.reads };
28
+ }
29
+ //# sourceMappingURL=operation.js.map
@@ -0,0 +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"}
@@ -0,0 +1,20 @@
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<{
3
+ queries: Schema.$Array<Schema.Union<readonly Schema.Struct<{
4
+ query: Schema.Literal<"get">;
5
+ payload: Schema.Void;
6
+ }>[]>>;
7
+ }>, import("effect/rpc/RpcSchema").Stream<Schema.Union<readonly [Schema.Struct<{
8
+ readonly _tag: Schema.Literal<"Changed">;
9
+ readonly keys: Schema.$Array<Schema.Union<readonly [Schema.Struct<{
10
+ readonly _tag: Schema.Literal<"List">;
11
+ readonly collection: Schema.String;
12
+ }>, Schema.Struct<{
13
+ readonly _tag: Schema.Literal<"Item">;
14
+ readonly collection: Schema.String;
15
+ readonly id: Schema.Union<readonly [Schema.String, Schema.Number]>;
16
+ }>]>>;
17
+ }>, Schema.Struct<{
18
+ readonly _tag: Schema.Literal<"Resync">;
19
+ }>]>, Schema.Never>, Schema.Never, never, never>, readonly [], undefined>;
20
+ //# sourceMappingURL=publicConfig.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,8 @@
1
+ import { contract } from "#contract.ts";
2
+ import { query } from "#operation.ts";
3
+ export function publicConfig(schema) {
4
+ return contract("platform.publicConfig", {
5
+ queries: [query("get", { reads: () => [], success: schema })],
6
+ });
7
+ }
8
+ //# sourceMappingURL=publicConfig.js.map
@@ -0,0 +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"}
@@ -0,0 +1,4 @@
1
+ import type { Duration } from "effect";
2
+ import * as Atom from "effect/reactivity/Atom";
3
+ export declare function queryCoalesceWindow<A>(query: Atom.Atom<A>): Atom.Writable<Duration.Input | undefined>;
4
+ //# sourceMappingURL=queryCoalesceWindow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryCoalesceWindow.d.ts","sourceRoot":"","sources":["../src/queryCoalesceWindow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,wBAAwB,CAAC;AAI/C,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC,CAOrG"}
@@ -0,0 +1,11 @@
1
+ import * as Atom from "effect/reactivity/Atom";
2
+ const windows = new WeakMap();
3
+ export function queryCoalesceWindow(query) {
4
+ let window = windows.get(query);
5
+ if (window === undefined) {
6
+ window = Atom.keepAlive(Atom.make(undefined));
7
+ windows.set(query, window);
8
+ }
9
+ return window;
10
+ }
11
+ //# sourceMappingURL=queryCoalesceWindow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryCoalesceWindow.js","sourceRoot":"","sources":["../src/queryCoalesceWindow.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,wBAAwB,CAAC;AAE/C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAiE,CAAC;AAE7F,MAAM,UAAU,mBAAmB,CAAI,KAAmB;IACzD,IAAI,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAA6B,SAAS,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { Context, type Duration, Effect } from "effect";
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: {
7
+ readonly rpc: Rpc.AnyWithProps;
8
+ 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>>;
10
+ //# sourceMappingURL=readPolicy.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,24 @@
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);
13
+ }
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
+ }
21
+ }
22
+ return yield* Effect.provideService(effect, ReadPolicy, canRead);
23
+ });
24
+ //# sourceMappingURL=readPolicy.js.map
@@ -0,0 +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"}
@@ -0,0 +1,41 @@
1
+ import { type Cause, Effect, Schema } from "effect";
2
+ export type RejectionValue<TTag extends string, TFields extends Schema.Struct.Fields> = Schema.TaggedStruct<TTag, TFields>["Type"] & Cause.YieldableError;
3
+ export type RejectionClass<TTag extends string, TFields extends Schema.Struct.Fields> = Schema.Class<RejectionValue<TTag, TFields>, Schema.TaggedStruct<TTag, TFields>, Cause.YieldableError>;
4
+ export type TaggedRejection = Schema.Top & (new (...args: never) => {
5
+ readonly _tag: string;
6
+ });
7
+ export interface RejectionSpecs {
8
+ readonly [tag: string]: Schema.Struct.Fields | TaggedRejection;
9
+ }
10
+ export type Rejections<TSpecs extends RejectionSpecs> = {
11
+ readonly [TTag in keyof TSpecs & string]: TSpecs[TTag] extends TaggedRejection ? TSpecs[TTag] : TSpecs[TTag] extends Schema.Struct.Fields ? RejectionClass<TTag, TSpecs[TTag]> : never;
12
+ };
13
+ export type RejectedBy<TSpecs extends RejectionSpecs> = {
14
+ [TTag in keyof TSpecs & string]: Rejections<TSpecs>[TTag]["Type"];
15
+ }[keyof TSpecs & string];
16
+ export type Reject<TSpecs extends RejectionSpecs> = {
17
+ readonly [TTag in keyof TSpecs & string]: Rejections<TSpecs>[TTag] extends new (...args: infer TArguments) => infer TValue ? (...args: TArguments) => Effect.Effect<never, TValue> : never;
18
+ };
19
+ export type RejectionUnion<TSpecs extends RejectionSpecs> = [keyof TSpecs & string] extends [never] ? Schema.Never : Schema.Union<readonly Rejections<TSpecs>[keyof TSpecs & string][]>;
20
+ export type MatchingTags<TSpecs extends RejectionSpecs> = {
21
+ readonly [TTag in keyof TSpecs]: TSpecs[TTag] extends TaggedRejection ? TSpecs[TTag]["Type"] extends {
22
+ readonly _tag: TTag;
23
+ } ? TSpecs[TTag] : `The rejection class under "${TTag & string}" must have that _tag` : TSpecs[TTag];
24
+ };
25
+ export interface RejectionSet<TSpecs extends RejectionSpecs> {
26
+ readonly error: RejectionUnion<TSpecs>;
27
+ readonly Rejection: Rejections<TSpecs>;
28
+ readonly reject: Reject<TSpecs>;
29
+ }
30
+ export declare function rejectionSet<const TSpecs extends RejectionSpecs>(specs: TSpecs): RejectionSet<TSpecs>;
31
+ export type FieldRejection<TField extends string> = Readonly<{
32
+ field: Schema.Literals<readonly TField[]>;
33
+ message: Schema.String;
34
+ }>;
35
+ export declare function fieldRejection<const TFields extends Schema.Struct.Fields>(struct: {
36
+ readonly fields: TFields;
37
+ }): FieldRejection<keyof TFields & string>;
38
+ export declare function fieldRejection<const TFields extends Schema.Struct.Fields, const TField extends keyof TFields & string>(struct: {
39
+ readonly fields: TFields;
40
+ }, fields: readonly TField[]): FieldRejection<TField>;
41
+ //# sourceMappingURL=rejection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rejection.d.ts","sourceRoot":"","sources":["../src/rejection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { Effect, Schema } from "effect";
2
+ export function rejectionSet(specs) {
3
+ const classes = Object.entries(specs).map(([tag, spec]) => [
4
+ tag,
5
+ Schema.isSchema(spec) ? spec : Schema.TaggedError()(tag, spec),
6
+ ]);
7
+ return {
8
+ error: classes.length === 0 ? Schema.Never : Schema.Union(classes.map(([, schema]) => schema)),
9
+ Rejection: Object.fromEntries(classes),
10
+ reject: Object.fromEntries(classes.map(([tag, Rejection]) => [tag, (...args) => Effect.fail(Reflect.construct(Rejection, args))])),
11
+ };
12
+ }
13
+ export function fieldRejection(struct, fields) {
14
+ return { field: Schema.Literals(fields ?? Object.keys(struct.fields)), message: Schema.String };
15
+ }
16
+ //# sourceMappingURL=rejection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rejection.js","sourceRoot":"","sources":["../src/rejection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AA8DpD,MAAM,UAAU,YAAY,CAAC,KAAqB;IACjD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAsC,EAAE,CAAC;QAC9F,GAAG;QACH,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAwB,CAAC,GAAG,EAAE,IAAI,CAAC;KACpF,CAAC,CAAC;IACH,OAAO;QACN,KAAK,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;QAC9F,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;QACtC,MAAM,EAAE,MAAM,CAAC,WAAW,CACzB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,IAAwB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAC1H;KACD,CAAC;AACH,CAAC;AAcD,MAAM,UAAU,cAAc,CAAC,MAAiD,EAAE,MAA0B;IAC3G,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AACjG,CAAC"}
@@ -0,0 +1,17 @@
1
+ import * as Atom from "effect/reactivity/Atom";
2
+ export type ResumeSource = (resume: () => void) => () => void;
3
+ type ResumeEvent = "online" | "visibilitychange";
4
+ export interface ResumeWindow {
5
+ readonly addEventListener: (type: ResumeEvent, listener: () => void) => void;
6
+ readonly document: {
7
+ readonly visibilityState: string;
8
+ };
9
+ readonly removeEventListener: (type: ResumeEvent, listener: () => void) => void;
10
+ }
11
+ export interface ResumeOptions {
12
+ readonly native?: ResumeSource;
13
+ readonly window?: ResumeWindow;
14
+ }
15
+ export declare function resumeSignal({ window, native }: ResumeOptions): Atom.Atom<number>;
16
+ export {};
17
+ //# sourceMappingURL=resume.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../src/resume.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,wBAAwB,CAAC;AAE/C,MAAM,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;AAE9D,KAAK,WAAW,GAAG,QAAQ,GAAG,kBAAkB,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IAC7E,QAAQ,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,QAAQ,CAAC,mBAAmB,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;CAChF;AAED,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;CAC/B;AAcD,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAcjF"}
package/dist/resume.js ADDED
@@ -0,0 +1,28 @@
1
+ import * as Atom from "effect/reactivity/Atom";
2
+ function whileVisible(target, type) {
3
+ return (resume) => {
4
+ function visible() {
5
+ if (target.document.visibilityState === "visible") {
6
+ resume();
7
+ }
8
+ }
9
+ target.addEventListener(type, visible);
10
+ return () => target.removeEventListener(type, visible);
11
+ };
12
+ }
13
+ export function resumeSignal({ window, native }) {
14
+ const browser = window === undefined ? [] : [whileVisible(window, "visibilitychange"), whileVisible(window, "online")];
15
+ const sources = native === undefined ? browser : [...browser, native];
16
+ return Atom.readable((get) => {
17
+ let count = 0;
18
+ function resume() {
19
+ count += 1;
20
+ get.setSelf(count);
21
+ }
22
+ for (const source of sources) {
23
+ get.addFinalizer(source(resume));
24
+ }
25
+ return count;
26
+ });
27
+ }
28
+ //# sourceMappingURL=resume.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume.js","sourceRoot":"","sources":["../src/resume.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,wBAAwB,CAAC;AAiB/C,SAAS,YAAY,CAAC,MAAoB,EAAE,IAAiB;IAC5D,OAAO,CAAC,MAAM,EAAE,EAAE;QACjB,SAAS,OAAO;YACf,IAAI,MAAM,CAAC,QAAQ,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;gBACnD,MAAM,EAAE,CAAC;YACV,CAAC;QACF,CAAC;QACD,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACvC,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,EAAiB;IAC7D,MAAM,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAAE,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IACvH,MAAM,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC;IACtE,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE;QAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,SAAS,MAAM;YACd,KAAK,IAAI,CAAC,CAAC;YACX,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC9B,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { Context, Schema } from "effect";
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 {
7
+ }
8
+ declare const CommandInvalidation_base: Context.ServiceClass<CommandInvalidation, "@shivaedev/contract/CommandInvalidation", import("@shivaedev/types/Bivariant.ts").Bivariant<(payload: unknown, result: unknown) => readonly Key[]>>;
9
+ export declare class CommandInvalidation extends CommandInvalidation_base {
10
+ }
11
+ declare const KeyScope_base: Context.ServiceClass<KeyScope, "@shivaedev/contract/KeyScope", "session">;
12
+ export declare class KeyScope extends KeyScope_base {
13
+ }
14
+ export interface QueryReference {
15
+ readonly payload: unknown;
16
+ readonly query: string;
17
+ }
18
+ type ReferenceSchema<TQuery extends QueryShape> = TQuery extends QueryShape ? Schema.Struct<{
19
+ query: Schema.Literal<TQuery["name"]>;
20
+ payload: TQuery["payload"];
21
+ }> : 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[];
26
+ export declare function changesRpc<const TName extends string, const TQueries extends readonly QueryShape[]>(name: TName, queries: TQueries): Rpc.Rpc<`${TName}.$changes`, Schema.Struct<{
27
+ queries: Schema.$Array<Schema.Union<readonly ReferenceSchema<TQueries[number]>[]>>;
28
+ }>, import("effect/rpc/RpcSchema").Stream<Schema.Union<readonly [Schema.Struct<{
29
+ readonly _tag: Schema.Literal<"Changed">;
30
+ readonly keys: Schema.$Array<Schema.Union<readonly [Schema.Struct<{
31
+ readonly _tag: Schema.Literal<"List">;
32
+ readonly collection: Schema.String;
33
+ }>, Schema.Struct<{
34
+ readonly _tag: Schema.Literal<"Item">;
35
+ readonly collection: Schema.String;
36
+ readonly id: Schema.Union<readonly [Schema.String, Schema.Number]>;
37
+ }>]>>;
38
+ }>, Schema.Struct<{
39
+ readonly _tag: Schema.Literal<"Resync">;
40
+ }>]>, Schema.Never>, Schema.Never, never, never>;
41
+ export {};
42
+ //# sourceMappingURL=serverMetadata.d.ts.map
@@ -0,0 +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"}