@lsync/server 0.0.1 → 0.0.3
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/README.md +46 -0
- package/dist/client.d.mts +1 -1
- package/dist/client.mjs +1 -1
- package/dist/index.d.mts +26 -55
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +214 -86
- package/dist/index.mjs.map +1 -1
- package/dist/{router-D_wddPdy.d.mts → router-B9emOwKj.d.mts} +13 -110
- package/dist/{router-D_wddPdy.d.mts.map → router-B9emOwKj.d.mts.map} +1 -1
- package/dist/router-CZnnFmXh.mjs +39 -0
- package/dist/router-CZnnFmXh.mjs.map +1 -0
- package/package.json +3 -4
- package/dist/router-C4eYfMV7.mjs +0 -39
- package/dist/router-C4eYfMV7.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -8,3 +8,49 @@ pnpm add @lsync/server @lsync/definitions
|
|
|
8
8
|
|
|
9
9
|
The package exports the reusable Durable Object, worker handler, collection configuration helpers,
|
|
10
10
|
and the `@lsync/server/client` subpath for server-side clients.
|
|
11
|
+
|
|
12
|
+
SQLite JSON collections use server-sequence last-write-wins conflict resolution. `previousValue`
|
|
13
|
+
is available to access rules and history consumers, but is not a compare-and-swap precondition.
|
|
14
|
+
Mutation IDs are recorded durably, so retrying the same update is idempotent; reusing an ID with a
|
|
15
|
+
different payload is rejected.
|
|
16
|
+
|
|
17
|
+
## Safeguards
|
|
18
|
+
|
|
19
|
+
Each WebSocket may subscribe to at most 100 collection scopes by default. Override or disable the
|
|
20
|
+
cap when building the shard options:
|
|
21
|
+
|
|
22
|
+
```ts
|
|
23
|
+
const options = CollectionShardDurableObject.from(collections)
|
|
24
|
+
.limits({ maxSubscriptionsPerWebSocket: 250 }) // or false
|
|
25
|
+
.build();
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Cloudflare's managed Rate Limiting binding can protect WebSocket message handling:
|
|
29
|
+
|
|
30
|
+
```ts
|
|
31
|
+
import { cloudflareRateLimiter } from "@lsync/server";
|
|
32
|
+
|
|
33
|
+
const options = CollectionShardDurableObject.from(collections)
|
|
34
|
+
.rateLimit(
|
|
35
|
+
cloudflareRateLimiter({
|
|
36
|
+
key: ({ auth, clientId }) => String(auth.userId ?? clientId),
|
|
37
|
+
}),
|
|
38
|
+
)
|
|
39
|
+
.build();
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Configure the matching binding in `wrangler.toml` (the period must be 10 or 60 seconds):
|
|
43
|
+
|
|
44
|
+
```toml
|
|
45
|
+
[[ratelimits]]
|
|
46
|
+
name = "RATE_LIMITER"
|
|
47
|
+
namespace_id = "1001"
|
|
48
|
+
|
|
49
|
+
[ratelimits.simple]
|
|
50
|
+
limit = 100
|
|
51
|
+
period = 60
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
The managed limiter is intentionally permissive, eventually consistent, and local to a Cloudflare
|
|
55
|
+
location. Use it for abuse protection rather than billing or exact accounting. Prefer an
|
|
56
|
+
authenticated user or tenant key; `clientId` is only the fallback.
|
package/dist/client.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { A as CollectionSubscriptionInput, B as ReadOrderBy, C as CollectionApiDefinition, E as CollectionConfigs, H as ReadQuery, J as SyncChangesQuery, K as SequencedBatch, L as ReadCursor, M as OperationType, N as PushResult, R as ReadFilter, T as CollectionConfig, U as ReadResult, V as ReadPredicate, X as SyncChangesResult, Y as SyncChangesQueryInput, Z as Update, _ as ApiOutput, b as Batch, d as ApiCallInput, f as ApiContract, g as ApiInput, h as ApiHandlerContext, j as CollectionSubscriptionResult, k as CollectionSubscription, l as ApiCall, m as ApiHandlerArgs, n as Router, p as ApiHandler, q as SequencedUpdate, r as router, t as Context, u as ApiCallArgs, v as ApiPath, w as CollectionApiHandlers, x as Broadcast, y as ApiRoute, z as ReadFilterOperator } from "./router-
|
|
1
|
+
import { A as CollectionSubscriptionInput, B as ReadOrderBy, C as CollectionApiDefinition, E as CollectionConfigs, H as ReadQuery, J as SyncChangesQuery, K as SequencedBatch, L as ReadCursor, M as OperationType, N as PushResult, R as ReadFilter, T as CollectionConfig, U as ReadResult, V as ReadPredicate, X as SyncChangesResult, Y as SyncChangesQueryInput, Z as Update, _ as ApiOutput, b as Batch, d as ApiCallInput, f as ApiContract, g as ApiInput, h as ApiHandlerContext, j as CollectionSubscriptionResult, k as CollectionSubscription, l as ApiCall, m as ApiHandlerArgs, n as Router, p as ApiHandler, q as SequencedUpdate, r as router, t as Context, u as ApiCallArgs, v as ApiPath, w as CollectionApiHandlers, x as Broadcast, y as ApiRoute, z as ReadFilterOperator } from "./router-B9emOwKj.mjs";
|
|
2
2
|
export { type ApiCall, type ApiCallArgs, type ApiCallInput, type ApiContract, type ApiHandler, type ApiHandlerArgs, type ApiHandlerContext, type ApiInput, type ApiOutput, type ApiPath, type ApiRoute, type Batch, type Broadcast, type CollectionApiDefinition, type CollectionApiHandlers, type CollectionConfig, type CollectionConfigs, type CollectionSubscription, type CollectionSubscriptionInput, type CollectionSubscriptionResult, type Context, type OperationType, type PushResult, type ReadCursor, type ReadFilter, type ReadFilterOperator, type ReadOrderBy, type ReadPredicate, type ReadQuery, type ReadResult, type Router, type SequencedBatch, type SequencedUpdate, type SyncChangesQuery, type SyncChangesQueryInput, type SyncChangesResult, type Update, router };
|
package/dist/client.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as router } from "./router-
|
|
1
|
+
import { t as router } from "./router-CZnnFmXh.mjs";
|
|
2
2
|
export { router };
|
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { A as CollectionSubscriptionInput, B as ReadOrderBy, C as CollectionApiDefinition, D as CollectionInvalidation, E as CollectionConfigs, F as ReadAccessHandler, G as SQLiteJsonStorageConfig, H as ReadQuery, I as ReadAccessResult, J as SyncChangesQuery, K as SequencedBatch$1, L as ReadCursor, M as OperationType, N as PushResult, O as CollectionStorageConfig, P as ReadAccessContext, Q as WebSocketAttachment, R as ReadFilter, S as CollectionAccessConfig, T as CollectionConfig, U as ReadResult, V as ReadPredicate, W as SQLiteJsonIndexConfig, X as SyncChangesResult, Y as SyncChangesQueryInput, Z as Update, _ as ApiOutput, a as AccessReference, b as Batch, c as ApiAccessHandler, d as ApiCallInput, f as ApiContract, g as ApiInput, h as ApiHandlerContext, i as AccessAuth, j as CollectionSubscriptionResult, k as CollectionSubscription, l as ApiCall, m as ApiHandlerArgs, n as Router, o as AccessReferenceResolver, p as ApiHandler, q as SequencedUpdate, r as router, s as ApiAccessContext, t as Context, u as ApiCallArgs, v as ApiPath, w as CollectionApiHandlers, x as Broadcast, y as ApiRoute, z as ReadFilterOperator } from "./router-
|
|
1
|
+
import { A as CollectionSubscriptionInput, B as ReadOrderBy, C as CollectionApiDefinition, D as CollectionInvalidation, E as CollectionConfigs, F as ReadAccessHandler, G as SQLiteJsonStorageConfig, H as ReadQuery, I as ReadAccessResult, J as SyncChangesQuery, K as SequencedBatch$1, L as ReadCursor, M as OperationType, N as PushResult, O as CollectionStorageConfig, P as ReadAccessContext, Q as WebSocketAttachment, R as ReadFilter, S as CollectionAccessConfig, T as CollectionConfig, U as ReadResult, V as ReadPredicate, W as SQLiteJsonIndexConfig, X as SyncChangesResult, Y as SyncChangesQueryInput, Z as Update, _ as ApiOutput, a as AccessReference, b as Batch, c as ApiAccessHandler, d as ApiCallInput, f as ApiContract, g as ApiInput, h as ApiHandlerContext, i as AccessAuth, j as CollectionSubscriptionResult, k as CollectionSubscription, l as ApiCall, m as ApiHandlerArgs, n as Router, o as AccessReferenceResolver, p as ApiHandler, q as SequencedUpdate, r as router, s as ApiAccessContext, t as Context, u as ApiCallArgs, v as ApiPath, w as CollectionApiHandlers, x as Broadcast, y as ApiRoute, z as ReadFilterOperator } from "./router-B9emOwKj.mjs";
|
|
2
2
|
import { FuncExpression, ReadExpression, ReadExpressionField, ReadExpressionInput, ReadExpressionRow, ReadExpressionRow as ReadExpressionRow$1, RefExpression, ValExpression, and, compileReadExpression, eq, field, gt, gte, inArray, lt, lte, matchesReadPredicate, ne, not, or, readExpressionReferences, readExpressionRow, val } from "@lsync/transport";
|
|
3
|
-
import { z } from "zod";
|
|
4
3
|
import { CollectionAtPath, CollectionDefinitions, CollectionPath, CollectionSet } from "@lsync/definitions";
|
|
5
4
|
|
|
6
5
|
//#region src/sqlite-json-read.d.ts
|
|
@@ -24,6 +23,7 @@ declare function ensureSQLiteJsonTables(sql: SqlStorageLike, collections?: Colle
|
|
|
24
23
|
declare function applySQLiteJsonBatch(sql: SqlStorageLike, batch: Batch, collections?: CollectionConfigs): void;
|
|
25
24
|
//#endregion
|
|
26
25
|
//#region src/history.d.ts
|
|
26
|
+
declare const SQLITE_JSON_CONFLICT_POLICY: "server-sequence-last-write-wins";
|
|
27
27
|
interface HistoryOptions {
|
|
28
28
|
maxChanges?: number;
|
|
29
29
|
}
|
|
@@ -35,6 +35,15 @@ declare function persistSQLiteJsonBatchWithHistory(sql: SqlStorageLike, batch: B
|
|
|
35
35
|
declare function readSQLiteJsonChanges(sql: SqlStorageLike, query: SyncChangesQuery, collections?: CollectionConfigs): SyncChangesResult;
|
|
36
36
|
//#endregion
|
|
37
37
|
//#region src/durable-object-types.d.ts
|
|
38
|
+
interface RateLimitContext {
|
|
39
|
+
auth: AccessAuth;
|
|
40
|
+
clientId: string;
|
|
41
|
+
env: Env;
|
|
42
|
+
}
|
|
43
|
+
type RateLimitHandler = (context: RateLimitContext) => boolean | Promise<boolean>;
|
|
44
|
+
interface CollectionShardLimits {
|
|
45
|
+
maxSubscriptionsPerWebSocket?: number | false;
|
|
46
|
+
}
|
|
38
47
|
interface Env {
|
|
39
48
|
SYNC_SHARDS: DurableObjectNamespace;
|
|
40
49
|
}
|
|
@@ -45,6 +54,8 @@ interface CollectionShardOptions {
|
|
|
45
54
|
request: Request;
|
|
46
55
|
}) => AccessAuth | Promise<AccessAuth>;
|
|
47
56
|
history?: HistoryOptions;
|
|
57
|
+
limits?: CollectionShardLimits;
|
|
58
|
+
rateLimit?: RateLimitHandler;
|
|
48
59
|
}
|
|
49
60
|
//#endregion
|
|
50
61
|
//#region src/definition-builder.d.ts
|
|
@@ -52,7 +63,10 @@ declare function collectionShardOptionsFrom<TCollections extends CollectionDefin
|
|
|
52
63
|
declare class CollectionShardDefinitionBuilder<TCollections extends CollectionDefinitions> {
|
|
53
64
|
private readonly definitions;
|
|
54
65
|
private readonly overrides;
|
|
55
|
-
|
|
66
|
+
private readonly options;
|
|
67
|
+
constructor(definitions: TCollections, overrides: Record<string, ServerCollectionOverride>, options: Omit<CollectionShardOptions, "collections">);
|
|
68
|
+
limits(limits: CollectionShardLimits): CollectionShardDefinitionBuilder<TCollections>;
|
|
69
|
+
rateLimit(rateLimit: RateLimitHandler): CollectionShardDefinitionBuilder<TCollections>;
|
|
56
70
|
collection<TPath extends CollectionPath<TCollections>>(path: TPath, configure: (collection: ServerCollectionBuilder<CollectionAtPath<TCollections, TPath>>) => ServerCollectionBuilder<CollectionAtPath<TCollections, TPath>>): CollectionShardDefinitionBuilder<TCollections>;
|
|
57
71
|
build(): CollectionShardOptions;
|
|
58
72
|
}
|
|
@@ -98,61 +112,10 @@ declare class CollectionShardDurableObject implements DurableObject {
|
|
|
98
112
|
private clientId;
|
|
99
113
|
private updateSubscriptions;
|
|
100
114
|
private subscribedUpdates;
|
|
101
|
-
private subscribedInvalidations;
|
|
102
115
|
private accessStore;
|
|
103
116
|
private shardId;
|
|
104
117
|
}
|
|
105
118
|
//#endregion
|
|
106
|
-
//#region src/collection-builder.d.ts
|
|
107
|
-
type BuilderState = {
|
|
108
|
-
path?: string;
|
|
109
|
-
schema?: z.ZodTypeAny;
|
|
110
|
-
access?: CollectionAccessConfig<any>;
|
|
111
|
-
storage?: CollectionStorageConfig;
|
|
112
|
-
indexes?: Array<SQLiteJsonIndexConfig>;
|
|
113
|
-
initialData?: Array<Record<string, unknown>>;
|
|
114
|
-
api?: CollectionApiHandlers;
|
|
115
|
-
children?: Record<string, CollectionBuilder<any>>;
|
|
116
|
-
};
|
|
117
|
-
type InitialCollectionBuilder = Pick<CollectionBuilder<Record<string, unknown>>, "name" | "path">;
|
|
118
|
-
type ConfiguredCollectionBuilder<T extends object> = Omit<CollectionBuilder<T>, "name" | "path" | "schema">;
|
|
119
|
-
type IndexField<T extends object> = string extends keyof T ? string : Extract<keyof T, string>;
|
|
120
|
-
type BuilderIndexConfig<T extends object> = Omit<SQLiteJsonIndexConfig, "fields"> & {
|
|
121
|
-
fields: Array<IndexField<T>>;
|
|
122
|
-
};
|
|
123
|
-
declare function collectionConfigsBuilder(): CollectionConfigsBuilder;
|
|
124
|
-
declare function collectionBuilder(): InitialCollectionBuilder;
|
|
125
|
-
declare const Collections: {
|
|
126
|
-
builder: typeof collectionConfigsBuilder;
|
|
127
|
-
collection: typeof collectionBuilder;
|
|
128
|
-
};
|
|
129
|
-
declare class CollectionConfigsBuilder {
|
|
130
|
-
private readonly collections;
|
|
131
|
-
constructor(collections: CollectionConfigs);
|
|
132
|
-
collection<TBuilder extends CollectionBuilder<any>>(name: string, configure: (builder: Pick<CollectionBuilder<Record<string, unknown>>, "schema" | "path">) => TBuilder): CollectionConfigsBuilder;
|
|
133
|
-
path<TBuilder extends CollectionBuilder<any>>(path: string, configure: (builder: Pick<CollectionBuilder<Record<string, unknown>>, "schema">) => TBuilder): CollectionConfigsBuilder;
|
|
134
|
-
build(): CollectionConfigs;
|
|
135
|
-
}
|
|
136
|
-
declare class CollectionBuilder<T extends object = Record<string, unknown>> {
|
|
137
|
-
private readonly state;
|
|
138
|
-
constructor(state: BuilderState);
|
|
139
|
-
name(name: string): Pick<CollectionBuilder<T>, "schema" | "path">;
|
|
140
|
-
path(path: string): Pick<CollectionBuilder<T>, "schema">;
|
|
141
|
-
schema<TSchema extends z.ZodTypeAny>(schema: TSchema): ConfiguredCollectionBuilder<z.output<TSchema> & object>;
|
|
142
|
-
access(access: CollectionAccessConfig<T>): CollectionBuilder<T>;
|
|
143
|
-
storage(storage: CollectionStorageConfig): CollectionBuilder<T>;
|
|
144
|
-
index(field: IndexField<T>, ...fields: Array<IndexField<T>>): CollectionBuilder<T>;
|
|
145
|
-
index(fields: Array<IndexField<T>> | BuilderIndexConfig<T>): CollectionBuilder<T>;
|
|
146
|
-
initialData<TData extends T>(...initialData: Array<TData>): CollectionBuilder<T>;
|
|
147
|
-
api<TName extends string, TSchema extends z.ZodTypeAny, TResult = unknown>(name: TName, input: TSchema, handler: ApiHandler<TResult, z.output<TSchema>>): CollectionBuilder<T>;
|
|
148
|
-
child<TBuilder extends CollectionBuilder<any>>(name: string, configure: (builder: Pick<CollectionBuilder<Record<string, unknown>>, "schema" | "path">) => TBuilder): CollectionBuilder<T>;
|
|
149
|
-
buildConfig(): CollectionConfig<T>;
|
|
150
|
-
build(): CollectionConfigs;
|
|
151
|
-
entries(): CollectionConfigs;
|
|
152
|
-
private next;
|
|
153
|
-
private requirePath;
|
|
154
|
-
}
|
|
155
|
-
//#endregion
|
|
156
119
|
//#region src/worker.d.ts
|
|
157
120
|
interface WorkerOptions {
|
|
158
121
|
binding?: keyof Env;
|
|
@@ -162,6 +125,14 @@ declare function createWorkerHandler(options?: WorkerOptions): {
|
|
|
162
125
|
fetch(request: Request, env: Env): Promise<Response> | Response;
|
|
163
126
|
};
|
|
164
127
|
//#endregion
|
|
128
|
+
//#region src/safeguards.d.ts
|
|
129
|
+
declare const DEFAULT_MAX_SUBSCRIPTIONS_PER_WEBSOCKET = 100;
|
|
130
|
+
interface CloudflareRateLimiterOptions {
|
|
131
|
+
binding?: string;
|
|
132
|
+
key?: (context: RateLimitContext) => string;
|
|
133
|
+
}
|
|
134
|
+
declare function cloudflareRateLimiter(options?: CloudflareRateLimiterOptions): RateLimitHandler;
|
|
135
|
+
//#endregion
|
|
165
136
|
//#region src/collections.d.ts
|
|
166
137
|
interface ResolvedCollection {
|
|
167
138
|
name: string;
|
|
@@ -201,5 +172,5 @@ declare function readAccessDecision(collection: string, collections: CollectionC
|
|
|
201
172
|
//#region src/validation.d.ts
|
|
202
173
|
declare function validateBatch(batch: Batch, collections?: CollectionConfigs): void;
|
|
203
174
|
//#endregion
|
|
204
|
-
export { type AccessAuth, type AccessReference, type AccessReferenceResolver, type AccessStore, type ApiAccessContext, type ApiAccessHandler, type ApiCall, type ApiCallArgs, type ApiCallInput, type ApiContract, type ApiHandler, type ApiHandlerArgs, type ApiHandlerContext, type ApiInput, type ApiOutput, type ApiPath, type ApiRoute, type Batch, type Broadcast, type CollectionAccessConfig, type CollectionApiDefinition, type CollectionApiHandlers,
|
|
175
|
+
export { type AccessAuth, type AccessReference, type AccessReferenceResolver, type AccessStore, type ApiAccessContext, type ApiAccessHandler, type ApiCall, type ApiCallArgs, type ApiCallInput, type ApiContract, type ApiHandler, type ApiHandlerArgs, type ApiHandlerContext, type ApiInput, type ApiOutput, type ApiPath, type ApiRoute, type Batch, type Broadcast, type CloudflareRateLimiterOptions, type CollectionAccessConfig, type CollectionApiDefinition, type CollectionApiHandlers, type CollectionConfig, type CollectionConfigs, type CollectionInvalidation, CollectionShardDurableObject, type CollectionShardLimits, type CollectionShardOptions, type CollectionStorageConfig, type CollectionSubscription, type CollectionSubscriptionInput, type CollectionSubscriptionResult, type Context, DEFAULT_MAX_SUBSCRIPTIONS_PER_WEBSOCKET, type Env, type FuncExpression, type HistoryOptions, type OperationType, type PushResult, type RateLimitContext, type RateLimitHandler, type ReadAccessContext, type ReadAccessDecision, type ReadAccessHandler, type ReadAccessResult, type ReadCursor, type ReadExpression, type ReadExpressionField, type ReadExpressionInput, type ReadExpressionRow, type ReadFilter, type ReadFilterOperator, type ReadOrderBy, type ReadPredicate, type ReadQuery, type ReadResult, type RefExpression, type ResolvedCollection, type Router, SQLITE_JSON_CONFLICT_POLICY, type SQLiteJsonIndexConfig, type SQLiteJsonStorageConfig, type SQLiteJsonTableOptions, type SequencedBatch, type SequencedUpdate, type SqlStorageCursorLike, type SqlStorageLike, type SqlStorageValue, type SyncChangesQuery, type SyncChangesQueryInput, type SyncChangesResult, type Update, type ValExpression, type WebSocketAttachment, type WorkerOptions, and, applySQLiteJsonBatch, authorizeApiCall, authorizeReadQuery, authorizeWriteBatch, cloudflareRateLimiter, collectionApiHandlers, collectionScope, collectionShardOptionsFrom, compileReadExpression, createWorkerHandler, defaultCollectionApiPath, ensureSQLiteJsonTables, eq, field, gt, gte, inArray, isCollectionPattern, lt, lte, matchesReadPredicate, ne, not, or, persistSQLiteJsonBatchWithHistory, readAccessDecision, readExpressionReferences, readExpressionRow, readSQLiteJsonChanges, readSQLiteJsonRow, readSQLiteJsonRows, resolveCollection, router, sqliteJsonTable, val, validateBatch, visibleUpdateForAuth };
|
|
205
176
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/sqlite-json-read.ts","../src/storage.ts","../src/history.ts","../src/durable-object-types.ts","../src/definition-builder.ts","../src/durable-object.ts","../src/
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/sqlite-json-read.ts","../src/storage.ts","../src/history.ts","../src/durable-object-types.ts","../src/definition-builder.ts","../src/durable-object.ts","../src/worker.ts","../src/safeguards.ts","../src/collections.ts","../src/access-expression.ts","../src/access.ts","../src/validation.ts"],"mappings":"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"}
|