Dmitriy Ryajov
827a8caba6
wip: modeling floodsub
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
bb648c87e1
wip: modeling secio
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
525646dcc1
handle secure managers correctly
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
fc36de21c1
handle exceptions correctly
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
2febd47e0d
don't complete futures twise
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
d27ea5d228
whip initial secio
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
435c69633f
adding chronicles logging
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
5bc8e7e7b1
remap exceptions
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
116051208a
make patterns runtime only
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
93a9fd203a
fix: multistream tests
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
e31966b6f8
fix: switch, with identify and mplex
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
701e048ee6
add debug logging
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
54d740949e
debug logging
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
0c416e757e
make gcsafe
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
ddd266f584
small helper to aid in debugging
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
b5dcfa9bc4
first attempt to proper channel cleanup
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
65ce1a93fc
prevent interleaved channel data
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
8c76799d9e
make writes sequential
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
e53c87e197
reworked to make msg reading sequential
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
c7fd08e002
use sane defaults
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
e5b782f094
mplex testing/interop
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
100f6220b3
dont clash with MultiCodec
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
6086038b01
raise correct LP exception on incomplete data
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
ba843f4091
wip: interop testing
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
13ca6d253d
fix: multistream tests
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
962f58b436
avoid wrapping in several futures
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
13837619ed
plaintext security
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
8338a16aab
testing mplex
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
b7f999d316
fixing several issues found while testing
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
dee46c4d37
remove unneded var
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
14d9150bbb
moving modules to apropriate directories
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
2f402d68e1
docs/wording
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
60245a065d
fix: don't call conn handler on dials
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
0f52a6e798
fix: switch and tests
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
6f8de062bb
fix: multistream
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
5237fc8b12
test multiple streams with mplex
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
746987156d
reworked switch
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
0b784c5b58
don't pass stream handler through contructor
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
3cd19ddc47
change root object from ref to obj
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
f8a942ed67
make peerinfo an optional type
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
9889bd9cbf
return proto string from select, instead of bool
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
cc595f7947
allow selecting one of many protos in identify
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
a7e5fde6f7
check identify request against known pubkey
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
ec351cc2b0
misc: cleanup mplex
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
6ce2782e5c
add missing test
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
80c68206f7
documentation
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
9b485b3082
feat: half closed channels
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
6058a3fc69
split mplex
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
1b02c5e4e4
don't block main loop
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
36917c5adc
disable switch tests temporarily
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
a0aaa29739
wip: mplex and mplex tests
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
cc26d4e040
prevent already closed errors
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
8549ce76bb
add init proc to bufferedstream
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
917e0553e1
fix: tests and docs
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
96cd7bcf50
wip: mplex tests
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
b26d1ac23a
cosmetic
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
93bd7f623c
remove generic constructor
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
9bc7043f48
export read size const
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
cae4910427
add custom new proc
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
40e75a7635
remove useless methods
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
4edd2c9f8a
mplex move everything to one file
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
ad1eaffdd6
make writeHandler async
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
d63e0c003b
add proper pragmas
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
5177bbb492
fix: return on read error
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
2c3c23c7c6
documentation
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
f3cc6fbef0
use correct names
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
7bd1e04d6f
wip: modeling mplex
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
7f0627378c
misc
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
fceea14aa5
adding bufferred stream
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
cbf0f4f186
move streams to own dir
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
ef7a0b41e4
add switch tests to native
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
0f3d024c0a
avoid unnecesary temps
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
18b9765525
fix: cleaning up based on jangko review
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
db1aad3df0
adding switch e2e test
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
79129ea6d1
`handles` should be called on concrete transport
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
3df92e0d67
wip: switch
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
152c1e3c14
close connections asyncronously
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
022a248ca3
reworked protocol
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
3d74a4c82a
add base upgrade method
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
71282fa442
make matcher func gcsafe
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
1cef1b803b
don't await twise
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
e2b04fc30d
add gcsafe pragma
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
ca4ccbe37f
don't use method as handler in protocol base
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
e7c3412d69
expose private and public keys
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
e5be1fcaee
wip: switch
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
5eced0abee
rename multistream
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
aa2dfababd
wip: identify
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
682fecc395
make things public
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
054bd365af
protocol handler method should receive context
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
b85d616a13
call the handler with the protocol context
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
a9c9788356
we don't need the switch in the protos after all
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
a7709b8afc
use gcsafe in closures
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
b56b005ab7
make object instead of ref
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
2d2c3ba977
identify message protobuf encode/decode
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
e77ebc2e5a
pretty
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
954a78fda0
remove useless error pragma
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
261204853e
rename readwrite to stream
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
f56d925f6f
rename supports to handles
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
e486b5e40c
make fields privae
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
90d9dcbce9
wip: identify and switch
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
ec86afebe0
modeling the switch
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
3d7f657ce8
rename readerwriter to stream
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
d23398f498
nimpretty
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
187645013f
fix: ls and other minor issues
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
139b8a752b
correctly close stream
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
47b6b89fc5
fix: call on reader
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
77aa11f0f3
removing bins
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
8a52cfa9b0
use consistent dispatcher object name
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
64e92eb9da
adding `na` test/functionality
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
6e5641dc48
add closed flag
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
f24c866a30
use loop on closed flag
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
402067ceae
await for void features and add closed flag
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
e13f42f9bb
wip: initial multistream handler implementation
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
307c76e139
feat: implemented select
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
f23106029f
feat: added length prefixed read/write methods
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
cb4ff262b0
wip: multistreamselect
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
7d647c1555
remove error pragma
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
368176f8d1
remote templated write
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
5d07145a0a
feat: added stream abstraction and chronos wrapper
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
5f8e633c0f
feat: use error pragma to signal abstract methods
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
a91c15c47a
feat: adding dial/listen test with transports on both ends
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
c15a9bdd67
feat: adding dial tests
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
c8546583e6
feat: tcp transport listen
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
47106a6a7d
wip: adding test
2019-10-11 08:15:24 +09:00
Dmitriy Ryajov
5b7e8d99bd
initial commit for native libp2p implementation
2019-10-11 08:15:24 +09:00
cheatfate
fb9d2d7d05
Add MultiAddress.init(TransportAddress).
2019-10-10 07:16:02 +03:00
Yuriy Glukhov
1ecdf159bb
Extern bearssl
2019-10-08 14:41:24 +03:00
Zahary Karadjov
1018bffb3f
Add gcsafe markers to make Nim 1.0 happy
2019-09-29 22:17:10 +03:00
cheatfate
41e1479213
Add rust's TwofishCTR support.
2019-09-13 09:52:13 +03:00
cheatfate
54f9a5be7c
Fix getOrder() bug.
2019-09-12 23:11:50 +03:00
cheatfate
7138f7e94d
Add more primitives for SecIO.
...
Fix SIGSEGV inside of rsa.nim and ecnist.nim.
2019-09-11 19:03:39 +03:00
cheatfate
f2b10776db
Add utility procedures for SECIO.
...
Add 2 more length encodings for protobuf.
2019-09-09 19:57:17 +03:00
cheatfate
c584583678
Fix compilation error for Nim devel.
2019-09-03 16:22:55 +03:00
cheatfate
40ad427ea0
Fix mistype.
2019-09-02 21:59:32 +03:00
cheatfate
968e635746
Add secp256k1 curve support and tests for it.
2019-09-02 21:55:42 +03:00
cheatfate
15a7136ad1
Add more supported `go-libp2p-daemon` flags to DaemonAPI.
2019-08-28 09:19:16 +03:00
cheatfate
53fb5924ea
Fix daemonapi flags in startProcess.
2019-08-25 13:53:41 +03:00
cheatfate
0bbd87b536
Fix bug in daemonapi length decoding message.
2019-08-25 10:09:54 +03:00
cheatfate
78f6afb544
Change default logging level to Debug.
2019-08-22 13:29:54 +03:00
cheatfate
c5925d0d9a
Fix appveyor problems.
2019-08-22 13:01:28 +03:00
cheatfate
236c685fb7
Attempt #4 to fix Appveyor CI freeze.
2019-08-22 09:17:49 +03:00
cheatfate
708dcbd1a1
Attempt #3 to fix Appveyor CI freeze.
2019-08-22 09:09:44 +03:00
cheatfate
5a45944489
Attempt #2 to fix Appveyor CI freeze.
2019-08-22 08:56:36 +03:00
cheatfate
2ab6b2c3ca
Fix #17 .
...
Add go-libp2p-daemon logging to file.
Fix mistypes in tests.
Fix issues with connection to dedicated go-libp2p2-daemon.
2019-08-22 00:42:44 +03:00
cheatfate
dfd824bd03
Fix #22 .
...
Fix wire.initTAddress(MultiAddress).
Add Windows support to daemonapi.
Add CI tests for daemonapi on Windows.
Fix Linux CI tests to install latest daemon.
2019-08-01 08:56:59 +03:00
cheatfate
bf7a7f9b73
Fix #23 .
2019-06-25 11:27:38 +03:00
Zahary Karadjov
3493b9ff7f
Cosmetic changes requested by cheatfate
2019-06-24 05:39:13 +03:00
Zahary Karadjov
dbcc6ce78b
Add support for specifying the listening address of the Daemon
2019-06-24 05:39:13 +03:00
Zahary Karadjov
d5b51bcf9e
Use CatchableError
2019-06-24 05:39:13 +03:00
cheatfate
774f5c8232
Proper fix for #18 .
2019-06-13 12:05:03 +03:00
cheatfate
d685147c52
Move ipnet/iface functionality to nim-chronos.
...
Adjust tests.
2019-04-15 11:16:54 +03:00
cheatfate
ab8b87be9a
Fix deprecation warnings.
2019-03-31 01:32:04 +02:00
cheatfate
f8dc3abe36
Add MultiAddress pattern matching procedures (go-multiaddr-fmt) with tests.
...
Add some comments.
2019-03-20 11:41:37 +02:00
cheatfate
4fa5ee3c93
Move iface.nim and ipnet.nim to proper place.
2019-03-18 10:47:54 +02:00
cheatfate
44d0cc2dea
Fix undefined reference to `br_ec_c25519_m31'.
2019-03-16 00:56:10 +02:00
cheatfate
80ec410118
Fix compilation error.
2019-03-16 00:47:04 +02:00
Ștefan Talpalaru
eed7ce92c1
Merge branch 'master' of github.com:status-im/nim-libp2p
2019-03-14 03:56:55 +01:00
Ștefan Talpalaru
7cbb89c7e4
assert() -> doAssert()
...
and refactored the "test" task in libp2p.nimble
2019-03-14 03:55:47 +01:00
Zahary Karadjov
d21953e458
Add a userdata field to the DaemonAPI to support attaching application data
2019-03-11 13:07:19 +02:00
cheatfate
dc2d0538ff
Fix import bugs.
...
Add PublicKey and Signature types to daemonapi.
Add more tests for crypto.nim
2019-03-06 13:23:12 +02:00
cheatfate
39129d0ec1
Add base64 and tests for it.
...
Adopt multibase to be able to use base64.
Fix base32 typos.
2019-03-06 02:36:09 +02:00
cheatfate
d7a7f8102d
Change PeerID type from distinct type.
...
Fix MultiAddress compilation error.
Fix chat example.
2019-03-05 22:28:46 +02:00
cheatfate
a96718cf9e
Add PeerID support to multiaddress.
...
Change some PeerID api.
Some fixes to chat.
2019-03-05 14:09:26 +02:00
cheatfate
215c6c4257
Add SHA-1 support to multihash.nim, enabled tests for it.
2019-03-05 11:49:59 +02:00
cheatfate
68f3f506f3
Fix multihash dependency.
2019-03-05 02:04:45 +02:00
cheatfate
046c693e3a
Merge branch 'master' of github.com:status-im/nim-libp2p into peer
2019-03-05 01:57:33 +02:00
cheatfate
d7d9d7bd40
Fix daemonapi and examples.
2019-03-05 01:57:18 +02:00
Zahary Karadjov
db64bd100e
Bugfix: Protobuf length prefix was assumed to be 1 byte
...
The error in the code was that the `vsizeof(n)` was called
with a dummy zeroed variable, instead of the proper size of
the buffer. This resulted in an assertion failure when the
prefix length needs to be stored in more than 1 byte.
2019-03-04 20:26:46 +02:00
cheatfate
1e6c8b2171
Fix examples.
...
Add peer.nim.
Switch daemonapi to use PeerID from peer.nim.
2019-03-04 20:22:38 +02:00
cheatfate
b235c84bb2
Add key interface with test vectors.
2019-03-02 21:19:41 +02:00
cheatfate
14686714c0
Add raw init functions for ecnist.nim
...
Add ECDHE helpers for ecnist.nim
Add test vectors for ECDHE.
2019-03-01 08:34:52 +02:00
cheatfate
411d9f0b9c
Fix protobuf's do not check error value.
2019-02-28 22:29:03 +02:00
cheatfate
5e6d740ee7
Cleanup.
2019-02-28 18:17:24 +02:00
cheatfate
2a2e378ced
Fix checkScalar in ecnist.
...
Add ed25519 and tests.
Add some comments.
2019-02-28 14:17:39 +02:00
cheatfate
cb334cc8ab
Fix inline documentation.
2019-02-25 20:03:52 +02:00
cheatfate
887795bbd2
Final RSA changes.
...
Add RSA tests and test vectors.
2019-02-24 02:07:13 +02:00
cheatfate
1aaf4797c9
Finish EC NIST curves implementation.
...
Add EC NIST curves tests and test vectors.
2019-02-22 13:32:15 +02:00
cheatfate
f67a7a2a3e
Add minimal ASN.1 encoding/decoding primitives.
...
Add ASN.1 DER serialization for EC NIST curves.
2019-02-21 06:10:21 +02:00
cheatfate
467d8e1db6
Add BearSSL submodule
...
Fix common.nim path to BearSSL submodule.
2019-02-20 00:24:43 +02:00
cheatfate
52f88dbd1e
Initial commit, not ready yet.
2019-02-20 00:11:59 +02:00
cheatfate
f37c6b1fe1
Last rename of asyncdispatch2 -> chronos.
2019-02-14 03:38:21 +02:00
cheatfate
ab274f0bdc
Rename asyncdispatch2 -> chronos.
2019-02-14 03:15:48 +02:00
cheatfate
7593d4d970
Fix unix path multiaddress serialization/deserialization.
...
Add tests for unix path multiaddress.
Add wire.nim.
Fix latest breaking changes from go-libp2p-daemon.
2019-01-09 19:12:15 +02:00
cheatfate
7e2d3e213f
Add isWire() procedure for MultiAddress.
2018-12-29 14:44:27 +02:00
cheatfate
e9785bb509
Make unix socket name generation more reliable (depending on process id).
...
Add examples of bootstrap node and gossipsub node.
2018-12-18 16:31:58 +02:00
cheatfate
79fbd74acd
Remove debug echo.
2018-12-18 05:19:11 +02:00
cheatfate
4ba727b768
Add NAT-PMP support.
2018-12-17 22:39:25 +02:00
cheatfate
bf2737525d
Fix cid with proper CIDv1 code.
...
Fix daemonapi to use proper Cid type.
Make daemonapi cid test more complex.
2018-12-16 15:51:12 +02:00
cheatfate
d96756f6e3
Add missed file.
2018-12-16 04:55:20 +02:00
cheatfate
38f82df582
Add write() and encode() procedures.
2018-12-16 04:54:07 +02:00
cheatfate
8b00514dd7
Fix compilation error.
2018-12-14 12:28:22 +02:00
cheatfate
a7c54c76fb
Add write(vbuffer, entity) procedure.
...
Add validate(openarray[byte])/
2018-12-14 11:49:55 +02:00
cheatfate
0b807e7ee5
Workaround for bug https://github.com/libp2p/go-libp2p-pubsub/issues/130 .
2018-12-13 11:17:02 +02:00
cheatfate
39deeca600
Fix for MacOS.
2018-12-12 16:52:29 +02:00
cheatfate
0eb649c990
Add logging `go-libp2p-daemon`.
...
Comment FloodSub test.
2018-12-12 16:08:55 +02:00
cheatfate
7d60e22782
MultiBase initial implementation with tests.
2018-12-12 03:52:42 +02:00
cheatfate
fc6902dda2
Add PeerInfo string representation procedure.
...
Use only IPv4 for pubsub tests.
2018-12-11 04:17:36 +02:00
cheatfate
01a268a440
Attempt to fix tests.
2018-12-10 22:55:06 +02:00
cheatfate
337c6c932c
Fix go-libp2p-daemon shutdown.
2018-12-10 12:38:12 +02:00
cheatfate
7e5f52afff
Fixes for pubsub methods and full tests for both methods.
2018-12-09 18:44:20 +02:00