@xyo-network/module-abstract 2.53.15 → 2.53.17
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/dist/cjs/AbstractModule.js +3 -3
- package/dist/cjs/AbstractModule.js.map +1 -1
- package/dist/cjs/Error.js +6 -6
- package/dist/cjs/Error.js.map +1 -1
- package/dist/cjs/Query/QueryBoundWitnessBuilder.js +1 -1
- package/dist/cjs/Query/QueryBoundWitnessBuilder.js.map +1 -1
- package/dist/cjs/Query/QueryBoundWitnessValidator.js +22 -13
- package/dist/cjs/Query/QueryBoundWitnessValidator.js.map +1 -1
- package/dist/cjs/Query/QueryBoundWitnessWrapper.js +2 -3
- package/dist/cjs/Query/QueryBoundWitnessWrapper.js.map +1 -1
- package/dist/cjs/QueryValidator/SupportedQueryValidator.js.map +1 -1
- package/dist/cjs/index.js +0 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/docs.json +17815 -32805
- package/dist/esm/AbstractModule.js +3 -3
- package/dist/esm/AbstractModule.js.map +1 -1
- package/dist/esm/Error.js +4 -4
- package/dist/esm/Error.js.map +1 -1
- package/dist/esm/Query/QueryBoundWitnessBuilder.js +2 -2
- package/dist/esm/Query/QueryBoundWitnessBuilder.js.map +1 -1
- package/dist/esm/Query/QueryBoundWitnessValidator.js +23 -14
- package/dist/esm/Query/QueryBoundWitnessValidator.js.map +1 -1
- package/dist/esm/Query/QueryBoundWitnessWrapper.js +2 -3
- package/dist/esm/Query/QueryBoundWitnessWrapper.js.map +1 -1
- package/dist/esm/QueryValidator/SupportedQueryValidator.js.map +1 -1
- package/dist/esm/index.js +0 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/types/AbstractModule.d.ts +5 -5
- package/dist/types/AbstractModule.d.ts.map +1 -1
- package/dist/types/Error.d.ts +6 -6
- package/dist/types/Error.d.ts.map +1 -1
- package/dist/types/Query/QueryBoundWitnessBuilder.d.ts +2 -2
- package/dist/types/Query/QueryBoundWitnessBuilder.d.ts.map +1 -1
- package/dist/types/Query/QueryBoundWitnessValidator.d.ts +2 -2
- package/dist/types/Query/QueryBoundWitnessValidator.d.ts.map +1 -1
- package/dist/types/Query/QueryBoundWitnessWrapper.d.ts +3 -3
- package/dist/types/Query/QueryBoundWitnessWrapper.d.ts.map +1 -1
- package/dist/types/QueryValidator/QueryValidator.d.ts +3 -3
- package/dist/types/QueryValidator/QueryValidator.d.ts.map +1 -1
- package/dist/types/QueryValidator/SupportedQueryValidator.d.ts.map +1 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/lib/duplicateModules.d.ts +6 -0
- package/dist/types/lib/duplicateModules.d.ts.map +1 -1
- package/package.json +18 -18
- package/src/AbstractModule.ts +12 -12
- package/src/Error.ts +7 -7
- package/src/Query/QueryBoundWitnessBuilder.ts +4 -4
- package/src/Query/QueryBoundWitnessValidator.ts +23 -16
- package/src/Query/QueryBoundWitnessWrapper.ts +6 -6
- package/src/QueryValidator/QueryValidator.ts +3 -3
- package/src/QueryValidator/SupportedQueryValidator.ts +2 -6
- package/src/index.ts +0 -1
- package/dist/cjs/IdLogger.js +0 -38
- package/dist/cjs/IdLogger.js.map +0 -1
- package/dist/cjs/ModuleWrapper.js +0 -227
- package/dist/cjs/ModuleWrapper.js.map +0 -1
- package/dist/esm/IdLogger.js +0 -31
- package/dist/esm/IdLogger.js.map +0 -1
- package/dist/esm/ModuleWrapper.js +0 -210
- package/dist/esm/ModuleWrapper.js.map +0 -1
- package/dist/types/IdLogger.d.ts +0 -14
- package/dist/types/IdLogger.d.ts.map +0 -1
- package/dist/types/ModuleWrapper.d.ts +0 -73
- package/dist/types/ModuleWrapper.d.ts.map +0 -1
- package/src/IdLogger.ts +0 -37
- package/src/ModuleWrapper.ts +0 -322
package/src/ModuleWrapper.ts
DELETED
|
@@ -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
|
-
}
|