@seedprotocol/sdk 0.1.46 → 0.1.48

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 (147) hide show
  1. package/dist/bin.js.map +1 -1
  2. package/dist/constants-BLctWkrn.js.map +1 -1
  3. package/dist/{index-BEzB8REh.js → index-DMIKRod-.js} +3684 -3660
  4. package/dist/index-DMIKRod-.js.map +1 -0
  5. package/dist/{index-ChGsdGPJ.js → index-wKss7188.js} +10 -10
  6. package/dist/index-wKss7188.js.map +1 -0
  7. package/dist/main.js +7 -7
  8. package/dist/{seed.schema.config-jKpK-lR6.js → seed.schema.config-C0M8Rcti.js} +7 -7
  9. package/dist/seed.schema.config-C0M8Rcti.js.map +1 -0
  10. package/dist/src/AppStateSchema.ts +10 -0
  11. package/dist/src/Attestation.ts +21 -0
  12. package/dist/src/ConfigSchema.ts +15 -0
  13. package/dist/src/ItemProperty.ts +383 -0
  14. package/dist/src/MetadataSchema.ts +28 -0
  15. package/dist/src/ModelSchema.ts +46 -0
  16. package/dist/src/ModelUidSchema.ts +16 -0
  17. package/dist/src/PropertyUidSchema.ts +16 -0
  18. package/dist/src/Schema.ts +17 -0
  19. package/dist/src/SeedSchema.ts +29 -0
  20. package/dist/src/VersionSchema.ts +16 -0
  21. package/dist/src/actors.ts +10 -0
  22. package/dist/src/addModelsToDb.ts +150 -0
  23. package/dist/src/allItems.ts +23 -0
  24. package/dist/src/arweave.ts +37 -0
  25. package/dist/src/browser.app.db.config.ts +27 -0
  26. package/dist/src/browser.seed.db.config.ts +33 -0
  27. package/dist/src/browser.ts +30 -0
  28. package/dist/src/checkStatus.ts +50 -0
  29. package/dist/src/client.ts +85 -0
  30. package/dist/src/configureFs.ts +81 -0
  31. package/dist/src/connectToDb.ts +74 -0
  32. package/dist/src/connectionManager.ts +67 -0
  33. package/dist/src/constants.ts +118 -0
  34. package/dist/src/create.ts +39 -0
  35. package/dist/src/createItem.ts +15 -0
  36. package/dist/src/createItemMachine.ts +37 -0
  37. package/dist/src/createPublishAttempt.ts +16 -0
  38. package/dist/src/createSeeds.ts +24 -0
  39. package/dist/src/createVersion.ts +33 -0
  40. package/dist/src/db.ts +247 -0
  41. package/dist/src/dbMachine.ts +181 -0
  42. package/dist/src/deleteItem.ts +19 -0
  43. package/dist/src/download.ts +289 -0
  44. package/dist/src/drizzle.ts +82 -0
  45. package/dist/src/environment.ts +15 -0
  46. package/dist/src/eventBus.ts +5 -0
  47. package/dist/src/events.ts +14 -0
  48. package/dist/src/fetchDataFromEas.ts +90 -0
  49. package/dist/src/fetchDbData.ts +16 -0
  50. package/dist/src/fetchRelatedItems.ts +179 -0
  51. package/dist/src/fetchSeeds.ts +44 -0
  52. package/dist/src/fetchVersions.ts +41 -0
  53. package/dist/src/files.ts +16 -0
  54. package/dist/src/fragment-masking.ts +87 -0
  55. package/dist/src/fsProxy.ts +36 -0
  56. package/dist/src/getItem.ts +189 -0
  57. package/dist/src/getItemProperties.ts +162 -0
  58. package/dist/src/getItems.ts +75 -0
  59. package/dist/src/getMetadata.ts +40 -0
  60. package/dist/src/getModelSchemas.ts +88 -0
  61. package/dist/src/getSchemaForModel.ts +42 -0
  62. package/dist/src/getSeedData.ts +34 -0
  63. package/dist/src/getVersionData.ts +58 -0
  64. package/dist/src/getVersionsForVersionUids.ts +39 -0
  65. package/dist/src/globalMachine.ts +259 -0
  66. package/dist/src/gql.ts +113 -0
  67. package/dist/src/graphql.ts +3201 -0
  68. package/dist/src/helpers.ts +150 -0
  69. package/dist/src/hydrateExistingItem.ts +137 -0
  70. package/dist/src/hydrateFromDb.ts +254 -0
  71. package/dist/src/hydrateNewItem.ts +34 -0
  72. package/dist/src/index.d.ts +5 -0
  73. package/dist/src/index.ts +21 -0
  74. package/dist/src/init.ts +61 -0
  75. package/dist/src/initialize.ts +127 -0
  76. package/dist/src/internalMachine.ts +220 -0
  77. package/dist/src/item.ts +324 -0
  78. package/dist/src/itemMachineAll.ts +158 -0
  79. package/dist/src/itemMachineSingle.ts +175 -0
  80. package/dist/src/loadAppDb.ts +47 -0
  81. package/dist/src/logger.ts +33 -0
  82. package/dist/src/machine.ts +55 -0
  83. package/dist/src/machines.ts +58 -0
  84. package/dist/src/migrate.ts +288 -0
  85. package/dist/src/model.ts +71 -0
  86. package/dist/src/modelClass.ts +19 -0
  87. package/dist/src/node.app.db.config.ts +40 -0
  88. package/dist/src/prepareDb.ts +34 -0
  89. package/dist/src/preparePublishRequestData.ts +81 -0
  90. package/dist/src/processItems.ts +71 -0
  91. package/dist/src/property.ts +161 -0
  92. package/dist/src/propertyMachine.ts +154 -0
  93. package/dist/src/publish.ts +31 -0
  94. package/dist/src/publishMachine.ts +77 -0
  95. package/dist/src/queries.ts +13 -0
  96. package/dist/src/read.ts +174 -0
  97. package/dist/src/recoverDeletedItem.ts +14 -0
  98. package/dist/src/request.ts +54 -0
  99. package/dist/src/requestAll.ts +157 -0
  100. package/dist/src/resolveRelatedValue.ts +348 -0
  101. package/dist/src/resolveRemoteStorage.ts +87 -0
  102. package/dist/src/save.ts +183 -0
  103. package/dist/src/saveConfig.ts +79 -0
  104. package/dist/src/saveDataToDb.ts +145 -0
  105. package/dist/src/saveMetadata.ts +18 -0
  106. package/dist/src/saveValueToDb.ts +94 -0
  107. package/dist/src/seed.schema.config.ts +25 -0
  108. package/dist/src/seed.ts +37 -0
  109. package/dist/src/seedData.ts +0 -0
  110. package/dist/src/seedProtocol.ts +17 -0
  111. package/dist/src/services.ts +359 -0
  112. package/dist/src/sqlWasmClient.ts +88 -0
  113. package/dist/src/syncDbWithEas.ts +686 -0
  114. package/dist/src/trash.ts +29 -0
  115. package/dist/src/ts-to-proto.ts +101 -0
  116. package/dist/src/types.ts +12 -0
  117. package/dist/src/upload.ts +86 -0
  118. package/dist/src/validate.ts +42 -0
  119. package/dist/src/validateInput.ts +33 -0
  120. package/dist/src/validateItemData.ts +20 -0
  121. package/dist/src/waitForDb.ts +23 -0
  122. package/dist/src/wasm.d.ts +8300 -0
  123. package/dist/src/write.ts +366 -0
  124. package/dist/types/src/browser/db/read/getModelSchemas.d.ts.map +1 -1
  125. package/dist/types/src/browser/events/item/create.d.ts.map +1 -1
  126. package/dist/types/src/browser/events/item/publish.d.ts.map +1 -1
  127. package/dist/types/src/browser/events/item/requestAll.d.ts.map +1 -1
  128. package/dist/types/src/browser/events/item/syncDbWithEas.d.ts.map +1 -1
  129. package/dist/types/src/browser/item/single/actors/hydrateExistingItem.d.ts +3 -1
  130. package/dist/types/src/browser/item/single/actors/hydrateExistingItem.d.ts.map +1 -1
  131. package/dist/types/src/browser/item/single/actors/saveDataToDb.d.ts +3 -3
  132. package/dist/types/src/browser/item/single/itemMachineSingle.d.ts +3 -3
  133. package/dist/types/src/browser/property/ItemProperty.d.ts +7 -7
  134. package/dist/types/src/browser/property/ItemProperty.d.ts.map +1 -1
  135. package/dist/types/src/browser/property/actors/hydrateFromDb.d.ts.map +1 -1
  136. package/dist/types/src/browser/property/actors/initialize.d.ts.map +1 -1
  137. package/dist/types/src/browser/property/actors/resolveRemoteStorage.d.ts +3 -3
  138. package/dist/types/src/browser/react/trash.d.ts +1 -1
  139. package/dist/types/src/browser/react/trash.d.ts.map +1 -1
  140. package/dist/types/src/browser/services/db/dbMachine.d.ts +6 -6
  141. package/dist/types/src/browser/services/publish/publishMachine.d.ts +17 -17
  142. package/dist/types/src/types/machines.d.ts +4 -0
  143. package/dist/types/src/types/machines.d.ts.map +1 -1
  144. package/package.json +1 -1
  145. package/dist/index-BEzB8REh.js.map +0 -1
  146. package/dist/index-ChGsdGPJ.js.map +0 -1
  147. package/dist/seed.schema.config-jKpK-lR6.js.map +0 -1
