@sentio/sdk 2.36.2-rc.1 → 2.37.0-rc.10

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 (70) hide show
  1. package/lib/core/base-context.d.ts +4 -0
  2. package/lib/core/base-context.d.ts.map +1 -1
  3. package/lib/core/base-context.js +20 -4
  4. package/lib/core/base-context.js.map +1 -1
  5. package/lib/core/core-plugin.d.ts.map +1 -1
  6. package/lib/core/core-plugin.js +8 -0
  7. package/lib/core/core-plugin.js.map +1 -1
  8. package/lib/core/database-schema.d.ts +15 -0
  9. package/lib/core/database-schema.d.ts.map +1 -0
  10. package/lib/core/database-schema.js +16 -0
  11. package/lib/core/database-schema.js.map +1 -0
  12. package/lib/core/index.d.ts +1 -0
  13. package/lib/core/index.d.ts.map +1 -1
  14. package/lib/core/index.js +1 -0
  15. package/lib/core/index.js.map +1 -1
  16. package/lib/store/codegen.d.ts +4 -0
  17. package/lib/store/codegen.d.ts.map +1 -0
  18. package/lib/store/codegen.js +221 -0
  19. package/lib/store/codegen.js.map +1 -0
  20. package/lib/store/context.d.ts +2 -0
  21. package/lib/store/context.d.ts.map +1 -0
  22. package/lib/store/context.js +2 -0
  23. package/lib/store/context.js.map +1 -0
  24. package/lib/store/decorators.d.ts +12 -0
  25. package/lib/store/decorators.d.ts.map +1 -0
  26. package/lib/store/decorators.js +25 -0
  27. package/lib/store/decorators.js.map +1 -0
  28. package/lib/store/entity.d.ts +17 -0
  29. package/lib/store/entity.d.ts.map +1 -0
  30. package/lib/store/entity.js +61 -0
  31. package/lib/store/entity.js.map +1 -0
  32. package/lib/store/index.d.ts +6 -0
  33. package/lib/store/index.d.ts.map +1 -0
  34. package/lib/store/index.js +6 -0
  35. package/lib/store/index.js.map +1 -0
  36. package/lib/store/run.d.ts +2 -0
  37. package/lib/store/run.d.ts.map +1 -0
  38. package/lib/store/run.js +11 -0
  39. package/lib/store/run.js.map +1 -0
  40. package/lib/store/schema.d.ts +7 -0
  41. package/lib/store/schema.d.ts.map +1 -0
  42. package/lib/store/schema.js +30 -0
  43. package/lib/store/schema.js.map +1 -0
  44. package/lib/store/store.d.ts +12 -0
  45. package/lib/store/store.d.ts.map +1 -0
  46. package/lib/store/store.js +74 -0
  47. package/lib/store/store.js.map +1 -0
  48. package/lib/store/types.d.ts +10 -0
  49. package/lib/store/types.d.ts.map +1 -0
  50. package/lib/store/types.js +2 -0
  51. package/lib/store/types.js.map +1 -0
  52. package/lib/testing/test-processor-server.d.ts +2 -5
  53. package/lib/testing/test-processor-server.d.ts.map +1 -1
  54. package/lib/testing/test-processor-server.js +2 -2
  55. package/lib/testing/test-processor-server.js.map +1 -1
  56. package/package.json +8 -5
  57. package/src/core/base-context.ts +22 -4
  58. package/src/core/core-plugin.ts +9 -0
  59. package/src/core/database-schema.ts +24 -0
  60. package/src/core/index.ts +1 -0
  61. package/src/store/codegen.ts +256 -0
  62. package/src/store/context.ts +1 -0
  63. package/src/store/decorators.ts +32 -0
  64. package/src/store/entity.ts +71 -0
  65. package/src/store/index.ts +5 -0
  66. package/src/store/run.ts +10 -0
  67. package/src/store/schema.ts +35 -0
  68. package/src/store/store.ts +80 -0
  69. package/src/store/types.ts +10 -0
  70. package/src/testing/test-processor-server.ts +13 -2
