@seedprotocol/sdk 0.1.47 → 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 (141) hide show
  1. package/dist/bin.js.map +1 -1
  2. package/dist/constants-BLctWkrn.js.map +1 -1
  3. package/dist/{index-DWf9Ls94.js → index-DMIKRod-.js} +3995 -3995
  4. package/dist/index-DMIKRod-.js.map +1 -0
  5. package/dist/{index-B2WbNudj.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-mBqth17w.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/item/single/actors/hydrateExistingItem.d.ts +3 -1
  126. package/dist/types/src/browser/item/single/actors/hydrateExistingItem.d.ts.map +1 -1
  127. package/dist/types/src/browser/item/single/actors/saveDataToDb.d.ts +3 -3
  128. package/dist/types/src/browser/item/single/itemMachineSingle.d.ts +3 -3
  129. package/dist/types/src/browser/property/ItemProperty.d.ts +7 -7
  130. package/dist/types/src/browser/property/ItemProperty.d.ts.map +1 -1
  131. package/dist/types/src/browser/property/actors/resolveRemoteStorage.d.ts +3 -3
  132. package/dist/types/src/browser/react/trash.d.ts +1 -1
  133. package/dist/types/src/browser/react/trash.d.ts.map +1 -1
  134. package/dist/types/src/browser/services/db/dbMachine.d.ts +6 -6
  135. package/dist/types/src/browser/services/publish/publishMachine.d.ts +17 -17
  136. package/dist/types/src/types/machines.d.ts +4 -0
  137. package/dist/types/src/types/machines.d.ts.map +1 -1
  138. package/package.json +1 -1
  139. package/dist/index-B2WbNudj.js.map +0 -1
  140. package/dist/index-DWf9Ls94.js.map +0 -1
  141. package/dist/seed.schema.config-mBqth17w.js.map +0 -1
@@ -0,0 +1,161 @@
1
+ import { useImmer } from 'use-immer'
2
+ import { Item } from '@/browser/item'
3
+ import { useCallback, useEffect, useState } from 'react'
4
+ import { useSelector } from '@xstate/react'
5
+ import debug from 'debug'
6
+ import { eventEmitter } from '@/eventBus'
7
+ import { ItemProperty } from '@/browser/property'
8
+ import { useGlobalServiceStatus } from '@/browser/react/services'
9
+
10
+ const logger = debug('app:react:property')
11
+
12
+ type UseItemPropertyProps = {
13
+ propertyName: string
14
+ seedLocalId?: string
15
+ seedUid?: string
16
+ }
17
+
18
+ type UseItemPropertyReturn = {
19
+ property: ItemProperty<any> | undefined
20
+ isInitialized: boolean
21
+ isReadingFromDb: boolean
22
+ value: any
23
+ status: string
24
+ }
25
+
26
+ type UseItemProperty = (props: UseItemPropertyProps) => UseItemPropertyReturn
27
+
28
+ export const useItemProperty: UseItemProperty = ({
29
+ propertyName,
30
+ seedLocalId,
31
+ seedUid,
32
+ }) => {
33
+ const [property, setProperty] = useState<ItemProperty<any> | undefined>()
34
+ const [isReadingFromDb, setIsReadingFromDb] = useState(false)
35
+ const [isInitialized, setIsInitialized] = useState(false)
36
+
37
+ // const isDbReady = useMemo(() => useIsDbReady(), [])
38
+
39
+ const { internalStatus } = useGlobalServiceStatus()
40
+
41
+ const value = useSelector(property?.getService(), (snapshot) => {
42
+ if (!snapshot || !snapshot.context) {
43
+ return
44
+ }
45
+ return snapshot.context.renderValue || snapshot.context.propertyValue
46
+ })
47
+
48
+ const status = useSelector(
49
+ property?.getService(),
50
+ (snapshot) => snapshot?.value as string,
51
+ )
52
+
53
+ // useEffect(() => {
54
+ // if (property && property.value !== value) {
55
+ // readFromDb()
56
+ // }
57
+ // }, [property, value])
58
+
59
+ const readFromDb = useCallback(async () => {
60
+ if (
61
+ internalStatus !== 'ready' ||
62
+ isReadingFromDb ||
63
+ (!seedLocalId && !seedUid)
64
+ ) {
65
+ return
66
+ }
67
+ setIsReadingFromDb(true)
68
+ const foundProperty = await ItemProperty.find({
69
+ propertyName,
70
+ seedLocalId,
71
+ seedUid,
72
+ })
73
+ setIsReadingFromDb(false)
74
+ if (!foundProperty) {
75
+ logger(
76
+ `[useItemPropertyTest] [readFromDb] no property found for Item.${seedLocalId}.${propertyName}`,
77
+ )
78
+ return
79
+ }
80
+ if (foundProperty.status === 'waitingForDb') {
81
+ foundProperty.getService().send({ type: 'waitForDbSuccess' })
82
+ }
83
+ setProperty(foundProperty)
84
+ setIsInitialized(true)
85
+ }, [internalStatus, isReadingFromDb])
86
+
87
+ // let count = 0
88
+ //
89
+ // const refresh = useCallback(() => {
90
+ // count++
91
+ // console.log('[useItemPropertyTest] [refresh] property', property)
92
+ // }, [property])
93
+
94
+ useEffect(() => {
95
+ if (internalStatus === 'ready') {
96
+ readFromDb()
97
+ }
98
+ }, [internalStatus])
99
+
100
+ // useEffect(() => {
101
+ // eventEmitter.addListener(
102
+ // `property.${seedUid || seedLocalId}.${propertyName}.update`,
103
+ // (event) => {
104
+ // refresh()
105
+ // },
106
+ // )
107
+ //
108
+ // return () => {
109
+ // eventEmitter.removeListener(
110
+ // `property.${seedUid || seedLocalId}.${propertyName}.update`,
111
+ // )
112
+ // }
113
+ // }, [])
114
+
115
+ return {
116
+ property,
117
+ isInitialized,
118
+ isReadingFromDb,
119
+ value,
120
+ status,
121
+ }
122
+ }
123
+ export const useItemProperties = (item?: Item<any>) => {
124
+ const [propertyObj, setPropertyObj] = useImmer({})
125
+ const [isListening, setIsListening] = useState(false)
126
+
127
+ const updatePropertyObj = useCallback(
128
+ (event) => {
129
+ if (!item) {
130
+ console.error('[XXXXXX] [updatePropertyObj] no item when expected')
131
+ return
132
+ }
133
+ const { propertyName, propertyValue } = event
134
+ if (!propertyName) {
135
+ return
136
+ }
137
+ setPropertyObj((draft) => {
138
+ draft[propertyName] = propertyValue
139
+ })
140
+ },
141
+ [item],
142
+ )
143
+
144
+ useEffect(() => {
145
+ if (!item) {
146
+ return
147
+ }
148
+
149
+ const eventKey = `item.${item.seedLocalId}.property.update`
150
+
151
+ eventEmitter.addListener(eventKey, updatePropertyObj)
152
+
153
+ return () => {
154
+ eventEmitter.removeListener(eventKey, updatePropertyObj)
155
+ }
156
+ }, [item])
157
+
158
+ return {
159
+ properties: propertyObj,
160
+ }
161
+ }
@@ -0,0 +1,154 @@
1
+ import { assign, setup } from 'xstate'
2
+ import { PropertyMachineContext } from '@/types'
3
+
4
+ import { resolveRemoteStorage } from '@/browser/property/actors/resolveRemoteStorage'
5
+ import { waitForDb } from '@/browser/property/actors/waitForDb'
6
+ import { initialize } from '@/browser/property/actors/initialize'
7
+ import { resolveRelatedValue } from '@/browser/property/actors/resolveRelatedValue'
8
+ import { hydrateFromDb } from '@/browser/property/actors/hydrateFromDb'
9
+ import { saveValueToDb } from '@/browser/property/actors/saveValueToDb'
10
+ import { updateMachineContext } from '@/browser/helpers'
11
+
12
+ export const propertyMachine = setup({
13
+ types: {
14
+ context: {} as PropertyMachineContext,
15
+ },
16
+ actors: {
17
+ waitForDb,
18
+ hydrateFromDb,
19
+ initialize,
20
+ resolveRelatedValue,
21
+ resolveRemoteStorage,
22
+ saveValueToDb,
23
+ },
24
+ }).createMachine({
25
+ id: 'itemProperty',
26
+ initial: 'waitingForDb',
27
+ context: ({ input }) => input as PropertyMachineContext,
28
+ on: {
29
+ updatePropertyValue: {
30
+ target: '.resolvingRelatedValue',
31
+ guard: ({ context }) => !context.isDbReady,
32
+ actions: assign(({ event }) => {
33
+ return {
34
+ propertyValue: event.propertyValue,
35
+ }
36
+ }),
37
+ },
38
+ updateRenderValue: {
39
+ actions: assign(({ event, context }) => {
40
+ return {
41
+ renderValue: event.renderValue,
42
+ }
43
+ }),
44
+ },
45
+ save: {
46
+ actions: assign({
47
+ isSaving: true,
48
+ }),
49
+ target: '.saving',
50
+ },
51
+ updateContext: updateMachineContext,
52
+ },
53
+ states: {
54
+ idle: {},
55
+ waitingForDb: {
56
+ on: {
57
+ waitForDbSuccess: {
58
+ target: 'hydratingFromDb',
59
+ actions: assign({
60
+ isDbReady: true,
61
+ }),
62
+ },
63
+ },
64
+ invoke: {
65
+ src: 'waitForDb',
66
+ input: ({ context }) => ({ context }),
67
+ },
68
+ },
69
+ hydratingFromDb: {
70
+ on: {
71
+ hydrateFromDbSuccess: 'initializing',
72
+ },
73
+ invoke: {
74
+ src: 'hydrateFromDb',
75
+ input: ({ context }) => ({ context }),
76
+ },
77
+ },
78
+ initializing: {
79
+ on: {
80
+ initializeSuccess: 'idle',
81
+ isRelatedProperty: {
82
+ target: 'resolvingRelatedValue',
83
+ },
84
+ hasRemoteBackup: {
85
+ target: 'resolvingRemoteStorage',
86
+ },
87
+ },
88
+ invoke: {
89
+ src: 'initialize',
90
+ input: ({ context, event }) => ({ context, event }),
91
+ },
92
+ },
93
+ resolvingRelatedValue: {
94
+ on: {
95
+ resolvingRelatedValueSuccess: {
96
+ target: 'idle',
97
+ actions: assign({
98
+ resolvedDisplayValue: ({ event }) => event.resolvedDisplayValue,
99
+ resolvedValue: ({ event }) => event.resolvedValue,
100
+ }),
101
+ },
102
+ resolvingRelatedValueDone: {
103
+ target: 'idle',
104
+ },
105
+ },
106
+ invoke: {
107
+ src: 'resolveRelatedValue',
108
+ input: ({ context }) => ({ context }),
109
+ },
110
+ },
111
+ resolvingRemoteStorage: {
112
+ on: {
113
+ resolveRemoteStorageSuccess: {
114
+ target: 'idle',
115
+ },
116
+ },
117
+ invoke: {
118
+ src: 'resolveRemoteStorage',
119
+ input: ({ context }) => ({ context }),
120
+ },
121
+ },
122
+ saving: {
123
+ on: {
124
+ saveValueToDbSuccess: {
125
+ target: 'idle',
126
+ actions: assign({
127
+ isSaving: false,
128
+ }),
129
+ },
130
+ saveValueToDbFailure: {
131
+ target: 'idle',
132
+ actions: assign({
133
+ isSaving: false,
134
+ }),
135
+ },
136
+ },
137
+ invoke: {
138
+ src: 'saveValueToDb',
139
+ input: ({ context, event }) => ({ context, event }),
140
+ },
141
+ },
142
+ },
143
+
144
+ // conflict: {
145
+ // on: {
146
+ // resolveConflict: {
147
+ // target: 'saving',
148
+ // actions: assign({
149
+ // data: ({ context, event }) => event.output,
150
+ // }),
151
+ // },
152
+ // },
153
+ // },
154
+ })
@@ -0,0 +1,31 @@
1
+ import { getGlobalService } from '@/browser/services/global'
2
+
3
+ type PublishItemRequestEvent = {
4
+ modelName?: string
5
+ seedLocalId: string
6
+ }
7
+
8
+ type PublishItemRequestHandler = (
9
+ event: PublishItemRequestEvent,
10
+ ) => Promise<void>
11
+
12
+ export const publishItemRequestHandler: PublishItemRequestHandler = async ({
13
+ modelName,
14
+ seedLocalId,
15
+ }) => {
16
+ const globalService = getGlobalService()
17
+ globalService.subscribe((snapshot) => {
18
+ if (
19
+ !snapshot ||
20
+ !snapshot.context ||
21
+ !snapshot.context.publishItemService
22
+ ) {
23
+ return
24
+ }
25
+ })
26
+ globalService.send({
27
+ type: 'publishItemRequest',
28
+ modelName,
29
+ seedLocalId,
30
+ })
31
+ }
@@ -0,0 +1,77 @@
1
+ import { setup } from 'xstate'
2
+ import { validateItemData } from './actors/validateItemData'
3
+ import { PublishMachineStates } from '@/browser/services/internal/constants'
4
+ import { PublishMachineContext } from '@/types'
5
+ import { createPublishAttempt } from './actors/createPublishAttempt'
6
+ import { updateMachineContext } from '@/browser/helpers'
7
+ import { preparePublishRequestData } from '@/browser/services/publish/actors/preparePublishRequestData'
8
+ import { upload } from '@/browser/services/publish/actors/upload'
9
+
10
+ const {
11
+ VALIDATING_ITEM_DATA,
12
+ CREATING_PUBLISH_ATTEMPT,
13
+ PREPARING_PUBLISH_REQUEST_DATA,
14
+ UPLOADING,
15
+ PUBLISHING,
16
+ IDLE,
17
+ } = PublishMachineStates
18
+
19
+ export const publishMachine = setup({
20
+ types: {
21
+ context: {} as PublishMachineContext,
22
+ input: {} as PublishMachineContext,
23
+ },
24
+ actors: {
25
+ validateItemData,
26
+ createPublishAttempt,
27
+ upload,
28
+ preparePublishRequestData,
29
+ },
30
+ }).createMachine({
31
+ id: 'publish',
32
+ initial: VALIDATING_ITEM_DATA,
33
+ context: ({ input }) => input,
34
+ on: {
35
+ updateContext: updateMachineContext,
36
+ },
37
+ states: {
38
+ [VALIDATING_ITEM_DATA]: {
39
+ on: {
40
+ validateItemDataSuccess: [CREATING_PUBLISH_ATTEMPT],
41
+ },
42
+ invoke: {
43
+ src: 'validateItemData',
44
+ input: ({ context }) => ({ context }),
45
+ },
46
+ },
47
+ [CREATING_PUBLISH_ATTEMPT]: {
48
+ on: {
49
+ createPublishAttemptSuccess: [UPLOADING],
50
+ },
51
+ invoke: {
52
+ src: 'createPublishAttempt',
53
+ input: ({ context }) => ({ context }),
54
+ },
55
+ },
56
+ [UPLOADING]: {
57
+ on: {
58
+ uploadingSuccess: [PREPARING_PUBLISH_REQUEST_DATA],
59
+ },
60
+ invoke: {
61
+ src: 'upload',
62
+ input: ({ context }) => ({ context }),
63
+ },
64
+ },
65
+ [PREPARING_PUBLISH_REQUEST_DATA]: {
66
+ on: {
67
+ preparePublishRequestDataSuccess: [UPLOADING],
68
+ },
69
+ invoke: {
70
+ src: 'preparePublishRequestData',
71
+ input: ({ context }) => ({ context }),
72
+ },
73
+ },
74
+ [PUBLISHING]: {},
75
+ [IDLE]: {},
76
+ },
77
+ })
@@ -0,0 +1,13 @@
1
+ import { graphql } from '@/browser/gql'
2
+
3
+ export const GET_SCHEMA_UIDS_FOR_MODELS = graphql(/* GraphQL */ `
4
+ query GetSchemaUids($where: SchemaWhereInput!) {
5
+ schemaUids: schemata(where: $where) {
6
+ id
7
+ schema
8
+ schemaNames {
9
+ name
10
+ }
11
+ }
12
+ }
13
+ `)
@@ -0,0 +1,174 @@
1
+ import { PropertyData } from '@/types'
2
+ import { startCase } from 'lodash-es'
3
+ import { metadata, MetadataType } from '@/shared/seedSchema'
4
+ import { and, eq, max, sql } from 'drizzle-orm'
5
+ import { getAppDb, runQueryForStatement } from '@/browser/db/sqlWasmClient'
6
+
7
+ export const getPropertyData = async (
8
+ propertyName: string,
9
+ seedLocalId?: string,
10
+ seedUid?: string,
11
+ ): Promise<PropertyData | undefined> => {
12
+ const appDb = getAppDb()
13
+
14
+ const queryBase = appDb.select().from(metadata)
15
+
16
+ if (seedLocalId) {
17
+ queryBase.where(
18
+ and(
19
+ eq(metadata.propertyName, propertyName),
20
+ eq(metadata.seedLocalId, seedLocalId),
21
+ ),
22
+ )
23
+ }
24
+
25
+ if (seedUid) {
26
+ queryBase.where(
27
+ and(
28
+ eq(metadata.propertyName, propertyName),
29
+ eq(metadata.seedUid, seedUid),
30
+ ),
31
+ )
32
+ }
33
+
34
+ const rows = (await queryBase.orderBy(
35
+ sql.raw(`COALESCE(attestation_created_at, created_at) DESC`),
36
+ )) as MetadataType[]
37
+
38
+ if (!rows || rows.length === 0) {
39
+ return
40
+ }
41
+
42
+ const row = rows[0]
43
+
44
+ return {
45
+ ...row,
46
+ itemModelName: startCase(row.modelType),
47
+ }
48
+ }
49
+
50
+ const seedUidToStorageTransactionId = new Map<string, string>()
51
+
52
+ type GetStorageTransactionIdResults = {
53
+ storageTransactionId: string
54
+ }[]
55
+
56
+ export const getStorageTransactionIdForSeedUid = async (
57
+ seedUid: string,
58
+ ): Promise<string | undefined> => {
59
+ if (seedUidToStorageTransactionId.has(seedUid)) {
60
+ return seedUidToStorageTransactionId.get(seedUid)
61
+ }
62
+
63
+ const appDb = getAppDb()
64
+
65
+ const results = (await appDb
66
+ .select({
67
+ storageTransactionId: metadata.propertyValue,
68
+ })
69
+ .from(metadata)
70
+ .where(
71
+ and(
72
+ eq(metadata.seedUid, seedUid),
73
+ eq(metadata.propertyName, 'storageTransactionId'),
74
+ ),
75
+ )) as GetStorageTransactionIdResults
76
+
77
+ if (!results || results.length === 0) {
78
+ return
79
+ }
80
+
81
+ seedUidToStorageTransactionId.set(seedUid, results[0].storageTransactionId)
82
+ return results[0].storageTransactionId
83
+ }
84
+
85
+ export const getRelationValueData = async (
86
+ propertyValue: any,
87
+ ): Promise<MetadataType | undefined> => {
88
+ const appDb = getAppDb()
89
+
90
+ const rows = (await appDb
91
+ .select({
92
+ propertyValue: metadata.propertyValue,
93
+ attestationCreatedAt: max(metadata.attestationCreatedAt),
94
+ refResolvedDisplayValue: metadata.refResolvedDisplayValue,
95
+ refResolvedValue: metadata.refResolvedValue,
96
+ refSeedType: metadata.refSeedType,
97
+ easDataType: metadata.easDataType,
98
+ })
99
+ .from(metadata)
100
+ .where(eq(metadata.propertyValue, propertyValue))) as MetadataType[]
101
+
102
+ if (!rows || rows.length === 0) {
103
+ return
104
+ }
105
+
106
+ return rows[0]
107
+ }
108
+
109
+ type GetExistingItemProps = {
110
+ seedLocalId: string
111
+ seedUid: string
112
+ }
113
+
114
+ type GetExistingItemReturn = {
115
+ seedLocalId: string
116
+ seedUid: string
117
+ createdAt: string
118
+ }
119
+
120
+ type GetExistingItem = (
121
+ props: GetExistingItemProps,
122
+ ) => Promise<GetExistingItemReturn | undefined>
123
+
124
+ export const getExistingItem: GetExistingItem = async ({
125
+ seedLocalId,
126
+ seedUid,
127
+ }) => {
128
+ const existingItemStatement = `SELECT local_id, uid, created_at
129
+ FROM seeds
130
+ WHERE (uid IS NOT NULL
131
+ AND uid != ''
132
+ AND uid != 'undefined'
133
+ AND uid != 'null'
134
+ AND uid != 'false'
135
+ AND uid != '0'
136
+ AND uid != 0
137
+ AND uid = '${seedUid}'
138
+ )
139
+ OR (
140
+ local_id IS NOT NULL
141
+ AND local_id != ''
142
+ AND local_id != 'undefined'
143
+ AND local_id != 'null'
144
+ AND local_id != 'false'
145
+ AND local_id != '0'
146
+ AND local_id != 0
147
+ AND local_id = '${seedLocalId}'
148
+ );
149
+ `
150
+
151
+ const { rows } = await runQueryForStatement(existingItemStatement)
152
+
153
+ let existingItem
154
+
155
+ if (rows && rows.length > 0) {
156
+ // We know the zero index is versionLocalId because we specifically asked for it first
157
+ // in the SELECT statement above. Same with the rest of the indexes.
158
+ let matchingRow = rows.find((row) => row[1] === seedUid)
159
+
160
+ if (!matchingRow) {
161
+ matchingRow = rows.find((row) => row[0] === seedLocalId)
162
+ }
163
+
164
+ if (matchingRow) {
165
+ existingItem = {
166
+ seedLocalId: matchingRow[0],
167
+ seedUid: matchingRow[1],
168
+ createdAt: matchingRow[2],
169
+ }
170
+ }
171
+ }
172
+
173
+ return existingItem
174
+ }
@@ -0,0 +1,14 @@
1
+ import { getAppDb } from '@/browser/db/sqlWasmClient'
2
+ import { seeds } from '@/shared/seedSchema'
3
+ import { eq, or } from 'drizzle-orm'
4
+
5
+ export const recoverDeletedItem = async ({ seedLocalId, seedUid }) => {
6
+ const appDb = getAppDb()
7
+
8
+ await appDb
9
+ .update(seeds)
10
+ .set({
11
+ _markedForDeletion: 0,
12
+ })
13
+ .where(or(eq(seeds.localId, seedLocalId), eq(seeds.uid, seedUid)))
14
+ }
@@ -0,0 +1,54 @@
1
+ import { getItem } from '@/browser/db/read/getItem'
2
+ import { eventEmitter } from '@/eventBus'
3
+
4
+ const activeItemRequests = new Set<string>()
5
+
6
+ const queue = new Map<string, Record<string, unknown>>()
7
+
8
+ export const itemRequestHandler = async (event) => {
9
+ const { seedLocalId, seedUid, modelName, eventId } = event
10
+
11
+ if (activeItemRequests.has(seedLocalId)) {
12
+ console.log(
13
+ '[item/events] [itemRequestHandler] already requesting item with queue size',
14
+ queue.size,
15
+ )
16
+ queue.set(seedLocalId, event)
17
+ return
18
+ }
19
+
20
+ const item = await getItem({
21
+ modelName,
22
+ seedLocalId,
23
+ seedUid,
24
+ })
25
+
26
+ if (!item) {
27
+ console.warn(
28
+ `[item/events] [itemRequestHandler] no item for seedLocalId ${seedLocalId} or versionUid ${seedUid}`,
29
+ )
30
+ if (eventId) {
31
+ eventEmitter.emit(`item.${modelName}.${seedLocalId}.response`, {
32
+ item,
33
+ eventId,
34
+ })
35
+ }
36
+ return
37
+ }
38
+
39
+ eventEmitter.emit(`item.${modelName}.${seedLocalId}.response`, {
40
+ item,
41
+ eventId,
42
+ })
43
+
44
+ queue.delete(seedLocalId)
45
+ if (queue.size > 0 && queue.has(seedLocalId)) {
46
+ const nextEvent = queue.get(seedLocalId)
47
+ console.log(
48
+ '[item/events] [itemRequestHandler] taking event from queue with queue size',
49
+ queue.size,
50
+ nextEvent,
51
+ )
52
+ await itemRequestHandler(nextEvent)
53
+ }
54
+ }