@xyo-network/module-abstract 2.53.14 → 2.53.16

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 (49) hide show
  1. package/dist/cjs/AbstractModule.js +2 -2
  2. package/dist/cjs/AbstractModule.js.map +1 -1
  3. package/dist/cjs/Error.js +4 -4
  4. package/dist/cjs/Error.js.map +1 -1
  5. package/dist/cjs/Query/QueryBoundWitnessValidator.js +21 -12
  6. package/dist/cjs/Query/QueryBoundWitnessValidator.js.map +1 -1
  7. package/dist/cjs/Query/QueryBoundWitnessWrapper.js +3 -4
  8. package/dist/cjs/Query/QueryBoundWitnessWrapper.js.map +1 -1
  9. package/dist/cjs/index.js +0 -1
  10. package/dist/cjs/index.js.map +1 -1
  11. package/dist/docs.json +17938 -32928
  12. package/dist/esm/AbstractModule.js +1 -1
  13. package/dist/esm/AbstractModule.js.map +1 -1
  14. package/dist/esm/Error.js +3 -3
  15. package/dist/esm/Error.js.map +1 -1
  16. package/dist/esm/Query/QueryBoundWitnessValidator.js +21 -12
  17. package/dist/esm/Query/QueryBoundWitnessValidator.js.map +1 -1
  18. package/dist/esm/Query/QueryBoundWitnessWrapper.js +3 -4
  19. package/dist/esm/Query/QueryBoundWitnessWrapper.js.map +1 -1
  20. package/dist/esm/index.js +0 -1
  21. package/dist/esm/index.js.map +1 -1
  22. package/dist/types/AbstractModule.d.ts.map +1 -1
  23. package/dist/types/Error.d.ts +5 -5
  24. package/dist/types/Error.d.ts.map +1 -1
  25. package/dist/types/Query/QueryBoundWitnessValidator.d.ts.map +1 -1
  26. package/dist/types/index.d.ts +0 -1
  27. package/dist/types/index.d.ts.map +1 -1
  28. package/dist/types/lib/duplicateModules.d.ts +6 -0
  29. package/dist/types/lib/duplicateModules.d.ts.map +1 -1
  30. package/package.json +20 -20
  31. package/src/AbstractModule.ts +1 -1
  32. package/src/Error.ts +6 -6
  33. package/src/Query/QueryBoundWitnessValidator.ts +20 -13
  34. package/src/Query/QueryBoundWitnessWrapper.ts +4 -4
  35. package/src/index.ts +0 -1
  36. package/dist/cjs/IdLogger.js +0 -38
  37. package/dist/cjs/IdLogger.js.map +0 -1
  38. package/dist/cjs/ModuleWrapper.js +0 -227
  39. package/dist/cjs/ModuleWrapper.js.map +0 -1
  40. package/dist/esm/IdLogger.js +0 -31
  41. package/dist/esm/IdLogger.js.map +0 -1
  42. package/dist/esm/ModuleWrapper.js +0 -210
  43. package/dist/esm/ModuleWrapper.js.map +0 -1
  44. package/dist/types/IdLogger.d.ts +0 -14
  45. package/dist/types/IdLogger.d.ts.map +0 -1
  46. package/dist/types/ModuleWrapper.d.ts +0 -73
  47. package/dist/types/ModuleWrapper.d.ts.map +0 -1
  48. package/src/IdLogger.ts +0 -37
  49. package/src/ModuleWrapper.ts +0 -322
