@toa.io/core 1.0.0-alpha.272 → 1.0.0-alpha.277
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/CHANGELOG.md +16 -0
- package/package.json +8 -8
- package/src/assignment.js +2 -6
- package/src/call.js +15 -9
- package/src/cascade.js +2 -6
- package/src/component.js +4 -8
- package/src/composition.js +3 -7
- package/src/connector.js +2 -6
- package/src/context.js +2 -6
- package/src/contract/contract.js +2 -6
- package/src/contract/index.js +2 -7
- package/src/contract/reply.js +4 -8
- package/src/contract/request.js +4 -8
- package/src/contract/schemas/index.js +9 -6
- package/src/discovery.js +3 -7
- package/src/effect.js +2 -6
- package/src/emission.js +2 -6
- package/src/entities/changeset.js +2 -6
- package/src/entities/entity.js +3 -7
- package/src/entities/factory.js +5 -9
- package/src/entities/index.js +1 -5
- package/src/entities/newid.js +2 -4
- package/src/entities/set.js +2 -6
- package/src/event.js +3 -7
- package/src/exceptions.js +37 -30
- package/src/exposition.js +2 -6
- package/src/guard.js +1 -5
- package/src/index.js +28 -55
- package/src/locator.js +2 -6
- package/src/observation.js +2 -6
- package/src/operation.js +4 -8
- package/src/outbox/index.js +1 -6
- package/src/outbox/outbox.js +5 -10
- package/src/query/criteria.js +3 -7
- package/src/query/options.js +2 -6
- package/src/query.js +5 -6
- package/src/receiver.js +4 -8
- package/src/reflection.js +2 -6
- package/src/remote.js +3 -7
- package/src/state.js +2 -6
- package/src/transition.js +4 -8
- package/src/transmission.js +3 -7
- package/src/unmanaged.js +2 -6
- package/test/call.fixtures.js +8 -12
- package/test/call.test.js +21 -9
- package/test/component.fixtures.js +5 -8
- package/test/component.test.js +22 -11
- package/test/connector.fixtures.js +5 -11
- package/test/connector.test.js +42 -41
- package/test/context.fixtures.js +8 -12
- package/test/context.test.js +18 -7
- package/test/contract/conditions.test.js +8 -6
- package/test/contract/contract.fixtures.js +12 -16
- package/test/contract/request.test.js +51 -40
- package/test/discovery.test.js +25 -17
- package/test/emission.fixtures.js +5 -8
- package/test/emission.test.js +29 -12
- package/test/entities/entity.fixtures.js +7 -11
- package/test/entities/entity.test.js +30 -19
- package/test/entities/factory.fixtures.js +22 -10
- package/test/entities/factory.test.js +29 -17
- package/test/entities/set.fixtures.js +6 -8
- package/test/entities/set.test.js +6 -5
- package/test/event.fixtures.js +9 -14
- package/test/event.test.js +57 -31
- package/test/locator.test.js +25 -24
- package/test/outbox.test.js +44 -37
- package/test/query.fixtures.js +1 -5
- package/test/query.test.js +28 -17
- package/test/receiver.fixtures.js +8 -12
- package/test/receiver.test.js +45 -22
- package/test/reflection.test.js +7 -6
- package/test/state.fixtures.js +24 -32
- package/test/state.test.js +35 -30
- package/test/transmission.fixtures.js +4 -6
- package/test/transmission.test.js +33 -15
- package/types/atomicity.d.ts +1 -1
- package/types/bindings.d.ts +1 -1
- package/types/bridges.ts +3 -3
- package/types/component.d.ts +4 -4
- package/types/context.d.ts +4 -4
- package/types/entity.d.ts +2 -2
- package/types/event.d.ts +1 -1
- package/types/extensions.d.ts +8 -7
- package/types/index.ts +16 -16
- package/types/operations.d.ts +1 -1
- package/types/outbox.d.ts +2 -2
- package/types/receiver.d.ts +2 -2
- package/types/reflection.d.ts +1 -1
- package/types/remote.d.ts +1 -1
- package/types/request.d.ts +1 -1
- package/types/state.d.ts +2 -2
- package/types/storages.d.ts +3 -3
package/src/index.js
CHANGED
|
@@ -1,55 +1,28 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
exports.contract = require('./contract')
|
|
30
|
-
|
|
31
|
-
exports.Assignment = Assignment
|
|
32
|
-
exports.Call = Call
|
|
33
|
-
exports.Cascade = Cascade
|
|
34
|
-
exports.Component = Component
|
|
35
|
-
exports.Composition = Composition
|
|
36
|
-
exports.Connector = Connector
|
|
37
|
-
exports.Context = Context
|
|
38
|
-
exports.Discovery = Discovery
|
|
39
|
-
exports.Effect = Effect
|
|
40
|
-
exports.Emission = Emission
|
|
41
|
-
exports.Event = Event
|
|
42
|
-
exports.Exposition = Exposition
|
|
43
|
-
exports.Locator = Locator
|
|
44
|
-
exports.Observation = Observation
|
|
45
|
-
exports.Outbox = Outbox
|
|
46
|
-
exports.Operation = Operation
|
|
47
|
-
exports.Query = Query
|
|
48
|
-
exports.Receiver = Receiver
|
|
49
|
-
exports.Reflection = Reflection
|
|
50
|
-
exports.Remote = Remote
|
|
51
|
-
exports.State = State
|
|
52
|
-
exports.Transition = Transition
|
|
53
|
-
exports.Transmission = Transmission
|
|
54
|
-
exports.Unmanaged = Unmanaged
|
|
55
|
-
exports.Guard = Guard
|
|
1
|
+
export { Assignment } from './assignment.js'
|
|
2
|
+
export { Call } from './call.js'
|
|
3
|
+
export { Cascade } from './cascade.js'
|
|
4
|
+
export { Component } from './component.js'
|
|
5
|
+
export { Composition } from './composition.js'
|
|
6
|
+
export { Connector } from './connector.js'
|
|
7
|
+
export { Context } from './context.js'
|
|
8
|
+
export { Discovery } from './discovery.js'
|
|
9
|
+
export { Effect } from './effect.js'
|
|
10
|
+
export { Emission } from './emission.js'
|
|
11
|
+
export { Event } from './event.js'
|
|
12
|
+
export { Exposition } from './exposition.js'
|
|
13
|
+
export { Locator } from './locator.js'
|
|
14
|
+
export { Observation } from './observation.js'
|
|
15
|
+
export { Outbox } from './outbox/index.js'
|
|
16
|
+
export { Operation } from './operation.js'
|
|
17
|
+
export { Query } from './query.js'
|
|
18
|
+
export { Receiver } from './receiver.js'
|
|
19
|
+
export { Reflection } from './reflection.js'
|
|
20
|
+
export { Remote } from './remote.js'
|
|
21
|
+
export { State } from './state.js'
|
|
22
|
+
export { Transition } from './transition.js'
|
|
23
|
+
export { Transmission } from './transmission.js'
|
|
24
|
+
export { Unmanaged } from './unmanaged.js'
|
|
25
|
+
export { Guard } from './guard.js'
|
|
26
|
+
export * as entities from './entities/index.js'
|
|
27
|
+
export * as exceptions from './exceptions.js'
|
|
28
|
+
export * as contract from './contract/index.js'
|
package/src/locator.js
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const { concat } = require('@toa.io/generic')
|
|
1
|
+
import { concat } from '@toa.io/generic'
|
|
4
2
|
|
|
5
3
|
/**
|
|
6
4
|
* @implements {toa.core.Locator}
|
|
7
5
|
*/
|
|
8
|
-
class Locator {
|
|
6
|
+
export class Locator {
|
|
9
7
|
name
|
|
10
8
|
namespace
|
|
11
9
|
|
|
@@ -50,5 +48,3 @@ class Locator {
|
|
|
50
48
|
}
|
|
51
49
|
|
|
52
50
|
const DOT = '.'
|
|
53
|
-
|
|
54
|
-
exports.Locator = Locator
|
package/src/observation.js
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
import { Operation } from './operation.js'
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
class Observation extends Operation {
|
|
3
|
+
export class Observation extends Operation {
|
|
6
4
|
async run (store) {
|
|
7
5
|
if (store.scope === null || (store.scope?.deleted === true && store.request.query?.options?.deleted !== true)) store.reply = null
|
|
8
6
|
else await super.run(store)
|
|
9
7
|
}
|
|
10
8
|
}
|
|
11
|
-
|
|
12
|
-
exports.Observation = Observation
|
package/src/operation.js
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
import { Connector } from './connector.js'
|
|
2
|
+
import { SystemException, RequestContractException } from './exceptions.js'
|
|
3
|
+
import { Readable } from 'node:stream'
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
const { SystemException, RequestContractException } = require('./exceptions')
|
|
5
|
-
const { Readable } = require('node:stream')
|
|
6
|
-
|
|
7
|
-
class Operation extends Connector {
|
|
5
|
+
export class Operation extends Connector {
|
|
8
6
|
scope
|
|
9
7
|
|
|
10
8
|
/**
|
|
@@ -95,5 +93,3 @@ class Operation extends Connector {
|
|
|
95
93
|
return this.scope[this.#scope](query, this.mutable)
|
|
96
94
|
}
|
|
97
95
|
}
|
|
98
|
-
|
|
99
|
-
exports.Operation = Operation
|
package/src/outbox/index.js
CHANGED
package/src/outbox/outbox.js
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const { Connector } = require('../connector')
|
|
5
|
-
const { newid } = require('../entities/newid')
|
|
1
|
+
import { console } from 'openspan'
|
|
2
|
+
import { Connector } from '../connector.js'
|
|
3
|
+
import { newid } from '../entities/newid.js'
|
|
6
4
|
|
|
7
5
|
/**
|
|
8
6
|
* Owns the intent to publish. A row is built before the write so that the storage can commit
|
|
@@ -15,7 +13,7 @@ const { newid } = require('../entities/newid')
|
|
|
15
13
|
* A storage that cannot commit a row atomically has no outbox, and this degrades to the
|
|
16
14
|
* inline emission it replaces.
|
|
17
15
|
*/
|
|
18
|
-
class Outbox extends Connector {
|
|
16
|
+
export class Outbox extends Connector {
|
|
19
17
|
#emission
|
|
20
18
|
#storage
|
|
21
19
|
#atom
|
|
@@ -278,7 +276,7 @@ const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms).unref())
|
|
|
278
276
|
* lanes nobody reads any more. It is also the ceiling on replicas of one component, and a
|
|
279
277
|
* power of two so that the common replica counts divide evenly.
|
|
280
278
|
*/
|
|
281
|
-
const LANES = 128
|
|
279
|
+
export const LANES = 128
|
|
282
280
|
|
|
283
281
|
/** one cycle reads, publishes and marks; in steady state it finds nothing to read */
|
|
284
282
|
const INTERVAL = 5000
|
|
@@ -296,6 +294,3 @@ const BATCH = 200
|
|
|
296
294
|
const DRAIN = 10_000
|
|
297
295
|
const INFLIGHT = 1000
|
|
298
296
|
const PUBLISHED = 10_000
|
|
299
|
-
|
|
300
|
-
exports.Outbox = Outbox
|
|
301
|
-
exports.LANES = LANES
|
package/src/query/criteria.js
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
import { parse } from '@rsql/parser'
|
|
2
|
+
import { QuerySyntaxException } from '../exceptions.js'
|
|
2
3
|
|
|
3
|
-
const
|
|
4
|
-
const { QuerySyntaxException } = require('../exceptions')
|
|
5
|
-
|
|
6
|
-
const criteria = (criteria, properties) => {
|
|
4
|
+
export const criteria = (criteria, properties) => {
|
|
7
5
|
let ast
|
|
8
6
|
|
|
9
7
|
try {
|
|
@@ -37,5 +35,3 @@ const COERCE = {
|
|
|
37
35
|
integer: Number.parseInt,
|
|
38
36
|
boolean: (value) => value === 'true'
|
|
39
37
|
}
|
|
40
|
-
|
|
41
|
-
exports.criteria = criteria
|
package/src/query/options.js
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
import { QuerySyntaxException } from '../exceptions.js'
|
|
2
2
|
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
const options = (options, properties, system) => {
|
|
3
|
+
export const options = (options, properties, system) => {
|
|
6
4
|
if (options.sort !== undefined) options.sort = sort(options.sort, properties)
|
|
7
5
|
|
|
8
6
|
if (options.projection !== undefined) projection(options.projection, properties)
|
|
@@ -37,5 +35,3 @@ const projection = (projection, properties) => {
|
|
|
37
35
|
if (!projection.includes(property))
|
|
38
36
|
projection.push(property)
|
|
39
37
|
}
|
|
40
|
-
|
|
41
|
-
exports.options = options
|
package/src/query.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
import { empty } from '@toa.io/generic'
|
|
2
|
+
import * as criteria from './query/criteria.js'
|
|
3
|
+
import * as options from './query/options.js'
|
|
2
4
|
|
|
3
|
-
const {
|
|
4
|
-
const parse = { ...require('./query/criteria'), ...require('./query/options') }
|
|
5
|
+
const parse = { ...criteria, ...options }
|
|
5
6
|
|
|
6
|
-
class Query {
|
|
7
|
+
export class Query {
|
|
7
8
|
#properties
|
|
8
9
|
#system
|
|
9
10
|
|
|
@@ -67,5 +68,3 @@ class Query {
|
|
|
67
68
|
}
|
|
68
69
|
|
|
69
70
|
const LIMIT = 1024
|
|
70
|
-
|
|
71
|
-
exports.Query = Query
|
package/src/receiver.js
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const { add } = require('@toa.io/generic')
|
|
5
|
-
const { Connector } = require('./connector')
|
|
1
|
+
import { console, decode, run } from 'openspan'
|
|
2
|
+
import { add } from '@toa.io/generic'
|
|
3
|
+
import { Connector } from './connector.js'
|
|
6
4
|
|
|
7
5
|
/**
|
|
8
6
|
* @implements {toa.core.Receiver}
|
|
9
7
|
*/
|
|
10
|
-
class Receiver extends Connector {
|
|
8
|
+
export class Receiver extends Connector {
|
|
11
9
|
/** @type {boolean} */
|
|
12
10
|
#conditioned
|
|
13
11
|
|
|
@@ -123,5 +121,3 @@ class Receiver extends Connector {
|
|
|
123
121
|
return this.#adaptive ? await this.#bridge.request(payload, ...(this.#arguments ?? [])) : { input: payload }
|
|
124
122
|
}
|
|
125
123
|
}
|
|
126
|
-
|
|
127
|
-
exports.Receiver = Receiver
|
package/src/reflection.js
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const { Connector } = require('./connector')
|
|
1
|
+
import { Connector } from './connector.js'
|
|
4
2
|
|
|
5
3
|
/**
|
|
6
4
|
* @implements {toa.core.Reflection}
|
|
7
5
|
*/
|
|
8
|
-
class Reflection extends Connector {
|
|
6
|
+
export class Reflection extends Connector {
|
|
9
7
|
/** @type {toa.core.reflection.Source} */
|
|
10
8
|
#source
|
|
11
9
|
|
|
@@ -24,5 +22,3 @@ class Reflection extends Connector {
|
|
|
24
22
|
this.value = await this.#source()
|
|
25
23
|
}
|
|
26
24
|
}
|
|
27
|
-
|
|
28
|
-
exports.Reflection = Reflection
|
package/src/remote.js
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
import assert from 'node:assert'
|
|
2
|
+
import { Component } from './component.js'
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
const { Component } = require('./component')
|
|
5
|
-
|
|
6
|
-
class Remote extends Component {
|
|
4
|
+
export class Remote extends Component {
|
|
7
5
|
kind = 'client'
|
|
8
6
|
|
|
9
7
|
explain (endpoint) {
|
|
@@ -14,5 +12,3 @@ class Remote extends Component {
|
|
|
14
12
|
return this.operations[endpoint].explain()
|
|
15
13
|
}
|
|
16
14
|
}
|
|
17
|
-
|
|
18
|
-
exports.Remote = Remote
|
package/src/state.js
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
import { StatePreconditionException, StateNotFoundException } from './exceptions.js'
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
class State {
|
|
3
|
+
export class State {
|
|
6
4
|
storage
|
|
7
5
|
|
|
8
6
|
#associated
|
|
@@ -138,5 +136,3 @@ class State {
|
|
|
138
136
|
|
|
139
137
|
/** an effect never commits what `ensure` hands it, see `Effect` */
|
|
140
138
|
const NOT_MUTABLE = false
|
|
141
|
-
|
|
142
|
-
exports.State = State
|
package/src/transition.js
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
import { retry } from '@toa.io/generic'
|
|
2
|
+
import { Operation } from './operation.js'
|
|
3
|
+
import { StateConcurrencyException, StateNotFoundException } from './exceptions.js'
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
const { Operation } = require('./operation')
|
|
5
|
-
const { StateConcurrencyException, StateNotFoundException } = require('./exceptions')
|
|
6
|
-
|
|
7
|
-
class Transition extends Operation {
|
|
5
|
+
export class Transition extends Operation {
|
|
8
6
|
/** a transition is the only operation that commits */
|
|
9
7
|
mutable = true
|
|
10
8
|
|
|
@@ -61,5 +59,3 @@ const RETRY = {
|
|
|
61
59
|
dispersion: 1,
|
|
62
60
|
retries: 32
|
|
63
61
|
}
|
|
64
|
-
|
|
65
|
-
exports.Transition = Transition
|
package/src/transmission.js
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
import { Connector } from './connector.js'
|
|
2
|
+
import { TransmissionException } from './exceptions.js'
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
const { TransmissionException } = require('./exceptions')
|
|
5
|
-
|
|
6
|
-
class Transmission extends Connector {
|
|
4
|
+
export class Transmission extends Connector {
|
|
7
5
|
#bindings
|
|
8
6
|
|
|
9
7
|
constructor (bindings) {
|
|
@@ -38,5 +36,3 @@ class Transmission extends Connector {
|
|
|
38
36
|
return reply
|
|
39
37
|
}
|
|
40
38
|
}
|
|
41
|
-
|
|
42
|
-
exports.Transmission = Transmission
|
package/src/unmanaged.js
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
import { Operation } from './operation.js'
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
class Unmanaged extends Operation {
|
|
3
|
+
export class Unmanaged extends Operation {
|
|
6
4
|
acquire (context) {
|
|
7
5
|
context.state = this.scope.storage.raw
|
|
8
6
|
}
|
|
9
7
|
}
|
|
10
|
-
|
|
11
|
-
exports.Unmanaged = Unmanaged
|
package/test/call.fixtures.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
|
|
1
|
+
import { mock } from 'node:test'
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
import { generate } from 'randomstring'
|
|
4
4
|
|
|
5
5
|
// noinspection JSCheckFunctionSignatures
|
|
6
|
-
const transmission = {
|
|
7
|
-
request:
|
|
8
|
-
link:
|
|
6
|
+
export const transmission = {
|
|
7
|
+
request: mock.fn((request) => ({ [request.invalid ? 'exception' : 'output']: generate() })),
|
|
8
|
+
link: mock.fn()
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
const contract = {
|
|
12
|
-
fit:
|
|
11
|
+
export const contract = {
|
|
12
|
+
fit: mock.fn(() => null)
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
const request = () => ({
|
|
15
|
+
export const request = () => ({
|
|
16
16
|
ok: {
|
|
17
17
|
input: { [generate()]: generate() },
|
|
18
18
|
query: { [generate()]: generate() }
|
|
@@ -21,7 +21,3 @@ const request = () => ({
|
|
|
21
21
|
invalid: true
|
|
22
22
|
}
|
|
23
23
|
})
|
|
24
|
-
|
|
25
|
-
exports.transmission = transmission
|
|
26
|
-
exports.contract = contract
|
|
27
|
-
exports.request = request
|
package/test/call.test.js
CHANGED
|
@@ -1,18 +1,20 @@
|
|
|
1
|
-
|
|
1
|
+
import { it, beforeEach, mock } from 'node:test'
|
|
2
|
+
import assert from 'node:assert/strict'
|
|
3
|
+
import { isDeepStrictEqual } from 'node:util'
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
+
import * as fixtures from './call.fixtures.js'
|
|
6
|
+
import { Call } from '../src/call.js'
|
|
5
7
|
|
|
6
8
|
let call
|
|
7
9
|
|
|
8
10
|
beforeEach(() => {
|
|
9
|
-
|
|
11
|
+
resetCalls()
|
|
10
12
|
|
|
11
13
|
call = new Call(fixtures.transmission, fixtures.contract)
|
|
12
14
|
})
|
|
13
15
|
|
|
14
16
|
it('should depend on transmission', () => {
|
|
15
|
-
|
|
17
|
+
assert.ok(((invocation) => invocation.arguments.length === 1 && isDeepStrictEqual(invocation.arguments[0], call))(fixtures.transmission.link.mock.calls.at(-1) ?? { arguments: [] }))
|
|
16
18
|
})
|
|
17
19
|
|
|
18
20
|
it('should call transmission', async () => {
|
|
@@ -20,7 +22,7 @@ it('should call transmission', async () => {
|
|
|
20
22
|
|
|
21
23
|
await call.invoke(request)
|
|
22
24
|
|
|
23
|
-
|
|
25
|
+
assert.ok(fixtures.transmission.request.mock.calls.some((invocation) => invocation.arguments.length === 1 && isDeepStrictEqual(invocation.arguments[0], request)))
|
|
24
26
|
})
|
|
25
27
|
|
|
26
28
|
it('should fit request', async () => {
|
|
@@ -28,7 +30,7 @@ it('should fit request', async () => {
|
|
|
28
30
|
|
|
29
31
|
await call.invoke(request)
|
|
30
32
|
|
|
31
|
-
|
|
33
|
+
assert.ok(((invocation) => invocation.arguments.length === 1 && isDeepStrictEqual(invocation.arguments[0], request))(fixtures.contract.fit.mock.calls.at(-1) ?? { arguments: [] }))
|
|
32
34
|
})
|
|
33
35
|
|
|
34
36
|
it('should return reply', async () => {
|
|
@@ -36,11 +38,21 @@ it('should return reply', async () => {
|
|
|
36
38
|
|
|
37
39
|
const reply = await call.invoke(request)
|
|
38
40
|
|
|
39
|
-
|
|
41
|
+
assert.deepStrictEqual(reply, fixtures.transmission.request.mock.calls[0].result.output)
|
|
40
42
|
})
|
|
41
43
|
|
|
42
44
|
it('should throw received exceptions', async () => {
|
|
43
45
|
const request = fixtures.request().bad
|
|
44
46
|
|
|
45
|
-
await
|
|
47
|
+
await assert.rejects(call.invoke(request), (error) => { assert.notStrictEqual(error, undefined); return true })
|
|
46
48
|
})
|
|
49
|
+
|
|
50
|
+
function resetCalls (target = [assert, fixtures], seen = new Set()) {
|
|
51
|
+
if (target === null || typeof target !== 'object' || seen.has(target)) return
|
|
52
|
+
|
|
53
|
+
seen.add(target)
|
|
54
|
+
|
|
55
|
+
for (const value of Object.values(target))
|
|
56
|
+
if (typeof value === 'function' && value.mock !== undefined) value.mock.resetCalls()
|
|
57
|
+
else resetCalls(value, seen)
|
|
58
|
+
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
import { mock } from 'node:test'
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
import randomstring from 'randomstring'
|
|
4
4
|
|
|
5
|
-
const invocation = () =>
|
|
5
|
+
const invocation = () => mock.fn(() => randomstring.generate())
|
|
6
6
|
|
|
7
|
-
const invocations = {
|
|
7
|
+
export const invocations = {
|
|
8
8
|
foo: {
|
|
9
9
|
invoke: invocation('foo'),
|
|
10
10
|
link: () => null
|
|
@@ -15,7 +15,4 @@ const invocations = {
|
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
const locator = {}
|
|
19
|
-
|
|
20
|
-
exports.invocations = invocations
|
|
21
|
-
exports.locator = locator
|
|
18
|
+
export const locator = {}
|
package/test/component.test.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
import { describe, it, beforeEach, mock } from 'node:test'
|
|
2
|
+
import assert from 'node:assert/strict'
|
|
3
|
+
import { isDeepStrictEqual } from 'node:util'
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
import { Component } from '../src/component.js'
|
|
6
|
+
import { codes } from '../src/exceptions.js'
|
|
7
|
+
import * as fixtures from './component.fixtures.js'
|
|
8
|
+
import { AssertionError } from 'node:assert'
|
|
7
9
|
|
|
8
10
|
describe('Invocations', () => {
|
|
9
11
|
const name = ['foo', 'bar'][Math.floor(2 * Math.random())]
|
|
@@ -11,18 +13,17 @@ describe('Invocations', () => {
|
|
|
11
13
|
const component = new Component(fixtures.locator, fixtures.invocations)
|
|
12
14
|
|
|
13
15
|
beforeEach(() => {
|
|
14
|
-
|
|
16
|
+
resetCalls()
|
|
15
17
|
})
|
|
16
18
|
|
|
17
19
|
it('should invoke', async () => {
|
|
18
20
|
await component.invoke(name)
|
|
19
21
|
|
|
20
|
-
|
|
22
|
+
assert.ok(invocation.invoke.mock.callCount() > 0)
|
|
21
23
|
})
|
|
22
24
|
|
|
23
25
|
it('should throw on unknown invocation name', async () => {
|
|
24
|
-
await
|
|
25
|
-
.rejects.toThrow(AssertionError)
|
|
26
|
+
await assert.rejects(() => component.invoke('baz'), AssertionError)
|
|
26
27
|
})
|
|
27
28
|
|
|
28
29
|
it('should invoke input and query', async () => {
|
|
@@ -30,12 +31,22 @@ describe('Invocations', () => {
|
|
|
30
31
|
const query = { test: Math.random() }
|
|
31
32
|
await component.invoke(name, { input, query })
|
|
32
33
|
|
|
33
|
-
|
|
34
|
+
assert.ok(invocation.invoke.mock.calls.some((call) => call.arguments.length === 1 && isDeepStrictEqual(call.arguments[0], { input, query })))
|
|
34
35
|
})
|
|
35
36
|
|
|
36
37
|
it('should return io', async () => {
|
|
37
38
|
const io = await component.invoke(name)
|
|
38
39
|
|
|
39
|
-
|
|
40
|
+
assert.strictEqual(io, fixtures.invocations[name].invoke.mock.calls[0].result)
|
|
40
41
|
})
|
|
41
42
|
})
|
|
43
|
+
|
|
44
|
+
function resetCalls (target = [assert, fixtures], seen = new Set()) {
|
|
45
|
+
if (target === null || typeof target !== 'object' || seen.has(target)) return
|
|
46
|
+
|
|
47
|
+
seen.add(target)
|
|
48
|
+
|
|
49
|
+
for (const value of Object.values(target))
|
|
50
|
+
if (typeof value === 'function' && value.mock !== undefined) value.mock.resetCalls()
|
|
51
|
+
else resetCalls(value, seen)
|
|
52
|
+
}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
import { random, timeout } from '@toa.io/generic'
|
|
2
|
+
import { Connector } from '../src/connector.js'
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
const { Connector } = require('../src/connector')
|
|
5
|
-
|
|
6
|
-
class TestConnector extends Connector {
|
|
4
|
+
export class TestConnector extends Connector {
|
|
7
5
|
#label
|
|
8
6
|
#seq
|
|
9
7
|
|
|
@@ -29,7 +27,7 @@ class TestConnector extends Connector {
|
|
|
29
27
|
}
|
|
30
28
|
}
|
|
31
29
|
|
|
32
|
-
class FailingConnector extends Connector {
|
|
30
|
+
export class FailingConnector extends Connector {
|
|
33
31
|
async open () {
|
|
34
32
|
await timeout(random(10))
|
|
35
33
|
throw new Error('FailingConnector')
|
|
@@ -37,12 +35,8 @@ class FailingConnector extends Connector {
|
|
|
37
35
|
}
|
|
38
36
|
|
|
39
37
|
/** Stands for a connector waiting for something that never arrives. */
|
|
40
|
-
class StuckConnector extends Connector {
|
|
38
|
+
export class StuckConnector extends Connector {
|
|
41
39
|
async open () {
|
|
42
40
|
return new Promise(() => undefined)
|
|
43
41
|
}
|
|
44
42
|
}
|
|
45
|
-
|
|
46
|
-
exports.TestConnector = TestConnector
|
|
47
|
-
exports.FailingConnector = FailingConnector
|
|
48
|
-
exports.StuckConnector = StuckConnector
|