@seedprotocol/sdk 0.3.0 → 0.3.1

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 (200) hide show
  1. package/dist/{ArweaveClient-CmJYeuq1.js → ArweaveClient-C0g0es2v.js} +2 -2
  2. package/dist/{ArweaveClient-EXXrXUzz.js.map → ArweaveClient-C0g0es2v.js.map} +1 -1
  3. package/dist/{ArweaveClient-EXXrXUzz.js → ArweaveClient-CzkBgiZY.js} +2 -2
  4. package/dist/{ArweaveClient-CmJYeuq1.js.map → ArweaveClient-CzkBgiZY.js.map} +1 -1
  5. package/dist/{Db-CESKJH-G.js → Db-C4oog-0n.js} +3 -3
  6. package/dist/{Db-CESKJH-G.js.map → Db-C4oog-0n.js.map} +1 -1
  7. package/dist/{Db-DiTPSbQ8.js → Db-VPouegkr.js} +3 -3
  8. package/dist/{Db-DiTPSbQ8.js.map → Db-VPouegkr.js.map} +1 -1
  9. package/dist/{EasClient-BesHK2bO.js → EasClient-B9a3NsTi.js} +2 -2
  10. package/dist/{EasClient-BesHK2bO.js.map → EasClient-B9a3NsTi.js.map} +1 -1
  11. package/dist/{EasClient-Cop6WtWl.js → EasClient-DQ93i2ci.js} +2 -2
  12. package/dist/{EasClient-Cop6WtWl.js.map → EasClient-DQ93i2ci.js.map} +1 -1
  13. package/dist/{FileManager-DTzkncLh.js → FileManager-_ErxVuwb.js} +8 -5
  14. package/dist/FileManager-_ErxVuwb.js.map +1 -0
  15. package/dist/{Item-B5Tz-Y7t.js → Item-D9HFPxsK.js} +3 -3
  16. package/dist/{Item-B5Tz-Y7t.js.map → Item-D9HFPxsK.js.map} +1 -1
  17. package/dist/{ItemProperty-DBV0Iib_.js → ItemProperty-BdtvKrEy.js} +3 -3
  18. package/dist/{ItemProperty-DBV0Iib_.js.map → ItemProperty-BdtvKrEy.js.map} +1 -1
  19. package/dist/{QueryClient-C7a0NHCt.js → QueryClient-Bmnv_moN.js} +2 -2
  20. package/dist/{QueryClient-C7a0NHCt.js.map → QueryClient-Bmnv_moN.js.map} +1 -1
  21. package/dist/{QueryClient-BnwbHtqe.js → QueryClient-hzOtFe99.js} +2 -2
  22. package/dist/{QueryClient-BnwbHtqe.js.map → QueryClient-hzOtFe99.js.map} +1 -1
  23. package/dist/bin.js +5 -5
  24. package/dist/bin.js.map +1 -1
  25. package/dist/{constants-CWg2B3Au.js → constants-Bhl5dZpN.js} +4 -1
  26. package/dist/constants-Bhl5dZpN.js.map +1 -0
  27. package/dist/{index-CQ9FS10O.js → index-BAtjd9W-.js} +3 -3
  28. package/dist/index-BAtjd9W-.js.map +1 -0
  29. package/dist/{index-BHGJ-Es9.js → index-BSR5hv7Q.js} +59 -27
  30. package/dist/index-BSR5hv7Q.js.map +1 -0
  31. package/dist/main.js +2 -2
  32. package/dist/{seed.schema.config-DDzfQguf.js → seed.schema.config-BxJYabim.js} +3 -3
  33. package/dist/{seed.schema.config-DDzfQguf.js.map → seed.schema.config-BxJYabim.js.map} +1 -1
  34. package/dist/src/AppStateSchema.ts +10 -0
  35. package/dist/src/ArweaveClient.ts +13 -0
  36. package/dist/src/Attestation.ts +21 -0
  37. package/dist/src/BaseArweaveClient.ts +13 -0
  38. package/dist/src/BaseClientManager.ts +35 -0
  39. package/dist/src/BaseDb.ts +35 -0
  40. package/dist/src/BaseEasClient.ts +14 -0
  41. package/dist/src/BaseFileManager.ts +60 -0
  42. package/dist/src/BaseItem.ts +413 -0
  43. package/dist/src/BaseItemProperty.ts +416 -0
  44. package/dist/src/BaseQueryClient.ts +13 -0
  45. package/dist/src/ClientManager.ts +63 -0
  46. package/dist/src/ConfigSchema.ts +15 -0
  47. package/dist/src/Db.ts +82 -0
  48. package/dist/src/EasClient.ts +13 -0
  49. package/dist/src/FileDownloader.ts +63 -0
  50. package/dist/src/FileManager.ts +59 -0
  51. package/dist/src/IDb.ts +7 -0
  52. package/dist/src/IEasClient.ts +2 -0
  53. package/dist/src/IItem.ts +26 -0
  54. package/dist/src/IItemProperty.ts +28 -0
  55. package/dist/src/IQueryClient.ts +11 -0
  56. package/dist/src/ImageResizer.ts +81 -0
  57. package/dist/src/Item.ts +12 -0
  58. package/dist/src/ItemProperty.ts +9 -0
  59. package/dist/src/MetadataSchema.ts +28 -0
  60. package/dist/src/ModelSchema.ts +46 -0
  61. package/dist/src/ModelUidSchema.ts +16 -0
  62. package/dist/src/PropertyUidSchema.ts +16 -0
  63. package/dist/src/QueryClient.ts +26 -0
  64. package/dist/src/Schema.ts +17 -0
  65. package/dist/src/SeedProtocolSdk.d.ts +19 -0
  66. package/dist/src/SeedSchema.ts +29 -0
  67. package/dist/src/VersionSchema.ts +16 -0
  68. package/dist/src/actors.ts +295 -0
  69. package/dist/src/addModelsToDb.ts +152 -0
  70. package/dist/src/allItems.ts +31 -0
  71. package/dist/src/analyzeInput.ts +144 -0
  72. package/dist/src/browser.app.db.config.ts +27 -0
  73. package/dist/src/browser.ts +30 -0
  74. package/dist/src/checkStatus.ts +57 -0
  75. package/dist/src/clientManagerMachine.ts +59 -0
  76. package/dist/src/configureFs.ts +98 -0
  77. package/dist/src/connectToDb.ts +41 -0
  78. package/dist/src/connectionManager.ts +67 -0
  79. package/dist/src/constants.ts +125 -0
  80. package/dist/src/content-hash.ts +30 -0
  81. package/dist/src/create.ts +39 -0
  82. package/dist/src/createMetadata.ts +77 -0
  83. package/dist/src/createNewItem.ts +61 -0
  84. package/dist/src/createPublishAttempt.ts +16 -0
  85. package/dist/src/createSeed.ts +31 -0
  86. package/dist/src/createSeeds.ts +24 -0
  87. package/dist/src/createVersion.ts +33 -0
  88. package/dist/src/dbMachine.ts +182 -0
  89. package/dist/src/deleteItem.ts +19 -0
  90. package/dist/src/download.ts +208 -0
  91. package/dist/src/drizzle.ts +78 -0
  92. package/dist/src/eas.ts +40 -0
  93. package/dist/src/environment.ts +35 -0
  94. package/dist/src/eventBus.ts +5 -0
  95. package/dist/src/events.ts +14 -0
  96. package/dist/src/fetchDataFromEas.ts +94 -0
  97. package/dist/src/fetchDbData.ts +19 -0
  98. package/dist/src/fetchRelatedItems.ts +184 -0
  99. package/dist/src/fetchSeeds.ts +45 -0
  100. package/dist/src/fetchVersions.ts +49 -0
  101. package/dist/src/files.ts +81 -0
  102. package/dist/src/filesDownload.ts +326 -0
  103. package/dist/src/fragment-masking.ts +87 -0
  104. package/dist/src/getExistingItem.ts +60 -0
  105. package/dist/src/getItem.ts +32 -0
  106. package/dist/src/getItemData.ts +99 -0
  107. package/dist/src/getItemProperties.ts +56 -0
  108. package/dist/src/getItemProperty.ts +34 -0
  109. package/dist/src/getItems.ts +70 -0
  110. package/dist/src/getMetadata.ts +40 -0
  111. package/dist/src/getModelSchemas.ts +89 -0
  112. package/dist/src/getPropertyData.ts +50 -0
  113. package/dist/src/getPublishPayload.ts +355 -0
  114. package/dist/src/getPublishUploads.ts +207 -0
  115. package/dist/src/getRelationValueData.ts +27 -0
  116. package/dist/src/getSchemaForItemProperty.ts +68 -0
  117. package/dist/src/getSchemaForModel.ts +42 -0
  118. package/dist/src/getSchemaUidForModel.ts +32 -0
  119. package/dist/src/getSeedData.ts +34 -0
  120. package/dist/src/getSegmentedItemProperties.ts +65 -0
  121. package/dist/src/getStorageTransactionIdForSeedUid.ts +38 -0
  122. package/dist/src/getVersionData.ts +46 -0
  123. package/dist/src/getVersionsForVersionUids.ts +39 -0
  124. package/dist/src/globalMachine.ts +280 -0
  125. package/dist/src/gql.ts +118 -0
  126. package/dist/src/graphql.ts +3209 -0
  127. package/dist/src/helpers.ts +273 -0
  128. package/dist/src/hydrateExistingItem.ts +137 -0
  129. package/dist/src/hydrateFromDb.ts +270 -0
  130. package/dist/src/hydrateNewItem.ts +34 -0
  131. package/dist/src/imageResize.ts +507 -0
  132. package/dist/src/index.d.ts +5 -0
  133. package/dist/src/index.ts +4 -0
  134. package/dist/src/initialize.ts +124 -0
  135. package/dist/src/internalMachine.ts +241 -0
  136. package/dist/src/itemMachineAll.ts +157 -0
  137. package/dist/src/itemMachineSingle.ts +158 -0
  138. package/dist/src/loadAppDb.ts +44 -0
  139. package/dist/src/machines.ts +66 -0
  140. package/dist/src/metadataLatest.ts +34 -0
  141. package/dist/src/migrate.ts +57 -0
  142. package/dist/src/model.ts +72 -0
  143. package/dist/src/modelClass.ts +19 -0
  144. package/dist/src/node.app.db.config.ts +41 -0
  145. package/dist/src/prepareDb.ts +29 -0
  146. package/dist/src/preparePublishRequestData.ts +81 -0
  147. package/dist/src/processItems.ts +74 -0
  148. package/dist/src/property.ts +156 -0
  149. package/dist/src/propertyMachine.ts +202 -0
  150. package/dist/src/publish.ts +28 -0
  151. package/dist/src/publishMachine.ts +77 -0
  152. package/dist/src/queries.ts +13 -0
  153. package/dist/src/recoverDeletedItem.ts +14 -0
  154. package/dist/src/reload.ts +33 -0
  155. package/dist/src/request.ts +45 -0
  156. package/dist/src/requestAll.ts +157 -0
  157. package/dist/src/resolveRelatedValue.ts +367 -0
  158. package/dist/src/resolveRemoteStorage.ts +88 -0
  159. package/dist/src/saveAppState.ts +50 -0
  160. package/dist/src/saveConfig.ts +106 -0
  161. package/dist/src/saveDataToDb.ts +145 -0
  162. package/dist/src/saveImageSrc.ts +242 -0
  163. package/dist/src/saveItemStorage.ts +156 -0
  164. package/dist/src/saveMetadata.ts +18 -0
  165. package/dist/src/savePublishService.ts +30 -0
  166. package/dist/src/saveRelation.ts +112 -0
  167. package/dist/src/seed.schema.config.ts +25 -0
  168. package/dist/src/seed.ts +10 -0
  169. package/dist/src/seedProtocol.ts +17 -0
  170. package/dist/src/services.ts +365 -0
  171. package/dist/src/setAddresses.ts +16 -0
  172. package/dist/src/sqlWasmClient.ts +88 -0
  173. package/dist/src/syncDbWithEas.ts +628 -0
  174. package/dist/src/trash.ts +29 -0
  175. package/dist/src/ts-to-proto.ts +101 -0
  176. package/dist/src/types.ts +12 -0
  177. package/dist/src/updateItemPropertyValue.ts +243 -0
  178. package/dist/src/updateMachineContext.ts +21 -0
  179. package/dist/src/updateMetadata.ts +59 -0
  180. package/dist/src/upload.ts +86 -0
  181. package/dist/src/validate.ts +45 -0
  182. package/dist/src/validateInput.ts +43 -0
  183. package/dist/src/validateItemData.ts +20 -0
  184. package/dist/src/versionData.ts +24 -0
  185. package/dist/src/waitForDb.ts +25 -0
  186. package/dist/src/waitForFiles.ts +41 -0
  187. package/dist/src/wasm.d.ts +8300 -0
  188. package/dist/types/scripts/bin.d.ts.map +1 -1
  189. package/dist/types/src/browser/helpers/FileManager.d.ts +2 -1
  190. package/dist/types/src/browser/helpers/FileManager.d.ts.map +1 -1
  191. package/dist/types/src/helpers/FileManager/BaseFileManager.d.ts +1 -0
  192. package/dist/types/src/helpers/FileManager/BaseFileManager.d.ts.map +1 -1
  193. package/dist/types/src/node/helpers/FileManager.d.ts +2 -1
  194. package/dist/types/src/node/helpers/FileManager.d.ts.map +1 -1
  195. package/package.json +3 -3
  196. package/dist/FileManager-DTzkncLh.js.map +0 -1
  197. package/dist/constants-CWg2B3Au.js.map +0 -1
  198. package/dist/index-BHGJ-Es9.js.map +0 -1
  199. package/dist/index-CQ9FS10O.js.map +0 -1
  200. package/dist/package.json +0 -189
