@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.
Files changed (151) hide show
  1. package/LICENSE +165 -0
  2. package/README.md +13 -0
  3. package/dist/cjs/AbstractModule.js +253 -0
  4. package/dist/cjs/AbstractModule.js.map +1 -0
  5. package/dist/cjs/BaseEmitter.js +40 -0
  6. package/dist/cjs/BaseEmitter.js.map +1 -0
  7. package/dist/cjs/Error.js +21 -0
  8. package/dist/cjs/Error.js.map +1 -0
  9. package/dist/cjs/IdLogger.js +38 -0
  10. package/dist/cjs/IdLogger.js.map +1 -0
  11. package/dist/cjs/ModuleWrapper.js +226 -0
  12. package/dist/cjs/ModuleWrapper.js.map +1 -0
  13. package/dist/cjs/Query/QueryBoundWitnessBuilder.js +25 -0
  14. package/dist/cjs/Query/QueryBoundWitnessBuilder.js.map +1 -0
  15. package/dist/cjs/Query/QueryBoundWitnessValidator.js +38 -0
  16. package/dist/cjs/Query/QueryBoundWitnessValidator.js.map +1 -0
  17. package/dist/cjs/Query/QueryBoundWitnessWrapper.js +47 -0
  18. package/dist/cjs/Query/QueryBoundWitnessWrapper.js.map +1 -0
  19. package/dist/cjs/Query/index.js +7 -0
  20. package/dist/cjs/Query/index.js.map +1 -0
  21. package/dist/cjs/QueryValidator/ModuleConfigQueryValidator.js +65 -0
  22. package/dist/cjs/QueryValidator/ModuleConfigQueryValidator.js.map +1 -0
  23. package/dist/cjs/QueryValidator/QueryValidator.js +3 -0
  24. package/dist/cjs/QueryValidator/QueryValidator.js.map +1 -0
  25. package/dist/cjs/QueryValidator/SupportedQueryValidator.js +20 -0
  26. package/dist/cjs/QueryValidator/SupportedQueryValidator.js.map +1 -0
  27. package/dist/cjs/QueryValidator/index.js +7 -0
  28. package/dist/cjs/QueryValidator/index.js.map +1 -0
  29. package/dist/cjs/Resolver/CompositeModuleResolver.js +66 -0
  30. package/dist/cjs/Resolver/CompositeModuleResolver.js.map +1 -0
  31. package/dist/cjs/Resolver/ResolverEventEmitter.js +38 -0
  32. package/dist/cjs/Resolver/ResolverEventEmitter.js.map +1 -0
  33. package/dist/cjs/Resolver/SimpleModuleResolver.js +91 -0
  34. package/dist/cjs/Resolver/SimpleModuleResolver.js.map +1 -0
  35. package/dist/cjs/Resolver/index.js +12 -0
  36. package/dist/cjs/Resolver/index.js.map +1 -0
  37. package/dist/cjs/index.js +12 -0
  38. package/dist/cjs/index.js.map +1 -0
  39. package/dist/cjs/lib/duplicateModules.js +17 -0
  40. package/dist/cjs/lib/duplicateModules.js.map +1 -0
  41. package/dist/cjs/lib/index.js +6 -0
  42. package/dist/cjs/lib/index.js.map +1 -0
  43. package/dist/cjs/lib/serializable.js +38 -0
  44. package/dist/cjs/lib/serializable.js.map +1 -0
  45. package/dist/docs.json +70567 -0
  46. package/dist/esm/AbstractModule.js +241 -0
  47. package/dist/esm/AbstractModule.js.map +1 -0
  48. package/dist/esm/BaseEmitter.js +37 -0
  49. package/dist/esm/BaseEmitter.js.map +1 -0
  50. package/dist/esm/Error.js +19 -0
  51. package/dist/esm/Error.js.map +1 -0
  52. package/dist/esm/IdLogger.js +31 -0
  53. package/dist/esm/IdLogger.js.map +1 -0
  54. package/dist/esm/ModuleWrapper.js +209 -0
  55. package/dist/esm/ModuleWrapper.js.map +1 -0
  56. package/dist/esm/Query/QueryBoundWitnessBuilder.js +22 -0
  57. package/dist/esm/Query/QueryBoundWitnessBuilder.js.map +1 -0
  58. package/dist/esm/Query/QueryBoundWitnessValidator.js +35 -0
  59. package/dist/esm/Query/QueryBoundWitnessValidator.js.map +1 -0
  60. package/dist/esm/Query/QueryBoundWitnessWrapper.js +41 -0
  61. package/dist/esm/Query/QueryBoundWitnessWrapper.js.map +1 -0
  62. package/dist/esm/Query/index.js +4 -0
  63. package/dist/esm/Query/index.js.map +1 -0
  64. package/dist/esm/QueryValidator/ModuleConfigQueryValidator.js +62 -0
  65. package/dist/esm/QueryValidator/ModuleConfigQueryValidator.js.map +1 -0
  66. package/dist/esm/QueryValidator/QueryValidator.js +2 -0
  67. package/dist/esm/QueryValidator/QueryValidator.js.map +1 -0
  68. package/dist/esm/QueryValidator/SupportedQueryValidator.js +16 -0
  69. package/dist/esm/QueryValidator/SupportedQueryValidator.js.map +1 -0
  70. package/dist/esm/QueryValidator/index.js +4 -0
  71. package/dist/esm/QueryValidator/index.js.map +1 -0
  72. package/dist/esm/Resolver/CompositeModuleResolver.js +60 -0
  73. package/dist/esm/Resolver/CompositeModuleResolver.js.map +1 -0
  74. package/dist/esm/Resolver/ResolverEventEmitter.js +33 -0
  75. package/dist/esm/Resolver/ResolverEventEmitter.js.map +1 -0
  76. package/dist/esm/Resolver/SimpleModuleResolver.js +84 -0
  77. package/dist/esm/Resolver/SimpleModuleResolver.js.map +1 -0
  78. package/dist/esm/Resolver/index.js +8 -0
  79. package/dist/esm/Resolver/index.js.map +1 -0
  80. package/dist/esm/index.js +9 -0
  81. package/dist/esm/index.js.map +1 -0
  82. package/dist/esm/lib/duplicateModules.js +13 -0
  83. package/dist/esm/lib/duplicateModules.js.map +1 -0
  84. package/dist/esm/lib/index.js +3 -0
  85. package/dist/esm/lib/index.js.map +1 -0
  86. package/dist/esm/lib/serializable.js +32 -0
  87. package/dist/esm/lib/serializable.js.map +1 -0
  88. package/dist/types/AbstractModule.d.ts +42 -0
  89. package/dist/types/AbstractModule.d.ts.map +1 -0
  90. package/dist/types/BaseEmitter.d.ts +16 -0
  91. package/dist/types/BaseEmitter.d.ts.map +1 -0
  92. package/dist/types/Error.d.ts +16 -0
  93. package/dist/types/Error.d.ts.map +1 -0
  94. package/dist/types/IdLogger.d.ts +14 -0
  95. package/dist/types/IdLogger.d.ts.map +1 -0
  96. package/dist/types/ModuleWrapper.d.ts +73 -0
  97. package/dist/types/ModuleWrapper.d.ts.map +1 -0
  98. package/dist/types/Query/QueryBoundWitnessBuilder.d.ts +12 -0
  99. package/dist/types/Query/QueryBoundWitnessBuilder.d.ts.map +1 -0
  100. package/dist/types/Query/QueryBoundWitnessValidator.d.ts +10 -0
  101. package/dist/types/Query/QueryBoundWitnessValidator.d.ts.map +1 -0
  102. package/dist/types/Query/QueryBoundWitnessWrapper.d.ts +16 -0
  103. package/dist/types/Query/QueryBoundWitnessWrapper.d.ts.map +1 -0
  104. package/dist/types/Query/index.d.ts +4 -0
  105. package/dist/types/Query/index.d.ts.map +1 -0
  106. package/dist/types/QueryValidator/ModuleConfigQueryValidator.d.ts +15 -0
  107. package/dist/types/QueryValidator/ModuleConfigQueryValidator.d.ts.map +1 -0
  108. package/dist/types/QueryValidator/QueryValidator.d.ts +7 -0
  109. package/dist/types/QueryValidator/QueryValidator.d.ts.map +1 -0
  110. package/dist/types/QueryValidator/SupportedQueryValidator.d.ts +18 -0
  111. package/dist/types/QueryValidator/SupportedQueryValidator.d.ts.map +1 -0
  112. package/dist/types/QueryValidator/index.d.ts +4 -0
  113. package/dist/types/QueryValidator/index.d.ts.map +1 -0
  114. package/dist/types/Resolver/CompositeModuleResolver.d.ts +16 -0
  115. package/dist/types/Resolver/CompositeModuleResolver.d.ts.map +1 -0
  116. package/dist/types/Resolver/ResolverEventEmitter.d.ts +10 -0
  117. package/dist/types/Resolver/ResolverEventEmitter.d.ts.map +1 -0
  118. package/dist/types/Resolver/SimpleModuleResolver.d.ts +19 -0
  119. package/dist/types/Resolver/SimpleModuleResolver.d.ts.map +1 -0
  120. package/dist/types/Resolver/index.d.ts +7 -0
  121. package/dist/types/Resolver/index.d.ts.map +1 -0
  122. package/dist/types/index.d.ts +9 -0
  123. package/dist/types/index.d.ts.map +1 -0
  124. package/dist/types/lib/duplicateModules.d.ts +32 -0
  125. package/dist/types/lib/duplicateModules.d.ts.map +1 -0
  126. package/dist/types/lib/index.d.ts +3 -0
  127. package/dist/types/lib/index.d.ts.map +1 -0
  128. package/dist/types/lib/serializable.d.ts +3 -0
  129. package/dist/types/lib/serializable.d.ts.map +1 -0
  130. package/package.json +73 -0
  131. package/src/AbstractModule.ts +307 -0
  132. package/src/BaseEmitter.ts +47 -0
  133. package/src/Error.ts +25 -0
  134. package/src/IdLogger.ts +37 -0
  135. package/src/ModuleWrapper.ts +330 -0
  136. package/src/Query/QueryBoundWitnessBuilder.ts +29 -0
  137. package/src/Query/QueryBoundWitnessValidator.ts +41 -0
  138. package/src/Query/QueryBoundWitnessWrapper.ts +55 -0
  139. package/src/Query/index.ts +3 -0
  140. package/src/QueryValidator/ModuleConfigQueryValidator.ts +67 -0
  141. package/src/QueryValidator/QueryValidator.ts +8 -0
  142. package/src/QueryValidator/SupportedQueryValidator.ts +22 -0
  143. package/src/QueryValidator/index.ts +3 -0
  144. package/src/Resolver/CompositeModuleResolver.ts +70 -0
  145. package/src/Resolver/ResolverEventEmitter.ts +46 -0
  146. package/src/Resolver/SimpleModuleResolver.ts +118 -0
  147. package/src/Resolver/index.ts +8 -0
  148. package/src/index.ts +8 -0
  149. package/src/lib/duplicateModules.ts +14 -0
  150. package/src/lib/index.ts +2 -0
  151. 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
+ }
@@ -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
+ }