@@ -0,0 +1 @@
1
+ export { StoreContext } from '@sentio/runtime'
@@ -0,0 +1,32 @@
1
+ type Constructor = { new (...args: any[]): any }
2
+
3
+ export function entity(name: string) {
4
+ return function <T extends Constructor>(constructor: T, context: any) {
5
+ constructor.prototype.entityName = name
6
+ return constructor
7
+ }
8
+ }
9
+
10
+ export function derivedFrom(field: string) {
11
+ return function (target: any, context: any) {}
12
+ }
13
+
14
+ export function unique(field: string) {
15
+ return function (target: any, context: any) {}
16
+ }
17
+
18
+ export function index(field: string[]) {
19
+ return function (target: any, context: any) {}
20
+ }
21
+
22
+ export function fulltext(query: string) {
23
+ return function (target: any, context: any) {}
24
+ }
25
+
26
+ export function cardinality(value: number) {
27
+ return function (target: any, context: any) {}
28
+ }
29
+
30
+ export function byteWeight(value: number) {
31
+ return function (target: any, context: any) {}
32
+ }
@@ -0,0 +1,71 @@
1
+ import { ID } from './types.js'
2
+ import { PluginManager } from '@sentio/runtime'
3
+ import { Store } from './store.js'
4
+
5
+ export interface EntityClass<T extends Entity> {
6
+ new (data: any): T
7
+ }
8
+
9
+ export class Entity {
10
+ get id(): ID {
11
+ return this.get('id')
12
+ }
13
+
14
+ data: Record<string, any> = {}
15
+ constructor(data: any) {
16
+ Object.entries(data).forEach(([key, value]) => {
17
+ if (Array.isArray(value)) {
18
+ this.data[key] = value.map((v) => this.getIdFromEntity(v))
19
+ } else {
20
+ this.data[key] = this.getIdFromEntity(value)
21
+ }
22
+ })
23
+ }
24
+
25
+ private getIdFromEntity(entity: any): any {
26
+ if (entity instanceof Entity) {
27
+ return entity.id
28
+ } else if (typeof entity === 'object' && entity.id) {
29
+ return entity.id
30
+ }
31
+ return entity
32
+ }
33
+
34
+ private getStore() {
35
+ const dbContext = PluginManager.INSTANCE.dbContextLocalStorage.getStore()
36
+ if (dbContext) {
37
+ return new Store(dbContext)
38
+ }
39
+ return undefined
40
+ }
41
+
42
+ get<T>(field: string): T {
43
+ return this.data[field]
44
+ }
45
+
46
+ set<T>(field: string, value: T | T[] | ID | ID[]): void {
47
+ if (Array.isArray(value) && value instanceof Entity) {
48
+ this.data[field] = value.map((v) => (v as Entity).id)
49
+ } else if (value instanceof Entity) {
50
+ this.data[field] = (value as Entity).id
51
+ }
52
+ this.data[field] = value
53
+ }
54
+
55
+ protected getFieldObject<T extends Entity>(entity: EntityClass<T> | string, field: string): Promise<T | undefined> {
56
+ const id = this.data[field]
57
+ return id ? (this.getStore()?.get(entity, id) as Promise<T>) : Promise.resolve(undefined)
58
+ }
59
+
60
+ protected getFieldObjectArray<T extends Entity>(entity: EntityClass<T>, field: string): Promise<T[]> {
61
+ const ids = this.data[field]
62
+ const promises = ids.map((id: string) => this.getStore()?.get(entity, id))
63
+ return Promise.all(promises) as Promise<T[]>
64
+ }
65
+
66
+ toString(): string {
67
+ const entityName = this.constructor.prototype.entityName
68
+ const id = this.id
69
+ return `${entityName}#${id} ${JSON.stringify(this.data)}`
70
+ }
71
+ }
@@ -0,0 +1,5 @@
1
+ export * from './decorators.js'
2
+ export * from './types.js'
3
+ export * from './entity.js'
4
+ export * from './store.js'
5
+ export * from './context.js'
@@ -0,0 +1,10 @@
1
+ import { codegen } from './codegen.js'
2
+
3
+ if (process.argv.length > 3) {
4
+ const srcFile = process.argv[2]
5
+ const targetDir = process.argv[3]
6
+ await codegen(srcFile, targetDir)
7
+ } else {
8
+ console.error('Not enough argument')
9
+ process.exit(1)
10
+ }
@@ -0,0 +1,35 @@
1
+ import { buildASTSchema, DocumentNode, extendSchema, GraphQLSchema, parse, validateSchema } from 'graphql/index.js'
2
+ import * as fs from 'node:fs'
3
+
4
+ const customScalars = ['BigInt', 'BigDecimal', 'DateTime', 'JSON', 'Bytes', 'ID']
5
+
6
+ const baseSchema = buildASTSchema(
7
+ parse(`
8
+ directive @entity on OBJECT
9
+ directive @query on INTERFACE
10
+ directive @derivedFrom(field: String!) on FIELD_DEFINITION
11
+ directive @unique on FIELD_DEFINITION
12
+ directive @index(fields: [String!] unique: Boolean) repeatable on OBJECT | FIELD_DEFINITION
13
+ directive @fulltext(query: String!) on FIELD_DEFINITION
14
+ directive @cardinality(value: Int!) on OBJECT | FIELD_DEFINITION
15
+ directive @byteWeight(value: Float!) on FIELD_DEFINITION
16
+ directive @variant on OBJECT # legacy
17
+ directive @jsonField on OBJECT # legacy
18
+ ${customScalars.map((name) => 'scalar ' + name).join('\n')}
19
+ `)
20
+ )
21
+
22
+ export function buildSchema(doc: DocumentNode): GraphQLSchema {
23
+ const schema = extendSchema(baseSchema, doc)
24
+ const errors = validateSchema(schema).filter((err) => !/query root/i.test(err.message))
25
+ if (errors.length > 0) {
26
+ throw errors[0]
27
+ }
28
+ return schema
29
+ }
30
+
31
+ export function schemaFromFile(filePath: string) {
32
+ const source = fs.readFileSync(filePath, 'utf-8')
33
+ const doc = parse(source)
34
+ return { schema: buildSchema(doc), source }
35
+ }
@@ -0,0 +1,80 @@
1
+ import { Entity, EntityClass } from './entity.js'
2
+ import { StoreContext } from './context.js'
3
+ import { DatabaseSchema } from '../core/index.js'
4
+
5
+ export class Store {
6
+ constructor(private readonly context: StoreContext) {}
7
+
8
+ async get<T extends Entity>(entity: EntityClass<T> | string, id: string): Promise<T | undefined> {
9
+ const promise = this.context.sendRequest({
10
+ get: {
11
+ entity: typeof entity == 'string' ? entity : entity.prototype.entityName,
12
+ id
13
+ }
14
+ })
15
+
16
+ const data = (await promise) as any
17
+ if (data?.['id'] != null) {
18
+ return this.newEntity(entity, data)
19
+ }
20
+ return undefined
21
+ }
22
+
23
+ async delete(entity: EntityClass<any>, id: string | string[]): Promise<void> {
24
+ const toBeDeleted = []
25
+ if (Array.isArray(id)) {
26
+ for (const i of id) {
27
+ toBeDeleted.push({ entity: entity.prototype.entityName, id: i })
28
+ }
29
+ } else {
30
+ toBeDeleted.push({ entity: entity.prototype.entityName, id })
31
+ }
32
+ await this.context.sendRequest({
33
+ delete: {
34
+ entity: toBeDeleted.map((e) => e.entity) as string[],
35
+ id: toBeDeleted.map((e) => e.id) as string[]
36
+ }
37
+ })
38
+ }
39
+
40
+ async upsert<T extends Entity>(entity: T | T[]): Promise<void> {
41
+ const entities = Array.isArray(entity) ? entity : [entity]
42
+ const promise = this.context.sendRequest({
43
+ upsert: {
44
+ entity: entities.map((e) => e.constructor.prototype.entityName),
45
+ data: entities.map((e) => e.data),
46
+ id: entities.map((e) => e.id)
47
+ }
48
+ })
49
+
50
+ await promise
51
+ }
52
+
53
+ async list<T extends Entity>(entity: EntityClass<T>, limit?: number, offset?: number): Promise<T[]> {
54
+ const promise = this.context.sendRequest({
55
+ list: {
56
+ entity: entity.constructor.prototype.entityName,
57
+ limit,
58
+ offset
59
+ }
60
+ })
61
+
62
+ const list = (await promise) as any[]
63
+ return list.map((data) => {
64
+ return this.newEntity(entity, data)
65
+ })
66
+ }
67
+
68
+ private newEntity<T extends Entity>(entity: EntityClass<T> | string, data: any) {
69
+ if (typeof entity == 'string') {
70
+ const en = DatabaseSchema.findEntity(entity)
71
+ if (!en) {
72
+ // it is an interface
73
+ return new Entity(data) as T
74
+ }
75
+ entity = en
76
+ }
77
+
78
+ return new (entity as EntityClass<T>)(data)
79
+ }
80
+ }
@@ -0,0 +1,10 @@
1
+ export type { BigDecimal } from '@sentio/bigdecimal'
2
+
3
+ export type ID = string
4
+ export type String = string
5
+ export type Int = number
6
+ export type Float = number
7
+ export type Boolean = boolean
8
+ export type DateTime = Date
9
+ export type Json = any
10
+ export type Bytes = Uint8Array
@@ -2,12 +2,16 @@ import {
2
2
  AccountConfig,
3
3
  ContractConfig,
4
4
  DataBinding,
5
+ DeepPartial,
5
6
  Empty,
6
7
  ProcessBindingResponse,
7
8
  ProcessBindingsRequest,
8
9
  ProcessConfigRequest,
9
10
  ProcessConfigResponse,
10
11
  ProcessorServiceImplementation,
12
+ ProcessStreamRequest,
13
+ ProcessStreamResponse,
14
+ ServerStreamingMethodResult,
11
15
  StartRequest
12
16
  } from '@sentio/protos'
13
17
  import { CallContext } from 'nice-grpc-common'
@@ -80,7 +84,14 @@ export class TestProcessorServer implements ProcessorServiceImplementation {
80
84
  return this.service.processBindings({ bindings: [request] }, context)
81
85
  }
82
86
 
83
- processBindingsStream(request: AsyncIterable<DataBinding>, context: CallContext) {
84
- return this.service.processBindingsStream(request, context)
87
+ processBindingsStream(
88
+ requests: AsyncIterable<ProcessStreamRequest>,
89
+ context: CallContext
90
+ ): ServerStreamingMethodResult<DeepPartial<ProcessStreamResponse>> {
91
+ throw new Error('Method not implemented.')
85
92
  }
93
+
94
+ // processBindingsStream(request: AsyncIterable<ProcessStreamRequest>, context: CallContext) {
95
+ // return this.service.processBindingsStream(request, context)
96
+ // }
86
97
  }