@shivaedev/contract 0.17.0 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -0
- package/README.md +68 -32
- package/dist/automaticLive.d.ts +2 -2
- package/dist/automaticLive.d.ts.map +1 -1
- package/dist/automaticLive.js +4 -3
- package/dist/automaticLive.js.map +1 -1
- package/dist/bind.d.ts +11 -2
- package/dist/bind.d.ts.map +1 -1
- package/dist/bind.js +9 -0
- package/dist/bind.js.map +1 -1
- package/dist/clientOptions.d.ts +23 -0
- package/dist/clientOptions.d.ts.map +1 -0
- package/dist/clientOptions.js +2 -0
- package/dist/clientOptions.js.map +1 -0
- package/dist/contract.d.ts +4 -2
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +6 -5
- package/dist/contract.js.map +1 -1
- package/dist/internal/bindingOwner.d.ts +1 -1
- package/dist/internal/bindingOwner.d.ts.map +1 -1
- package/dist/internal/clientOperations.d.ts.map +1 -1
- package/dist/internal/clientOperations.js +26 -7
- package/dist/internal/clientOperations.js.map +1 -1
- package/dist/internal/httpClient.d.ts +21 -0
- package/dist/internal/httpClient.d.ts.map +1 -0
- package/dist/internal/httpClient.js +13 -0
- package/dist/internal/httpClient.js.map +1 -0
- package/dist/internal/operationDeclaration.d.ts +19 -0
- package/dist/internal/operationDeclaration.d.ts.map +1 -0
- package/dist/internal/operationDeclaration.js +20 -0
- package/dist/internal/operationDeclaration.js.map +1 -0
- package/dist/internal/queryHints.d.ts +8 -0
- package/dist/internal/queryHints.d.ts.map +1 -0
- package/dist/internal/queryHints.js +34 -0
- package/dist/internal/queryHints.js.map +1 -0
- package/dist/live.d.ts +7 -1
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +2 -2
- package/dist/live.js.map +1 -1
- package/dist/makeLiveServer.d.ts +27 -1
- package/dist/makeLiveServer.d.ts.map +1 -1
- package/dist/makeLiveServer.js +15 -8
- package/dist/makeLiveServer.js.map +1 -1
- package/dist/operation.d.ts +13 -9
- package/dist/operation.d.ts.map +1 -1
- package/dist/operation.js +5 -19
- package/dist/operation.js.map +1 -1
- package/dist/publicConfig.d.ts +9 -3
- package/dist/publicConfig.d.ts.map +1 -1
- package/dist/publicConfig.js +2 -1
- package/dist/publicConfig.js.map +1 -1
- package/dist/querySubscription.d.ts +15 -0
- package/dist/querySubscription.d.ts.map +1 -0
- package/dist/querySubscription.js +10 -0
- package/dist/querySubscription.js.map +1 -0
- package/dist/readPolicy.d.ts +11 -6
- package/dist/readPolicy.d.ts.map +1 -1
- package/dist/readPolicy.js +16 -19
- package/dist/readPolicy.js.map +1 -1
- package/dist/readPolicyErrors.d.ts +13 -0
- package/dist/readPolicyErrors.d.ts.map +1 -0
- package/dist/readPolicyErrors.js +6 -0
- package/dist/readPolicyErrors.js.map +1 -0
- package/dist/serverMetadata.d.ts +29 -11
- package/dist/serverMetadata.d.ts.map +1 -1
- package/dist/serverMetadata.js +19 -12
- package/dist/serverMetadata.js.map +1 -1
- package/dist/testing.d.ts +51 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +17 -0
- package/dist/testing.js.map +1 -0
- package/package.json +6 -5
- package/src/automaticLive.ts +8 -3
- package/src/bind.ts +45 -3
- package/src/clientOptions.ts +35 -0
- package/src/contract.ts +11 -6
- package/src/internal/bindingOwner.ts +1 -1
- package/src/internal/clientOperations.ts +30 -11
- package/src/internal/httpClient.ts +21 -0
- package/src/internal/operationDeclaration.ts +28 -0
- package/src/internal/queryHints.ts +38 -0
- package/src/live.ts +2 -2
- package/src/makeLiveServer.ts +18 -12
- package/src/operation.ts +27 -37
- package/src/publicConfig.ts +2 -2
- package/src/querySubscription.ts +21 -0
- package/src/readPolicy.ts +23 -23
- package/src/readPolicyErrors.ts +4 -0
- package/src/serverMetadata.ts +35 -19
- package/src/testing.ts +41 -0
- package/dist/internal/makeHintPolicy.d.ts +0 -4
- package/dist/internal/makeHintPolicy.d.ts.map +0 -1
- package/dist/internal/makeHintPolicy.js +0 -25
- package/dist/internal/makeHintPolicy.js.map +0 -1
- package/dist/keys.d.ts +0 -34
- package/dist/keys.d.ts.map +0 -1
- package/dist/keys.js +0 -25
- package/dist/keys.js.map +0 -1
- package/src/internal/makeHintPolicy.ts +0 -40
- package/src/keys.ts +0 -62
package/dist/keys.d.ts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { Schema } from "effect";
|
|
2
|
-
export type Identity = string | number;
|
|
3
|
-
export interface ListKey<TName extends string = string> {
|
|
4
|
-
readonly _tag: "List";
|
|
5
|
-
readonly collection: TName;
|
|
6
|
-
}
|
|
7
|
-
export interface ItemKey<TName extends string = string> {
|
|
8
|
-
readonly _tag: "Item";
|
|
9
|
-
readonly collection: TName;
|
|
10
|
-
readonly id: Identity;
|
|
11
|
-
}
|
|
12
|
-
export type Key = ListKey | ItemKey;
|
|
13
|
-
export declare const Key: Schema.Union<readonly [Schema.Struct<{
|
|
14
|
-
readonly _tag: Schema.Literal<"List">;
|
|
15
|
-
readonly collection: Schema.String;
|
|
16
|
-
}>, Schema.Struct<{
|
|
17
|
-
readonly _tag: Schema.Literal<"Item">;
|
|
18
|
-
readonly collection: Schema.String;
|
|
19
|
-
readonly id: Schema.Union<readonly [Schema.String, Schema.Number]>;
|
|
20
|
-
}>]>;
|
|
21
|
-
export interface Collection<TName extends string, TId extends Identity> {
|
|
22
|
-
readonly item: (id: TId) => ItemKey<TName>;
|
|
23
|
-
readonly list: ListKey<TName>;
|
|
24
|
-
readonly name: TName;
|
|
25
|
-
}
|
|
26
|
-
export declare function collection<const TName extends string, TId extends Schema.Top & {
|
|
27
|
-
readonly Type: Identity;
|
|
28
|
-
}>(name: TName, _id: TId): Collection<TName, TId["Type"]>;
|
|
29
|
-
export interface KeyContext {
|
|
30
|
-
readonly scope: string;
|
|
31
|
-
}
|
|
32
|
-
export declare function readKeys(keys: readonly Key[], context?: KeyContext): readonly string[];
|
|
33
|
-
export declare function invalidationKeys(keys: readonly Key[], context?: KeyContext): readonly string[];
|
|
34
|
-
//# sourceMappingURL=keys.d.ts.map
|
package/dist/keys.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAEvC,MAAM,WAAW,OAAO,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC;CAC3B;AAED,MAAM,WAAW,OAAO,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC;IAC3B,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;CACtB;AAED,MAAM,MAAM,GAAG,GAAG,OAAO,GAAG,OAAO,CAAC;AAEpC,eAAO,MAAM,GAAG;;;;;;;IAGd,CAAC;AAEH,MAAM,WAAW,UAAU,CAAC,KAAK,SAAS,MAAM,EAAE,GAAG,SAAS,QAAQ;IACrE,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3C,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;CACrB;AAED,wBAAgB,UAAU,CAAC,KAAK,CAAC,KAAK,SAAS,MAAM,EAAE,GAAG,SAAS,MAAM,CAAC,GAAG,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,EAC1G,IAAI,EAAE,KAAK,EACX,GAAG,EAAE,GAAG,GACN,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAMhC;AAED,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAUD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,EAAE,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,SAAS,MAAM,EAAE,CAItF;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,GAAG,EAAE,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,SAAS,MAAM,EAAE,CAI9F"}
|
package/dist/keys.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { Schema } from "effect";
|
|
2
|
-
export const Key = Schema.Union([
|
|
3
|
-
Schema.Struct({ _tag: Schema.Literal("List"), collection: Schema.String }),
|
|
4
|
-
Schema.Struct({ _tag: Schema.Literal("Item"), collection: Schema.String, id: Schema.Union([Schema.String, Schema.Number]) }),
|
|
5
|
-
]);
|
|
6
|
-
export function collection(name, _id) {
|
|
7
|
-
return {
|
|
8
|
-
item: (id) => ({ _tag: "Item", collection: name, id }),
|
|
9
|
-
list: { _tag: "List", collection: name },
|
|
10
|
-
name,
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
function contextual(key, context) {
|
|
14
|
-
return context === undefined ? key : `${JSON.stringify(["session", context.scope])}:${key}`;
|
|
15
|
-
}
|
|
16
|
-
function own(key) {
|
|
17
|
-
return key._tag === "List" ? key.collection : `${key.collection}:${key.id}`;
|
|
18
|
-
}
|
|
19
|
-
export function readKeys(keys, context) {
|
|
20
|
-
return [...new Set(keys.flatMap((key) => (key._tag === "Item" ? [own(key), `${key.collection}:*`] : [own(key)])))].map((key) => contextual(key, context));
|
|
21
|
-
}
|
|
22
|
-
export function invalidationKeys(keys, context) {
|
|
23
|
-
return [...new Set(keys.flatMap((key) => (key._tag === "List" ? [key.collection] : [own(key), key.collection])))].map((key) => contextual(key, context));
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=keys.js.map
|
package/dist/keys.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAiBhC,MAAM,CAAC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;IAC/B,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC1E,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;CAC5H,CAAC,CAAC;AAQH,MAAM,UAAU,UAAU,CACzB,IAAW,EACX,GAAQ;IAER,OAAO;QACN,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACtD,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE;QACxC,IAAI;KACJ,CAAC;AACH,CAAC;AAMD,SAAS,UAAU,CAAC,GAAW,EAAE,OAAoB;IACpD,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;AAC7F,CAAC;AAED,SAAS,GAAG,CAAC,GAAQ;IACpB,OAAO,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAoB,EAAE,OAAoB;IAClE,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC9H,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CACxB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAoB,EAAE,OAAoB;IAC1E,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC7H,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CACxB,CAAC;AACH,CAAC"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { Cache, Data, Effect, Exit, Queue } from "effect";
|
|
2
|
-
import type { Key } from "#keys.ts";
|
|
3
|
-
import { ReadPolicy, ReadPolicyMemoWindow } from "#readPolicy.ts";
|
|
4
|
-
|
|
5
|
-
export const makeHintPolicy = Effect.fnUntraced(function* (capacity: number, retry: (keys: readonly Key[]) => Effect.Effect<void>) {
|
|
6
|
-
const policy = yield* ReadPolicy;
|
|
7
|
-
const window = yield* ReadPolicyMemoWindow;
|
|
8
|
-
const cache = yield* Cache.makeWith(policy, {
|
|
9
|
-
capacity: Math.max(1, capacity),
|
|
10
|
-
timeToLive: (exit) => (Exit.isSuccess(exit) ? window : 0),
|
|
11
|
-
});
|
|
12
|
-
const failed = new Map<string, Key>();
|
|
13
|
-
const wake = yield* Queue.unbounded<void>();
|
|
14
|
-
yield* Queue.take(wake).pipe(
|
|
15
|
-
Effect.andThen(Effect.sleep("1 second")),
|
|
16
|
-
Effect.andThen(
|
|
17
|
-
Effect.suspend(() => {
|
|
18
|
-
const keys = [...failed.values()];
|
|
19
|
-
failed.clear();
|
|
20
|
-
return retry(keys);
|
|
21
|
-
}),
|
|
22
|
-
),
|
|
23
|
-
Effect.forever,
|
|
24
|
-
Effect.forkScoped,
|
|
25
|
-
);
|
|
26
|
-
return (keys: readonly Key[]) =>
|
|
27
|
-
Effect.filter(keys, (key) =>
|
|
28
|
-
Cache.get(cache, new Data.Class<Key>(key)).pipe(
|
|
29
|
-
Effect.catch(() =>
|
|
30
|
-
Effect.gen(function* () {
|
|
31
|
-
if (failed.size === 0) {
|
|
32
|
-
yield* Queue.offer(wake, undefined);
|
|
33
|
-
}
|
|
34
|
-
failed.set(JSON.stringify(key), key);
|
|
35
|
-
return false;
|
|
36
|
-
}),
|
|
37
|
-
),
|
|
38
|
-
),
|
|
39
|
-
);
|
|
40
|
-
});
|
package/src/keys.ts
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import { Schema } from "effect";
|
|
2
|
-
|
|
3
|
-
export type Identity = string | number;
|
|
4
|
-
|
|
5
|
-
export interface ListKey<TName extends string = string> {
|
|
6
|
-
readonly _tag: "List";
|
|
7
|
-
readonly collection: TName;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export interface ItemKey<TName extends string = string> {
|
|
11
|
-
readonly _tag: "Item";
|
|
12
|
-
readonly collection: TName;
|
|
13
|
-
readonly id: Identity;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export type Key = ListKey | ItemKey;
|
|
17
|
-
|
|
18
|
-
export const Key = Schema.Union([
|
|
19
|
-
Schema.Struct({ _tag: Schema.Literal("List"), collection: Schema.String }),
|
|
20
|
-
Schema.Struct({ _tag: Schema.Literal("Item"), collection: Schema.String, id: Schema.Union([Schema.String, Schema.Number]) }),
|
|
21
|
-
]);
|
|
22
|
-
|
|
23
|
-
export interface Collection<TName extends string, TId extends Identity> {
|
|
24
|
-
readonly item: (id: TId) => ItemKey<TName>;
|
|
25
|
-
readonly list: ListKey<TName>;
|
|
26
|
-
readonly name: TName;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function collection<const TName extends string, TId extends Schema.Top & { readonly Type: Identity }>(
|
|
30
|
-
name: TName,
|
|
31
|
-
_id: TId,
|
|
32
|
-
): Collection<TName, TId["Type"]> {
|
|
33
|
-
return {
|
|
34
|
-
item: (id) => ({ _tag: "Item", collection: name, id }),
|
|
35
|
-
list: { _tag: "List", collection: name },
|
|
36
|
-
name,
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export interface KeyContext {
|
|
41
|
-
readonly scope: string;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
function contextual(key: string, context?: KeyContext): string {
|
|
45
|
-
return context === undefined ? key : `${JSON.stringify(["session", context.scope])}:${key}`;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
function own(key: Key): string {
|
|
49
|
-
return key._tag === "List" ? key.collection : `${key.collection}:${key.id}`;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export function readKeys(keys: readonly Key[], context?: KeyContext): readonly string[] {
|
|
53
|
-
return [...new Set(keys.flatMap((key) => (key._tag === "Item" ? [own(key), `${key.collection}:*`] : [own(key)])))].map((key) =>
|
|
54
|
-
contextual(key, context),
|
|
55
|
-
);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export function invalidationKeys(keys: readonly Key[], context?: KeyContext): readonly string[] {
|
|
59
|
-
return [...new Set(keys.flatMap((key) => (key._tag === "List" ? [key.collection] : [own(key), key.collection])))].map((key) =>
|
|
60
|
-
contextual(key, context),
|
|
61
|
-
);
|
|
62
|
-
}
|