@@ -1,322 +0,0 @@
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 { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'
6
- import { Base, BaseParams } from '@xyo-network/core'
7
- import { EventAnyListener, EventListener } from '@xyo-network/module-events'
8
- import {
9
- Module,
10
- ModuleDescription,
11
- ModuleDiscoverQuery,
12
- ModuleDiscoverQuerySchema,
13
- ModuleFilter,
14
- ModuleQueryResult,
15
- XyoQuery,
16
- XyoQueryBoundWitness,
17
- } from '@xyo-network/module-model'
18
- import { Payload } from '@xyo-network/payload-model'
19
- import { PayloadWrapper } from '@xyo-network/payload-wrapper'
20
- import { Promisable, PromiseEx } from '@xyo-network/promise'
21
- import compact from 'lodash/compact'
22
-
23
- import { XyoError, XyoErrorSchema } from './Error'
24
- import { duplicateModules } from './lib'
25
- import { QueryBoundWitnessBuilder, QueryBoundWitnessWrapper } from './Query'
26
-
27
- export interface WrapperError extends Error {
28
- errors: (XyoError | null)[]
29
- query: [XyoQueryBoundWitness, Payload[]]
30
- result: ModuleQueryResult | undefined
31
- }
32
-
33
- export type ModuleConstructable<TModule extends Module = Module, TWrapper extends ModuleWrapper<TModule> = ModuleWrapper<TModule>> = {
34
- new (params: ModuleWrapperParams): TWrapper
35
- }
36
-
37
- export function moduleConstructable<TModule extends Module = Module, TWrapper extends ModuleWrapper<TModule> = ModuleWrapper<TModule>>() {
38
- return <U extends ModuleConstructable<TModule, TWrapper>>(constructor: U) => {
39
- constructor
40
- }
41
- }
42
-
43
- export type ModuleWrapperParams<TWrappedModule extends Module = Module> = BaseParams<{
44
- account?: AccountInstance
45
- module: TWrappedModule
46
- }>
47
-
48
- @moduleConstructable()
49
- export class ModuleWrapper<TWrappedModule extends Module = Module>
50
- extends Base<TWrappedModule['params']>
51
- implements Module<TWrappedModule['params'], TWrappedModule['eventData']>
52
- {
53
- static requiredQueries: string[] = [ModuleDiscoverQuerySchema]
54
-
55
- eventData = {} as TWrappedModule['eventData']
56
-
57
- protected readonly wrapperParams: ModuleWrapperParams<TWrappedModule>
58
-
59
- constructor(params: ModuleWrapperParams<TWrappedModule>) {
60
- const mutatedParams = { ...params } as ModuleWrapperParams<TWrappedModule>
61
- //unwrap it if already wrapped
62
- const wrapper = params.module as unknown as ModuleWrapper<TWrappedModule>
63
- if (wrapper.module) {
64
- mutatedParams.module = wrapper.module
65
- }
66
-
67
- //set the root params to the wrapped module params
68
- super(params.module.params)
69
- this.wrapperParams = params
70
- }
71
-
72
- get account() {
73
- return this.wrapperParams.account
74
- }
75
-
76
- get address() {
77
- return this.module.address
78
- }
79
-
80
- get config(): TWrappedModule['config'] {
81
- return this.module.config
82
- }
83
-
84
- get downResolver() {
85
- return this.module.downResolver
86
- }
87
-
88
- get module() {
89
- return this.wrapperParams.module
90
- }
91
-
92
- get queries(): string[] {
93
- return this.module.queries
94
- }
95
-
96
- get upResolver() {
97
- return this.module.upResolver
98
- }
99
-
100
- static canWrap(module?: Module) {
101
- return !!module && this.missingRequiredQueries(module).length === 0
102
- }
103
-
104
- static hasRequiredQueries(module: Module) {
105
- return this.missingRequiredQueries(module).length === 0
106
- }
107
-
108
- static missingRequiredQueries(module: Module): string[] {
109
- const moduleQueries = module.queries
110
- return compact(
111
- this.requiredQueries.map((query) => {
112
- return moduleQueries.find((item) => item === query) ? null : query
113
- }),
114
- )
115
- }
116
-
117
- static tryWrap(module?: Module, account?: AccountInstance): ModuleWrapper | undefined {
118
- if (this.canWrap(module)) {
119
- if (!account) {
120
- this.defaultLogger?.info('Anonymous Module Wrapper Created')
121
- }
122
- return new ModuleWrapper({ account, module: module as Module })
123
- }
124
- }
125
-
126
- static wrap(module?: Module, account?: AccountInstance): ModuleWrapper {
127
- return assertEx(this.tryWrap(module, account), 'Unable to wrap module as ModuleWrapper')
128
- }
129
-
130
- clearListeners(eventNames: Parameters<TWrappedModule['clearListeners']>[0]) {
131
- return this.module.clearListeners(eventNames)
132
- }
133
-
134
- async describe(): Promise<Promise<Promisable<ModuleDescription>>> {
135
- const description: ModuleDescription = {
136
- address: this.module.address,
137
- queries: this.module.queries,
138
- }
139
- if (this.config.name) {
140
- description.name = this.config.name
141
- }
142
-
143
- const discover = await this.discover()
144
-
145
- description.children = compact(
146
- discover?.map((payload) => {
147
- const address = payload.schema === AddressSchema ? (payload as AddressPayload).address : undefined
148
- return address != this.module.address ? address : undefined
149
- }) ?? [],
150
- )
151
-
152
- return description
153
- }
154
-
155
- discover(): Promise<Payload[]> {
156
- const queryPayload = PayloadWrapper.parse<ModuleDiscoverQuery>({ schema: ModuleDiscoverQuerySchema })
157
- return this.sendQuery(queryPayload)
158
- }
159
-
160
- emit(eventName: Parameters<TWrappedModule['emit']>[0], eventArgs: Parameters<TWrappedModule['emit']>[1]) {
161
- return this.module.emit(eventName, eventArgs)
162
- }
163
-
164
- emitSerial(eventName: Parameters<TWrappedModule['emitSerial']>[0], eventArgs: Parameters<TWrappedModule['emitSerial']>[1]) {
165
- return this.module.emitSerial(eventName, eventArgs)
166
- }
167
-
168
- listenerCount(eventNames: Parameters<TWrappedModule['listenerCount']>[0]) {
169
- return this.module.listenerCount(eventNames)
170
- }
171
-
172
- off<TEventName extends keyof TWrappedModule['eventData']>(
173
- eventNames: TEventName,
174
- listener: EventListener<TWrappedModule['eventData'][TEventName]>,
175
- ) {
176
- return this.module.off(eventNames, listener)
177
- }
178
-
179
- offAny(listener: EventAnyListener) {
180
- return this.module.offAny(listener)
181
- }
182
-
183
- on<TEventName extends keyof TWrappedModule['eventData']>(eventNames: TEventName, listener: EventListener<TWrappedModule['eventData'][TEventName]>) {
184
- return this.module.on(eventNames, listener)
185
- }
186
-
187
- onAny(listener: EventAnyListener) {
188
- return this.module.onAny(listener)
189
- }
190
-
191
- once<TEventName extends keyof TWrappedModule['eventData']>(
192
- eventName: TEventName,
193
- listener: EventListener<TWrappedModule['eventData'][TEventName]>,
194
- ) {
195
- return this.module.once(eventName, listener)
196
- }
197
-
198
- async query<T extends XyoQueryBoundWitness = XyoQueryBoundWitness>(query: T, payloads?: Payload[]): Promise<ModuleQueryResult> {
199
- return await this.module.query(query, payloads)
200
- }
201
-
202
- queryable<T extends XyoQueryBoundWitness = XyoQueryBoundWitness>(query: T, payloads?: Payload[]) {
203
- return this.module.queryable(query, payloads)
204
- }
205
-
206
- async resolve<TModule extends Module = Module>(filter?: ModuleFilter): Promise<TModule[]>
207
- async resolve<TModule extends Module = Module>(nameOrAddress: string): Promise<TModule | undefined>
208
- async resolve<TModule extends Module = Module>(nameOrAddressOrFilter?: ModuleFilter | string): Promise<TModule | TModule[] | undefined> {
209
- switch (typeof nameOrAddressOrFilter) {
210
- case 'string': {
211
- const byAddress = Account.isAddress(nameOrAddressOrFilter)
212
- ? (await this.resolve<TModule>({ address: [nameOrAddressOrFilter] })).pop()
213
- : undefined
214
- return byAddress ?? (await this.resolve<TModule>({ name: [nameOrAddressOrFilter] })).pop()
215
- }
216
- default: {
217
- const filter: ModuleFilter | undefined = nameOrAddressOrFilter
218
- return [...(await this.module.downResolver.resolve<TModule>(filter)), ...(await this.module.upResolver.resolve<TModule>(filter))].filter(
219
- duplicateModules,
220
- )
221
- }
222
- }
223
- }
224
-
225
- /**
226
- * Resolves the supplied filter into wrapped modules
227
- * @example <caption>Example using ArchivistWrapper</caption>
228
- * const filter = { address: [address] }
229
- * const mods: ArchivistWrapper[] = await node.resolveWrapped(ArchivistWrapper, filter)
230
- * @param wrapper The ModuleWrapper class (ArchivistWrapper,
231
- * DivinerWrapper, etc.)
232
- * @param filter The ModuleFilter
233
- * @returns An array of ModuleWrapper instances corresponding to
234
- * the underlying modules matching the supplied filter
235
- */
236
- async resolveWrapped<T extends ModuleWrapper<Module> = ModuleWrapper<Module>>(
237
- wrapper: ModuleConstructable<Module, T>,
238
- filter?: ModuleFilter,
239
- ): Promise<T[]>
240
- async resolveWrapped<T extends ModuleWrapper<Module> = ModuleWrapper<Module>>(
241
- wrapper: ModuleConstructable<Module, T>,
242
- nameOrAddress: string,
243
- ): Promise<T | undefined>
244
- async resolveWrapped<T extends ModuleWrapper<Module> = ModuleWrapper<Module>>(
245
- wrapper: ModuleConstructable<Module, T>,
246
- nameOrAddressOrFilter?: ModuleFilter | string,
247
- ): Promise<T[] | T | undefined> {
248
- switch (typeof nameOrAddressOrFilter) {
249
- case 'string': {
250
- const nameOrAddress: string = nameOrAddressOrFilter
251
- const mod = await this.resolve<T['module']>(nameOrAddress)
252
- return mod ? new wrapper({ account: this.account, module: mod }) : undefined
253
- }
254
- default: {
255
- const filter: ModuleFilter | undefined = nameOrAddressOrFilter
256
- return (await this.resolve<T['module']>(filter)).map((mod) => new wrapper({ account: this.account, module: mod }))
257
- }
258
- }
259
- }
260
-
261
- protected bindQuery<T extends XyoQuery | PayloadWrapper<XyoQuery>>(
262
- query: T,
263
- payloads?: Payload[],
264
- account: AccountInstance | undefined = this.account,
265
- ): PromiseEx<[XyoQueryBoundWitness, Payload[]], AccountInstance> {
266
- const promise = new PromiseEx<[XyoQueryBoundWitness, Payload[]], AccountInstance>((resolve) => {
267
- const result = this.bindQueryInternal(query, payloads, account)
268
- resolve?.(result)
269
- return result
270
- }, account)
271
- return promise
272
- }
273
-
274
- protected bindQueryInternal<T extends XyoQuery | PayloadWrapper<XyoQuery>>(
275
- query: T,
276
- payloads?: Payload[],
277
- account: AccountInstance | undefined = this.account,
278
- ): [XyoQueryBoundWitness, Payload[]] {
279
- const builder = new QueryBoundWitnessBuilder().payloads(payloads).query(query)
280
- const result = (account ? builder.witness(account) : builder).build()
281
- return result
282
- }
283
-
284
- protected filterErrors(query: [XyoQueryBoundWitness, Payload[]], result: ModuleQueryResult | undefined): (XyoError | null)[] {
285
- return (result?.[1]?.filter((payload) => {
286
- if (payload?.schema === XyoErrorSchema) {
287
- const wrapper = new QueryBoundWitnessWrapper(query[0])
288
- return payload.sources?.includes(wrapper.hash)
289
- }
290
- return false
291
- }) ?? []) as XyoError[]
292
- }
293
-
294
- protected async sendQuery<T extends XyoQuery | PayloadWrapper<XyoQuery>>(queryPayload: T, payloads?: Payload[]): Promise<Payload[]> {
295
- //make sure we did not get wrapped payloads
296
- const unwrappedPayloads = payloads?.map((payload) => assertEx(PayloadWrapper.unwrap(payload), 'Unable to parse payload'))
297
- const unwrappedQueryPayload = assertEx(BoundWitnessWrapper.unwrap<XyoQueryBoundWitness>(queryPayload), 'Unable to parse queryPayload')
298
-
299
- // Bind them
300
- const query = await this.bindQuery(unwrappedQueryPayload, unwrappedPayloads)
301
-
302
- // Send them off
303
- const result = await this.module.query(query[0], query[1])
304
-
305
- this.throwErrors(query, result)
306
- return result[1]
307
- }
308
-
309
- protected throwErrors(query: [XyoQueryBoundWitness, Payload[]], result: ModuleQueryResult | undefined) {
310
- const errors = this.filterErrors(query, result)
311
- if (errors?.length > 0) {
312
- const error: WrapperError = {
313
- errors,
314
- message: errors.reduce((message, error) => `${message}${message.length > 0 ? '|' : ''}${error?.message}`, ''),
315
- name: 'XyoError',
316
- query,
317
- result,
318
- }
319
- throw error
320
- }
321
- }
322
- }