@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.
Files changed (186) hide show
  1. package/LICENSE.md +9 -0
  2. package/README.md +31 -0
  3. package/dist/blob-api.d.ts +92 -0
  4. package/dist/blob-api.d.ts.map +1 -0
  5. package/dist/blob-store/index.d.ts +163 -0
  6. package/dist/blob-store/index.d.ts.map +1 -0
  7. package/dist/blob-store/live-download.d.ts +107 -0
  8. package/dist/blob-store/live-download.d.ts.map +1 -0
  9. package/dist/config-import.d.ts +74 -0
  10. package/dist/config-import.d.ts.map +1 -0
  11. package/dist/constants.d.ts +14 -0
  12. package/dist/constants.d.ts.map +1 -0
  13. package/dist/core-manager/bitfield-rle.d.ts +25 -0
  14. package/dist/core-manager/bitfield-rle.d.ts.map +1 -0
  15. package/dist/core-manager/core-index.d.ts +56 -0
  16. package/dist/core-manager/core-index.d.ts.map +1 -0
  17. package/dist/core-manager/index.d.ts +125 -0
  18. package/dist/core-manager/index.d.ts.map +1 -0
  19. package/dist/core-manager/random-access-file-pool.d.ts +17 -0
  20. package/dist/core-manager/random-access-file-pool.d.ts.map +1 -0
  21. package/dist/core-manager/remote-bitfield.d.ts +146 -0
  22. package/dist/core-manager/remote-bitfield.d.ts.map +1 -0
  23. package/dist/core-ownership.d.ts +112 -0
  24. package/dist/core-ownership.d.ts.map +1 -0
  25. package/dist/datastore/index.d.ts +91 -0
  26. package/dist/datastore/index.d.ts.map +1 -0
  27. package/dist/datatype/index.d.ts +108 -0
  28. package/dist/discovery/local-discovery.d.ts +64 -0
  29. package/dist/discovery/local-discovery.d.ts.map +1 -0
  30. package/dist/errors.d.ts +4 -0
  31. package/dist/errors.d.ts.map +1 -0
  32. package/dist/fastify-controller.d.ts +27 -0
  33. package/dist/fastify-controller.d.ts.map +1 -0
  34. package/dist/fastify-plugins/blobs.d.ts +6 -0
  35. package/dist/fastify-plugins/blobs.d.ts.map +1 -0
  36. package/dist/fastify-plugins/constants.d.ts +3 -0
  37. package/dist/fastify-plugins/constants.d.ts.map +1 -0
  38. package/dist/fastify-plugins/icons.d.ts +6 -0
  39. package/dist/fastify-plugins/icons.d.ts.map +1 -0
  40. package/dist/fastify-plugins/maps/index.d.ts +11 -0
  41. package/dist/fastify-plugins/maps/index.d.ts.map +1 -0
  42. package/dist/fastify-plugins/maps/offline-fallback-map.d.ts +12 -0
  43. package/dist/fastify-plugins/maps/offline-fallback-map.d.ts.map +1 -0
  44. package/dist/fastify-plugins/maps/static-maps.d.ts +11 -0
  45. package/dist/fastify-plugins/maps/static-maps.d.ts.map +1 -0
  46. package/dist/fastify-plugins/utils.d.ts +23 -0
  47. package/dist/fastify-plugins/utils.d.ts.map +1 -0
  48. package/dist/generated/extensions.d.ts +44 -0
  49. package/dist/generated/extensions.d.ts.map +1 -0
  50. package/dist/generated/keys.d.ts +36 -0
  51. package/dist/generated/keys.d.ts.map +1 -0
  52. package/dist/generated/rpc.d.ts +87 -0
  53. package/dist/generated/rpc.d.ts.map +1 -0
  54. package/dist/icon-api.d.ts +109 -0
  55. package/dist/icon-api.d.ts.map +1 -0
  56. package/dist/index-writer/index.d.ts +51 -0
  57. package/dist/index-writer/index.d.ts.map +1 -0
  58. package/dist/index.d.ts +14 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/invite-api.d.ts +70 -0
  61. package/dist/invite-api.d.ts.map +1 -0
  62. package/dist/lib/hashmap.d.ts +62 -0
  63. package/dist/lib/hashmap.d.ts.map +1 -0
  64. package/dist/lib/hypercore-helpers.d.ts +6 -0
  65. package/dist/lib/hypercore-helpers.d.ts.map +1 -0
  66. package/dist/lib/noise-secret-stream-helpers.d.ts +45 -0
  67. package/dist/lib/noise-secret-stream-helpers.d.ts.map +1 -0
  68. package/dist/lib/ponyfills.d.ts +10 -0
  69. package/dist/lib/ponyfills.d.ts.map +1 -0
  70. package/dist/lib/string.d.ts +2 -0
  71. package/dist/lib/string.d.ts.map +1 -0
  72. package/dist/lib/timing-safe-equal.d.ts +15 -0
  73. package/dist/lib/timing-safe-equal.d.ts.map +1 -0
  74. package/dist/local-peers.d.ts +151 -0
  75. package/dist/local-peers.d.ts.map +1 -0
  76. package/dist/logger.d.ts +32 -0
  77. package/dist/logger.d.ts.map +1 -0
  78. package/dist/mapeo-manager.d.ts +178 -0
  79. package/dist/mapeo-manager.d.ts.map +1 -0
  80. package/dist/mapeo-project.d.ts +3233 -0
  81. package/dist/mapeo-project.d.ts.map +1 -0
  82. package/dist/member-api.d.ts +114 -0
  83. package/dist/member-api.d.ts.map +1 -0
  84. package/dist/roles.d.ts +157 -0
  85. package/dist/roles.d.ts.map +1 -0
  86. package/dist/schema/client.d.ts +284 -0
  87. package/dist/schema/client.d.ts.map +1 -0
  88. package/dist/schema/project.d.ts +1812 -0
  89. package/dist/schema/project.d.ts.map +1 -0
  90. package/dist/schema/schema-to-drizzle.d.ts +20 -0
  91. package/dist/schema/schema-to-drizzle.d.ts.map +1 -0
  92. package/dist/schema/types.d.ts +98 -0
  93. package/dist/schema/types.d.ts.map +1 -0
  94. package/dist/schema/utils.d.ts +55 -0
  95. package/dist/schema/utils.d.ts.map +1 -0
  96. package/dist/sync/core-sync-state.d.ts +252 -0
  97. package/dist/sync/core-sync-state.d.ts.map +1 -0
  98. package/dist/sync/namespace-sync-state.d.ts +47 -0
  99. package/dist/sync/namespace-sync-state.d.ts.map +1 -0
  100. package/dist/sync/peer-sync-controller.d.ts +44 -0
  101. package/dist/sync/peer-sync-controller.d.ts.map +1 -0
  102. package/dist/sync/sync-api.d.ts +158 -0
  103. package/dist/sync/sync-api.d.ts.map +1 -0
  104. package/dist/sync/sync-state.d.ts +40 -0
  105. package/dist/sync/sync-state.d.ts.map +1 -0
  106. package/dist/translation-api.d.ts +288 -0
  107. package/dist/translation-api.d.ts.map +1 -0
  108. package/dist/types.d.ts +115 -0
  109. package/dist/types.d.ts.map +1 -0
  110. package/dist/utils.d.ts +115 -0
  111. package/dist/utils.d.ts.map +1 -0
  112. package/dist/utils_types.d.ts +14 -0
  113. package/drizzle/client/0000_bumpy_carnage.sql +33 -0
  114. package/drizzle/client/meta/0000_snapshot.json +199 -0
  115. package/drizzle/client/meta/_journal.json +13 -0
  116. package/drizzle/project/0000_spooky_lady_ursula.sql +192 -0
  117. package/drizzle/project/meta/0000_snapshot.json +1137 -0
  118. package/drizzle/project/meta/_journal.json +13 -0
  119. package/package.json +202 -0
  120. package/src/blob-api.js +139 -0
  121. package/src/blob-store/index.js +325 -0
  122. package/src/blob-store/live-download.js +373 -0
  123. package/src/config-import.js +604 -0
  124. package/src/constants.js +34 -0
  125. package/src/core-manager/bitfield-rle.js +235 -0
  126. package/src/core-manager/core-index.js +87 -0
  127. package/src/core-manager/index.js +504 -0
  128. package/src/core-manager/random-access-file-pool.js +30 -0
  129. package/src/core-manager/remote-bitfield.js +416 -0
  130. package/src/core-ownership.js +235 -0
  131. package/src/datastore/README.md +46 -0
  132. package/src/datastore/index.js +234 -0
  133. package/src/datatype/README.md +33 -0
  134. package/src/datatype/index.d.ts +108 -0
  135. package/src/datatype/index.js +358 -0
  136. package/src/discovery/local-discovery.js +303 -0
  137. package/src/errors.js +5 -0
  138. package/src/fastify-controller.js +84 -0
  139. package/src/fastify-plugins/blobs.js +139 -0
  140. package/src/fastify-plugins/constants.js +5 -0
  141. package/src/fastify-plugins/icons.js +158 -0
  142. package/src/fastify-plugins/maps/index.js +173 -0
  143. package/src/fastify-plugins/maps/offline-fallback-map.js +114 -0
  144. package/src/fastify-plugins/maps/static-maps.js +271 -0
  145. package/src/fastify-plugins/utils.js +52 -0
  146. package/src/generated/README.md +3 -0
  147. package/src/generated/extensions.d.ts +44 -0
  148. package/src/generated/extensions.js +196 -0
  149. package/src/generated/extensions.ts +237 -0
  150. package/src/generated/keys.d.ts +36 -0
  151. package/src/generated/keys.js +148 -0
  152. package/src/generated/keys.ts +185 -0
  153. package/src/generated/rpc.d.ts +87 -0
  154. package/src/generated/rpc.js +389 -0
  155. package/src/generated/rpc.ts +463 -0
  156. package/src/icon-api.js +282 -0
  157. package/src/index-writer/README.md +38 -0
  158. package/src/index-writer/index.js +124 -0
  159. package/src/index.js +16 -0
  160. package/src/invite-api.js +450 -0
  161. package/src/lib/hashmap.js +91 -0
  162. package/src/lib/hypercore-helpers.js +18 -0
  163. package/src/lib/noise-secret-stream-helpers.js +37 -0
  164. package/src/lib/ponyfills.js +25 -0
  165. package/src/lib/string.js +7 -0
  166. package/src/lib/timing-safe-equal.js +34 -0
  167. package/src/local-peers.js +737 -0
  168. package/src/logger.js +99 -0
  169. package/src/mapeo-manager.js +914 -0
  170. package/src/mapeo-project.js +980 -0
  171. package/src/member-api.js +319 -0
  172. package/src/roles.js +412 -0
  173. package/src/schema/client.js +55 -0
  174. package/src/schema/project.js +44 -0
  175. package/src/schema/schema-to-drizzle.js +118 -0
  176. package/src/schema/types.ts +153 -0
  177. package/src/schema/utils.js +51 -0
  178. package/src/sync/core-sync-state.js +440 -0
  179. package/src/sync/namespace-sync-state.js +193 -0
  180. package/src/sync/peer-sync-controller.js +332 -0
  181. package/src/sync/sync-api.js +588 -0
  182. package/src/sync/sync-state.js +63 -0
  183. package/src/translation-api.js +141 -0
  184. package/src/types.ts +149 -0
  185. package/src/utils.js +210 -0
  186. 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":"AAQA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAGC;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAgC4M,CAAC;oCAA+K,CAAC;;oCAAyW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA7BtuB;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAwE;AACxE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAA2E;AAC3E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAwE;AACxE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAGC;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAqE;AACrE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAGC;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAqE;AAErE;;;;;;;;;;;;;;;;;;GAAuE;AACvE;;;;;;;;;;;;;;;;;;GAAuE;AACvE;;;;;;;;;;;;;;;;;;GAA2D;AAC3D;;;;;;;;;;;;;;;;;;GAA6D;AAC7D;;;;;;;;;;;;;;;;;;GAA2D;AAC3D;;;;;;;;;;;;;;;;;;GAA2E;AAC3E;;;;;;;;;;;;;;;;;;GAAyD;AACzD;;;;;;;;;;;;;;;;;;GAAqE;AACrE;;;;;;;;;;;;;;;;;;GAAyD;AAEzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAGE"}
@@ -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":"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"}
@@ -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"}