@comapeo/core 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +9 -0
- package/README.md +31 -0
- package/dist/blob-api.d.ts +92 -0
- package/dist/blob-api.d.ts.map +1 -0
- package/dist/blob-store/index.d.ts +163 -0
- package/dist/blob-store/index.d.ts.map +1 -0
- package/dist/blob-store/live-download.d.ts +107 -0
- package/dist/blob-store/live-download.d.ts.map +1 -0
- package/dist/config-import.d.ts +74 -0
- package/dist/config-import.d.ts.map +1 -0
- package/dist/constants.d.ts +14 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/core-manager/bitfield-rle.d.ts +25 -0
- package/dist/core-manager/bitfield-rle.d.ts.map +1 -0
- package/dist/core-manager/core-index.d.ts +56 -0
- package/dist/core-manager/core-index.d.ts.map +1 -0
- package/dist/core-manager/index.d.ts +125 -0
- package/dist/core-manager/index.d.ts.map +1 -0
- package/dist/core-manager/random-access-file-pool.d.ts +17 -0
- package/dist/core-manager/random-access-file-pool.d.ts.map +1 -0
- package/dist/core-manager/remote-bitfield.d.ts +146 -0
- package/dist/core-manager/remote-bitfield.d.ts.map +1 -0
- package/dist/core-ownership.d.ts +112 -0
- package/dist/core-ownership.d.ts.map +1 -0
- package/dist/datastore/index.d.ts +91 -0
- package/dist/datastore/index.d.ts.map +1 -0
- package/dist/datatype/index.d.ts +108 -0
- package/dist/discovery/local-discovery.d.ts +64 -0
- package/dist/discovery/local-discovery.d.ts.map +1 -0
- package/dist/errors.d.ts +4 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/fastify-controller.d.ts +27 -0
- package/dist/fastify-controller.d.ts.map +1 -0
- package/dist/fastify-plugins/blobs.d.ts +6 -0
- package/dist/fastify-plugins/blobs.d.ts.map +1 -0
- package/dist/fastify-plugins/constants.d.ts +3 -0
- package/dist/fastify-plugins/constants.d.ts.map +1 -0
- package/dist/fastify-plugins/icons.d.ts +6 -0
- package/dist/fastify-plugins/icons.d.ts.map +1 -0
- package/dist/fastify-plugins/maps/index.d.ts +11 -0
- package/dist/fastify-plugins/maps/index.d.ts.map +1 -0
- package/dist/fastify-plugins/maps/offline-fallback-map.d.ts +12 -0
- package/dist/fastify-plugins/maps/offline-fallback-map.d.ts.map +1 -0
- package/dist/fastify-plugins/maps/static-maps.d.ts +11 -0
- package/dist/fastify-plugins/maps/static-maps.d.ts.map +1 -0
- package/dist/fastify-plugins/utils.d.ts +23 -0
- package/dist/fastify-plugins/utils.d.ts.map +1 -0
- package/dist/generated/extensions.d.ts +44 -0
- package/dist/generated/extensions.d.ts.map +1 -0
- package/dist/generated/keys.d.ts +36 -0
- package/dist/generated/keys.d.ts.map +1 -0
- package/dist/generated/rpc.d.ts +87 -0
- package/dist/generated/rpc.d.ts.map +1 -0
- package/dist/icon-api.d.ts +109 -0
- package/dist/icon-api.d.ts.map +1 -0
- package/dist/index-writer/index.d.ts +51 -0
- package/dist/index-writer/index.d.ts.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/invite-api.d.ts +70 -0
- package/dist/invite-api.d.ts.map +1 -0
- package/dist/lib/hashmap.d.ts +62 -0
- package/dist/lib/hashmap.d.ts.map +1 -0
- package/dist/lib/hypercore-helpers.d.ts +6 -0
- package/dist/lib/hypercore-helpers.d.ts.map +1 -0
- package/dist/lib/noise-secret-stream-helpers.d.ts +45 -0
- package/dist/lib/noise-secret-stream-helpers.d.ts.map +1 -0
- package/dist/lib/ponyfills.d.ts +10 -0
- package/dist/lib/ponyfills.d.ts.map +1 -0
- package/dist/lib/string.d.ts +2 -0
- package/dist/lib/string.d.ts.map +1 -0
- package/dist/lib/timing-safe-equal.d.ts +15 -0
- package/dist/lib/timing-safe-equal.d.ts.map +1 -0
- package/dist/local-peers.d.ts +151 -0
- package/dist/local-peers.d.ts.map +1 -0
- package/dist/logger.d.ts +32 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/mapeo-manager.d.ts +178 -0
- package/dist/mapeo-manager.d.ts.map +1 -0
- package/dist/mapeo-project.d.ts +3233 -0
- package/dist/mapeo-project.d.ts.map +1 -0
- package/dist/member-api.d.ts +114 -0
- package/dist/member-api.d.ts.map +1 -0
- package/dist/roles.d.ts +157 -0
- package/dist/roles.d.ts.map +1 -0
- package/dist/schema/client.d.ts +284 -0
- package/dist/schema/client.d.ts.map +1 -0
- package/dist/schema/project.d.ts +1812 -0
- package/dist/schema/project.d.ts.map +1 -0
- package/dist/schema/schema-to-drizzle.d.ts +20 -0
- package/dist/schema/schema-to-drizzle.d.ts.map +1 -0
- package/dist/schema/types.d.ts +98 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/utils.d.ts +55 -0
- package/dist/schema/utils.d.ts.map +1 -0
- package/dist/sync/core-sync-state.d.ts +252 -0
- package/dist/sync/core-sync-state.d.ts.map +1 -0
- package/dist/sync/namespace-sync-state.d.ts +47 -0
- package/dist/sync/namespace-sync-state.d.ts.map +1 -0
- package/dist/sync/peer-sync-controller.d.ts +44 -0
- package/dist/sync/peer-sync-controller.d.ts.map +1 -0
- package/dist/sync/sync-api.d.ts +158 -0
- package/dist/sync/sync-api.d.ts.map +1 -0
- package/dist/sync/sync-state.d.ts +40 -0
- package/dist/sync/sync-state.d.ts.map +1 -0
- package/dist/translation-api.d.ts +288 -0
- package/dist/translation-api.d.ts.map +1 -0
- package/dist/types.d.ts +115 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/utils.d.ts +115 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils_types.d.ts +14 -0
- package/drizzle/client/0000_bumpy_carnage.sql +33 -0
- package/drizzle/client/meta/0000_snapshot.json +199 -0
- package/drizzle/client/meta/_journal.json +13 -0
- package/drizzle/project/0000_spooky_lady_ursula.sql +192 -0
- package/drizzle/project/meta/0000_snapshot.json +1137 -0
- package/drizzle/project/meta/_journal.json +13 -0
- package/package.json +202 -0
- package/src/blob-api.js +139 -0
- package/src/blob-store/index.js +325 -0
- package/src/blob-store/live-download.js +373 -0
- package/src/config-import.js +604 -0
- package/src/constants.js +34 -0
- package/src/core-manager/bitfield-rle.js +235 -0
- package/src/core-manager/core-index.js +87 -0
- package/src/core-manager/index.js +504 -0
- package/src/core-manager/random-access-file-pool.js +30 -0
- package/src/core-manager/remote-bitfield.js +416 -0
- package/src/core-ownership.js +235 -0
- package/src/datastore/README.md +46 -0
- package/src/datastore/index.js +234 -0
- package/src/datatype/README.md +33 -0
- package/src/datatype/index.d.ts +108 -0
- package/src/datatype/index.js +358 -0
- package/src/discovery/local-discovery.js +303 -0
- package/src/errors.js +5 -0
- package/src/fastify-controller.js +84 -0
- package/src/fastify-plugins/blobs.js +139 -0
- package/src/fastify-plugins/constants.js +5 -0
- package/src/fastify-plugins/icons.js +158 -0
- package/src/fastify-plugins/maps/index.js +173 -0
- package/src/fastify-plugins/maps/offline-fallback-map.js +114 -0
- package/src/fastify-plugins/maps/static-maps.js +271 -0
- package/src/fastify-plugins/utils.js +52 -0
- package/src/generated/README.md +3 -0
- package/src/generated/extensions.d.ts +44 -0
- package/src/generated/extensions.js +196 -0
- package/src/generated/extensions.ts +237 -0
- package/src/generated/keys.d.ts +36 -0
- package/src/generated/keys.js +148 -0
- package/src/generated/keys.ts +185 -0
- package/src/generated/rpc.d.ts +87 -0
- package/src/generated/rpc.js +389 -0
- package/src/generated/rpc.ts +463 -0
- package/src/icon-api.js +282 -0
- package/src/index-writer/README.md +38 -0
- package/src/index-writer/index.js +124 -0
- package/src/index.js +16 -0
- package/src/invite-api.js +450 -0
- package/src/lib/hashmap.js +91 -0
- package/src/lib/hypercore-helpers.js +18 -0
- package/src/lib/noise-secret-stream-helpers.js +37 -0
- package/src/lib/ponyfills.js +25 -0
- package/src/lib/string.js +7 -0
- package/src/lib/timing-safe-equal.js +34 -0
- package/src/local-peers.js +737 -0
- package/src/logger.js +99 -0
- package/src/mapeo-manager.js +914 -0
- package/src/mapeo-project.js +980 -0
- package/src/member-api.js +319 -0
- package/src/roles.js +412 -0
- package/src/schema/client.js +55 -0
- package/src/schema/project.js +44 -0
- package/src/schema/schema-to-drizzle.js +118 -0
- package/src/schema/types.ts +153 -0
- package/src/schema/utils.js +51 -0
- package/src/sync/core-sync-state.js +440 -0
- package/src/sync/namespace-sync-state.js +193 -0
- package/src/sync/peer-sync-controller.js +332 -0
- package/src/sync/sync-api.js +588 -0
- package/src/sync/sync-state.js +63 -0
- package/src/translation-api.js +141 -0
- package/src/types.ts +149 -0
- package/src/utils.js +210 -0
- package/src/utils_types.d.ts +14 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/schema/project.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** @import { MapeoDoc } from '@comapeo/schema' */
|
|
2
|
+
/** @import { MapeoDocMap } from '../types.js' */
|
|
3
|
+
/**
|
|
4
|
+
Convert a JSONSchema definition to a Drizzle Columns Map (the parameter for
|
|
5
|
+
`sqliteTable()`).
|
|
6
|
+
|
|
7
|
+
**NOTE**: The return of this function is _not_ type-checked (it is coerced with
|
|
8
|
+
`as`, because it's not possible to type-check what this function is doing), but
|
|
9
|
+
the return type _should_ be correct when using this function.
|
|
10
|
+
@template {import('./types.js').JSONSchema7WithProps} TSchema
|
|
11
|
+
NB: The inline typescript checker often marks this next line as an error, but this seems to be a bug with JSDoc parsing - running `tsc` does not show this as an error.
|
|
12
|
+
@template {import('type-fest').Get<TSchema, 'properties.schemaName.const'>} TSchemaName
|
|
13
|
+
@template {TSchemaName extends MapeoDoc['schemaName'] ? MapeoDocMap[TSchemaName] : any} TObjectType
|
|
14
|
+
@param {TSchema} schema
|
|
15
|
+
@returns {import('./types.js').SchemaToDrizzleColumns<TSchema, TObjectType>}
|
|
16
|
+
*/
|
|
17
|
+
export function jsonSchemaToDrizzleColumns<TSchema extends import("./types.js").JSONSchema7WithProps, TSchemaName extends import("type-fest").Get<TSchema, "properties.schemaName.const">, TObjectType extends TSchemaName extends MapeoDoc["schemaName"] ? MapeoDocMap[TSchemaName] : any>(schema: TSchema): import("./types.js").SchemaToDrizzleColumns<TSchema, TObjectType>;
|
|
18
|
+
import type { MapeoDoc } from '@comapeo/schema';
|
|
19
|
+
import type { MapeoDocMap } from '../types.js';
|
|
20
|
+
//# sourceMappingURL=schema-to-drizzle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-to-drizzle.d.ts","sourceRoot":"","sources":["../../src/schema/schema-to-drizzle.js"],"names":[],"mappings":"AAGA,kDAAkD;AAClD,iDAAiD;AAEjD;;;;;;;;;;;;;GAaG;AACH,2CAPsD,OAAO,SAAnD,OAAQ,YAAY,EAAE,oBAAqB,EAEuB,WAAW,SAA7E,OAAQ,WAAW,EAAE,GAAG,CAAC,OAAO,EAAE,6BAA6B,CAAE,EACa,WAAW,SAAxF,WAAW,SAAS,QAAQ,CAAC,YAAY,CAAC,GAAG,WAAW,CAAC,WAAW,CAAC,GAAG,GAAI,UAC/E,OAAO,GACL,OAAO,YAAY,EAAE,sBAAsB,CAAC,OAAO,EAAE,WAAW,CAAC,CAyD1E;8BAxE6B,iBAAiB;iCACd,aAAa"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { Includes, ReadonlyDeep } from 'type-fest';
|
|
2
|
+
import { JSONSchema7 as JSONSchema7Writable, JSONSchema7Type } from 'json-schema';
|
|
3
|
+
/** Convert optional properties to nullable */
|
|
4
|
+
export type OptionalToNull<T extends {}> = {
|
|
5
|
+
[K in keyof T]-?: undefined extends T[K] ? T[K] | null : T[K];
|
|
6
|
+
};
|
|
7
|
+
/** Convert a readonly array/object to writeable */
|
|
8
|
+
type Writable<T> = {
|
|
9
|
+
-readonly [P in keyof T]: T[P];
|
|
10
|
+
};
|
|
11
|
+
/** Type returned by text(columnName, { enum: [] }) */
|
|
12
|
+
type TextBuilder<TName extends string, TEnum extends readonly [string, ...string[]], TNotNull extends boolean, THasDefault extends boolean> = import('drizzle-orm/sqlite-core').SQLiteTextBuilder<{
|
|
13
|
+
name: TName;
|
|
14
|
+
data: Writable<TEnum>[number];
|
|
15
|
+
driverParam: string;
|
|
16
|
+
columnType: 'SQLiteText';
|
|
17
|
+
dataType: 'string';
|
|
18
|
+
enumValues: Writable<TEnum>;
|
|
19
|
+
notNull: TNotNull;
|
|
20
|
+
hasDefault: THasDefault;
|
|
21
|
+
}>;
|
|
22
|
+
/** Type returned by integer(columnName, { mode: 'boolean' }) */
|
|
23
|
+
type BooleanBuilder<TName extends string, TNotNull extends boolean, THasDefault extends boolean> = import('drizzle-orm/sqlite-core').SQLiteBooleanBuilder<{
|
|
24
|
+
name: TName;
|
|
25
|
+
data: boolean;
|
|
26
|
+
driverParam: number;
|
|
27
|
+
columnType: 'SQLiteBoolean';
|
|
28
|
+
dataType: 'boolean';
|
|
29
|
+
notNull: TNotNull;
|
|
30
|
+
hasDefault: THasDefault;
|
|
31
|
+
enumValues: undefined;
|
|
32
|
+
}>;
|
|
33
|
+
/** Type returned by real(columnName) */
|
|
34
|
+
type RealBuilder<TName extends string, TNotNull extends boolean, THasDefault extends boolean> = import('drizzle-orm/sqlite-core').SQLiteRealBuilder<{
|
|
35
|
+
name: TName;
|
|
36
|
+
data: number;
|
|
37
|
+
driverParam: number;
|
|
38
|
+
columnType: 'SQLiteReal';
|
|
39
|
+
dataType: 'number';
|
|
40
|
+
notNull: TNotNull;
|
|
41
|
+
hasDefault: THasDefault;
|
|
42
|
+
enumValues: undefined;
|
|
43
|
+
}>;
|
|
44
|
+
/** Type returned by integer(columnName) */
|
|
45
|
+
type IntegerBuilder<TName extends string, TNotNull extends boolean, THasDefault extends boolean> = import('drizzle-orm/sqlite-core').SQLiteIntegerBuilder<{
|
|
46
|
+
name: TName;
|
|
47
|
+
data: number;
|
|
48
|
+
driverParam: number;
|
|
49
|
+
columnType: 'SQLiteInteger';
|
|
50
|
+
dataType: 'number';
|
|
51
|
+
notNull: TNotNull;
|
|
52
|
+
hasDefault: THasDefault;
|
|
53
|
+
enumValues: undefined;
|
|
54
|
+
}>;
|
|
55
|
+
/** Type returned by the `customJson` custom type */
|
|
56
|
+
type JsonBuilder<TName extends string, TData extends unknown, TNotNull extends boolean, THasDefault extends boolean> = import('drizzle-orm/sqlite-core').SQLiteCustomColumnBuilder<{
|
|
57
|
+
name: TName;
|
|
58
|
+
data: TData;
|
|
59
|
+
dataType: 'custom';
|
|
60
|
+
driverParam: string;
|
|
61
|
+
columnType: 'SQLiteCustomColumn';
|
|
62
|
+
notNull: TNotNull;
|
|
63
|
+
hasDefault: THasDefault;
|
|
64
|
+
enumValues: undefined;
|
|
65
|
+
}>;
|
|
66
|
+
export type JSONSchema7 = ReadonlyDeep<JSONSchema7Writable>;
|
|
67
|
+
type JsonSchema7Properties = {
|
|
68
|
+
readonly [K: string]: JSONSchema7;
|
|
69
|
+
};
|
|
70
|
+
export type JSONSchema7WithProps = Omit<JSONSchema7, 'properties'> & {
|
|
71
|
+
readonly properties: JsonSchema7Properties;
|
|
72
|
+
};
|
|
73
|
+
/** Get the type of a JSONSchema string: array of constants for an enum,
|
|
74
|
+
otherwise string[]. Strangeness is to convert it into the format expected by
|
|
75
|
+
drizzle, which results in the correct type for the field from SQLite */
|
|
76
|
+
type Enum<T extends JSONSchema7, TEnum extends T['enum'] = T['enum']> = TEnum extends readonly [string, ...string[]] ? Writable<TEnum> : T['const'] extends string ? [T['const']] : [string, ...string[]];
|
|
77
|
+
/** True if JSONSchema object has a default */
|
|
78
|
+
type HasDefault<T extends JSONSchema7> = T['default'] extends JSONSchema7Type ? true : false;
|
|
79
|
+
/** True if JSONSchema value is required */
|
|
80
|
+
type IsRequired<T extends JSONSchema7WithProps, U extends string, V extends JSONSchema7['required'] = T['required']> = V extends readonly any[] ? Includes<V, U> : false;
|
|
81
|
+
/**
|
|
82
|
+
* Convert a JSONSchema to a Drizzle Columns map (e.g. parameter for
|
|
83
|
+
* `sqliteTable()`). All top-level properties map to SQLite columns, with
|
|
84
|
+
* `required` properties marked as `NOT NULL`, and JSONSchema `default` will map
|
|
85
|
+
* to SQLite defaults. Any properties that are of type `object` or `array` in
|
|
86
|
+
* the JSONSchema will be mapped to a text field, which drizzle will parse and
|
|
87
|
+
* stringify. Types for parsed JSON will be derived from MapeoDoc types.
|
|
88
|
+
*/
|
|
89
|
+
export type SchemaToDrizzleColumns<T extends JSONSchema7WithProps, TObjectType extends {
|
|
90
|
+
[K in keyof U]?: any;
|
|
91
|
+
}, U extends JsonSchema7Properties = T['properties']> = {
|
|
92
|
+
[K in keyof U]: K extends string ? U[K]['type'] extends 'string' ? TextBuilder<K, Enum<U[K]>, IsRequired<T, K>, HasDefault<U[K]>> : U[K]['type'] extends 'boolean' ? BooleanBuilder<K, IsRequired<T, K>, HasDefault<U[K]>> : U[K]['type'] extends 'number' ? RealBuilder<K, IsRequired<T, K>, HasDefault<U[K]>> : U[K]['type'] extends 'integer' ? IntegerBuilder<K, IsRequired<T, K>, HasDefault<U[K]>> : U[K]['type'] extends 'array' | 'object' ? JsonBuilder<K, TObjectType[K], IsRequired<T, K>, HasDefault<U[K]>> : never : never;
|
|
93
|
+
} & {
|
|
94
|
+
forks: JsonBuilder<'forks', string[], true, false>;
|
|
95
|
+
};
|
|
96
|
+
export type NonEmptyArray<T> = [T, ...T[]];
|
|
97
|
+
export {};
|
|
98
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/schema/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EACL,WAAW,IAAI,mBAAmB,EAClC,eAAe,EAChB,MAAM,aAAa,CAAA;AAEpB,8CAA8C;AAC9C,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,EAAE,IAAI;KACxC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;CAC9D,CAAA;AACD,mDAAmD;AACnD,KAAK,QAAQ,CAAC,CAAC,IAAI;IAAE,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,CAAA;AACrD,sDAAsD;AACtD,KAAK,WAAW,CACd,KAAK,SAAS,MAAM,EACpB,KAAK,SAAS,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,EAC5C,QAAQ,SAAS,OAAO,EACxB,WAAW,SAAS,OAAO,IACzB,OAAO,yBAAyB,EAAE,iBAAiB,CAAC;IACtD,IAAI,EAAE,KAAK,CAAA;IACX,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAA;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,YAAY,CAAA;IACxB,QAAQ,EAAE,QAAQ,CAAA;IAClB,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC3B,OAAO,EAAE,QAAQ,CAAA;IACjB,UAAU,EAAE,WAAW,CAAA;CACxB,CAAC,CAAA;AAEF,gEAAgE;AAChE,KAAK,cAAc,CACjB,KAAK,SAAS,MAAM,EACpB,QAAQ,SAAS,OAAO,EACxB,WAAW,SAAS,OAAO,IACzB,OAAO,yBAAyB,EAAE,oBAAoB,CAAC;IACzD,IAAI,EAAE,KAAK,CAAA;IACX,IAAI,EAAE,OAAO,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,eAAe,CAAA;IAC3B,QAAQ,EAAE,SAAS,CAAA;IACnB,OAAO,EAAE,QAAQ,CAAA;IACjB,UAAU,EAAE,WAAW,CAAA;IACvB,UAAU,EAAE,SAAS,CAAA;CACtB,CAAC,CAAA;AAEF,wCAAwC;AACxC,KAAK,WAAW,CACd,KAAK,SAAS,MAAM,EACpB,QAAQ,SAAS,OAAO,EACxB,WAAW,SAAS,OAAO,IACzB,OAAO,yBAAyB,EAAE,iBAAiB,CAAC;IACtD,IAAI,EAAE,KAAK,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,YAAY,CAAA;IACxB,QAAQ,EAAE,QAAQ,CAAA;IAClB,OAAO,EAAE,QAAQ,CAAA;IACjB,UAAU,EAAE,WAAW,CAAA;IACvB,UAAU,EAAE,SAAS,CAAA;CACtB,CAAC,CAAA;AAEF,2CAA2C;AAC3C,KAAK,cAAc,CACjB,KAAK,SAAS,MAAM,EACpB,QAAQ,SAAS,OAAO,EACxB,WAAW,SAAS,OAAO,IACzB,OAAO,yBAAyB,EAAE,oBAAoB,CAAC;IACzD,IAAI,EAAE,KAAK,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,eAAe,CAAA;IAC3B,QAAQ,EAAE,QAAQ,CAAA;IAClB,OAAO,EAAE,QAAQ,CAAA;IACjB,UAAU,EAAE,WAAW,CAAA;IACvB,UAAU,EAAE,SAAS,CAAA;CACtB,CAAC,CAAA;AAEF,oDAAoD;AACpD,KAAK,WAAW,CACd,KAAK,SAAS,MAAM,EACpB,KAAK,SAAS,OAAO,EACrB,QAAQ,SAAS,OAAO,EACxB,WAAW,SAAS,OAAO,IACzB,OAAO,yBAAyB,EAAE,yBAAyB,CAAC;IAC9D,IAAI,EAAE,KAAK,CAAA;IACX,IAAI,EAAE,KAAK,CAAA;IACX,QAAQ,EAAE,QAAQ,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,oBAAoB,CAAA;IAChC,OAAO,EAAE,QAAQ,CAAA;IACjB,UAAU,EAAE,WAAW,CAAA;IACvB,UAAU,EAAE,SAAS,CAAA;CACtB,CAAC,CAAA;AAEF,MAAM,MAAM,WAAW,GAAG,YAAY,CAAC,mBAAmB,CAAC,CAAA;AAC3D,KAAK,qBAAqB,GAAG;IAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;CAAE,CAAA;AAClE,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,GAAG;IACnE,QAAQ,CAAC,UAAU,EAAE,qBAAqB,CAAA;CAC3C,CAAA;AAED;;uEAEuE;AACvE,KAAK,IAAI,CACP,CAAC,SAAS,WAAW,EACrB,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IACjC,KAAK,SAAS,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,GAC5C,QAAQ,CAAC,KAAK,CAAC,GACf,CAAC,CAAC,OAAO,CAAC,SAAS,MAAM,GACzB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GACZ,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;AAEzB,8CAA8C;AAC9C,KAAK,UAAU,CAAC,CAAC,SAAS,WAAW,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,eAAe,GACzE,IAAI,GACJ,KAAK,CAAA;AAET,2CAA2C;AAC3C,KAAK,UAAU,CACb,CAAC,SAAS,oBAAoB,EAC9B,CAAC,SAAS,MAAM,EAChB,CAAC,SAAS,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,IAC/C,CAAC,SAAS,SAAS,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAA;AAErD;;;;;;;GAOG;AACH,MAAM,MAAM,sBAAsB,CAChC,CAAC,SAAS,oBAAoB,EAC9B,WAAW,SAAS;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG;CAAE,EAC5C,CAAC,SAAS,qBAAqB,GAAG,CAAC,CAAC,YAAY,CAAC,IAC/C;KACD,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,MAAM,GAC5B,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,QAAQ,GAC3B,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAC9D,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,SAAS,GAC9B,cAAc,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GACrD,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,QAAQ,GAC7B,WAAW,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAClD,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,SAAS,GAC9B,cAAc,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GACrD,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,OAAO,GAAG,QAAQ,GACvC,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAClE,KAAK,GACP,KAAK;CACV,GAAG;IAAE,KAAK,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;CAAE,CAAA;AAE1D,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Table for storing backlinks, used for indexing. There needs to be one for
|
|
3
|
+
* each indexed document type
|
|
4
|
+
* @param {SqliteTable} tableSchema
|
|
5
|
+
*/
|
|
6
|
+
export function backlinkTable(tableSchema: SqliteTable): SQLiteTableWithColumns<{
|
|
7
|
+
name: string;
|
|
8
|
+
schema: undefined;
|
|
9
|
+
columns: {
|
|
10
|
+
versionId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
11
|
+
name: "versionId";
|
|
12
|
+
tableName: string;
|
|
13
|
+
dataType: "string";
|
|
14
|
+
columnType: "SQLiteText";
|
|
15
|
+
data: string;
|
|
16
|
+
driverParam: string;
|
|
17
|
+
notNull: true;
|
|
18
|
+
hasDefault: false;
|
|
19
|
+
enumValues: [string, ...string[]];
|
|
20
|
+
baseColumn: never;
|
|
21
|
+
}, object>;
|
|
22
|
+
};
|
|
23
|
+
dialect: "sqlite";
|
|
24
|
+
}>;
|
|
25
|
+
/**
|
|
26
|
+
* @param {string} tableName
|
|
27
|
+
*/
|
|
28
|
+
export function getBacklinkTableName(tableName: string): string;
|
|
29
|
+
/** @import { SQLiteTableWithColumns } from 'drizzle-orm/sqlite-core' */
|
|
30
|
+
/**
|
|
31
|
+
* @template {string} [TName=string]
|
|
32
|
+
* @typedef {SQLiteTableWithColumns<{
|
|
33
|
+
* name: TName;
|
|
34
|
+
* dialect: 'sqlite';
|
|
35
|
+
* schema: string | undefined;
|
|
36
|
+
* columns: any
|
|
37
|
+
* }>} SqliteTable
|
|
38
|
+
*/
|
|
39
|
+
export const BACKLINK_TABLE_POSTFIX: "_backlink";
|
|
40
|
+
export const customJson: <TName extends string>(dbName: TName, fieldConfig?: unknown) => import("drizzle-orm/sqlite-core").SQLiteCustomColumnBuilder<{
|
|
41
|
+
name: TName;
|
|
42
|
+
dataType: "custom";
|
|
43
|
+
columnType: "SQLiteCustomColumn";
|
|
44
|
+
data: unknown;
|
|
45
|
+
driverParam: unknown;
|
|
46
|
+
enumValues: undefined;
|
|
47
|
+
}>;
|
|
48
|
+
export type SqliteTable<TName extends string = string> = SQLiteTableWithColumns<{
|
|
49
|
+
name: TName;
|
|
50
|
+
dialect: "sqlite";
|
|
51
|
+
schema: string | undefined;
|
|
52
|
+
columns: any;
|
|
53
|
+
}>;
|
|
54
|
+
import type { SQLiteTableWithColumns } from 'drizzle-orm/sqlite-core';
|
|
55
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/schema/utils.js"],"names":[],"mappings":"AAoBA;;;;GAIG;AACH,2CAFW,WAAW;;;;;;;;;;;;;;;;;;GAOrB;AAED;;GAEG;AACH,gDAFW,MAAM,UAIhB;AA/BD,wEAAwE;AAExE;;;;;;;;GAQG;AAEH,iDAAiD;AAqBjD;;;;;;;GAWE;wBAzCqB,KAAK,SAAf,MAAQ,aACR,uBAAuB;IACnC,IAAQ,EAAE,KAAK,CAAC;IAChB,OAAW,EAAE,QAAQ,CAAC;IACtB,MAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,OAAW,EAAE,GAAG,CAAA;CACb,CAAC;4CATuC,yBAAyB"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derive count for each peer: "want"; "have"; "wanted".
|
|
3
|
+
*
|
|
4
|
+
* @param {InternalState} coreState
|
|
5
|
+
*
|
|
6
|
+
* @private
|
|
7
|
+
* Only exporteed for testing
|
|
8
|
+
*/
|
|
9
|
+
export function deriveState(coreState: InternalState): {
|
|
10
|
+
coreLength: number;
|
|
11
|
+
localState: LocalCoreState;
|
|
12
|
+
remoteStates: Record<string, PeerNamespaceState>;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Apologies for the obscure code. From
|
|
16
|
+
* https://stackoverflow.com/a/109025/903300
|
|
17
|
+
* @param {number} n
|
|
18
|
+
*/
|
|
19
|
+
export function bitCount32(n: number): number;
|
|
20
|
+
/** @import { HypercorePeer, HypercoreRemoteBitfield, Namespace } from '../types.js' */
|
|
21
|
+
/**
|
|
22
|
+
* @typedef {RemoteBitfield} Bitfield
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* @typedef {string} PeerId
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* @typedef {Object} InternalState
|
|
29
|
+
* @property {number | undefined} length Core length, e.g. how many blocks in the core (including blocks that are not downloaded)
|
|
30
|
+
* @property {PeerState} localState
|
|
31
|
+
* @property {Map<PeerId, PeerState>} remoteStates
|
|
32
|
+
* @property {Map<string, import('./peer-sync-controller.js').PeerSyncController>} peerSyncControllers
|
|
33
|
+
* @property {Namespace} namespace
|
|
34
|
+
*/
|
|
35
|
+
/**
|
|
36
|
+
* @typedef {object} LocalCoreState
|
|
37
|
+
* @property {number} have blocks we have
|
|
38
|
+
* @property {number} want unique blocks we want from any other peer
|
|
39
|
+
* @property {number} wanted blocks we want from this peer
|
|
40
|
+
*/
|
|
41
|
+
/**
|
|
42
|
+
* @typedef {object} PeerNamespaceState
|
|
43
|
+
* @property {number} have blocks the peer has locally
|
|
44
|
+
* @property {number} want blocks this peer wants from us
|
|
45
|
+
* @property {number} wanted blocks we want from this peer
|
|
46
|
+
* @property {'stopped' | 'starting' | 'started'} status
|
|
47
|
+
*/
|
|
48
|
+
/**
|
|
49
|
+
* @typedef {object} DerivedState
|
|
50
|
+
* @property {number} coreLength known (sparse) length of the core
|
|
51
|
+
* @property {LocalCoreState} localState local state
|
|
52
|
+
* @property {{ [peerId in PeerId]: PeerNamespaceState }} remoteStates map of state of all known peers
|
|
53
|
+
*/
|
|
54
|
+
/**
|
|
55
|
+
* Track sync state for a core identified by `discoveryId`. Can start tracking
|
|
56
|
+
* state before the core instance exists locally, via the "preHave" messages
|
|
57
|
+
* received over the project creator core.
|
|
58
|
+
*
|
|
59
|
+
* Because deriving the state is expensive (it iterates through the bitfields of
|
|
60
|
+
* all peers), this is designed to be pull-based: the onUpdate event signals
|
|
61
|
+
* that the state is updated, but does not pass the state. The consumer can
|
|
62
|
+
* "pull" the state when it wants it via `coreSyncState.getState()`.
|
|
63
|
+
*
|
|
64
|
+
* Each peer (including the local peer) has a state of:
|
|
65
|
+
*
|
|
66
|
+
* 1. `have` - number of blocks the peer has locally
|
|
67
|
+
*
|
|
68
|
+
* 2. `want` - number of blocks this peer wants. For local state, this is the
|
|
69
|
+
* number of unique blocks we want from anyone else. For remote peers, it is
|
|
70
|
+
* the number of blocks this peer wants from us.
|
|
71
|
+
*
|
|
72
|
+
* 3. `wanted` - number of blocks this peer has that's wanted by others. For
|
|
73
|
+
* local state, this is the number of unique blocks any of our peers want.
|
|
74
|
+
* For remote peers, it is the number of blocks we want from them.
|
|
75
|
+
*/
|
|
76
|
+
export class CoreSyncState {
|
|
77
|
+
/**
|
|
78
|
+
* @param {object} opts
|
|
79
|
+
* @param {() => void} opts.onUpdate Called when a state update is available (via getState())
|
|
80
|
+
* @param {Map<string, import('./peer-sync-controller.js').PeerSyncController>} opts.peerSyncControllers
|
|
81
|
+
* @param {Namespace} opts.namespace
|
|
82
|
+
*/
|
|
83
|
+
constructor({ onUpdate, peerSyncControllers, namespace }: {
|
|
84
|
+
onUpdate: () => void;
|
|
85
|
+
peerSyncControllers: Map<string, import("./peer-sync-controller.js").PeerSyncController>;
|
|
86
|
+
namespace: Namespace;
|
|
87
|
+
});
|
|
88
|
+
getState(): DerivedState;
|
|
89
|
+
/**
|
|
90
|
+
* Attach a core. The sync state can be initialized without a core instance,
|
|
91
|
+
* because we could receive peer want and have states via extension messages
|
|
92
|
+
* before we have the core key that allows us to create a core instance.
|
|
93
|
+
*
|
|
94
|
+
* @param {import('hypercore')<'binary', Buffer>} core
|
|
95
|
+
*/
|
|
96
|
+
attachCore(core: import("hypercore")<"binary", Buffer>): void;
|
|
97
|
+
/**
|
|
98
|
+
* Add a pre-emptive "have" bitfield for a peer. This is used when we receive
|
|
99
|
+
* a peer "have" via extension message - it allows us to have a state for the
|
|
100
|
+
* peer before the peer actually starts syncing this core
|
|
101
|
+
*
|
|
102
|
+
* @param {PeerId} peerId
|
|
103
|
+
* @param {number} start
|
|
104
|
+
* @param {Uint32Array} bitfield
|
|
105
|
+
*/
|
|
106
|
+
insertPreHaves(peerId: PeerId, start: number, bitfield: Uint32Array): void;
|
|
107
|
+
/**
|
|
108
|
+
* Add a ranges of wanted blocks for a peer. By default a peer wants all
|
|
109
|
+
* blocks in a core - calling this will change the peer to only want the
|
|
110
|
+
* blocks/ranges that are added here
|
|
111
|
+
*
|
|
112
|
+
* @param {PeerId} peerId
|
|
113
|
+
* @param {Array<{ start: number, length: number }>} ranges
|
|
114
|
+
*/
|
|
115
|
+
setPeerWants(peerId: PeerId, ranges: Array<{
|
|
116
|
+
start: number;
|
|
117
|
+
length: number;
|
|
118
|
+
}>): void;
|
|
119
|
+
/**
|
|
120
|
+
* @param {PeerId} peerId
|
|
121
|
+
*/
|
|
122
|
+
addPeer(peerId: PeerId): void;
|
|
123
|
+
#private;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Sync state for a core for a peer. Uses an internal bitfield from Hypercore to
|
|
127
|
+
* track which blocks the peer has. Default is that a peer wants all blocks, but
|
|
128
|
+
* can set ranges of "wants". Setting a want range changes all other blocks to
|
|
129
|
+
* "not wanted"
|
|
130
|
+
*
|
|
131
|
+
* @private
|
|
132
|
+
* Only exported for testing
|
|
133
|
+
*/
|
|
134
|
+
export class PeerState {
|
|
135
|
+
constructor({ wantAll }?: {
|
|
136
|
+
wantAll?: boolean | undefined;
|
|
137
|
+
});
|
|
138
|
+
/** @type {PeerNamespaceState['status']} */
|
|
139
|
+
status: PeerNamespaceState["status"];
|
|
140
|
+
get preHavesBitfield(): RemoteBitfield;
|
|
141
|
+
/**
|
|
142
|
+
* @param {number} start
|
|
143
|
+
* @param {Uint32Array} bitfield
|
|
144
|
+
*/
|
|
145
|
+
insertPreHaves(start: number, bitfield: Uint32Array): boolean;
|
|
146
|
+
/**
|
|
147
|
+
* @param {HypercoreRemoteBitfield} bitfield
|
|
148
|
+
*/
|
|
149
|
+
setHavesBitfield(bitfield: HypercoreRemoteBitfield): void;
|
|
150
|
+
/**
|
|
151
|
+
* Set a range of blocks that a peer wants. This is not part of the Hypercore
|
|
152
|
+
* protocol, so we need our own extension messages that a peer can use to
|
|
153
|
+
* inform us which blocks they are interested in. For most cores peers always
|
|
154
|
+
* want all blocks, but for blob cores often peers only want preview or
|
|
155
|
+
* thumbnail versions of media
|
|
156
|
+
*
|
|
157
|
+
* @param {{ start: number, length: number }} range
|
|
158
|
+
*/
|
|
159
|
+
setWantRange({ start, length }: {
|
|
160
|
+
start: number;
|
|
161
|
+
length: number;
|
|
162
|
+
}): void;
|
|
163
|
+
/**
|
|
164
|
+
* Returns whether the peer has the block at `index`. If a pre-have bitfield
|
|
165
|
+
* has been passed, this is used if no connected peer bitfield is available.
|
|
166
|
+
* If neither bitfield is available then this defaults to `false`
|
|
167
|
+
* @param {number} index
|
|
168
|
+
*/
|
|
169
|
+
have(index: number): boolean;
|
|
170
|
+
/**
|
|
171
|
+
* Return the "haves" for the 32 blocks from `index`, as a 32-bit integer
|
|
172
|
+
*
|
|
173
|
+
* @param {number} index
|
|
174
|
+
* @returns {number} 32-bit number representing whether the peer has or not
|
|
175
|
+
* the 32 blocks from `index`
|
|
176
|
+
*/
|
|
177
|
+
haveWord(index: number): number;
|
|
178
|
+
/**
|
|
179
|
+
* Returns whether this peer wants block at `index`. Defaults to `true` for
|
|
180
|
+
* all blocks
|
|
181
|
+
* @param {number} index
|
|
182
|
+
*/
|
|
183
|
+
want(index: number): boolean;
|
|
184
|
+
/**
|
|
185
|
+
* Return the "wants" for the 32 blocks from `index`, as a 32-bit integer
|
|
186
|
+
*
|
|
187
|
+
* @param {number} index
|
|
188
|
+
* @returns {number} 32-bit number representing whether the peer wants or not
|
|
189
|
+
* the 32 blocks from `index`
|
|
190
|
+
*/
|
|
191
|
+
wantWord(index: number): number;
|
|
192
|
+
#private;
|
|
193
|
+
}
|
|
194
|
+
export type Bitfield = RemoteBitfield;
|
|
195
|
+
export type PeerId = string;
|
|
196
|
+
export type InternalState = {
|
|
197
|
+
/**
|
|
198
|
+
* Core length, e.g. how many blocks in the core (including blocks that are not downloaded)
|
|
199
|
+
*/
|
|
200
|
+
length: number | undefined;
|
|
201
|
+
localState: PeerState;
|
|
202
|
+
remoteStates: Map<PeerId, PeerState>;
|
|
203
|
+
peerSyncControllers: Map<string, import("./peer-sync-controller.js").PeerSyncController>;
|
|
204
|
+
namespace: Namespace;
|
|
205
|
+
};
|
|
206
|
+
export type LocalCoreState = {
|
|
207
|
+
/**
|
|
208
|
+
* blocks we have
|
|
209
|
+
*/
|
|
210
|
+
have: number;
|
|
211
|
+
/**
|
|
212
|
+
* unique blocks we want from any other peer
|
|
213
|
+
*/
|
|
214
|
+
want: number;
|
|
215
|
+
/**
|
|
216
|
+
* blocks we want from this peer
|
|
217
|
+
*/
|
|
218
|
+
wanted: number;
|
|
219
|
+
};
|
|
220
|
+
export type PeerNamespaceState = {
|
|
221
|
+
/**
|
|
222
|
+
* blocks the peer has locally
|
|
223
|
+
*/
|
|
224
|
+
have: number;
|
|
225
|
+
/**
|
|
226
|
+
* blocks this peer wants from us
|
|
227
|
+
*/
|
|
228
|
+
want: number;
|
|
229
|
+
/**
|
|
230
|
+
* blocks we want from this peer
|
|
231
|
+
*/
|
|
232
|
+
wanted: number;
|
|
233
|
+
status: "stopped" | "starting" | "started";
|
|
234
|
+
};
|
|
235
|
+
export type DerivedState = {
|
|
236
|
+
/**
|
|
237
|
+
* known (sparse) length of the core
|
|
238
|
+
*/
|
|
239
|
+
coreLength: number;
|
|
240
|
+
/**
|
|
241
|
+
* local state
|
|
242
|
+
*/
|
|
243
|
+
localState: LocalCoreState;
|
|
244
|
+
/**
|
|
245
|
+
* map of state of all known peers
|
|
246
|
+
*/
|
|
247
|
+
remoteStates: { [peerId in PeerId]: PeerNamespaceState; };
|
|
248
|
+
};
|
|
249
|
+
import type { Namespace } from '../types.js';
|
|
250
|
+
import RemoteBitfield from '../core-manager/remote-bitfield.js';
|
|
251
|
+
import type { HypercoreRemoteBitfield } from '../types.js';
|
|
252
|
+
//# sourceMappingURL=core-sync-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-sync-state.d.ts","sourceRoot":"","sources":["../../src/sync/core-sync-state.js"],"names":[],"mappings":"AA4VA;;;;;;;GAOG;AACH,uCALW,aAAa;;;;EA6DvB;AAED;;;;GAIG;AACH,8BAFW,MAAM,UAMhB;AAnaD,uFAAuF;AAEvF;;GAEG;AACH;;GAEG;AACH;;;;;;;GAOG;AACH;;;;;GAKG;AACH;;;;;;GAMG;AACH;;;;;GAKG;AAEH;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH;IAYE;;;;;OAKG;IACH,0DAJG;QAAyB,QAAQ,EAAzB,MAAM,IAAI;QACgE,mBAAmB,EAA7F,GAAG,CAAC,MAAM,EAAE,OAAO,2BAA2B,EAAE,kBAAkB,CAAC;QACnD,SAAS,EAAzB,SAAS;KACnB,EASA;IAEU,YAAM,YAAY,CAAA;IAY7B;;;;;;OAMG;IACH,iBAFW,OAAO,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,QAiC/C;IAED;;;;;;;;OAQG;IACH,uBAJW,MAAM,SACN,MAAM,YACN,WAAW,QAUrB;IAED;;;;;;;OAOG;IACH,qBAHW,MAAM,UACN,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,QAQlD;IAED;;OAEG;IACH,gBAFW,MAAM,QAMhB;;CAiEF;AAED;;;;;;;;GAQG;AACH;IAUE;;OAEC;IALD,2CAA2C;IAC3C,QADW,kBAAkB,CAAC,QAAQ,CAAC,CACrB;IAKlB,uCAEC;IACD;;;OAGG;IACH,sBAHW,MAAM,YACN,WAAW,WAIrB;IACD;;OAEG;IACH,2BAFW,uBAAuB,QAIjC;IACD;;;;;;;;OAQG;IACH,gCAFW;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,QAK3C;IACD;;;;;OAKG;IACH,YAFW,MAAM,WAIhB;IACD;;;;;;OAMG;IACH,gBAJW,MAAM,GACJ,MAAM,CAOlB;IACD;;;;OAIG;IACH,YAFW,MAAM,WAKhB;IACD;;;;;;OAMG;IACH,gBAJW,MAAM,GACJ,MAAM,CASlB;;CACF;uBAnVY,cAAc;qBAGd,MAAM;;;;;YAIL,MAAM,GAAG,SAAS;gBAClB,SAAS;kBACT,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC;yBACtB,GAAG,CAAC,MAAM,EAAE,OAAO,2BAA2B,EAAE,kBAAkB,CAAC;eACnE,SAAS;;;;;;UAIT,MAAM;;;;UACN,MAAM;;;;YACN,MAAM;;;;;;UAIN,MAAM;;;;UACN,MAAM;;;;YACN,MAAM;YACN,SAAS,GAAG,UAAU,GAAG,SAAS;;;;;;gBAIlC,MAAM;;;;gBACN,cAAc;;;;kBACd,GAAG,MAAgB,IAAN,MAAM,GAAG,kBAAkB,GAAE;;+BAjCe,aAAa;2BAD7E,oCAAoC;6CAC4B,aAAa"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @overload
|
|
3
|
+
* @returns {SyncState['localState']}
|
|
4
|
+
*/
|
|
5
|
+
export function createState(): SyncState["localState"];
|
|
6
|
+
/**
|
|
7
|
+
* @overload
|
|
8
|
+
* @param {import('./core-sync-state.js').PeerNamespaceState['status']} status
|
|
9
|
+
* @returns {import('./core-sync-state.js').PeerNamespaceState}
|
|
10
|
+
*/
|
|
11
|
+
export function createState(status: import("./core-sync-state.js").PeerNamespaceState["status"]): import("./core-sync-state.js").PeerNamespaceState;
|
|
12
|
+
/** @import { Namespace } from '../types.js' */
|
|
13
|
+
/**
|
|
14
|
+
* @typedef {Omit<import('./core-sync-state.js').DerivedState, 'coreLength'> & { dataToSync: boolean, coreCount: number }} SyncState
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* @template {Namespace} [TNamespace=Namespace]
|
|
18
|
+
*/
|
|
19
|
+
export class NamespaceSyncState<TNamespace extends Namespace = "blob" | "auth" | "config" | "data" | "blobIndex"> {
|
|
20
|
+
/**
|
|
21
|
+
* @param {object} opts
|
|
22
|
+
* @param {TNamespace} opts.namespace
|
|
23
|
+
* @param {import('../core-manager/index.js').CoreManager} opts.coreManager
|
|
24
|
+
* @param {() => void} opts.onUpdate Called when a state update is available (via getState())
|
|
25
|
+
* @param {Map<string, import('./peer-sync-controller.js').PeerSyncController>} opts.peerSyncControllers
|
|
26
|
+
*/
|
|
27
|
+
constructor({ namespace, coreManager, onUpdate, peerSyncControllers }: {
|
|
28
|
+
namespace: TNamespace;
|
|
29
|
+
coreManager: import("../core-manager/index.js").CoreManager;
|
|
30
|
+
onUpdate: () => void;
|
|
31
|
+
peerSyncControllers: Map<string, import("./peer-sync-controller.js").PeerSyncController>;
|
|
32
|
+
});
|
|
33
|
+
get namespace(): TNamespace;
|
|
34
|
+
/** @returns {SyncState} */
|
|
35
|
+
getState(): SyncState;
|
|
36
|
+
/**
|
|
37
|
+
* @param {string} peerId
|
|
38
|
+
*/
|
|
39
|
+
addPeer(peerId: string): void;
|
|
40
|
+
#private;
|
|
41
|
+
}
|
|
42
|
+
export type SyncState = Omit<import("./core-sync-state.js").DerivedState, "coreLength"> & {
|
|
43
|
+
dataToSync: boolean;
|
|
44
|
+
coreCount: number;
|
|
45
|
+
};
|
|
46
|
+
import type { Namespace } from '../types.js';
|
|
47
|
+
//# sourceMappingURL=namespace-sync-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namespace-sync-state.d.ts","sourceRoot":"","sources":["../../src/sync/namespace-sync-state.js"],"names":[],"mappings":";;;;AAwIG,+BACU,SAAS,CAAC,YAAY,CAAC,CACnC;;;;;;AAGE,oCACQ,OAAO,sBAAsB,EAAE,kBAAkB,CAAC,QAAQ,CAAC,GACzD,OAAO,sBAAsB,EAAE,kBAAkB,CAC7D;AA9ID,+CAA+C;AAE/C;;GAEG;AAEH;;GAEG;AACH,gCAF0B,UAAU,SAAvB,SAAW;IAYtB;;;;;;OAMG;IACH,uEALG;QAAyB,SAAS,EAA1B,UAAU;QAC2C,WAAW,EAAhE,OAAO,0BAA0B,EAAE,WAAW;QAC7B,QAAQ,EAAzB,MAAM,IAAI;QACgE,mBAAmB,EAA7F,GAAG,CAAC,MAAM,EAAE,OAAO,2BAA2B,EAAE,kBAAkB,CAAC;KAC7E,EAwBA;IAED,4BAEC;IAED,2BAA2B;IAC3B,YADc,SAAS,CA4BtB;IAED;;OAEG;IACH,gBAFW,MAAM,QAMhB;;CAuCF;wBAhIY,IAAI,CAAC,OAAO,sBAAsB,EAAE,YAAY,EAAE,YAAY,CAAC,GAAG;IAAE,UAAU,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE;+BAH1F,aAAa"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/** @import { CoreRecord } from '../core-manager/index.js' */
|
|
2
|
+
/** @import { Role } from '../roles.js' */
|
|
3
|
+
/** @import { SyncEnabledState } from './sync-api.js' */
|
|
4
|
+
/** @import { Namespace } from '../types.js' */
|
|
5
|
+
/** @import { OpenedNoiseStream } from '../lib/noise-secret-stream-helpers.js' */
|
|
6
|
+
/**
|
|
7
|
+
* @typedef {Role['sync'][Namespace] | 'unknown'} SyncCapability
|
|
8
|
+
*/
|
|
9
|
+
export class PeerSyncController {
|
|
10
|
+
/**
|
|
11
|
+
* @param {object} opts
|
|
12
|
+
* @param {import('protomux')<OpenedNoiseStream>} opts.protomux
|
|
13
|
+
* @param {import("../core-manager/index.js").CoreManager} opts.coreManager
|
|
14
|
+
* @param {import("./sync-state.js").SyncState} opts.syncState
|
|
15
|
+
* @param {import('../roles.js').Roles} opts.roles
|
|
16
|
+
* @param {Logger} [opts.logger]
|
|
17
|
+
*/
|
|
18
|
+
constructor({ protomux, coreManager, syncState, roles, logger }: {
|
|
19
|
+
protomux: import("protomux")<OpenedNoiseStream>;
|
|
20
|
+
coreManager: import("../core-manager/index.js").CoreManager;
|
|
21
|
+
syncState: import("./sync-state.js").SyncState;
|
|
22
|
+
roles: import("../roles.js").Roles;
|
|
23
|
+
logger?: Logger | undefined;
|
|
24
|
+
});
|
|
25
|
+
get peerKey(): Buffer;
|
|
26
|
+
get peerId(): string;
|
|
27
|
+
get syncCapability(): Record<"blob" | "auth" | "config" | "data" | "blobIndex", SyncCapability>;
|
|
28
|
+
/** @param {SyncEnabledState} syncEnabledState */
|
|
29
|
+
setSyncEnabledState(syncEnabledState: SyncEnabledState): void;
|
|
30
|
+
/**
|
|
31
|
+
* @param {Buffer} discoveryKey
|
|
32
|
+
*/
|
|
33
|
+
handleDiscoveryKey(discoveryKey: Buffer): void;
|
|
34
|
+
#private;
|
|
35
|
+
}
|
|
36
|
+
export type PeerState = { [namespace in Namespace]?: import("./core-sync-state.js").PeerNamespaceState; };
|
|
37
|
+
export type SyncStatus = Record<Namespace, "unknown" | "syncing" | "synced">;
|
|
38
|
+
export type SyncCapability = Role["sync"][Namespace] | "unknown";
|
|
39
|
+
import type { SyncEnabledState } from './sync-api.js';
|
|
40
|
+
import type { OpenedNoiseStream } from '../lib/noise-secret-stream-helpers.js';
|
|
41
|
+
import { Logger } from '../logger.js';
|
|
42
|
+
import type { Namespace } from '../types.js';
|
|
43
|
+
import type { Role } from '../roles.js';
|
|
44
|
+
//# sourceMappingURL=peer-sync-controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peer-sync-controller.d.ts","sourceRoot":"","sources":["../../src/sync/peer-sync-controller.js"],"names":[],"mappings":"AAKA,6DAA6D;AAC7D,0CAA0C;AAC1C,wDAAwD;AACxD,+CAA+C;AAC/C,iFAAiF;AAEjF;;GAEG;AAEH;IAqBE;;;;;;;OAOG;IACH,iEANG;QAAoD,QAAQ,EAApD,OAAO,UAAU,EAAE,iBAAiB,CAAC;QACgB,WAAW,EAAhE,OAAO,0BAA0B,EAAE,WAAW;QACJ,SAAS,EAAnD,OAAO,iBAAiB,EAAE,SAAS;QACD,KAAK,EAAvC,OAAO,aAAa,EAAE,KAAK;QACb,MAAM;KAAC,EA2B/B;IAED,sBAEC;IAED,qBAEC;IAED,gGAEC;IAED,iDAAiD;IACjD,sCADY,gBAAgB,QAO3B;IAED;;OAEG;IACH,iCAFW,MAAM,QAgBhB;;CAyLF;wBAGY,GAAG,SAAsB,IAAT,SAAS,CAAC,CAAC,EAAE,OAAO,sBAAsB,EAAE,kBAAkB,GAAE;yBAG/E,MAAM,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;6BAhSpD,IAAI,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,SAAS;sCALV,eAAe;uCAEd,uCAAuC;uBAPvD,cAAc;+BAMN,aAAa;0BAFlB,aAAa"}
|