@interopio/bridge 0.0.1-alpha → 0.0.4-beta.0
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/bin/bridge.js +1 -1
- package/changelog.md +24 -0
- package/dist/main.js +2201 -0
- package/dist/main.js.map +7 -0
- package/package.json +9 -6
- package/gen/instance/GeneratedBuildInfo.ts +0 -4
- package/src/cluster/Address.ts +0 -57
- package/src/cluster/Cluster.ts +0 -13
- package/src/cluster/Endpoint.ts +0 -5
- package/src/cluster/Member.ts +0 -9
- package/src/cluster/MembershipListener.ts +0 -6
- package/src/config/Config.ts +0 -100
- package/src/config/DiscoveryConfig.ts +0 -21
- package/src/config/Duration.ts +0 -168
- package/src/config/KubernetesConfig.ts +0 -7
- package/src/config/NamedDiscoveryConfig.ts +0 -17
- package/src/config/Properties.ts +0 -49
- package/src/config/index.ts +0 -1
- package/src/discovery/SimpleDiscoveryNode.ts +0 -14
- package/src/discovery/index.ts +0 -207
- package/src/discovery/multicast/MulticastDiscoveryStrategy.ts +0 -141
- package/src/discovery/multicast/MulticastDiscoveryStrategyFactory.ts +0 -30
- package/src/discovery/multicast/MulticastProperties.ts +0 -4
- package/src/discovery/settings.ts +0 -37
- package/src/error/RequestFailure.ts +0 -48
- package/src/gossip/ApplicationState.ts +0 -48
- package/src/gossip/EndpointState.ts +0 -141
- package/src/gossip/FailureDetector.ts +0 -235
- package/src/gossip/Gossiper.ts +0 -1133
- package/src/gossip/HeartbeatState.ts +0 -66
- package/src/gossip/Messenger.ts +0 -130
- package/src/gossip/VersionedValue.ts +0 -59
- package/src/index.ts +0 -3
- package/src/instance/AddressPicker.ts +0 -245
- package/src/instance/BridgeNode.ts +0 -141
- package/src/instance/ClusterTopologyIntentTracker.ts +0 -4
- package/src/io/VersionedSerializer.ts +0 -230
- package/src/io/util.ts +0 -117
- package/src/kubernetes/DnsEndpointResolver.ts +0 -70
- package/src/kubernetes/KubernetesApiEndpointResolver.ts +0 -111
- package/src/kubernetes/KubernetesApiProvider.ts +0 -75
- package/src/kubernetes/KubernetesClient.ts +0 -264
- package/src/kubernetes/KubernetesConfig.ts +0 -130
- package/src/kubernetes/KubernetesDiscoveryStrategy.ts +0 -30
- package/src/kubernetes/KubernetesDiscoveryStrategyFactory.ts +0 -71
- package/src/kubernetes/KubernetesEndpointResolver.ts +0 -43
- package/src/kubernetes/KubernetesProperties.ts +0 -22
- package/src/license/BridgeLicenseValidator.ts +0 -19
- package/src/license/LicenseValidator.ts +0 -114
- package/src/license/types.ts +0 -40
- package/src/logging.ts +0 -22
- package/src/main.mts +0 -53
- package/src/net/Action.ts +0 -143
- package/src/net/AddressSerializer.ts +0 -44
- package/src/net/ByteBufferAllocator.ts +0 -27
- package/src/net/FrameDecoder.ts +0 -314
- package/src/net/FrameEncoder.ts +0 -138
- package/src/net/HandshakeProtocol.ts +0 -143
- package/src/net/InboundConnection.ts +0 -108
- package/src/net/InboundConnectionInitiator.ts +0 -150
- package/src/net/InboundMessageHandler.ts +0 -377
- package/src/net/InboundSink.ts +0 -38
- package/src/net/Message.ts +0 -428
- package/src/net/OutboundConnection.ts +0 -1141
- package/src/net/OutboundConnectionInitiator.ts +0 -76
- package/src/net/RequestCallbacks.ts +0 -148
- package/src/net/ResponseHandler.ts +0 -30
- package/src/net/ShareableBytes.ts +0 -125
- package/src/net/internal/AsyncResourceExecutor.ts +0 -464
- package/src/net/internal/AsyncSocketPromise.ts +0 -37
- package/src/net/internal/channel/ChannelHandlerAdapter.ts +0 -99
- package/src/net/internal/channel/types.ts +0 -188
- package/src/utils/bigint.ts +0 -23
- package/src/utils/buffer.ts +0 -434
- package/src/utils/clock.ts +0 -148
- package/src/utils/collections.ts +0 -283
- package/src/utils/crc.ts +0 -39
- package/src/utils/internal/IpAddressUtil.ts +0 -161
- package/src/utils/memory/BufferPools.ts +0 -40
- package/src/utils/network.ts +0 -130
- package/src/utils/promise.ts +0 -38
- package/src/utils/uuid.ts +0 -5
- package/src/utils/vint.ts +0 -238
- package/src/version/MemberVersion.ts +0 -42
- package/src/version/Version.ts +0 -12
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
import type {Address} from '../../../cluster/Address.ts';
|
|
2
|
-
import {type EventExecutor, type EventExecutorGroup} from '../AsyncResourceExecutor.ts';
|
|
3
|
-
|
|
4
|
-
export interface SocketAddress {}
|
|
5
|
-
|
|
6
|
-
export type InetSocketAddress = SocketAddress & Address;
|
|
7
|
-
|
|
8
|
-
export interface ChannelOutboundInvoker {
|
|
9
|
-
bind(localAddress: SocketAddress): Promise<void>
|
|
10
|
-
connect(remoteAddress: SocketAddress, localAddress?: SocketAddress): Promise<void>
|
|
11
|
-
disconnect(): Promise<void>
|
|
12
|
-
close(error?: Error): Promise<void>
|
|
13
|
-
deregister(): Promise<void>
|
|
14
|
-
write(message: unknown): Promise<void>
|
|
15
|
-
flush(): this
|
|
16
|
-
writeAndFlush(message: unknown): Promise<void>
|
|
17
|
-
read(): this
|
|
18
|
-
newPromise(): ChannelPromise<void>
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
interface ChannelInboundInvoker {
|
|
22
|
-
fireChannelRegistered(): this;
|
|
23
|
-
fireChannelUnregistered(): this;
|
|
24
|
-
fireChannelActive(): this;
|
|
25
|
-
fireChannelInactive(): this;
|
|
26
|
-
fireErrorCaught(error: Error): this;
|
|
27
|
-
fireChannelRead(data: unknown): this;
|
|
28
|
-
fireChannelReadComplete(): this;
|
|
29
|
-
fireChannelWritabilityChanged(): this;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export interface EventLoopGroup extends EventExecutorGroup {
|
|
33
|
-
next(): EventLoop
|
|
34
|
-
register(channel: Channel): Promise<void>;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export interface EventLoop extends EventExecutor, EventLoopGroup {
|
|
38
|
-
next(): EventLoop
|
|
39
|
-
readonly ordered: true
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export interface ChannelConfig {
|
|
43
|
-
autoRead: boolean
|
|
44
|
-
messageSizeEstimator: MessageSizeEstimator
|
|
45
|
-
writeBufferHighWaterMark: number
|
|
46
|
-
writeBufferLowWaterMark: number
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export interface MessageSizeEstimator {
|
|
50
|
-
newHandle(): MessageSizeEstimatorHandle
|
|
51
|
-
}
|
|
52
|
-
export interface MessageSizeEstimatorHandle {
|
|
53
|
-
size(message: unknown): number
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export interface ChannelMetadata {
|
|
57
|
-
readonly hasDisconnect: boolean
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export interface Channel extends ChannelOutboundInvoker {
|
|
61
|
-
readonly id: string
|
|
62
|
-
readonly eventLoop: EventLoop
|
|
63
|
-
readonly parent?: Channel
|
|
64
|
-
readonly config: ChannelConfig
|
|
65
|
-
readonly metadata: ChannelMetadata
|
|
66
|
-
isOpen(): boolean
|
|
67
|
-
isRegistered(): boolean
|
|
68
|
-
readonly localAddress: SocketAddress
|
|
69
|
-
readonly remoteAddress: SocketAddress
|
|
70
|
-
readonly closePromise: Promise<void>
|
|
71
|
-
|
|
72
|
-
readonly unsafe: Unsafe
|
|
73
|
-
readonly pipeline: ChannelPipeline
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
export interface Unsafe {
|
|
77
|
-
|
|
78
|
-
readonly localAddress: SocketAddress
|
|
79
|
-
readonly remoteAddress: SocketAddress
|
|
80
|
-
register(eventLoop: EventLoop): Promise<void>
|
|
81
|
-
deregister(promise: ChannelPromise<void>): void
|
|
82
|
-
bind(localAddress: SocketAddress): Promise<void>
|
|
83
|
-
connect(remoteAddress: SocketAddress, localAddress: SocketAddress): Promise<void>
|
|
84
|
-
disconnect(promise: ChannelPromise<void>): void
|
|
85
|
-
close(error: Error): Promise<void>
|
|
86
|
-
closeForcibly(): void
|
|
87
|
-
beginRead(): void
|
|
88
|
-
write(message: unknown): Promise<void>
|
|
89
|
-
flush(): void
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
export interface ServerChannel extends Channel {}
|
|
93
|
-
|
|
94
|
-
export interface DuplexChannelConfig extends ChannelConfig {
|
|
95
|
-
allowHalfOpen: boolean
|
|
96
|
-
}
|
|
97
|
-
export interface DuplexChannel extends Channel {}
|
|
98
|
-
|
|
99
|
-
export interface ServerSocketChannelConfig extends ChannelConfig {
|
|
100
|
-
backlog: number
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
export interface ServerSocketChannel extends ServerChannel {
|
|
104
|
-
readonly config: ServerSocketChannelConfig
|
|
105
|
-
readonly localAddress: InetSocketAddress
|
|
106
|
-
readonly remoteAddress: InetSocketAddress
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
export interface SocketChannelConfig extends DuplexChannelConfig {
|
|
110
|
-
noDelay?: boolean
|
|
111
|
-
}
|
|
112
|
-
export interface SocketChannel extends DuplexChannel {
|
|
113
|
-
readonly parent: ServerSocketChannel
|
|
114
|
-
readonly localAddress: InetSocketAddress
|
|
115
|
-
readonly remoteAddress: InetSocketAddress
|
|
116
|
-
}
|
|
117
|
-
export interface DatagramChannel extends Channel {}
|
|
118
|
-
|
|
119
|
-
export interface ChannelPipeline extends ChannelInboundInvoker, ChannelOutboundInvoker {
|
|
120
|
-
readonly channel: Channel
|
|
121
|
-
|
|
122
|
-
newPromise(): ChannelPromise<void>
|
|
123
|
-
|
|
124
|
-
addFirst(handler: ChannelHandler): this
|
|
125
|
-
addFirst(handler: ChannelHandler, name: string): this
|
|
126
|
-
addBefore(base: string, handler: ChannelHandler): this
|
|
127
|
-
addBefore(base: string, handler: ChannelHandler, name: string): this
|
|
128
|
-
addAfter(base: string, handler: ChannelHandler): this
|
|
129
|
-
addAfter(base: string, handler: ChannelHandler, name: string): this
|
|
130
|
-
addLast(handler: ChannelHandler): this
|
|
131
|
-
addLast(handler: ChannelHandler, name: string): this
|
|
132
|
-
remove(name: string): this
|
|
133
|
-
remove(handler: ChannelHandler): this
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
export interface ChannelHandlerContext extends ChannelInboundInvoker, ChannelOutboundInvoker {
|
|
137
|
-
readonly channel: Channel
|
|
138
|
-
readonly executor: EventExecutor
|
|
139
|
-
readonly name: string
|
|
140
|
-
readonly handler: ChannelHandler
|
|
141
|
-
readonly pipeline: ChannelPipeline
|
|
142
|
-
isRemoved(): boolean
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
export interface ChannelHandler {
|
|
146
|
-
handlerAdded(ctx: ChannelHandlerContext): void
|
|
147
|
-
handlerRemoved(ctx: ChannelHandlerContext): void
|
|
148
|
-
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
export interface ChannelInboundHandler extends ChannelHandler {
|
|
152
|
-
channelRegistered(ctx: ChannelHandlerContext): void
|
|
153
|
-
channelUnregistered(ctx: ChannelHandlerContext): void
|
|
154
|
-
channelActive(ctx: ChannelHandlerContext): void
|
|
155
|
-
channelInactive(ctx: ChannelHandlerContext): void
|
|
156
|
-
channelRead(ctx: ChannelHandlerContext, data: unknown): void
|
|
157
|
-
channelReadComplete(ctx: ChannelHandlerContext): void
|
|
158
|
-
channelWritabilityChanged(ctx: ChannelHandlerContext): void
|
|
159
|
-
errorCaught(ctx: ChannelHandlerContext, error: Error): void
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
export interface ChannelOutboundHandler extends ChannelHandler {
|
|
163
|
-
onBind(ctx: ChannelHandlerContext, localAddress: SocketAddress): Promise<void>
|
|
164
|
-
onConnect(ctx: ChannelHandlerContext, remoteAddress: SocketAddress, localAddress: SocketAddress): Promise<void>
|
|
165
|
-
onDisconnect(ctx: ChannelHandlerContext): Promise<void>
|
|
166
|
-
onClose(ctx: ChannelHandlerContext, error?: Error): Promise<void>
|
|
167
|
-
onDeregister(ctx: ChannelHandlerContext): Promise<void>
|
|
168
|
-
onWrite(ctx: ChannelHandlerContext, message: unknown): Promise<void>
|
|
169
|
-
onFlush(ctx: ChannelHandlerContext): void;
|
|
170
|
-
onRead(ctx: ChannelHandlerContext): void
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
export interface ChannelPromise<T> {
|
|
175
|
-
readonly promise: Promise<T>
|
|
176
|
-
readonly channel: Channel
|
|
177
|
-
success(value: T): boolean
|
|
178
|
-
failure(error: Error): boolean
|
|
179
|
-
isSuccess(): boolean
|
|
180
|
-
isDone(): boolean
|
|
181
|
-
cancel(): boolean
|
|
182
|
-
|
|
183
|
-
readonly reason: any | undefined
|
|
184
|
-
addListener(listener: (promise: ChannelPromise<T>) => void): this
|
|
185
|
-
sync(): Promise<this>
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
|
package/src/utils/bigint.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
export function maxn(...values: bigint[]) {
|
|
2
|
-
let max = values[0];
|
|
3
|
-
for (let i = 1; i < values.length; i++) {
|
|
4
|
-
if (values[i] > max) {
|
|
5
|
-
max = values[i];
|
|
6
|
-
}
|
|
7
|
-
}
|
|
8
|
-
return max;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function minn(...values: bigint[]) {
|
|
12
|
-
let min = values[0];
|
|
13
|
-
for (let i = 1; i < values.length; i++) {
|
|
14
|
-
if (values[i] < min) {
|
|
15
|
-
min = values[i];
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
return min;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export function absn(n: bigint) {
|
|
22
|
-
return n < 0n ? -n : n;
|
|
23
|
-
}
|
package/src/utils/buffer.ts
DELETED
|
@@ -1,434 +0,0 @@
|
|
|
1
|
-
export interface ByteBuffer /*extends DataView*/ {
|
|
2
|
-
readonly remaining: number;
|
|
3
|
-
readonly hasRemaining: boolean;
|
|
4
|
-
readonly capacity: number;
|
|
5
|
-
|
|
6
|
-
mark(): this;
|
|
7
|
-
reset(): this;
|
|
8
|
-
clear(): this;
|
|
9
|
-
flip(): this;
|
|
10
|
-
duplicate(): this;
|
|
11
|
-
position: number;
|
|
12
|
-
limit: number;
|
|
13
|
-
|
|
14
|
-
order: 'little-endian' | 'big-endian';
|
|
15
|
-
|
|
16
|
-
// unsigned byte
|
|
17
|
-
getUint8(): number;
|
|
18
|
-
setUint8(value: number): this;
|
|
19
|
-
getUint8(offset: number): number;
|
|
20
|
-
setUint8(value: number, offset: number): this;
|
|
21
|
-
|
|
22
|
-
// singed byte
|
|
23
|
-
getInt8(): number
|
|
24
|
-
setInt8(value: number): this;
|
|
25
|
-
getInt8(offset: number): number
|
|
26
|
-
setInt8(offset: number, value: number): this;
|
|
27
|
-
|
|
28
|
-
// signed short
|
|
29
|
-
getInt16(): number;
|
|
30
|
-
setInt16(value: number): this;
|
|
31
|
-
getInt16(offset: number): number;
|
|
32
|
-
setInt16(offset: number, value: number): this;
|
|
33
|
-
|
|
34
|
-
// unsigned short
|
|
35
|
-
getUint16(): number;
|
|
36
|
-
setUint16(value: number): this;
|
|
37
|
-
getUint16(offset: number): number;
|
|
38
|
-
setUint16(offset: number, value: number): this;
|
|
39
|
-
|
|
40
|
-
// signed int
|
|
41
|
-
getInt32(): number;
|
|
42
|
-
setInt32(value: number): this;
|
|
43
|
-
getInt32(offset: number): number;
|
|
44
|
-
setInt32(offset: number, value: number): this;
|
|
45
|
-
|
|
46
|
-
// unsigned int
|
|
47
|
-
getUint32(): number;
|
|
48
|
-
setUint32(value: number): this;
|
|
49
|
-
getUint32(offset: number): number;
|
|
50
|
-
setUint32(offset: number, value: number): this;
|
|
51
|
-
|
|
52
|
-
// signed long
|
|
53
|
-
getBigInt64(): bigint;
|
|
54
|
-
setBigInt64(value: bigint): this;
|
|
55
|
-
getBigInt64(offset: number): bigint;
|
|
56
|
-
setBigInt64(offset: number, value: bigint): this;
|
|
57
|
-
|
|
58
|
-
// byte array
|
|
59
|
-
getUint8Array(value: Uint8Array): this;
|
|
60
|
-
setUint8Array(value: Uint8Array): this;
|
|
61
|
-
getUint8Array(value: Uint8Array, offset: number, length: number): this;
|
|
62
|
-
setUint8Array(value: Uint8Array, offset: number, length: number): this;
|
|
63
|
-
|
|
64
|
-
setByteBuffer(value: ByteBuffer): this;
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
abstract class BaseBuffer {
|
|
69
|
-
private _mark = -1;
|
|
70
|
-
private _position = 0;
|
|
71
|
-
private _limit: number;
|
|
72
|
-
private _capacity: number;
|
|
73
|
-
|
|
74
|
-
/*protected*/ constructor(mark: number, pos: number, lim: number, cap: number) {
|
|
75
|
-
if (cap < 0) {
|
|
76
|
-
throw new Error(`capacity must not be negative (${cap} < 0)`);
|
|
77
|
-
}
|
|
78
|
-
this._capacity = cap;
|
|
79
|
-
this.limit = lim;
|
|
80
|
-
this.position = pos;
|
|
81
|
-
if (mark >= 0) {
|
|
82
|
-
if (mark > pos) {
|
|
83
|
-
throw new Error(`mark > position (${mark} > ${pos})`);
|
|
84
|
-
}
|
|
85
|
-
this._mark = mark;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
get capacity(): number {
|
|
90
|
-
return this._capacity;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
get position(): number {
|
|
94
|
-
return this._position;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
set position(value: number) {
|
|
98
|
-
if (value < 0 || value > this._limit) {
|
|
99
|
-
throw new Error(`invalid position ${value} (limit: ${this._limit})`);
|
|
100
|
-
}
|
|
101
|
-
if (this._mark > value) {
|
|
102
|
-
this._mark = -1;
|
|
103
|
-
}
|
|
104
|
-
this._position = value;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
get limit(): number {
|
|
108
|
-
return this._limit;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
set limit(value: number) {
|
|
112
|
-
if (value < 0 || value > this._capacity) {
|
|
113
|
-
throw new Error(`invalid limit ${value} (capacity: ${this._capacity})`);
|
|
114
|
-
}
|
|
115
|
-
this._limit = value;
|
|
116
|
-
if (this._position > value) {
|
|
117
|
-
this._position = value;
|
|
118
|
-
}
|
|
119
|
-
if (this._mark > value) {
|
|
120
|
-
this._mark = -1;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
mark(): this {
|
|
125
|
-
this._mark = this._position;
|
|
126
|
-
return this;
|
|
127
|
-
}
|
|
128
|
-
reset(): this {
|
|
129
|
-
const m = this._mark;
|
|
130
|
-
if (m < 0) {
|
|
131
|
-
throw new Error('invalid mark');
|
|
132
|
-
}
|
|
133
|
-
this._position = m;
|
|
134
|
-
return this;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
clear(): this {
|
|
138
|
-
this._position = 0;
|
|
139
|
-
this._limit = this._capacity;
|
|
140
|
-
this._mark = -1;
|
|
141
|
-
return this;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
flip(): this {
|
|
145
|
-
this._limit = this._position;
|
|
146
|
-
this._position = 0;
|
|
147
|
-
this._mark = -1;
|
|
148
|
-
return this;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
rewind(): this {
|
|
152
|
-
this._position = 0;
|
|
153
|
-
this._mark = -1;
|
|
154
|
-
return this;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
get remaining(): number {
|
|
158
|
-
const rem = this._limit - this._position;
|
|
159
|
-
return rem > 0 ? rem : 0;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
get hasRemaining(): boolean {
|
|
163
|
-
return this._position < this._limit;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
private truncate(): void {
|
|
167
|
-
this._mark = -1;
|
|
168
|
-
this._position = 0;
|
|
169
|
-
this._limit = 0;
|
|
170
|
-
this._capacity = 0;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
protected nextGetByteOffset(numberOfBytes = 1): number {
|
|
174
|
-
const p = this.position;
|
|
175
|
-
if (this._limit - p < numberOfBytes) {
|
|
176
|
-
throw new Error('Buffer underflow');
|
|
177
|
-
}
|
|
178
|
-
this._position = p + numberOfBytes;
|
|
179
|
-
return p;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
protected nextSetByteOffset(numberOfBytes = 1): number {
|
|
183
|
-
const p = this.position;
|
|
184
|
-
if (this._limit - p < numberOfBytes) {
|
|
185
|
-
throw new Error('Buffer overflow');
|
|
186
|
-
}
|
|
187
|
-
this._position = p + numberOfBytes;
|
|
188
|
-
return p;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
protected checkByteOffset(byteOffset: number, numberOfBytes = 1): number {
|
|
192
|
-
if (byteOffset < 0 || numberOfBytes > this._limit - byteOffset) {
|
|
193
|
-
throw new Error(`byteOffset ${byteOffset} for ${numberOfBytes} bytes out of bounds: (limits ${this._limit})`);
|
|
194
|
-
}
|
|
195
|
-
return byteOffset;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
export function allocate(capacity: number) {
|
|
201
|
-
return new ArrayByteBuffer(capacity, capacity);
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
export function wrap(view: DataView<ArrayBuffer>) {
|
|
205
|
-
return new ArrayByteBuffer(view.byteLength, view.byteLength - view.byteOffset, view);
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
function checkBounds(offset: number, length: number, size: number): void {
|
|
209
|
-
if (offset < 0 || length < 0 || offset + length > size) {
|
|
210
|
-
throw new Error(`index out of bounds: ${offset} + ${length} > ${size}`);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
class ArrayByteBuffer extends BaseBuffer implements ByteBuffer {
|
|
215
|
-
private readonly _view: DataView<ArrayBuffer>;
|
|
216
|
-
private _littleEndian?: boolean;
|
|
217
|
-
|
|
218
|
-
constructor(cap: number, lim: number, view?: DataView<ArrayBuffer>) {
|
|
219
|
-
super(-1, 0, lim, cap);
|
|
220
|
-
|
|
221
|
-
this._view = view ?? new DataView(new ArrayBuffer(lim, { maxByteLength: cap }));
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
duplicate(): this {
|
|
225
|
-
const dup = new ArrayByteBuffer(this.capacity, this.limit, this._view);
|
|
226
|
-
dup.position = this.position;
|
|
227
|
-
dup._littleEndian = this._littleEndian;
|
|
228
|
-
return dup as this;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
get order(): 'little-endian' | 'big-endian' {
|
|
233
|
-
return this._littleEndian ? 'little-endian' : 'big-endian';
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
set order(value: 'little-endian' | 'big-endian') {
|
|
237
|
-
this._littleEndian = value === 'little-endian';
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
// get buffer() {
|
|
241
|
-
// return this._view.buffer;
|
|
242
|
-
// }
|
|
243
|
-
//
|
|
244
|
-
// get byteLength(): number {
|
|
245
|
-
// return this._view.byteLength;
|
|
246
|
-
// }
|
|
247
|
-
//
|
|
248
|
-
// get byteOffset(): number {
|
|
249
|
-
// return this._view.byteOffset;
|
|
250
|
-
// }
|
|
251
|
-
|
|
252
|
-
private index(byteOffset: number): number {
|
|
253
|
-
return byteOffset + this._view.byteOffset;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
getInt8(byteOffset?: number): number {
|
|
257
|
-
byteOffset = byteOffset !== undefined ? super.checkByteOffset(byteOffset) : super.nextGetByteOffset();
|
|
258
|
-
return this._view.getInt8(this.index(byteOffset));
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
setInt8(byteOffsetOrValue: number, value?: number): this {
|
|
262
|
-
let byteOffset: number;
|
|
263
|
-
if (value === undefined) {
|
|
264
|
-
value = byteOffsetOrValue;
|
|
265
|
-
byteOffset = super.nextSetByteOffset();
|
|
266
|
-
}
|
|
267
|
-
else {
|
|
268
|
-
byteOffset = super.checkByteOffset(byteOffsetOrValue);
|
|
269
|
-
}
|
|
270
|
-
this._view.setInt8(this.index(byteOffset), value);
|
|
271
|
-
return this;
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
getUint8(byteOffset?: number): number {
|
|
275
|
-
byteOffset = byteOffset !== undefined ? super.checkByteOffset(byteOffset) : super.nextGetByteOffset();
|
|
276
|
-
return this._view.getUint8(this.index(byteOffset));
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
setUint8(byteOffsetOrValue: number, value?: number): this {
|
|
280
|
-
let byteOffset: number;
|
|
281
|
-
if (value === undefined) {
|
|
282
|
-
value = byteOffsetOrValue;
|
|
283
|
-
byteOffset = super.nextSetByteOffset();
|
|
284
|
-
}
|
|
285
|
-
else {
|
|
286
|
-
byteOffset = super.checkByteOffset(byteOffsetOrValue);
|
|
287
|
-
}
|
|
288
|
-
this._view.setUint8(this.index(byteOffset), value);
|
|
289
|
-
return this;
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
getInt16(bytesOffset?: number): number {
|
|
293
|
-
bytesOffset = bytesOffset !== undefined ? super.checkByteOffset(bytesOffset, 2) : super.nextGetByteOffset(2);
|
|
294
|
-
return this._view.getInt16(this.index(bytesOffset), this._littleEndian);
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
setInt16(byteOffsetOrValue: number, value?: number): this {
|
|
298
|
-
let byteOffset: number;
|
|
299
|
-
if (value === undefined) {
|
|
300
|
-
value = byteOffsetOrValue;
|
|
301
|
-
byteOffset = super.nextSetByteOffset(2);
|
|
302
|
-
}
|
|
303
|
-
else {
|
|
304
|
-
byteOffset = super.checkByteOffset(byteOffsetOrValue, 2);
|
|
305
|
-
}
|
|
306
|
-
this._view.setInt16(this.index(byteOffset), value, this._littleEndian);
|
|
307
|
-
return this;
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
getUint16(bytesOffset?: number): number {
|
|
311
|
-
bytesOffset = bytesOffset !== undefined ? super.checkByteOffset(bytesOffset, 2) : super.nextGetByteOffset(2);
|
|
312
|
-
return this._view.getUint16(this.index(bytesOffset), this._littleEndian);
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
setUint16(byteOffsetOrValue: number, value?: number): this {
|
|
316
|
-
let byteOffset: number;
|
|
317
|
-
if (value === undefined) {
|
|
318
|
-
value = byteOffsetOrValue;
|
|
319
|
-
byteOffset = super.nextSetByteOffset(2);
|
|
320
|
-
}
|
|
321
|
-
else {
|
|
322
|
-
byteOffset = super.checkByteOffset(byteOffsetOrValue, 2);
|
|
323
|
-
}
|
|
324
|
-
this._view.setUint16(this.index(byteOffset), value, this._littleEndian);
|
|
325
|
-
return this;
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
getInt32(byteOffset?: number): number {
|
|
329
|
-
byteOffset = byteOffset !== undefined ? super.checkByteOffset(byteOffset, 4) : super.nextGetByteOffset(4);
|
|
330
|
-
return this._view.getInt32(this.index(byteOffset), this._littleEndian);
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
setInt32(byteOffsetOrValue: number, value?: number): this {
|
|
334
|
-
let byteOffset: number;
|
|
335
|
-
if (value === undefined) {
|
|
336
|
-
value = byteOffsetOrValue;
|
|
337
|
-
byteOffset = super.nextSetByteOffset(4);
|
|
338
|
-
}
|
|
339
|
-
else {
|
|
340
|
-
byteOffset = super.checkByteOffset(byteOffsetOrValue, 4);
|
|
341
|
-
}
|
|
342
|
-
this._view.setInt32(this.index(byteOffset), value, this._littleEndian);
|
|
343
|
-
return this;
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
getUint32(byteOffset?: number): number {
|
|
347
|
-
byteOffset = byteOffset !== undefined ? super.checkByteOffset(byteOffset, 4) : super.nextGetByteOffset(4);
|
|
348
|
-
return this._view.getUint32(this.index(byteOffset), this._littleEndian);
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
setUint32(byteOffsetOrValue: number, value?: number): this {
|
|
352
|
-
let byteOffset: number;
|
|
353
|
-
if (value === undefined) {
|
|
354
|
-
value = byteOffsetOrValue;
|
|
355
|
-
byteOffset = super.nextSetByteOffset(4);
|
|
356
|
-
}
|
|
357
|
-
else {
|
|
358
|
-
byteOffset = super.checkByteOffset(byteOffsetOrValue, 4);
|
|
359
|
-
}
|
|
360
|
-
this._view.setUint32(this.index(byteOffset), value, this._littleEndian);
|
|
361
|
-
return this;
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
getBigInt64(byteOffset?: number): bigint {
|
|
365
|
-
byteOffset = byteOffset !== undefined ? super.checkByteOffset(byteOffset, 8) : super.nextGetByteOffset(8);
|
|
366
|
-
return this._view.getBigInt64(this.index(byteOffset), this._littleEndian);
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
setBigInt64(byteOffsetOrValue: bigint | number, value?: bigint): this {
|
|
370
|
-
let byteOffset: number;
|
|
371
|
-
if (value === undefined) {
|
|
372
|
-
value = typeof byteOffsetOrValue === 'bigint' ? byteOffsetOrValue : BigInt(byteOffsetOrValue);
|
|
373
|
-
byteOffset = super.nextSetByteOffset(8);
|
|
374
|
-
}
|
|
375
|
-
else {
|
|
376
|
-
byteOffset = super.checkByteOffset(typeof byteOffsetOrValue === 'number' ? byteOffsetOrValue : Number(byteOffsetOrValue), 8);
|
|
377
|
-
}
|
|
378
|
-
this._view.setBigInt64(this.index(byteOffset), value);
|
|
379
|
-
return this;
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
getUint8Array(value: Uint8Array, offset: number = 0, length?: number): this {
|
|
383
|
-
length ??= value.length - offset;
|
|
384
|
-
checkBounds(offset, length, value.length);
|
|
385
|
-
if (length > this.remaining) {
|
|
386
|
-
throw new Error(`Buffer underflow`);
|
|
387
|
-
}
|
|
388
|
-
const end = offset + length;
|
|
389
|
-
for (let i = offset; i < end; i++) {
|
|
390
|
-
value[i] = this.getUint8();
|
|
391
|
-
}
|
|
392
|
-
return this;
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
setUint8Array(value: Uint8Array, offset: number = 0, length?: number): this {
|
|
396
|
-
length ??= value.length - offset;
|
|
397
|
-
checkBounds(offset, length, value.length);
|
|
398
|
-
if (length > this.remaining) {
|
|
399
|
-
throw new Error(`Buffer overflow`);
|
|
400
|
-
}
|
|
401
|
-
const end = offset + length;
|
|
402
|
-
for (let i = offset; i < end; i++) {
|
|
403
|
-
this.setUint8(value[i]);
|
|
404
|
-
}
|
|
405
|
-
return this;
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
setByteBuffer(value: ByteBuffer): this {
|
|
409
|
-
if (value === this) {
|
|
410
|
-
throw new Error('cannot set self');
|
|
411
|
-
}
|
|
412
|
-
const pos = this.position;
|
|
413
|
-
const sbpos = value.position;
|
|
414
|
-
const n = value.limit - sbpos;
|
|
415
|
-
if (n > this.limit - pos) {
|
|
416
|
-
throw new Error(`buffer underflow: ${n} > ${this.limit - pos}`);
|
|
417
|
-
}
|
|
418
|
-
let array: Uint8Array;
|
|
419
|
-
if (value instanceof ArrayByteBuffer) {
|
|
420
|
-
const byteOffset = value.nextGetByteOffset(n);
|
|
421
|
-
array = new Uint8Array(value._view.buffer, byteOffset, n);
|
|
422
|
-
}
|
|
423
|
-
else {
|
|
424
|
-
array = new Uint8Array(n);
|
|
425
|
-
value.getUint8Array(array);
|
|
426
|
-
}
|
|
427
|
-
this.setUint8Array(array);
|
|
428
|
-
return this;
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
export function adopt(data: Buffer<ArrayBufferLike>) {
|
|
433
|
-
return wrap(new DataView<ArrayBuffer>(data.buffer as ArrayBuffer, data.byteOffset, data.byteLength));
|
|
434
|
-
}
|