@xyo-network/module-abstract 2.51.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.
- package/LICENSE +165 -0
- package/README.md +13 -0
- package/dist/cjs/AbstractModule.js +253 -0
- package/dist/cjs/AbstractModule.js.map +1 -0
- package/dist/cjs/BaseEmitter.js +40 -0
- package/dist/cjs/BaseEmitter.js.map +1 -0
- package/dist/cjs/Error.js +21 -0
- package/dist/cjs/Error.js.map +1 -0
- package/dist/cjs/IdLogger.js +38 -0
- package/dist/cjs/IdLogger.js.map +1 -0
- package/dist/cjs/ModuleWrapper.js +226 -0
- package/dist/cjs/ModuleWrapper.js.map +1 -0
- package/dist/cjs/Query/QueryBoundWitnessBuilder.js +25 -0
- package/dist/cjs/Query/QueryBoundWitnessBuilder.js.map +1 -0
- package/dist/cjs/Query/QueryBoundWitnessValidator.js +38 -0
- package/dist/cjs/Query/QueryBoundWitnessValidator.js.map +1 -0
- package/dist/cjs/Query/QueryBoundWitnessWrapper.js +47 -0
- package/dist/cjs/Query/QueryBoundWitnessWrapper.js.map +1 -0
- package/dist/cjs/Query/index.js +7 -0
- package/dist/cjs/Query/index.js.map +1 -0
- package/dist/cjs/QueryValidator/ModuleConfigQueryValidator.js +65 -0
- package/dist/cjs/QueryValidator/ModuleConfigQueryValidator.js.map +1 -0
- package/dist/cjs/QueryValidator/QueryValidator.js +3 -0
- package/dist/cjs/QueryValidator/QueryValidator.js.map +1 -0
- package/dist/cjs/QueryValidator/SupportedQueryValidator.js +20 -0
- package/dist/cjs/QueryValidator/SupportedQueryValidator.js.map +1 -0
- package/dist/cjs/QueryValidator/index.js +7 -0
- package/dist/cjs/QueryValidator/index.js.map +1 -0
- package/dist/cjs/Resolver/CompositeModuleResolver.js +66 -0
- package/dist/cjs/Resolver/CompositeModuleResolver.js.map +1 -0
- package/dist/cjs/Resolver/ResolverEventEmitter.js +38 -0
- package/dist/cjs/Resolver/ResolverEventEmitter.js.map +1 -0
- package/dist/cjs/Resolver/SimpleModuleResolver.js +91 -0
- package/dist/cjs/Resolver/SimpleModuleResolver.js.map +1 -0
- package/dist/cjs/Resolver/index.js +12 -0
- package/dist/cjs/Resolver/index.js.map +1 -0
- package/dist/cjs/index.js +12 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/lib/duplicateModules.js +17 -0
- package/dist/cjs/lib/duplicateModules.js.map +1 -0
- package/dist/cjs/lib/index.js +6 -0
- package/dist/cjs/lib/index.js.map +1 -0
- package/dist/cjs/lib/serializable.js +38 -0
- package/dist/cjs/lib/serializable.js.map +1 -0
- package/dist/docs.json +70567 -0
- package/dist/esm/AbstractModule.js +241 -0
- package/dist/esm/AbstractModule.js.map +1 -0
- package/dist/esm/BaseEmitter.js +37 -0
- package/dist/esm/BaseEmitter.js.map +1 -0
- package/dist/esm/Error.js +19 -0
- package/dist/esm/Error.js.map +1 -0
- package/dist/esm/IdLogger.js +31 -0
- package/dist/esm/IdLogger.js.map +1 -0
- package/dist/esm/ModuleWrapper.js +209 -0
- package/dist/esm/ModuleWrapper.js.map +1 -0
- package/dist/esm/Query/QueryBoundWitnessBuilder.js +22 -0
- package/dist/esm/Query/QueryBoundWitnessBuilder.js.map +1 -0
- package/dist/esm/Query/QueryBoundWitnessValidator.js +35 -0
- package/dist/esm/Query/QueryBoundWitnessValidator.js.map +1 -0
- package/dist/esm/Query/QueryBoundWitnessWrapper.js +41 -0
- package/dist/esm/Query/QueryBoundWitnessWrapper.js.map +1 -0
- package/dist/esm/Query/index.js +4 -0
- package/dist/esm/Query/index.js.map +1 -0
- package/dist/esm/QueryValidator/ModuleConfigQueryValidator.js +62 -0
- package/dist/esm/QueryValidator/ModuleConfigQueryValidator.js.map +1 -0
- package/dist/esm/QueryValidator/QueryValidator.js +2 -0
- package/dist/esm/QueryValidator/QueryValidator.js.map +1 -0
- package/dist/esm/QueryValidator/SupportedQueryValidator.js +16 -0
- package/dist/esm/QueryValidator/SupportedQueryValidator.js.map +1 -0
- package/dist/esm/QueryValidator/index.js +4 -0
- package/dist/esm/QueryValidator/index.js.map +1 -0
- package/dist/esm/Resolver/CompositeModuleResolver.js +60 -0
- package/dist/esm/Resolver/CompositeModuleResolver.js.map +1 -0
- package/dist/esm/Resolver/ResolverEventEmitter.js +33 -0
- package/dist/esm/Resolver/ResolverEventEmitter.js.map +1 -0
- package/dist/esm/Resolver/SimpleModuleResolver.js +84 -0
- package/dist/esm/Resolver/SimpleModuleResolver.js.map +1 -0
- package/dist/esm/Resolver/index.js +8 -0
- package/dist/esm/Resolver/index.js.map +1 -0
- package/dist/esm/index.js +9 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/lib/duplicateModules.js +13 -0
- package/dist/esm/lib/duplicateModules.js.map +1 -0
- package/dist/esm/lib/index.js +3 -0
- package/dist/esm/lib/index.js.map +1 -0
- package/dist/esm/lib/serializable.js +32 -0
- package/dist/esm/lib/serializable.js.map +1 -0
- package/dist/types/AbstractModule.d.ts +42 -0
- package/dist/types/AbstractModule.d.ts.map +1 -0
- package/dist/types/BaseEmitter.d.ts +16 -0
- package/dist/types/BaseEmitter.d.ts.map +1 -0
- package/dist/types/Error.d.ts +16 -0
- package/dist/types/Error.d.ts.map +1 -0
- package/dist/types/IdLogger.d.ts +14 -0
- package/dist/types/IdLogger.d.ts.map +1 -0
- package/dist/types/ModuleWrapper.d.ts +73 -0
- package/dist/types/ModuleWrapper.d.ts.map +1 -0
- package/dist/types/Query/QueryBoundWitnessBuilder.d.ts +12 -0
- package/dist/types/Query/QueryBoundWitnessBuilder.d.ts.map +1 -0
- package/dist/types/Query/QueryBoundWitnessValidator.d.ts +10 -0
- package/dist/types/Query/QueryBoundWitnessValidator.d.ts.map +1 -0
- package/dist/types/Query/QueryBoundWitnessWrapper.d.ts +16 -0
- package/dist/types/Query/QueryBoundWitnessWrapper.d.ts.map +1 -0
- package/dist/types/Query/index.d.ts +4 -0
- package/dist/types/Query/index.d.ts.map +1 -0
- package/dist/types/QueryValidator/ModuleConfigQueryValidator.d.ts +15 -0
- package/dist/types/QueryValidator/ModuleConfigQueryValidator.d.ts.map +1 -0
- package/dist/types/QueryValidator/QueryValidator.d.ts +7 -0
- package/dist/types/QueryValidator/QueryValidator.d.ts.map +1 -0
- package/dist/types/QueryValidator/SupportedQueryValidator.d.ts +18 -0
- package/dist/types/QueryValidator/SupportedQueryValidator.d.ts.map +1 -0
- package/dist/types/QueryValidator/index.d.ts +4 -0
- package/dist/types/QueryValidator/index.d.ts.map +1 -0
- package/dist/types/Resolver/CompositeModuleResolver.d.ts +16 -0
- package/dist/types/Resolver/CompositeModuleResolver.d.ts.map +1 -0
- package/dist/types/Resolver/ResolverEventEmitter.d.ts +10 -0
- package/dist/types/Resolver/ResolverEventEmitter.d.ts.map +1 -0
- package/dist/types/Resolver/SimpleModuleResolver.d.ts +19 -0
- package/dist/types/Resolver/SimpleModuleResolver.d.ts.map +1 -0
- package/dist/types/Resolver/index.d.ts +7 -0
- package/dist/types/Resolver/index.d.ts.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/lib/duplicateModules.d.ts +32 -0
- package/dist/types/lib/duplicateModules.d.ts.map +1 -0
- package/dist/types/lib/index.d.ts +3 -0
- package/dist/types/lib/index.d.ts.map +1 -0
- package/dist/types/lib/serializable.d.ts +3 -0
- package/dist/types/lib/serializable.d.ts.map +1 -0
- package/package.json +73 -0
- package/src/AbstractModule.ts +307 -0
- package/src/BaseEmitter.ts +47 -0
- package/src/Error.ts +25 -0
- package/src/IdLogger.ts +37 -0
- package/src/ModuleWrapper.ts +330 -0
- package/src/Query/QueryBoundWitnessBuilder.ts +29 -0
- package/src/Query/QueryBoundWitnessValidator.ts +41 -0
- package/src/Query/QueryBoundWitnessWrapper.ts +55 -0
- package/src/Query/index.ts +3 -0
- package/src/QueryValidator/ModuleConfigQueryValidator.ts +67 -0
- package/src/QueryValidator/QueryValidator.ts +8 -0
- package/src/QueryValidator/SupportedQueryValidator.ts +22 -0
- package/src/QueryValidator/index.ts +3 -0
- package/src/Resolver/CompositeModuleResolver.ts +70 -0
- package/src/Resolver/ResolverEventEmitter.ts +46 -0
- package/src/Resolver/SimpleModuleResolver.ts +118 -0
- package/src/Resolver/index.ts +8 -0
- package/src/index.ts +8 -0
- package/src/lib/duplicateModules.ts +14 -0
- package/src/lib/index.ts +2 -0
- package/src/lib/serializable.ts +41 -0
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import { assertEx } from '@xylabs/assert'
|
|
2
|
+
import { Account } from '@xyo-network/account'
|
|
3
|
+
import { AccountInstance } from '@xyo-network/account-model'
|
|
4
|
+
import { AddressPayload, AddressSchema } from '@xyo-network/address-payload-plugin'
|
|
5
|
+
import { BoundWitnessBuilder } from '@xyo-network/boundwitness-builder'
|
|
6
|
+
import { XyoBoundWitness } from '@xyo-network/boundwitness-model'
|
|
7
|
+
import { ConfigPayload, ConfigSchema } from '@xyo-network/config-payload-plugin'
|
|
8
|
+
import {
|
|
9
|
+
AccountModuleParams,
|
|
10
|
+
CreatableModule,
|
|
11
|
+
creatableModule,
|
|
12
|
+
Module,
|
|
13
|
+
ModuleConfig,
|
|
14
|
+
ModuleDiscoverQuerySchema,
|
|
15
|
+
ModuleFilter,
|
|
16
|
+
ModuleParams,
|
|
17
|
+
ModuleQueriedEventArgs,
|
|
18
|
+
ModuleQuery,
|
|
19
|
+
ModuleQueryResult,
|
|
20
|
+
ModuleSubscribeQuerySchema,
|
|
21
|
+
SchemaString,
|
|
22
|
+
WalletModuleParams,
|
|
23
|
+
XyoQuery,
|
|
24
|
+
XyoQueryBoundWitness,
|
|
25
|
+
} from '@xyo-network/module-model'
|
|
26
|
+
import { XyoPayloadBuilder } from '@xyo-network/payload-builder'
|
|
27
|
+
import { XyoPayload } from '@xyo-network/payload-model'
|
|
28
|
+
import { PayloadWrapper } from '@xyo-network/payload-wrapper'
|
|
29
|
+
import { Promisable, PromiseEx } from '@xyo-network/promise'
|
|
30
|
+
import { QueryPayload, QuerySchema } from '@xyo-network/query-payload-plugin'
|
|
31
|
+
import compact from 'lodash/compact'
|
|
32
|
+
|
|
33
|
+
import { BaseEmitter } from './BaseEmitter'
|
|
34
|
+
import { XyoErrorBuilder } from './Error'
|
|
35
|
+
import { IdLogger } from './IdLogger'
|
|
36
|
+
import { duplicateModules, serializableField } from './lib'
|
|
37
|
+
import { QueryBoundWitnessBuilder, QueryBoundWitnessWrapper } from './Query'
|
|
38
|
+
import { ModuleConfigQueryValidator, Queryable, SupportedQueryValidator } from './QueryValidator'
|
|
39
|
+
import { CompositeModuleResolver } from './Resolver'
|
|
40
|
+
|
|
41
|
+
@creatableModule()
|
|
42
|
+
export class AbstractModule<TParams extends ModuleParams = ModuleParams> extends BaseEmitter<TParams> implements Module<TParams>, Module {
|
|
43
|
+
static configSchema: string
|
|
44
|
+
|
|
45
|
+
readonly downResolver = new CompositeModuleResolver()
|
|
46
|
+
readonly upResolver = new CompositeModuleResolver()
|
|
47
|
+
|
|
48
|
+
protected _started = false
|
|
49
|
+
protected readonly account: AccountInstance
|
|
50
|
+
protected readonly moduleConfigQueryValidator: Queryable
|
|
51
|
+
|
|
52
|
+
protected readonly supportedQueryValidator: Queryable
|
|
53
|
+
|
|
54
|
+
constructor(params: TParams) {
|
|
55
|
+
//we copy this to prevent mutation of the incoming object
|
|
56
|
+
const mutatedParams = { ...params } as TParams
|
|
57
|
+
const activeLogger = params.logger ?? AbstractModule.defaultLogger
|
|
58
|
+
//TODO: change wallet to use accountDerivationPath
|
|
59
|
+
const account: AccountInstance | undefined = (mutatedParams as WalletModuleParams<TParams['config'], TParams['eventData']>).wallet
|
|
60
|
+
? Account.fromPrivateKey(
|
|
61
|
+
(mutatedParams as WalletModuleParams<TParams['config']>).wallet.derivePath(
|
|
62
|
+
(mutatedParams as WalletModuleParams<TParams['config']>).accountDerivationPath,
|
|
63
|
+
).privateKey,
|
|
64
|
+
)
|
|
65
|
+
: (mutatedParams as AccountModuleParams<TParams['config']>).account
|
|
66
|
+
? (mutatedParams as AccountModuleParams<TParams['config']>).account
|
|
67
|
+
: undefined
|
|
68
|
+
|
|
69
|
+
mutatedParams.logger = activeLogger ? new IdLogger(activeLogger, () => `0x${this.account.addressValue.hex}`) : undefined
|
|
70
|
+
super(mutatedParams)
|
|
71
|
+
this.account = this.loadAccount(account)
|
|
72
|
+
this.downResolver.add(this)
|
|
73
|
+
this.supportedQueryValidator = new SupportedQueryValidator(this).queryable
|
|
74
|
+
this.moduleConfigQueryValidator = new ModuleConfigQueryValidator(mutatedParams?.config).queryable
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
get address() {
|
|
78
|
+
return this.account.addressValue.hex
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
get allowAnonymous() {
|
|
82
|
+
return !!this.config.security?.allowAnonymous
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
get config(): TParams['config'] {
|
|
86
|
+
return this.params.config
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
get previousHash() {
|
|
90
|
+
return this.account.previousHash
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
get queries(): string[] {
|
|
94
|
+
return [ModuleDiscoverQuerySchema, ModuleSubscribeQuerySchema]
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
static async create<TModule extends Module>(this: CreatableModule<TModule>, params?: TModule['params']) {
|
|
98
|
+
if (!this.configSchema) {
|
|
99
|
+
this.defaultLogger?.log(`Missing configSchema [${params?.config?.schema}][${this.name}]`)
|
|
100
|
+
}
|
|
101
|
+
const schema = this.configSchema
|
|
102
|
+
if (params?.config?.schema) {
|
|
103
|
+
if (params?.config?.schema !== schema) {
|
|
104
|
+
this.defaultLogger?.log(`Bad Config Schema [Received ${params?.config?.schema}] [Expected ${schema}]`)
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
params?.logger?.debug(`config: ${JSON.stringify(params?.config, null, 2)}`)
|
|
108
|
+
const mutatedConfig = { ...params?.config, schema } as TModule['params']['config']
|
|
109
|
+
const mutatedParams = { ...params, config: mutatedConfig } as TModule['params']
|
|
110
|
+
//console.log(`Create-config: ${JSON.stringify(mutatedConfig)}`)
|
|
111
|
+
const newModule = new this(mutatedParams)
|
|
112
|
+
await newModule.start?.()
|
|
113
|
+
return newModule
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
discover(): Promisable<XyoPayload[]> {
|
|
117
|
+
const config = this.config
|
|
118
|
+
const address = new XyoPayloadBuilder<AddressPayload>({ schema: AddressSchema }).fields({ address: this.address, name: this.config.name }).build()
|
|
119
|
+
const queries = this.queries.map((query) => {
|
|
120
|
+
return new XyoPayloadBuilder<QueryPayload>({ schema: QuerySchema }).fields({ query }).build()
|
|
121
|
+
})
|
|
122
|
+
const configSchema: ConfigPayload = {
|
|
123
|
+
config: config.schema,
|
|
124
|
+
schema: ConfigSchema,
|
|
125
|
+
}
|
|
126
|
+
return compact([config, configSchema, address, ...queries])
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
async query<T extends XyoQueryBoundWitness = XyoQueryBoundWitness, TConfig extends ModuleConfig = ModuleConfig>(
|
|
130
|
+
query: T,
|
|
131
|
+
payloads?: XyoPayload[],
|
|
132
|
+
queryConfig?: TConfig,
|
|
133
|
+
): Promise<ModuleQueryResult> {
|
|
134
|
+
this.started('throw')
|
|
135
|
+
const wrapper = QueryBoundWitnessWrapper.parseQuery<ModuleQuery>(query, payloads)
|
|
136
|
+
if (!this.allowAnonymous) {
|
|
137
|
+
if (query.addresses.length === 0) {
|
|
138
|
+
console.warn(`Anonymous Queries not allowed, but running anyway [${this.config.name}], [${this.address}]`)
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
const typedQuery = wrapper.query.payload
|
|
142
|
+
assertEx(this.queryable(query, payloads, queryConfig))
|
|
143
|
+
const resultPayloads: XyoPayload[] = []
|
|
144
|
+
const queryAccount = new Account()
|
|
145
|
+
try {
|
|
146
|
+
switch (typedQuery.schema) {
|
|
147
|
+
case ModuleDiscoverQuerySchema: {
|
|
148
|
+
resultPayloads.push(...(await this.discover()))
|
|
149
|
+
break
|
|
150
|
+
}
|
|
151
|
+
case ModuleSubscribeQuerySchema: {
|
|
152
|
+
this.subscribe(queryAccount)
|
|
153
|
+
break
|
|
154
|
+
}
|
|
155
|
+
default:
|
|
156
|
+
console.error(`Unsupported Query [${query.schema}]`)
|
|
157
|
+
}
|
|
158
|
+
} catch (ex) {
|
|
159
|
+
const error = ex as Error
|
|
160
|
+
resultPayloads.push(new XyoErrorBuilder([wrapper.hash], error.message).build())
|
|
161
|
+
}
|
|
162
|
+
const result = await this.bindResult(resultPayloads, queryAccount)
|
|
163
|
+
|
|
164
|
+
const args: ModuleQueriedEventArgs = { module: this, payloads, query, result }
|
|
165
|
+
await this.emit('moduleQueried', args)
|
|
166
|
+
|
|
167
|
+
return result
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
queryable<T extends XyoQueryBoundWitness = XyoQueryBoundWitness, TConfig extends ModuleConfig = ModuleConfig>(
|
|
171
|
+
query: T,
|
|
172
|
+
payloads?: XyoPayload[],
|
|
173
|
+
queryConfig?: TConfig,
|
|
174
|
+
): boolean {
|
|
175
|
+
if (!this.started('warn')) return false
|
|
176
|
+
const configValidator = queryConfig
|
|
177
|
+
? new ModuleConfigQueryValidator(Object.assign({}, this.config, queryConfig)).queryable
|
|
178
|
+
: this.moduleConfigQueryValidator
|
|
179
|
+
const validators = [this.supportedQueryValidator, configValidator]
|
|
180
|
+
return validators.every((validator) => validator(query, payloads))
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
start(_timeout?: number): Promisable<void> {
|
|
184
|
+
this.validateConfig()
|
|
185
|
+
this._started = true
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
started(notStartedAction?: 'error' | 'throw' | 'warn' | 'log' | 'none') {
|
|
189
|
+
if (!this._started) {
|
|
190
|
+
switch (notStartedAction) {
|
|
191
|
+
case 'throw':
|
|
192
|
+
throw Error(`Module not Started [${this.address}]`)
|
|
193
|
+
case 'warn':
|
|
194
|
+
this.logger?.warn('Module not started')
|
|
195
|
+
break
|
|
196
|
+
case 'error':
|
|
197
|
+
this.logger?.error('Module not started')
|
|
198
|
+
break
|
|
199
|
+
case 'none':
|
|
200
|
+
break
|
|
201
|
+
case 'log':
|
|
202
|
+
default:
|
|
203
|
+
this.logger?.log('Module not started')
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return this._started
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
subscribe(_queryAccount?: AccountInstance) {
|
|
210
|
+
return
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
protected bindHashes(hashes: string[], schema: SchemaString[], account?: AccountInstance) {
|
|
214
|
+
const promise = new PromiseEx((resolve) => {
|
|
215
|
+
const result = this.bindHashesInternal(hashes, schema, account)
|
|
216
|
+
resolve?.(result)
|
|
217
|
+
return result
|
|
218
|
+
}, account)
|
|
219
|
+
return promise
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
protected bindHashesInternal(hashes: string[], schema: SchemaString[], account?: AccountInstance): XyoBoundWitness {
|
|
223
|
+
const builder = new BoundWitnessBuilder().hashes(hashes, schema).witness(this.account)
|
|
224
|
+
const result = (account ? builder.witness(account) : builder).build()[0]
|
|
225
|
+
this.logger?.debug(`result: ${JSON.stringify(result, null, 2)}`)
|
|
226
|
+
return result
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
protected bindQuery<T extends XyoQuery | PayloadWrapper<XyoQuery>>(
|
|
230
|
+
query: T,
|
|
231
|
+
payloads?: XyoPayload[],
|
|
232
|
+
account?: AccountInstance,
|
|
233
|
+
): PromiseEx<[XyoQueryBoundWitness, XyoPayload[]], AccountInstance> {
|
|
234
|
+
const promise = new PromiseEx<[XyoQueryBoundWitness, XyoPayload[]], AccountInstance>((resolve) => {
|
|
235
|
+
const result = this.bindQueryInternal(query, payloads, account)
|
|
236
|
+
resolve?.(result)
|
|
237
|
+
return result
|
|
238
|
+
}, account)
|
|
239
|
+
return promise
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
protected bindQueryInternal<T extends XyoQuery | PayloadWrapper<XyoQuery>>(
|
|
243
|
+
query: T,
|
|
244
|
+
payloads?: XyoPayload[],
|
|
245
|
+
account?: AccountInstance,
|
|
246
|
+
): [XyoQueryBoundWitness, XyoPayload[]] {
|
|
247
|
+
const builder = new QueryBoundWitnessBuilder().payloads(payloads).witness(this.account).query(query)
|
|
248
|
+
const result = (account ? builder.witness(account) : builder).build()
|
|
249
|
+
//this.logger?.debug(`result: ${JSON.stringify(result, null, 2)}`)
|
|
250
|
+
return result
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
protected bindResult(payloads: XyoPayload[], account?: AccountInstance): PromiseEx<ModuleQueryResult, AccountInstance> {
|
|
254
|
+
const promise = new PromiseEx<ModuleQueryResult, AccountInstance>((resolve) => {
|
|
255
|
+
const result = this.bindResultInternal(payloads, account)
|
|
256
|
+
resolve?.(result)
|
|
257
|
+
return result
|
|
258
|
+
}, account)
|
|
259
|
+
return promise
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
protected bindResultInternal(payloads: XyoPayload[], account?: AccountInstance): ModuleQueryResult {
|
|
263
|
+
const builder = new BoundWitnessBuilder().payloads(payloads).witness(this.account)
|
|
264
|
+
const result: ModuleQueryResult = [(account ? builder.witness(account) : builder).build()[0], payloads]
|
|
265
|
+
return result
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
protected loadAccount(account?: AccountInstance): AccountInstance {
|
|
269
|
+
return account ?? new Account()
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
protected async resolve<TModule extends Module = Module>(filter?: ModuleFilter): Promise<TModule[]> {
|
|
273
|
+
return [...(await this.upResolver.resolve<TModule>(filter)), ...(await this.downResolver.resolve<TModule>(filter))].filter(duplicateModules)
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
protected stop(_timeout?: number): Promisable<this> {
|
|
277
|
+
this._started = false
|
|
278
|
+
return this
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
protected validateConfig(config?: unknown, parents: string[] = []): boolean {
|
|
282
|
+
return Object.entries(config ?? this.config ?? {}).reduce((valid, [key, value]) => {
|
|
283
|
+
switch (typeof value) {
|
|
284
|
+
case 'function':
|
|
285
|
+
this.logger?.warn(`Fields of type function not allowed in config [${parents?.join('.')}.${key}]`)
|
|
286
|
+
return false
|
|
287
|
+
case 'object': {
|
|
288
|
+
if (Array.isArray(value)) {
|
|
289
|
+
return (
|
|
290
|
+
value.reduce((valid, value) => {
|
|
291
|
+
return this.validateConfig(value, [...parents, key]) && valid
|
|
292
|
+
}, true) && valid
|
|
293
|
+
)
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
if (!serializableField(value)) {
|
|
297
|
+
this.logger?.warn(`Fields that are not serializable to JSON are not allowed in config [${parents?.join('.')}.${key}]`)
|
|
298
|
+
return false
|
|
299
|
+
}
|
|
300
|
+
return value ? this.validateConfig(value, [...parents, key]) && valid : true
|
|
301
|
+
}
|
|
302
|
+
default:
|
|
303
|
+
return valid
|
|
304
|
+
}
|
|
305
|
+
}, true)
|
|
306
|
+
}
|
|
307
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Base } from '@xyo-network/core'
|
|
2
|
+
import { EventAnyListener, EventDataParams, EventFunctions, EventListener, Events } from '@xyo-network/module-events'
|
|
3
|
+
|
|
4
|
+
export class BaseEmitter<TParams extends EventDataParams = EventDataParams> extends Base<TParams> implements EventFunctions<TParams['eventData']> {
|
|
5
|
+
private events: Events<TParams['eventData']>
|
|
6
|
+
|
|
7
|
+
constructor(params: TParams) {
|
|
8
|
+
super(params)
|
|
9
|
+
this.events = new Events(params.eventData)
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
clearListeners(eventNames: keyof TParams['eventData'] | keyof TParams['eventData'][]) {
|
|
13
|
+
return this.events.clearListeners(eventNames)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
emit(eventName: keyof TParams['eventData'], eventArgs?: TParams['eventData'][keyof TParams['eventData']]) {
|
|
17
|
+
return this.events.emit(eventName, eventArgs)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
emitSerial(eventName: keyof TParams['eventData'], eventArgs?: TParams['eventData'][keyof TParams['eventData']]) {
|
|
21
|
+
return this.events.emitSerial(eventName, eventArgs)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
listenerCount(eventNames: keyof TParams['eventData'] | keyof TParams['eventData'][]) {
|
|
25
|
+
return this.events.listenerCount(eventNames)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
off(eventNames: keyof TParams['eventData'] | keyof TParams['eventData'][], listener: EventListener<TParams['eventData']>) {
|
|
29
|
+
return this.events.off(eventNames, listener)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
offAny(listener: EventAnyListener<TParams['eventData']>) {
|
|
33
|
+
return this.events.offAny(listener)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
on(eventNames: keyof TParams['eventData'] | keyof TParams['eventData'][], listener: EventListener<TParams['eventData']>) {
|
|
37
|
+
return this.events.on(eventNames, listener)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
onAny(listener: EventAnyListener<TParams['eventData']>) {
|
|
41
|
+
return this.events.onAny(listener)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
once(eventNames: keyof TParams['eventData'] | keyof TParams['eventData'][], listener: EventListener<TParams['eventData']>) {
|
|
45
|
+
return this.events.once(eventNames, listener)
|
|
46
|
+
}
|
|
47
|
+
}
|
package/src/Error.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { XyoPayloadBuilder } from '@xyo-network/payload-builder'
|
|
2
|
+
import { XyoPayload } from '@xyo-network/payload-model'
|
|
3
|
+
|
|
4
|
+
export type XyoErrorSchema = 'network.xyo.error'
|
|
5
|
+
export const XyoErrorSchema: XyoErrorSchema = 'network.xyo.error'
|
|
6
|
+
|
|
7
|
+
export type XyoError = XyoPayload<{ message?: string; schema: XyoErrorSchema; sources: string[] }>
|
|
8
|
+
|
|
9
|
+
export class XyoErrorBuilder extends XyoPayloadBuilder {
|
|
10
|
+
message?: string
|
|
11
|
+
sources: string[]
|
|
12
|
+
constructor(sources: string[], message?: string) {
|
|
13
|
+
super({ schema: XyoErrorSchema })
|
|
14
|
+
this.sources = sources
|
|
15
|
+
this.message = message
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
override build(): XyoError {
|
|
19
|
+
return {
|
|
20
|
+
message: this.message,
|
|
21
|
+
schema: XyoErrorSchema,
|
|
22
|
+
sources: this.sources,
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
package/src/IdLogger.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { getFunctionName, Logger } from '@xyo-network/shared'
|
|
2
|
+
|
|
3
|
+
export class IdLogger implements Logger {
|
|
4
|
+
private _id?: () => string
|
|
5
|
+
private _logger: Logger
|
|
6
|
+
|
|
7
|
+
constructor(logger: Logger, id?: () => string) {
|
|
8
|
+
this._logger = logger
|
|
9
|
+
this._id = id
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
set id(id: string) {
|
|
13
|
+
this._id = () => id
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
debug(message?: unknown) {
|
|
17
|
+
this._logger?.debug(this.generate(message, getFunctionName(3)))
|
|
18
|
+
}
|
|
19
|
+
error(message?: unknown) {
|
|
20
|
+
this._logger?.error(this.generate(message, getFunctionName(3)))
|
|
21
|
+
}
|
|
22
|
+
info(message?: unknown) {
|
|
23
|
+
this._logger?.info(this.generate(message, getFunctionName(3)))
|
|
24
|
+
}
|
|
25
|
+
log(message?: unknown) {
|
|
26
|
+
this._logger?.log(this.generate(message, getFunctionName(3)))
|
|
27
|
+
}
|
|
28
|
+
warn(message?: unknown) {
|
|
29
|
+
this._logger?.warn(this.generate(message, getFunctionName(3)))
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
private generate(message?: unknown, tag?: string) {
|
|
33
|
+
return `${tag} ${this._id ? `[${this._id}] ` : ''}${
|
|
34
|
+
typeof message === 'string' ? message : typeof message === 'object' ? JSON.stringify(message, null, 2) : `${message}`
|
|
35
|
+
}`
|
|
36
|
+
}
|
|
37
|
+
}
|