@@ -0,0 +1,288 @@
1
+ import { EventObject, fromCallback } from 'xstate'
2
+ import { DbServiceContext, FromCallbackInput, SqliteWasmResult } from '@/types'
3
+ import {
4
+ BROWSER_FS_TOP_DIR,
5
+ DB_MIGRATING_SUCCESS,
6
+ } from '@/browser/services/internal/constants'
7
+ import { getSqliteWasmClient, setAppDb } from '@/browser/db/sqlWasmClient'
8
+ import { drizzle } from 'drizzle-orm/sqlite-proxy'
9
+ import { sql } from 'drizzle-orm'
10
+ import { fs } from '@zenfs/core'
11
+ import debug from 'debug'
12
+
13
+ const logger = debug('app:services:db:actors:migrate')
14
+
15
+ export const dbExec = async (dbId, params, sql, dbName, retries = 2) => {
16
+ const rowsToReturnRaw: SqliteWasmResult[] = []
17
+ const rowsValues: string[][] = []
18
+
19
+ const sqliteWasmClient = await getSqliteWasmClient()
20
+
21
+ // For a single exec command, the callback potentially gets called several times -- once for each row.
22
+ // So we need to collect all rows into a final array to return (execResult).
23
+ const rowsToReturn = await new Promise((resolve, reject) => {
24
+ sqliteWasmClient('exec', {
25
+ dbId,
26
+ sql,
27
+ bind: params,
28
+ callback: (result) => {
29
+ // Checks if this is the final callback of the query
30
+ if (!result || !result.row || !result.rowNumber) {
31
+ const returnResult = []
32
+ // Before returning the array, we process it to match the expected output format
33
+ // const rowsToReturnProcessed = rowsToReturnRaw.reduce((acc, curr) => {
34
+ // if (
35
+ // Array.isArray(curr.row) &&
36
+ // curr.row?.length > 0 &&
37
+ // curr.columnNames.length > 0
38
+ // ) {
39
+ // const returnObj: ReturnObj = {
40
+ // database: dbName,
41
+ // }
42
+ //
43
+ // const values = []
44
+ //
45
+ // curr.columnNames.forEach((colName, index: number) => {
46
+ // if (curr.row && curr.row[index]) {
47
+ // returnObj[colName] = curr.row[index]
48
+ // values.push(curr.row[index])
49
+ // }
50
+ // })
51
+ // // rowsValueStrings.push(`(${values.join(', ')})`)
52
+ // acc.push(returnObj)
53
+ // }
54
+ // return acc
55
+ // }, [] as string[])
56
+ for (const currRow of rowsToReturnRaw) {
57
+ // const values: string[] = []
58
+ // currRow.columnNames.forEach((colName, index: number) => {
59
+ // if (currRow.row) {
60
+ // values.push(currRow.row[index])
61
+ // }
62
+ // })
63
+ // logger(`[db/actors] [dbExec] currRow`, currRow)
64
+ returnResult.push(currRow.row)
65
+ }
66
+ resolve(returnResult)
67
+ } else {
68
+ // If not the final response, add this row to the return array
69
+ rowsToReturnRaw.push(result)
70
+ }
71
+ },
72
+ }).catch(async (error) => {
73
+ reject(error)
74
+ })
75
+ })
76
+
77
+ // logger(`[db/actors] [dbExec] rowsToReturn`, rowsToReturn)
78
+ // logger(`[db/actors] [dbExec] rowsValues`, rowsValues)
79
+
80
+ return rowsToReturn || []
81
+ }
82
+ export const migrate = fromCallback<
83
+ EventObject,
84
+ FromCallbackInput<DbServiceContext>
85
+ >(({ sendBack, input: { context } }) => {
86
+ const { pathToDbDir, dbId, dbName } = context
87
+
88
+ logger('[db/actors] migrate context', context)
89
+
90
+ const schemaGlobString = `${BROWSER_FS_TOP_DIR}/schema/*`
91
+
92
+ let journalExists = false
93
+
94
+ // const _initFs = async (): Promise<void> => {
95
+ // const handle = await navigator.storage.getDirectory()
96
+ // // await configure({ backend: WebAccess, handle })
97
+ // await configureSingle({
98
+ // backend: WebAccess,
99
+ // handle,
100
+ // })
101
+ // }
102
+ //
103
+ // _initFs()
104
+
105
+ const _checkForFiles = async (): Promise<void> => {
106
+ const { fs } = await import('@zenfs/core')
107
+
108
+ journalExists = await fs.promises.exists(
109
+ `/${pathToDbDir}/meta/_journal.json`,
110
+ )
111
+
112
+ if (!journalExists) {
113
+ window.location.reload()
114
+ // setTimeout(() => {
115
+ // _checkForFiles().then(() => {
116
+ // return
117
+ // })
118
+ // }, 500)
119
+ }
120
+ }
121
+
122
+ const _migrate = async (): Promise<void> => {
123
+ const drizzleDb = drizzle(
124
+ async (sql, params, method) => {
125
+ try {
126
+ // logger(
127
+ // `executing sql on ${dbName} with id: ${dbId} and method: ${method}`,
128
+ // sql,
129
+ // )
130
+
131
+ const finalResult = await dbExec(dbId, params, sql, dbName)
132
+
133
+ // logger(`finalResult with method: ${method}`, finalResult)
134
+ // Drizzle always waits for {rows: string[][]} or {rows: string[]} for the return value.
135
+
136
+ // When the method is get, you should return a value as {rows: string[]}.
137
+ // Otherwise, you should return {rows: string[][]}.
138
+
139
+ return { rows: finalResult }
140
+ } catch (e: any) {
141
+ console.error('Error from sqlite proxy server: ', JSON.stringify(e))
142
+ return { rows: [] }
143
+ }
144
+ },
145
+ {
146
+ schema: schemaGlobString,
147
+ // logger: true,
148
+ },
149
+ )
150
+
151
+ const { migrate: drizzleMigrate } = await import(
152
+ 'drizzle-orm/sqlite-proxy/migrator'
153
+ )
154
+ const { readMigrationFiles } = await import('drizzle-orm/migrator')
155
+
156
+ try {
157
+ const migrations = readMigrationFiles({
158
+ migrationsFolder: pathToDbDir,
159
+ })
160
+
161
+ if (migrations.length > 0) {
162
+ const incomingMigrationHashes = migrations.map(
163
+ (migration) => migration.hash,
164
+ )
165
+
166
+ let existingMigrationHashes
167
+ let rows = []
168
+
169
+ try {
170
+ const query = await drizzleDb.run(
171
+ sql.raw(
172
+ `SELECT hash, created_at
173
+ FROM main.__drizzle_migrations;`,
174
+ ),
175
+ )
176
+
177
+ rows = query.rows
178
+ } catch (e) {
179
+ rows = []
180
+ }
181
+
182
+ if (rows && rows.length > 0) {
183
+ existingMigrationHashes = rows.map((row) => row[0])
184
+ }
185
+
186
+ if (existingMigrationHashes) {
187
+ let shouldRebuildDb = false
188
+ for (const existingHash of existingMigrationHashes) {
189
+ if (!incomingMigrationHashes.includes(existingHash)) {
190
+ shouldRebuildDb = true
191
+ break
192
+ }
193
+ }
194
+ if (shouldRebuildDb) {
195
+ await fs.promises.unlink(`${pathToDbDir}/${dbName}.sqlite3`)
196
+ }
197
+ }
198
+ }
199
+
200
+ await drizzleMigrate(
201
+ drizzleDb,
202
+ async (queriesToRun) => {
203
+ // logger('queriesToRun', queriesToRun)
204
+ for (const query of queriesToRun) {
205
+ // logger('query', query)
206
+ await drizzleDb.run(sql.raw(query))
207
+ }
208
+ },
209
+ {
210
+ migrationsFolder: pathToDbDir,
211
+ },
212
+ )
213
+ } catch (error) {
214
+ console.error('Error migrating database: ', error)
215
+ window.location.reload()
216
+ }
217
+
218
+ setAppDb(drizzleDb)
219
+ // const createTempTableQuery = await appDb.run(
220
+ // sql.raw(
221
+ // `CREATE TEMP TABLE IF NOT EXISTS temp_last_inserted_id (id INTEGER, table TEXT);`,
222
+ // ),
223
+ // )
224
+ //
225
+ // logger(
226
+ // '[db/actors] [migrate] createTempTableQuery',
227
+ // createTempTableQuery,
228
+ // )
229
+
230
+ // const triggersQuery = await appDb.run(
231
+ // sql.raw(
232
+ // `SELECT name
233
+ // FROM main.sqlite_master
234
+ // WHERE type = 'trigger';`,
235
+ // ),
236
+ // )
237
+ //
238
+ // logger('[db/actors] [migrate] triggersQuery', triggersQuery)
239
+ //
240
+ // const triggers = triggersQuery.rows.map((row) => row[0])
241
+ //
242
+ // const tablesQuery = await appDb.run(
243
+ // sql.raw(
244
+ // `SELECT name
245
+ // FROM main.sqlite_master
246
+ // WHERE type = 'table';`,
247
+ // ),
248
+ // )
249
+ //
250
+ // logger('[db/actors] [migrate] tablesQuery', tablesQuery)
251
+ //
252
+ // const tableNames = tablesQuery.rows.map((row) => row[0])
253
+ // logger('[db/actors] [migrate] tableNames', tableNames)
254
+ // for (const tableName of tableNames) {
255
+ // const triggerName = `after_insert_${tableName}`
256
+ // if (triggers.includes(triggerName)) {
257
+ // continue
258
+ // }
259
+ // const createTriggerQuery = await appDb.run(
260
+ // sql.raw(
261
+ // `CREATE TRIGGER after_insert_${tableName}
262
+ // AFTER INSERT ON ${tableName}
263
+ // BEGIN
264
+ // DELETE FROM temp_last_inserted_id;
265
+ // INSERT INTO temp_last_inserted_id (id) VALUES (new.id);
266
+ // END;`,
267
+ // ),
268
+ // )
269
+ //
270
+ // logger(
271
+ // '[db/actors] [migrate] createTriggerQuery',
272
+ // createTriggerQuery,
273
+ // )
274
+ // }
275
+ }
276
+
277
+ _checkForFiles()
278
+ .then(() => {
279
+ if (journalExists) {
280
+ return _migrate()
281
+ }
282
+ })
283
+ .then(() => {
284
+ sendBack({ type: DB_MIGRATING_SUCCESS, dbName })
285
+ })
286
+
287
+ return () => {}
288
+ })
@@ -0,0 +1,71 @@
1
+ import { PropertyStates, PropertyValue } from './property'
2
+ import { Actor } from 'xstate'
3
+ import { Static } from '@sinclair/typebox'
4
+ import { IModelClass, Item, TModelSchema } from '@/browser/schema'
5
+
6
+ export type ModelDefinitions = {
7
+ [modelName: string]: ModelClassType
8
+ }
9
+
10
+ export type ModelStatus = (propName: string) => keyof PropertyStates
11
+
12
+ export type ExcludedKeys = 'states' | 'status'
13
+
14
+ type ExcludeKeys<T, K> = {
15
+ [P in keyof T as Exclude<P, K>]: T[P]
16
+ }
17
+
18
+ export type ModelClassType = {
19
+ originalConstructor: () => void
20
+ schema: ModelSchema
21
+ schemaUid?: string
22
+ create: <T>(values: ModelValues<T>) => Promise<Item<T>>
23
+ }
24
+
25
+ export type ModelValues<T> = Item<T> & {
26
+ schema: ModelSchema
27
+ ModelClass?: ModelClassType
28
+ [key: string & keyof T]: PropertyValue
29
+ }
30
+
31
+ export type StatesMap<T> = Map<string, Actor<T>>
32
+
33
+ // export type ModelSchema = {
34
+ // [key: string]: TObject
35
+ // }
36
+
37
+ export type ModelSchema = Partial<Static<typeof TModelSchema>>
38
+
39
+ export type ModelConstructor = <
40
+ T extends { new (...args: any[]): IModelClass },
41
+ >(
42
+ constructor: T,
43
+ ) => T & IModelClass
44
+
45
+ // export type ModelConstructor = Static<TModelConstructor>
46
+
47
+ export interface ModelProperty {
48
+ propertyLocalId?: string
49
+ name: string
50
+ dataType:
51
+ | 'string'
52
+ | 'bytes32'
53
+ | 'uint8'
54
+ | 'uint256'
55
+ | 'bool'
56
+ | 'address'
57
+ | 'bytes'
58
+ | 'int8'
59
+ | 'int256'
60
+ | 'int'
61
+ | 'bytes32[]'
62
+ modelSchemaUids: string[]
63
+ modelLocalId?: string
64
+ schemaName?: string
65
+ schemaUid: string
66
+ schemaDefinition: string
67
+ relatedModelSchemaUid?: string
68
+ relatedModelLocalId?: string
69
+ createdAt?: number
70
+ updatedAt?: number
71
+ }
@@ -0,0 +1,19 @@
1
+ import { ModelClassType } from '@/types'
2
+
3
+ const modelStore = new Map<string, ModelClassType>()
4
+
5
+ export const getModels = (): Record<string, ModelClassType> => {
6
+ return Object.fromEntries(modelStore)
7
+ }
8
+
9
+ export const getModel = (modelName: string): ModelClassType | undefined => {
10
+ return modelStore.get(modelName)
11
+ }
12
+
13
+ export const getModelNames = (): string[] => {
14
+ return Array.from(modelStore.keys())
15
+ }
16
+
17
+ export const setModel = (modelName: string, model: ModelClassType) => {
18
+ modelStore.set(modelName, model)
19
+ }
@@ -0,0 +1,40 @@
1
+ import { defineConfig } from 'drizzle-kit'
2
+ import dotenv from 'dotenv'
3
+ import process from 'node:process'
4
+ import path from 'path'
5
+ import { DrizzleConfig } from 'drizzle-orm'
6
+
7
+ dotenv.config()
8
+
9
+ let sdkRoot = './node_modules/@seedprotocol/sdk'
10
+
11
+ if (process.env.IS_SEED_DEV) {
12
+ sdkRoot = './src'
13
+ }
14
+
15
+ let dotSeedDir = path.join(process.cwd(), '.seed')
16
+
17
+ if (process.env.IS_SEED_DEV) {
18
+ dotSeedDir = path.join(
19
+ process.cwd(),
20
+ '__tests__',
21
+ '__mocks__',
22
+ 'project',
23
+ '.seed',
24
+ )
25
+ }
26
+
27
+ let schemaDir = `${sdkRoot}/dist/shared/seedSchema/*.ts`
28
+
29
+ if (process.env.IS_SEED_DEV) {
30
+ schemaDir = `${sdkRoot}/shared/seedSchema/*.ts`
31
+ }
32
+
33
+ export default defineConfig({
34
+ schema: schemaDir,
35
+ dialect: 'sqlite',
36
+ out: `${dotSeedDir}/db`,
37
+ dbCredentials: {
38
+ url: `${dotSeedDir}/db/app_db.sqlite3`,
39
+ },
40
+ }) as DrizzleConfig
@@ -0,0 +1,34 @@
1
+ import { EventObject, fromCallback } from 'xstate'
2
+ import { SqliteConnectionManager } from '@/browser/services/db'
3
+ import { getSqliteWasmClient, setManager } from '@/browser/db/sqlWasmClient'
4
+
5
+ export const prepareDb = fromCallback<EventObject>(({ sendBack }) => {
6
+ let sqliteWasmClient
7
+ const _prepareDb = async (): Promise<void> => {
8
+ if (typeof window === 'undefined') {
9
+ return
10
+ }
11
+ sqliteWasmClient = await getSqliteWasmClient()
12
+ }
13
+
14
+ const interval = setInterval(() => {
15
+ // TODO: Add a timeout
16
+ // TODO: Add a cancel token to the promise so we can prevent more loops starting while we're checking the successful outcome
17
+ if (sqliteWasmClient) {
18
+ clearInterval(interval)
19
+ const manager = new SqliteConnectionManager(sqliteWasmClient)
20
+ setManager(manager)
21
+ sendBack({ type: 'prepareDbSuccess', manager })
22
+ return
23
+ }
24
+ _prepareDb().then(() => {
25
+ return
26
+ })
27
+ }, 200)
28
+
29
+ return () => {
30
+ if (interval) {
31
+ clearInterval(interval)
32
+ }
33
+ }
34
+ })
@@ -0,0 +1,81 @@
1
+ import { EventObject, fromCallback } from 'xstate'
2
+ import { FromCallbackInput, PublishMachineContext } from '@/types'
3
+ import { Item } from '@/browser/item'
4
+ import { models as modelsTable, modelUids } from '@/shared/seedSchema'
5
+ import { getAppDb } from '@/browser'
6
+ import { eq } from 'drizzle-orm'
7
+ import { getModelSchemas } from '@/browser/db/read/getModelSchemas'
8
+
9
+ export const preparePublishRequestData = fromCallback<
10
+ EventObject,
11
+ FromCallbackInput<PublishMachineContext>
12
+ >(({ sendBack, input: { context } }) => {
13
+ const { localId } = context
14
+
15
+ const _preparePublishRequestData = async () => {
16
+ const item = await Item.find({ seedLocalId: localId })
17
+
18
+ if (!item) {
19
+ return false
20
+ }
21
+
22
+ const appDb = getAppDb()
23
+
24
+ const modelsRows = await appDb
25
+ .select({
26
+ modelName: modelsTable.name,
27
+ schemaUid: modelUids.uid,
28
+ })
29
+ .from(modelsTable)
30
+ .leftJoin(modelUids, eq(modelUids.modelId, modelsTable.id))
31
+ .where(eq(modelsTable.name, 'Version'))
32
+
33
+ if (!modelsRows || modelsRows.length === 0) {
34
+ sendBack({ type: 'preparePublishRequestDataError' })
35
+ return false
36
+ }
37
+
38
+ const versionSchemaUid = modelsRows[0].schemaUid
39
+
40
+ const editedProperties = await item.getEditedProperties()
41
+
42
+ const { modelSchemas, schemaStringToModelRecord } = await getModelSchemas({
43
+ sdkConfigDb: appDb,
44
+ })
45
+
46
+ // const dataEncoder = new SchemaEncoder(modelProperty.schemaDefinition,)
47
+ // const encodedData = dataEncoder.encodeData(data,)
48
+ //
49
+ // itemData.listOfAttestations.push({
50
+ // schema : modelProperty.schemaUid,
51
+ // data : [
52
+ // {
53
+ // ...defaultAttestationData,
54
+ // data : encodedData,
55
+ // },
56
+ // ],
57
+ // },)
58
+
59
+ const publishRequestData = {
60
+ seedIsRevocable: false,
61
+ seedSchemaUid: item.schemaUid,
62
+ seedUid: item.seedUid,
63
+ versionSchemaUid,
64
+ versionUid: item.latestVersionUid,
65
+ listOfAttestations: [],
66
+ }
67
+
68
+ sendBack({
69
+ type: 'updateContext',
70
+ ...publishRequestData,
71
+ })
72
+
73
+ return true
74
+ }
75
+
76
+ _preparePublishRequestData().then((success) => {
77
+ if (success) {
78
+ sendBack({ type: 'preparePublishRequestDataSuccess' })
79
+ }
80
+ })
81
+ })
@@ -0,0 +1,71 @@
1
+ import { EventObject, fromCallback } from 'xstate'
2
+ import { itemMachineAll } from '@/browser/item/all/itemMachineAll'
3
+ import { Attestation } from '@/browser/gql/graphql'
4
+ import { eventEmitter } from '@/eventBus'
5
+
6
+ export const processItems = fromCallback<EventObject, typeof itemMachineAll>(
7
+ ({ sendBack, input: { context } }) => {
8
+ const {
9
+ itemVersions,
10
+ itemSeeds,
11
+ ModelClass,
12
+ schemaUidsByModelName,
13
+ mostRecentPropertiesBySeedUid,
14
+ times,
15
+ // relatedProperties,
16
+ // relatedVersionsBySchemaUid,
17
+ // relatedVersionsBySeedUid,
18
+ } = context
19
+
20
+ if (!itemVersions || !itemSeeds) {
21
+ throw new Error('No itemVersions or itemSeeds found')
22
+ }
23
+
24
+ const _processItems = async () => {
25
+ // For each itemSeed, find all the Versions
26
+ for (const itemSeed of itemSeeds.slice(8, 16)) {
27
+ const versionsForSeed = itemVersions.filter(
28
+ (version) => version.refUID === itemSeed.id,
29
+ )
30
+
31
+ if (versionsForSeed.length === 0) {
32
+ continue
33
+ }
34
+
35
+ // Find the most recent Version for each Seed
36
+ const recentVersionsMap: { [seedId: string]: Attestation } = {}
37
+ versionsForSeed.forEach((version: Attestation) => {
38
+ const existingVersion = recentVersionsMap[version.refUID]
39
+ if (
40
+ !existingVersion ||
41
+ new Date(version.timeCreated * 1000) >
42
+ new Date(existingVersion.timeCreated * 1000)
43
+ ) {
44
+ recentVersionsMap[version.refUID] = version
45
+ }
46
+ })
47
+ }
48
+ }
49
+
50
+ _processItems().then(() => {
51
+ sendBack({ type: 'processItemsSuccess' })
52
+ const modelName = ModelClass.originalConstructor.name
53
+ eventEmitter.emit('item.requestAll', {
54
+ modelName,
55
+ })
56
+ eventEmitter.emit('service.save', {
57
+ modelName,
58
+ })
59
+ sendBack({
60
+ type: 'updateTimes',
61
+ times: {
62
+ ...times,
63
+ processItems: {
64
+ start: null,
65
+ end: Date.now(),
66
+ },
67
+ },
68
+ })
69
+ })
70
+ },
71
+ )