@@ -0,0 +1,241 @@
1
+ import { assign, setup } from 'xstate'
2
+ import { createBrowserInspector } from '@statelyai/inspect'
3
+ import {
4
+ DB_NAME_APP,
5
+ INTERNAL_CONFIGURING_FS_SUCCESS,
6
+ INTERNAL_LOADING_APP_DB_SUCCESS,
7
+ INTERNAL_SAVING_CONFIG_SUCCESS,
8
+ INTERNAL_VALIDATING_INPUT_SUCCESS,
9
+ InternalState,
10
+ MachineIds,
11
+ } from './constants'
12
+ import { dbMachine } from '@/services/db/dbMachine'
13
+ import debug from 'debug'
14
+ import { validateInput } from '@/services/internal/actors/validateInput'
15
+ import { prepareDb } from '@/services/internal/actors/prepareDb'
16
+ import { configureFs } from '@/services/internal/actors/configureFs'
17
+ import { saveConfig } from '@/services/internal/actors/saveConfig'
18
+ import { loadAppDb } from '@/services/internal/actors/loadAppDb'
19
+ import { InternalMachineContext } from '@/types'
20
+ import { waitForFiles } from './actors/waitForFiles'
21
+
22
+ const logger = debug('app:services:internal:machine')
23
+
24
+ const { inspect } = createBrowserInspector({
25
+ autoStart: false,
26
+ })
27
+
28
+ const {
29
+ IDLE,
30
+ VALIDATING_INPUT,
31
+ SAVING_CONFIG,
32
+ CONFIGURING_FS,
33
+ LOADING_APP_DB,
34
+ } = InternalState
35
+
36
+ // Create the state machine
37
+ export const internalMachine = setup({
38
+ types: {
39
+ context: {} as Partial<InternalMachineContext>,
40
+ input: {} as Partial<InternalMachineContext> | undefined,
41
+ },
42
+ actors: {
43
+ prepareDb,
44
+ validateInput,
45
+ waitForFiles,
46
+ configureFs,
47
+ loadAppDb,
48
+ saveConfig,
49
+ },
50
+ }).createMachine({
51
+ id: MachineIds.INTERNAL,
52
+ initial: IDLE,
53
+ context: ({ input }) => {
54
+ return {
55
+ ...input,
56
+ error: undefined,
57
+ hasFiles: false,
58
+ }
59
+ },
60
+ states: {
61
+ [IDLE]: {
62
+ on: {
63
+ reValidate: VALIDATING_INPUT,
64
+ init: {
65
+ target: VALIDATING_INPUT,
66
+ actions: [
67
+ assign({
68
+ appDbService: ({context, spawn }) => {
69
+ return spawn(dbMachine, {
70
+ input: {
71
+ dbName: DB_NAME_APP,
72
+ pathToDir: context?.filesDir,
73
+ },
74
+ })
75
+ },
76
+ }),
77
+ ],
78
+ },
79
+ },
80
+ meta: {
81
+ displayText: 'Waiting for something to happen ...',
82
+ percentComplete: 0,
83
+ },
84
+ },
85
+ [VALIDATING_INPUT]: {
86
+ on: {
87
+ [INTERNAL_VALIDATING_INPUT_SUCCESS]: {
88
+ target: 'preparingDb',
89
+ actions: assign({
90
+ endpoints: ({ event }) => event.endpoints,
91
+ addresses: ({ event }) => event.addresses,
92
+ filesDir: ({ event }) => event.filesDir,
93
+ arweaveDomain: ({ event }) => event.arweaveDomain,
94
+ }),
95
+ },
96
+ },
97
+ invoke: {
98
+ src: 'validateInput',
99
+ input: ({ context, event }) => ({ context, event }),
100
+ },
101
+ meta: {
102
+ displayText: 'Validating input',
103
+ percentComplete: 20,
104
+ },
105
+ tags: ['loading'],
106
+ },
107
+ preparingDb: {
108
+ on: {
109
+ prepareDbSuccess: {
110
+ target: CONFIGURING_FS,
111
+ },
112
+ },
113
+ invoke: {
114
+ src: 'prepareDb',
115
+ input: ({ context, event }) => ({ context, event }),
116
+ },
117
+ },
118
+ waitingForFiles: {
119
+ on: {
120
+ filesReceived: {
121
+ target: LOADING_APP_DB,
122
+ },
123
+ },
124
+ invoke: {
125
+ src: 'waitForFiles',
126
+ input: ({ context, event }) => ({ context, event }),
127
+ },
128
+ },
129
+ [CONFIGURING_FS]: {
130
+ on: {
131
+ [INTERNAL_CONFIGURING_FS_SUCCESS]: {
132
+ target: LOADING_APP_DB,
133
+ actions: assign({ hasFiles: true }),
134
+ },
135
+ shouldWaitForFiles: {
136
+ target: 'waitingForFiles',
137
+ },
138
+ },
139
+ invoke: {
140
+ src: 'configureFs',
141
+ input: ({ context, event }) => ({ context, event }),
142
+ },
143
+ meta: {
144
+ displayText: 'Downloading app files',
145
+ percentComplete: 30,
146
+ },
147
+ tags: ['loading'],
148
+ },
149
+ [LOADING_APP_DB]: {
150
+ on: {
151
+ [INTERNAL_LOADING_APP_DB_SUCCESS]: {
152
+ target: SAVING_CONFIG,
153
+ actions: () => {
154
+ logger('[sdk] [internal/index] App DB loaded!')
155
+ },
156
+ },
157
+ },
158
+ invoke: {
159
+ src: 'loadAppDb',
160
+ input: ({ context, event }) => ({ context, event }),
161
+ },
162
+ },
163
+ // Save developer's config to DB
164
+ [SAVING_CONFIG]: {
165
+ on: {
166
+ [INTERNAL_SAVING_CONFIG_SUCCESS]: 'ready',
167
+ },
168
+ invoke: {
169
+ src: 'saveConfig',
170
+ input: ({ context, event }) => ({ context, event }),
171
+ },
172
+ meta: {
173
+ displayText: 'Saving configuration',
174
+ percentComplete: 80,
175
+ },
176
+ tags: ['loading'],
177
+ },
178
+ ready: {
179
+ entry: () => {
180
+ console.log('[sdk] [internal/index] Ready!')
181
+ logger('[sdk] [internal/index] Ready!')
182
+ },
183
+ meta: {
184
+ displayText: "Crossing the t's ...",
185
+ percentComplete: 90,
186
+ },
187
+ },
188
+ error: {
189
+ on: {
190
+ retry: {
191
+ target: CONFIGURING_FS,
192
+ actions: assign({ error: undefined }),
193
+ },
194
+ },
195
+ entry: () => {
196
+ logger('[sdk] [internal/index] Error!')
197
+ },
198
+ meta: {
199
+ displayText: 'Whoops! Something went wrong.',
200
+ percentComplete: null,
201
+ },
202
+ tags: ['error'],
203
+ },
204
+ },
205
+ })
206
+
207
+ // const internalService = createActor(internalMachine, {
208
+ // input: {},
209
+ // inspect: (inspEvent) => {
210
+ // if (inspEvent.type === '@xstate.snapshot') {
211
+ // if (
212
+ // inspEvent.event &&
213
+ // inspEvent.event.snapshot &&
214
+ // inspEvent.event.snapshot.value
215
+ // ) {
216
+ // logger(
217
+ // `[internalService] ${inspEvent.event.snapshot.value}`,
218
+ // inspEvent,
219
+ // )
220
+ // return
221
+ // }
222
+ //
223
+ // if (inspEvent.snapshot && inspEvent.snapshot.value) {
224
+ // logger(`[internalService] ${inspEvent.snapshot.value}`, inspEvent)
225
+ // return
226
+ // }
227
+ //
228
+ // // logger(`[internalService] Uncaught event`, inspEvent)
229
+ // }
230
+ // },
231
+ // })
232
+
233
+ // internalService.subscribe((snapshot) => {
234
+ // globalService.send({ type: INTERNAL_SERVICE_SNAPSHOT, snapshot })
235
+ // })
236
+ //
237
+ // internalService.on(CHILD_SNAPSHOT, (emitted) => {
238
+ // globalService.send({ ...emitted })
239
+ // })
240
+
241
+ // internalService.start()
@@ -0,0 +1,157 @@
1
+ import { assign, setup } from 'xstate'
2
+ import { MachineIds } from '@/services/internal/constants'
3
+ import { AllItemsMachineContext } from '@/types'
4
+ import { eventEmitter } from '@/eventBus'
5
+ import { initialize } from '../allItems/actors/initialize'
6
+ import { fetchDbData } from '../allItems/actors/fetchDbData'
7
+ import { fetchSeeds } from '../allItems/actors/fetchSeeds'
8
+ import { fetchVersions } from '../allItems/actors/fetchVersions'
9
+ import { fetchRelatedItems } from '../allItems/actors/fetchRelatedItems'
10
+ import { processItems } from '../allItems/actors/processItems'
11
+
12
+
13
+ export const itemMachineAll = setup({
14
+ types: {
15
+ context: {} as Partial<AllItemsMachineContext>,
16
+ input: {} as Partial<AllItemsMachineContext> | undefined,
17
+ },
18
+ actors: {
19
+ initialize,
20
+ fetchDbData,
21
+ fetchSeeds,
22
+ fetchVersions,
23
+ fetchRelatedItems,
24
+ processItems,
25
+ },
26
+ }).createMachine({
27
+ id: MachineIds.ALL_ITEMS,
28
+ initial: 'uninitialized',
29
+ context: ({ input }) => input as AllItemsMachineContext,
30
+ on: {
31
+ updateTimes: {
32
+ actions: assign({
33
+ times: ({ event }) => event.times,
34
+ }),
35
+ },
36
+ },
37
+ states: {
38
+ idle: {
39
+ entry: ({ self, context }) => {
40
+ eventEmitter.emit('service.saveState.request', {
41
+ state: self.getPersistedSnapshot(),
42
+ serviceId: `${MachineIds.ALL_ITEMS}_${context.modelName}`,
43
+ })
44
+ },
45
+ },
46
+ uninitialized: {
47
+ on: {
48
+ modelsFound: {
49
+ target: 'initializing',
50
+ actions: assign({
51
+ modelAddedToDb: true,
52
+ }),
53
+ },
54
+ },
55
+ },
56
+ initializing: {
57
+ on: {
58
+ initializeSuccess: {
59
+ target: 'fetchingSeeds',
60
+ actions: assign({
61
+ modelName: ({ event }) => event.modelName,
62
+ modelNameLowercase: ({ event }) => event.modelNameLowercase,
63
+ modelNamePlural: ({ event }) => event.modelNamePlural,
64
+ queryVariables: ({ event }) => event.queryVariables,
65
+ }),
66
+ },
67
+ modelsNotFound: 'idle',
68
+ },
69
+ invoke: {
70
+ src: 'initialize',
71
+ input: ({ context }) => ({ context }),
72
+ },
73
+ },
74
+ fetchingSeeds: {
75
+ on: {
76
+ fetchSeedsSuccess: {
77
+ target: 'fetchingVersions',
78
+ actions: assign({
79
+ itemSeeds: ({ event }) => event.itemSeeds,
80
+ }),
81
+ },
82
+ },
83
+ invoke: {
84
+ src: 'fetchSeeds',
85
+ input: ({ context }) => ({ context }),
86
+ },
87
+ },
88
+ fetchingVersions: {
89
+ on: {
90
+ fetchVersionsSuccess: {
91
+ target: 'fetchingRelatedItems',
92
+ actions: assign({
93
+ itemVersions: ({ event }) => event.itemVersions,
94
+ }),
95
+ },
96
+ },
97
+ invoke: {
98
+ src: 'fetchVersions',
99
+ input: ({ context }) => ({ context }),
100
+ },
101
+ },
102
+ fetchingRelatedItems: {
103
+ on: {
104
+ fetchRelatedItemsSuccess: {
105
+ target: 'processingItems',
106
+ actions: assign({
107
+ relatedProperties: ({ event }) => event.relatedProperties,
108
+ relatedVersionsBySeedUid: ({ event }) =>
109
+ event.relatedVersionsBySeedUid,
110
+ relatedVersionsBySchemaUid: ({ event }) =>
111
+ event.relatedVersionsBySchemaUid,
112
+ schemaUidsByModelName: ({ event }) => event.schemaUidsByModelName,
113
+ mostRecentPropertiesBySeedUid: ({ event }) =>
114
+ event.mostRecentPropertiesBySeedUid,
115
+ }),
116
+ },
117
+ },
118
+ invoke: {
119
+ src: 'fetchRelatedItems',
120
+ input: ({ context }) => ({ context }),
121
+ },
122
+ },
123
+ processingItems: {
124
+ on: {
125
+ processItemsSuccess: 'idle',
126
+ itemCreated: {
127
+ actions: assign({
128
+ items: ({ context, event }) => {
129
+ if (context && context.items) {
130
+ const foundItem = context.items.find((item) => {
131
+ if (!item.versionLocalId) {
132
+ return false
133
+ }
134
+ return (
135
+ item.versionLocalId === event.item.versionLocalId ||
136
+ item.versionUid === event.item.versionUid
137
+ )
138
+ })
139
+ if (foundItem) {
140
+ return context.items
141
+ }
142
+ return [...context.items, event.item]
143
+ }
144
+ if (context && !context.items) {
145
+ return [event.item]
146
+ }
147
+ },
148
+ }),
149
+ },
150
+ },
151
+ invoke: {
152
+ src: 'processItems',
153
+ input: ({ context, self }) => ({ context, self }),
154
+ },
155
+ },
156
+ },
157
+ })
@@ -0,0 +1,158 @@
1
+ import { assign, setup } from 'xstate'
2
+ import { MachineIds } from '@/services/internal/constants'
3
+ import { ItemMachineContext } from '@/types'
4
+ import { waitForDb } from './actors/waitForDb'
5
+ import { initialize } from './actors/initialize'
6
+ import { hydrateExistingItem } from './actors/hydrateExistingItem'
7
+ import { hydrateNewItem } from './actors/hydrateNewItem'
8
+ import { fetchDataFromEas } from './actors/fetchDataFromEas'
9
+ import { reload } from './actors/reload'
10
+ import { IItemProperty } from '@/interfaces'
11
+
12
+ export const itemMachineSingle = setup({
13
+ types: {
14
+ context: {} as ItemMachineContext<any>,
15
+ input: {},
16
+ },
17
+ actors: {
18
+ waitForDb,
19
+ initialize,
20
+ hydrateExistingItem,
21
+ hydrateNewItem,
22
+ fetchDataFromEas,
23
+ reload,
24
+ },
25
+ }).createMachine({
26
+ id: MachineIds.ITEM,
27
+ initial: 'waitingForDb',
28
+ context: ({ input }) => input as ItemMachineContext<any>,
29
+ on: {
30
+ updatedPropertiesBySchemaUid: {
31
+ actions: assign({
32
+ propertiesBySchemaUid: ({ event }) => event.propertiesBySchemaUid,
33
+ }),
34
+ },
35
+ updatePropertiesMetadata: {
36
+ actions: assign({
37
+ propertiesMetadata: ({ event }) => event.propertiesMetadata,
38
+ }),
39
+ },
40
+ updateProperties: {
41
+ actions: assign({
42
+ propertiesUpdatedAt: Date.now(),
43
+ }),
44
+ },
45
+ updateValue: {
46
+ actions: assign(({ event, context }) => {
47
+ let { propertyInstances } = context
48
+ if (!propertyInstances) {
49
+ propertyInstances = new Map<string, IItemProperty<any>>()
50
+ }
51
+ const { propertyName, propertyValue } = event
52
+
53
+ if (!propertyInstances.has(propertyName)) {
54
+ return {
55
+ [propertyName]: propertyValue,
56
+ }
57
+ }
58
+ const propertyInstance = propertyInstances.get(
59
+ propertyName,
60
+ ) as IItemProperty<any>
61
+
62
+ propertyInstance.value = propertyValue
63
+ propertyInstances.set(propertyName, propertyInstance)
64
+ // TODO: use immer here
65
+ return {
66
+ propertyInstances,
67
+ }
68
+ }),
69
+ },
70
+ addPropertyInstance: {
71
+ actions: assign(({ context, event }) => {
72
+ const propertyInstances =
73
+ context.propertyInstances || new Map<string, IItemProperty<any>>()
74
+ propertyInstances.set(event.propertyName, event.propertyInstance)
75
+ return {
76
+ propertyInstances,
77
+ }
78
+ }),
79
+ },
80
+ reload: '.reloading',
81
+ },
82
+ states: {
83
+ idle: {},
84
+ waitingForDb: {
85
+ on: {
86
+ waitForDbSuccess: 'initializing',
87
+ },
88
+ invoke: {
89
+ src: 'waitForDb',
90
+ },
91
+ },
92
+ initializing: {
93
+ on: {
94
+ hasExistingItem: {
95
+ target: 'idle',
96
+ actions: assign({
97
+ modelTableName: ({ event }) => event.modelTableName,
98
+ modelNamePlural: ({ event }) => event.modelNamePlural,
99
+ modelName: ({ event }) => event.modelName,
100
+ existingItem: ({ event }) => event.existingItem,
101
+ }),
102
+ },
103
+ isNewItem: {
104
+ target: 'idle',
105
+ actions: assign({
106
+ modelTableName: ({ event }) => event.modelTableName,
107
+ modelNamePlural: ({ event }) => event.modelNamePlural,
108
+ modelName: ({ event }) => event.modelName,
109
+ }),
110
+ },
111
+ },
112
+ invoke: {
113
+ src: 'initialize',
114
+ input: ({ context, event }) => ({ context, event }),
115
+ },
116
+ },
117
+ hydratingExistingItem: {
118
+ on: {
119
+ hydrateExistingItemSuccess: 'idle',
120
+ hydrateExistingItemFailure: 'destroying',
121
+ },
122
+ invoke: {
123
+ src: 'hydrateExistingItem',
124
+ input: ({ event, context }) => ({ event, context }),
125
+ },
126
+ },
127
+ hydratingNewItem: {
128
+ on: {
129
+ hydrateNewItemSuccess: 'idle',
130
+ },
131
+ invoke: {
132
+ src: 'hydrateNewItem',
133
+ input: ({ context }) => ({ context }),
134
+ },
135
+ },
136
+ fetchingRemoteData: {
137
+ on: {
138
+ fetchRemoteDataSuccess: 'idle',
139
+ },
140
+ invoke: {
141
+ src: 'fetchRemoteData',
142
+ input: ({ context }) => ({ context }),
143
+ },
144
+ },
145
+ reloading: {
146
+ on: {
147
+ reloadSuccess: 'idle',
148
+ },
149
+ invoke: {
150
+ src: 'reload',
151
+ input: ({ context }) => ({ context }),
152
+ },
153
+ },
154
+ destroying: {
155
+ type: 'final',
156
+ },
157
+ },
158
+ })
@@ -0,0 +1,44 @@
1
+ import { EventObject, fromCallback, Subscription } from 'xstate'
2
+ import {
3
+ DB_NAME_APP,
4
+ DB_ON_SNAPSHOT,
5
+ INTERNAL_LOADING_APP_DB_SUCCESS,
6
+ } from '@/services/internal/constants'
7
+ import debug from 'debug'
8
+ import { FromCallbackInput, InternalMachineContext } from '@/types'
9
+
10
+ const logger = debug('app:services:internal:actors:loadAppDb')
11
+
12
+ export const loadAppDb = fromCallback<
13
+ EventObject,
14
+ FromCallbackInput<InternalMachineContext>
15
+ >(({ sendBack, input: { context } }) => {
16
+ const { appDbService } = context
17
+
18
+ let subscription: Subscription | undefined
19
+
20
+ const _loadAppDb = async (): Promise<void> => {
21
+ if (appDbService.getSnapshot().value === 'ready') {
22
+ return
23
+ }
24
+ return new Promise((resolve) => {
25
+ subscription = appDbService.subscribe((snapshot) => {
26
+ if (snapshot.value === 'ready') {
27
+ return resolve()
28
+ }
29
+
30
+ sendBack({ type: DB_ON_SNAPSHOT, dbName: DB_NAME_APP, snapshot })
31
+ })
32
+ })
33
+ }
34
+
35
+ _loadAppDb().then(() => {
36
+ sendBack({ type: INTERNAL_LOADING_APP_DB_SUCCESS })
37
+ })
38
+
39
+ return () => {
40
+ if (subscription) {
41
+ subscription.unsubscribe()
42
+ }
43
+ }
44
+ })
@@ -0,0 +1,66 @@
1
+ import { Endpoints, Environment, ModelClassType } from './index'
2
+ import { ActorRefFrom } from 'xstate'
3
+ import { PublishRequestData } from './seedProtocol'
4
+
5
+ export type DbServiceContext = {
6
+ dbName: string
7
+ dbId?: string
8
+ dirName: string
9
+ drizzleDb?: any
10
+ pathToDb?: string
11
+ pathToDir?: string
12
+ pathToDbDir?: string
13
+ hasFiles?: boolean
14
+ error?: string
15
+ }
16
+
17
+ export type InternalMachineContext = {
18
+ error?: string
19
+ endpoints: Endpoints
20
+ addresses: string[]
21
+ filesDir?: string
22
+ arweaveDomain?: string
23
+ environment: string
24
+ hasFiles: boolean
25
+ seedDbService: any
26
+ appDbService: any
27
+ sdkDbService: any
28
+ }
29
+
30
+ export type GlobalMachineContext = {
31
+ isInitialized?: boolean
32
+ addedModelRecordsToDb?: boolean
33
+ environment?: Environment
34
+ endpoints?: Endpoints
35
+ addresses?: string[]
36
+ models?: { [key: string]: ModelClassType }
37
+ internalService?: ActorRefFrom<any>
38
+ publishItemService?: ActorRefFrom<any>
39
+ arweaveDomain?: string
40
+ filesDir?: string
41
+ }
42
+
43
+ export type PublishMachineContext = PublishRequestData & {
44
+ status: string
45
+ }
46
+
47
+ export type GetSchemaForModelEvent = {
48
+ type: 'getSchemaForModel'
49
+ modelName: string
50
+ }
51
+
52
+ export type HydrateExistingItemEvent = {
53
+ type: 'hydrateExistingItem'
54
+ existingItem: any
55
+ }
56
+
57
+ export type FromCallbackInput<T, P = undefined> = {
58
+ context: T
59
+ event?: P
60
+ }
61
+
62
+ export type ClientManagerContext = {
63
+ isInitialized: boolean
64
+ addressesSet: boolean
65
+ isSaving: boolean
66
+ }
@@ -0,0 +1,34 @@
1
+ import { and, eq, getTableColumns, or, SQL, sql } from 'drizzle-orm'
2
+ import { BaseDb } from '@/db/Db/BaseDb'
3
+ import { metadata } from '@/seedSchema'
4
+
5
+ export const getMetadataLatest = ({seedLocalId, seedUid}: {seedLocalId?: string, seedUid?: string}) => {
6
+ const appDb = BaseDb.getAppDb()
7
+
8
+ const whereClauses: SQL[] = []
9
+
10
+ if (seedLocalId) {
11
+ whereClauses.push(eq(metadata.seedLocalId, seedLocalId))
12
+ }
13
+
14
+ if (seedUid) {
15
+ whereClauses.push(eq(metadata.seedUid, seedUid))
16
+ }
17
+
18
+ const metadataColumns = getTableColumns(metadata)
19
+
20
+ return appDb.$with('metadataLatest').as(
21
+ appDb
22
+ .select({
23
+ ...metadataColumns,
24
+ rowNum: sql.raw(`
25
+ ROW_NUMBER() OVER (
26
+ PARTITION BY property_name
27
+ ORDER BY COALESCE(created_at, attestation_created_at) DESC
28
+ )
29
+ `).as('rowNum')
30
+ })
31
+ .from(metadata)
32
+ .where(and(...whereClauses))
33
+ )
34
+ }