@itee/client 10.0.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/CHANGELOG.md +251 -0
- package/LICENSE.md +23 -0
- package/README.md +76 -0
- package/builds/itee-client.cjs.js +6517 -0
- package/builds/itee-client.cjs.js.map +1 -0
- package/builds/itee-client.cjs.min.js +125 -0
- package/builds/itee-client.esm.js +6468 -0
- package/builds/itee-client.esm.js.map +1 -0
- package/builds/itee-client.esm.min.js +124 -0
- package/builds/itee-client.iife.js +6524 -0
- package/builds/itee-client.iife.js.map +1 -0
- package/builds/itee-client.iife.min.js +125 -0
- package/package.json +87 -0
- package/sources/client.js +14 -0
- package/sources/cores/TAbstractFactory.js +42 -0
- package/sources/cores/TCloningFactory.js +39 -0
- package/sources/cores/TConstants.js +433 -0
- package/sources/cores/TInstancingFactory.js +41 -0
- package/sources/cores/TStore.js +303 -0
- package/sources/cores/_cores.js +13 -0
- package/sources/input_devices/TKeyboardController.js +158 -0
- package/sources/input_devices/TMouseController.js +31 -0
- package/sources/input_devices/_inputDevices.js +11 -0
- package/sources/loaders/TBinaryConverter.js +35 -0
- package/sources/loaders/TBinaryReader.js +1029 -0
- package/sources/loaders/TBinarySerializer.js +258 -0
- package/sources/loaders/TBinaryWriter.js +429 -0
- package/sources/loaders/_loaders.js +21 -0
- package/sources/loaders/converters/ArrayBinaryConverter.js +33 -0
- package/sources/loaders/converters/BooleanBinaryConverter.js +24 -0
- package/sources/loaders/converters/DateBinaryConverter.js +21 -0
- package/sources/loaders/converters/NullBinaryConverter.js +13 -0
- package/sources/loaders/converters/NumberBinaryConverter.js +15 -0
- package/sources/loaders/converters/ObjectBinaryConverter.js +101 -0
- package/sources/loaders/converters/RegExBinaryConverter.js +11 -0
- package/sources/loaders/converters/StringBinaryConverter.js +26 -0
- package/sources/loaders/converters/UndefinedBinaryConverter.js +13 -0
- package/sources/managers/TDataBaseManager.js +1649 -0
- package/sources/managers/_managers.js +10 -0
- package/sources/utils/TIdFactory.js +84 -0
- package/sources/utils/_utils.js +9 -0
- package/sources/webapis/WebAPI.js +773 -0
- package/sources/webapis/WebAPIOrigin.js +141 -0
- package/sources/webapis/_webapis.js +10 -0
- package/sources/webapis/messages/WebAPIMessage.js +75 -0
- package/sources/webapis/messages/WebAPIMessageData.js +51 -0
- package/sources/webapis/messages/WebAPIMessageError.js +79 -0
- package/sources/webapis/messages/WebAPIMessageEvent.js +58 -0
- package/sources/webapis/messages/WebAPIMessageProgress.js +91 -0
- package/sources/webapis/messages/WebAPIMessageReady.js +66 -0
- package/sources/webapis/messages/WebAPIMessageRequest.js +94 -0
- package/sources/webapis/messages/WebAPIMessageResponse.js +80 -0
- package/sources/webapis/messages/_messages.js +16 -0
- package/sources/workers/AbstractWorker.js +149 -0
- package/sources/workers/_workers.js +10 -0
- package/sources/workers/messages/WorkerMessage.js +33 -0
- package/sources/workers/messages/WorkerMessageData.js +30 -0
- package/sources/workers/messages/WorkerMessageError.js +32 -0
- package/sources/workers/messages/WorkerMessageMethodCall.js +60 -0
- package/sources/workers/messages/WorkerMessageProgress.js +67 -0
- package/sources/workers/messages/_messages.js +14 -0
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author [Tristan Valcke]{@link https://github.com/Itee}
|
|
3
|
+
* @license [BSD-3-Clause]{@link https://opensource.org/licenses/BSD-3-Clause}
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
isArray,
|
|
8
|
+
isBoolean,
|
|
9
|
+
isNotDefined,
|
|
10
|
+
isNull,
|
|
11
|
+
isNumber,
|
|
12
|
+
isObject,
|
|
13
|
+
isString,
|
|
14
|
+
isUndefined
|
|
15
|
+
} from '@itee/validators'
|
|
16
|
+
import { ArrayBinaryConverter } from './converters/ArrayBinaryConverter.js'
|
|
17
|
+
import { BooleanBinaryConverter } from './converters/BooleanBinaryConverter.js'
|
|
18
|
+
import { DateBinaryConverter } from './converters/DateBinaryConverter.js'
|
|
19
|
+
import { NullBinaryConverter } from './converters/NullBinaryConverter.js'
|
|
20
|
+
import { NumberBinaryConverter } from './converters/NumberBinaryConverter.js'
|
|
21
|
+
import { ObjectBinaryConverter } from './converters/ObjectBinaryConverter.js'
|
|
22
|
+
import { RegExBinaryConverter } from './converters/RegExBinaryConverter.js'
|
|
23
|
+
import { StringBinaryConverter } from './converters/StringBinaryConverter.js'
|
|
24
|
+
import { UndefinedBinaryConverter } from './converters/UndefinedBinaryConverter.js'
|
|
25
|
+
import { TBinaryReader } from './TBinaryReader.js'
|
|
26
|
+
import { TBinaryWriter } from './TBinaryWriter.js'
|
|
27
|
+
|
|
28
|
+
//const BinaryType = toEnum( {
|
|
29
|
+
// Null: 0,
|
|
30
|
+
// Boolean: 1,
|
|
31
|
+
// Number: 2,
|
|
32
|
+
// String: 3,
|
|
33
|
+
// Date: 4,
|
|
34
|
+
// RegExp: 5,
|
|
35
|
+
// Object: 6,
|
|
36
|
+
// Array: 7,
|
|
37
|
+
// UserDefined: 8
|
|
38
|
+
//} )
|
|
39
|
+
|
|
40
|
+
const BinaryType = {
|
|
41
|
+
Null: 0,
|
|
42
|
+
Undefined: 1,
|
|
43
|
+
Boolean: 2,
|
|
44
|
+
Number: 3,
|
|
45
|
+
String: 4,
|
|
46
|
+
Date: 5,
|
|
47
|
+
RegEx: 6,
|
|
48
|
+
Array: 7,
|
|
49
|
+
Object: 8,
|
|
50
|
+
UserDefined: 255
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function isDate( value ) {
|
|
54
|
+
if ( isNotDefined( value ) ) {
|
|
55
|
+
return false
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
switch ( typeof value ) {
|
|
59
|
+
case 'number':
|
|
60
|
+
return true
|
|
61
|
+
case 'string':
|
|
62
|
+
return !isNaN( Date.parse( value ) )
|
|
63
|
+
case 'object':
|
|
64
|
+
if ( value instanceof Date ) {
|
|
65
|
+
return !isNaN( value.getTime() )
|
|
66
|
+
} else {
|
|
67
|
+
return false
|
|
68
|
+
}
|
|
69
|
+
default:
|
|
70
|
+
return false
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function isRegEx( value ) {
|
|
75
|
+
if ( isNotDefined( value ) ) {
|
|
76
|
+
return false
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return value instanceof RegExp
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
class TBinarySerializer {
|
|
83
|
+
|
|
84
|
+
constructor() {
|
|
85
|
+
|
|
86
|
+
this.reader = new TBinaryReader()
|
|
87
|
+
this.writer = new TBinaryWriter()
|
|
88
|
+
|
|
89
|
+
this.converters = new Map( [
|
|
90
|
+
[ BinaryType.Null, new NullBinaryConverter( this ) ],
|
|
91
|
+
[ BinaryType.Undefined, new UndefinedBinaryConverter( this ) ],
|
|
92
|
+
[ BinaryType.Boolean, new BooleanBinaryConverter( this ) ],
|
|
93
|
+
[ BinaryType.Number, new NumberBinaryConverter( this ) ],
|
|
94
|
+
[ BinaryType.String, new StringBinaryConverter( this ) ],
|
|
95
|
+
[ BinaryType.Date, new DateBinaryConverter( this ) ],
|
|
96
|
+
[ BinaryType.RegEx, new RegExBinaryConverter( this ) ],
|
|
97
|
+
[ BinaryType.Array, new ArrayBinaryConverter( this ) ],
|
|
98
|
+
[ BinaryType.Object, new ObjectBinaryConverter( null, this ) ],
|
|
99
|
+
[ BinaryType.UserDefined, new Map( [] ) ]
|
|
100
|
+
] )
|
|
101
|
+
|
|
102
|
+
// this.converters.set( BinaryType.Boolean, new BooleanBinaryConverter() )
|
|
103
|
+
// this.converters.set( 'String', new StringBinaryConverter() )
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
addConverter( converter ) {
|
|
107
|
+
|
|
108
|
+
converter.serializer = this
|
|
109
|
+
|
|
110
|
+
const userDefinedConverters = this.converters.get( BinaryType.UserDefined )
|
|
111
|
+
userDefinedConverters.set( converter.targetCtor.name, converter )
|
|
112
|
+
|
|
113
|
+
}
|
|
114
|
+
removeConverter( converter ) {
|
|
115
|
+
const userDefinedConverters = this.converters.get( BinaryType.UserDefined )
|
|
116
|
+
userDefinedConverters.remove( converter.targetCtor.name )
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
serialize( instance, options = {} ) {
|
|
120
|
+
|
|
121
|
+
// Reset writer buffer
|
|
122
|
+
this.writer.buffer = new ArrayBuffer( 1024 )
|
|
123
|
+
const buffer = this._serialize( instance )
|
|
124
|
+
|
|
125
|
+
// // Clip buffer to current offset
|
|
126
|
+
// const writerOffset = this.writer.offset
|
|
127
|
+
// console.log( writerOffset )
|
|
128
|
+
// const clippedBuffer = buffer.slice( 0, writerOffset )
|
|
129
|
+
//
|
|
130
|
+
// return clippedBuffer
|
|
131
|
+
//
|
|
132
|
+
|
|
133
|
+
// Clip buffer to current writer offset
|
|
134
|
+
return buffer.slice( 0, this.writer.offset )
|
|
135
|
+
}
|
|
136
|
+
_serialize( instance ) {
|
|
137
|
+
const binaryType = this._getBinaryTypeOf( instance )
|
|
138
|
+
|
|
139
|
+
// Prepend internal binary type for deserialization process to be able to target correct converter
|
|
140
|
+
this.writer.setUint8( binaryType )
|
|
141
|
+
|
|
142
|
+
// Get local converters and in case where binary type is userdefined, search in specific converter or use default (unoptimized)
|
|
143
|
+
let converter = this.converters.get( binaryType )
|
|
144
|
+
if ( binaryType === BinaryType.UserDefined ) {
|
|
145
|
+
|
|
146
|
+
// Prepend class name for deserialization (like BinaryType for primitives)
|
|
147
|
+
const ctor = instance.constructor
|
|
148
|
+
const ctorName = ctor.name
|
|
149
|
+
this.writer.setUint8( ctorName.length )
|
|
150
|
+
this.writer.setString( ctorName )
|
|
151
|
+
|
|
152
|
+
if ( !converter.has( ctorName ) ) {
|
|
153
|
+
console.info( `Need to create new converter for ${ ctorName } serialization. The serialization of this class could be optimized using it's own dedicated serializer that extend TBinaryConverter and add it to serializer converters.` )
|
|
154
|
+
converter.set( ctorName, new ObjectBinaryConverter( ctor, this ) )
|
|
155
|
+
}
|
|
156
|
+
converter = converter.get( ctorName )
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
converter.to( this.writer, instance )
|
|
160
|
+
|
|
161
|
+
return this.writer.buffer
|
|
162
|
+
}
|
|
163
|
+
_getBinaryTypeOf( instance ) {
|
|
164
|
+
let binaryType
|
|
165
|
+
if ( isNull( instance ) ) {
|
|
166
|
+
binaryType = BinaryType.Null
|
|
167
|
+
} else if ( isUndefined( instance ) ) {
|
|
168
|
+
binaryType = BinaryType.Undefined
|
|
169
|
+
} else if ( isBoolean( instance ) ) {
|
|
170
|
+
binaryType = BinaryType.Boolean
|
|
171
|
+
} else if ( isNumber( instance ) ) {
|
|
172
|
+
binaryType = BinaryType.Number
|
|
173
|
+
} else if ( isString( instance ) ) {
|
|
174
|
+
binaryType = BinaryType.String
|
|
175
|
+
} else if ( isDate( instance ) ) {
|
|
176
|
+
binaryType = BinaryType.Date
|
|
177
|
+
} else if ( isRegEx( instance ) ) {
|
|
178
|
+
binaryType = BinaryType.RegEx
|
|
179
|
+
} else if ( isArray( instance ) ) {
|
|
180
|
+
binaryType = BinaryType.Array
|
|
181
|
+
} else if ( isObject( instance ) ) { // Todo: care it should be isPlainObject !!!
|
|
182
|
+
binaryType = BinaryType.Object
|
|
183
|
+
} else { // UserDefined check in registered converters
|
|
184
|
+
binaryType = BinaryType.UserDefined
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return binaryType
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
deserialize( buffer ) {
|
|
191
|
+
if ( isNotDefined( buffer ) || buffer.length === 0 ) { return }
|
|
192
|
+
|
|
193
|
+
// Reset writer buffer
|
|
194
|
+
this.reader.setBuffer( buffer, 0, buffer.length )
|
|
195
|
+
|
|
196
|
+
return this._deserialize()
|
|
197
|
+
|
|
198
|
+
}
|
|
199
|
+
_deserialize() {
|
|
200
|
+
|
|
201
|
+
const binaryType = this.reader.getUint8()
|
|
202
|
+
|
|
203
|
+
let converter = this.converters.get( binaryType )
|
|
204
|
+
if ( binaryType === BinaryType.UserDefined ) {
|
|
205
|
+
|
|
206
|
+
const ctorNameLength = this.reader.getUint8()
|
|
207
|
+
const ctorName = this.reader.getString( ctorNameLength )
|
|
208
|
+
|
|
209
|
+
// var ctor = this._getCtorOf( ctorName )
|
|
210
|
+
|
|
211
|
+
converter = converter.has( ctorName )
|
|
212
|
+
? converter.get( ctorName )
|
|
213
|
+
: null //converter.get( null )
|
|
214
|
+
|
|
215
|
+
// Get specific or create default converter for userdefined type
|
|
216
|
+
// const ctorNameLength = this.reader.getUint8()
|
|
217
|
+
// const ctorName = this.reader.getString( ctorNameLength )
|
|
218
|
+
//
|
|
219
|
+
// if ( !converter.has( ctorName ) ) {
|
|
220
|
+
// console.info( `Need to create new converter for ${ ctorName } serialization. The serialization of this class could be optimized using it's own dedicated serializer that extend TBinaryConverter and add it to serializer
|
|
221
|
+
// converters.` ) converter.set( ctorName, new ObjectBinaryConverter( ctor ) ) } converter = converter.get( ctorName )
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
if ( !converter ) {
|
|
225
|
+
throw new TypeError( `Unable to found appropriate converter for deserialize type: ${ binaryType }` )
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
return converter.from( this.reader )
|
|
229
|
+
|
|
230
|
+
}
|
|
231
|
+
// _getCtorOf ( typeName ) {
|
|
232
|
+
// var stringToFunction = function ( str ) {
|
|
233
|
+
// var arr = str.split( '.' )
|
|
234
|
+
//
|
|
235
|
+
// var fn = ( window || this )
|
|
236
|
+
// for ( var i = 0, len = arr.length ; i < len ; i++ ) {
|
|
237
|
+
// fn = fn[ arr[ i ] ]
|
|
238
|
+
// }
|
|
239
|
+
//
|
|
240
|
+
// if ( typeof fn !== 'function' ) {
|
|
241
|
+
// throw new Error( 'function not found' )
|
|
242
|
+
// }
|
|
243
|
+
//
|
|
244
|
+
// return fn
|
|
245
|
+
// }
|
|
246
|
+
// }
|
|
247
|
+
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
const binarySerializerInstance = /*#__PURE__*/new TBinarySerializer()
|
|
251
|
+
|
|
252
|
+
export {
|
|
253
|
+
isDate,
|
|
254
|
+
isRegEx,
|
|
255
|
+
binarySerializerInstance as DefaultBinarySerializer,
|
|
256
|
+
TBinarySerializer,
|
|
257
|
+
BinaryType
|
|
258
|
+
}
|
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isNotArrayBuffer,
|
|
3
|
+
isNotBoolean,
|
|
4
|
+
isNotNumber,
|
|
5
|
+
isNull,
|
|
6
|
+
isUndefined
|
|
7
|
+
} from '@itee/validators'
|
|
8
|
+
import {
|
|
9
|
+
Byte,
|
|
10
|
+
Endianness
|
|
11
|
+
} from './TBinaryReader.js'
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @author [Tristan Valcke]{@link https://github.com/Itee}
|
|
15
|
+
* @license [BSD-3-Clause]{@link https://opensource.org/licenses/BSD-3-Clause}
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
class TBinaryWriter {
|
|
19
|
+
|
|
20
|
+
constructor( {
|
|
21
|
+
buffer = new ArrayBuffer( 1024 ),
|
|
22
|
+
endianness = Endianness.Little
|
|
23
|
+
} = {} ) {
|
|
24
|
+
|
|
25
|
+
this.buffer = buffer
|
|
26
|
+
this.endianness = endianness
|
|
27
|
+
|
|
28
|
+
// Todo: For bit writing use same approche than byte
|
|
29
|
+
// this._bits = {
|
|
30
|
+
// buffer: null,
|
|
31
|
+
// offset: 0,
|
|
32
|
+
// length: 0
|
|
33
|
+
// }
|
|
34
|
+
|
|
35
|
+
this._updateDataView()
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
*
|
|
39
|
+
* @returns {*}
|
|
40
|
+
*/
|
|
41
|
+
get buffer() {
|
|
42
|
+
return this._buffer
|
|
43
|
+
}
|
|
44
|
+
set buffer( value ) {
|
|
45
|
+
|
|
46
|
+
const memberName = 'Buffer'
|
|
47
|
+
const expect = 'Expect an instance of ArrayBuffer.'
|
|
48
|
+
|
|
49
|
+
if ( isNull( value ) ) { throw new TypeError( `${ memberName } cannot be null ! ${ expect }` ) }
|
|
50
|
+
if ( isUndefined( value ) ) { throw new TypeError( `${ memberName } cannot be undefined ! ${ expect }` ) }
|
|
51
|
+
if ( isNotArrayBuffer( value ) ) { throw new TypeError( `${ memberName } cannot be an instance of ${ value.constructor.name } ! ${ expect }` ) }
|
|
52
|
+
|
|
53
|
+
this._buffer = value
|
|
54
|
+
this._offset = 0
|
|
55
|
+
this._length = value.byteLength
|
|
56
|
+
|
|
57
|
+
this._updateDataView()
|
|
58
|
+
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
*
|
|
62
|
+
* @returns {*}
|
|
63
|
+
*/
|
|
64
|
+
get offset() {
|
|
65
|
+
return this._offset
|
|
66
|
+
}
|
|
67
|
+
set offset( value ) {
|
|
68
|
+
|
|
69
|
+
const memberName = 'Offset'
|
|
70
|
+
const expect = 'Expect a number.'
|
|
71
|
+
|
|
72
|
+
if ( isNull( value ) ) { throw new TypeError( `${ memberName } cannot be null ! ${ expect }` ) }
|
|
73
|
+
if ( isUndefined( value ) ) { throw new TypeError( `${ memberName } cannot be undefined ! ${ expect }` ) }
|
|
74
|
+
if ( isNotNumber( value ) ) { throw new TypeError( `${ memberName } cannot be an instance of ${ value.constructor.name } ! ${ expect }` ) }
|
|
75
|
+
|
|
76
|
+
this._offset = value
|
|
77
|
+
|
|
78
|
+
this._updateDataView()
|
|
79
|
+
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
*
|
|
83
|
+
* @param value
|
|
84
|
+
*/
|
|
85
|
+
get length() {
|
|
86
|
+
return this._length
|
|
87
|
+
}
|
|
88
|
+
set length( value ) {
|
|
89
|
+
|
|
90
|
+
const memberName = 'Length'
|
|
91
|
+
const expect = 'Expect a number.'
|
|
92
|
+
|
|
93
|
+
if ( isNull( value ) ) { throw new TypeError( `${ memberName } cannot be null ! ${ expect }` ) }
|
|
94
|
+
if ( isUndefined( value ) ) { throw new TypeError( `${ memberName } cannot be undefined ! ${ expect }` ) }
|
|
95
|
+
if ( isNotNumber( value ) ) { throw new TypeError( `${ memberName } cannot be an instance of ${ value.constructor.name } ! ${ expect }` ) }
|
|
96
|
+
|
|
97
|
+
this._length = value
|
|
98
|
+
|
|
99
|
+
this._updateDataView()
|
|
100
|
+
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
*
|
|
104
|
+
* @returns {*}
|
|
105
|
+
*/
|
|
106
|
+
get endianness() {
|
|
107
|
+
return this._endianness
|
|
108
|
+
}
|
|
109
|
+
set endianness( value ) {
|
|
110
|
+
|
|
111
|
+
const memberName = 'Endianness'
|
|
112
|
+
const expect = 'Expect a boolean.'
|
|
113
|
+
|
|
114
|
+
if ( isNull( value ) ) { throw new TypeError( `${ memberName } cannot be null ! ${ expect }` ) }
|
|
115
|
+
if ( isUndefined( value ) ) { throw new TypeError( `${ memberName } cannot be undefined ! ${ expect }` ) }
|
|
116
|
+
if ( isNotBoolean( value ) ) { throw new TypeError( `${ memberName } cannot be an instance of ${ value.constructor.name } ! ${ expect }` ) }
|
|
117
|
+
|
|
118
|
+
this._endianness = value
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
*
|
|
122
|
+
* @param buffer
|
|
123
|
+
* @param offset
|
|
124
|
+
* @param length
|
|
125
|
+
* @returns {TBinaryReader}
|
|
126
|
+
*/
|
|
127
|
+
setBuffer( buffer, offset, length ) {
|
|
128
|
+
|
|
129
|
+
this.buffer = buffer
|
|
130
|
+
this.offset = offset || 0
|
|
131
|
+
this.length = length || buffer.byteLength
|
|
132
|
+
|
|
133
|
+
return this
|
|
134
|
+
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
*
|
|
139
|
+
* @param value
|
|
140
|
+
* @returns {TBinaryReader}
|
|
141
|
+
*/
|
|
142
|
+
setOffset( value ) {
|
|
143
|
+
|
|
144
|
+
this.offset = value
|
|
145
|
+
return this
|
|
146
|
+
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
*
|
|
151
|
+
* @param value
|
|
152
|
+
* @returns {TBinaryReader}
|
|
153
|
+
*/
|
|
154
|
+
setLength( value ) {
|
|
155
|
+
|
|
156
|
+
this.length = value
|
|
157
|
+
return this
|
|
158
|
+
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
*
|
|
163
|
+
* @param endianess
|
|
164
|
+
* @returns {TBinaryReader}
|
|
165
|
+
*/
|
|
166
|
+
setEndianess( endianess ) {
|
|
167
|
+
|
|
168
|
+
this.endianness = endianess
|
|
169
|
+
return this
|
|
170
|
+
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
*
|
|
175
|
+
* @param increment
|
|
176
|
+
* @returns {*}
|
|
177
|
+
* @private
|
|
178
|
+
*/
|
|
179
|
+
_getAndUpdateOffsetBy( increment ) {
|
|
180
|
+
|
|
181
|
+
const currentOffset = this._offset
|
|
182
|
+
this._offset += increment
|
|
183
|
+
|
|
184
|
+
// Manage buffer overflow, and auto-extend if needed
|
|
185
|
+
const bufferByteLength = this._buffer.byteLength
|
|
186
|
+
if ( this._offset >= bufferByteLength ) {
|
|
187
|
+
|
|
188
|
+
// Create new buffer and view with extended size
|
|
189
|
+
const newBuffer = new ArrayBuffer( bufferByteLength + 1024 )
|
|
190
|
+
const newDataView = new DataView( newBuffer, 0, newBuffer.byteLength )
|
|
191
|
+
|
|
192
|
+
// Copy data from current to new
|
|
193
|
+
for ( let i = 0 ; i < bufferByteLength ; i++ ) {
|
|
194
|
+
newDataView.setUint8( i, this._dataView.getUint8( i ) )
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Update local
|
|
198
|
+
this._buffer = newBuffer
|
|
199
|
+
this._dataView = newDataView
|
|
200
|
+
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
return currentOffset
|
|
204
|
+
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
*
|
|
209
|
+
* @private
|
|
210
|
+
*/
|
|
211
|
+
_updateDataView() {
|
|
212
|
+
|
|
213
|
+
this._dataView = new DataView( this._buffer, this._offset, this._length )
|
|
214
|
+
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
*
|
|
219
|
+
* @returns {boolean}
|
|
220
|
+
*/
|
|
221
|
+
isEndOfFile() {
|
|
222
|
+
|
|
223
|
+
return ( this._offset === this._length )
|
|
224
|
+
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
_iterArray( values, func, moveNext ) {
|
|
228
|
+
|
|
229
|
+
const currentOffset = this._offset
|
|
230
|
+
|
|
231
|
+
for ( let value of values ) {
|
|
232
|
+
func( value )
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
if ( !moveNext ) {
|
|
236
|
+
this._offset = currentOffset
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// Bytes
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
*
|
|
245
|
+
* @param offset
|
|
246
|
+
*/
|
|
247
|
+
skipOffsetTo( offset ) {
|
|
248
|
+
|
|
249
|
+
this._offset = offset
|
|
250
|
+
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
*
|
|
255
|
+
* @param nBytes
|
|
256
|
+
*/
|
|
257
|
+
skipOffsetOf( nBytes ) {
|
|
258
|
+
|
|
259
|
+
this._offset += nBytes
|
|
260
|
+
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
setBoolean( value, moveNext = true ) {
|
|
264
|
+
|
|
265
|
+
this.setUint8( ( ( value & 1 ) === 1 ), moveNext )
|
|
266
|
+
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
setBooleanArray( values, moveNext = true ) {
|
|
270
|
+
|
|
271
|
+
this._iterArray( values, this.setBoolean.bind( this ), moveNext )
|
|
272
|
+
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
setInt8( value, moveNext = true ) {
|
|
276
|
+
|
|
277
|
+
const offset = ( moveNext ) ? this._getAndUpdateOffsetBy( Byte.One ) : this._offset
|
|
278
|
+
this._dataView.setInt8( offset, value )
|
|
279
|
+
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
setInt8Array( values, moveNext = true ) {
|
|
283
|
+
|
|
284
|
+
this._iterArray( values, this.setInt8.bind( this ), moveNext )
|
|
285
|
+
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
setUint8( value, moveNext = true ) {
|
|
289
|
+
|
|
290
|
+
const offset = ( moveNext ) ? this._getAndUpdateOffsetBy( Byte.One ) : this._offset
|
|
291
|
+
this._dataView.setUint8( offset, value )
|
|
292
|
+
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
setUint8Array( values, moveNext = true ) {
|
|
296
|
+
|
|
297
|
+
this._iterArray( values, this.setUint8.bind( this ), moveNext )
|
|
298
|
+
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
setInt16( value, moveNext = true ) {
|
|
302
|
+
|
|
303
|
+
const offset = ( moveNext ) ? this._getAndUpdateOffsetBy( Byte.Two ) : this._offset
|
|
304
|
+
this._dataView.setInt16( offset, value, this._endianness )
|
|
305
|
+
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
setInt16Array( values, moveNext = true ) {
|
|
309
|
+
|
|
310
|
+
this._iterArray( values, this.setInt16.bind( this ), moveNext )
|
|
311
|
+
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
setUint16( value, moveNext = true ) {
|
|
315
|
+
|
|
316
|
+
const offset = ( moveNext ) ? this._getAndUpdateOffsetBy( Byte.Two ) : this._offset
|
|
317
|
+
this._dataView.setUint16( offset, value, this._endianness )
|
|
318
|
+
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
setUint16Array( values, moveNext = true ) {
|
|
322
|
+
|
|
323
|
+
this._iterArray( values, this.setUint16.bind( this ), moveNext )
|
|
324
|
+
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
setInt32( value, moveNext = true ) {
|
|
328
|
+
|
|
329
|
+
const offset = ( moveNext ) ? this._getAndUpdateOffsetBy( Byte.Four ) : this._offset
|
|
330
|
+
this._dataView.setInt32( offset, value, this._endianness )
|
|
331
|
+
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
setInt32Array( values, moveNext = true ) {
|
|
335
|
+
|
|
336
|
+
this._iterArray( values, this.setInt32.bind( this ), moveNext )
|
|
337
|
+
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
setUint32( value, moveNext = true ) {
|
|
341
|
+
|
|
342
|
+
const offset = ( moveNext ) ? this._getAndUpdateOffsetBy( Byte.Four ) : this._offset
|
|
343
|
+
this._dataView.setUint32( offset, value, this._endianness )
|
|
344
|
+
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
setUint32Array( values, moveNext = true ) {
|
|
348
|
+
|
|
349
|
+
this._iterArray( values, this.setUint32.bind( this ), moveNext )
|
|
350
|
+
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
setInt64( /*value, moveNext = true*/ ) {
|
|
354
|
+
|
|
355
|
+
// From THREE.FBXLoader
|
|
356
|
+
// JavaScript doesn't support 64-bit integer so attempting to calculate by ourselves.
|
|
357
|
+
// 1 << 32 will return 1 so using multiply operation instead here.
|
|
358
|
+
// There'd be a possibility that this method returns wrong value if the value
|
|
359
|
+
// is out of the range between Number.MAX_SAFE_INTEGER and Number.MIN_SAFE_INTEGER.
|
|
360
|
+
// TODO: safely handle 64-bit integer using bigint ?
|
|
361
|
+
|
|
362
|
+
throw new Error( 'Not implemented, sorry... any help is welcome !' )
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
setInt64Array( values, moveNext = true ) {
|
|
366
|
+
|
|
367
|
+
this._iterArray( values, this.setInt64.bind( this ), moveNext )
|
|
368
|
+
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
setUint64( /*value, moveNext = true*/ ) {
|
|
372
|
+
// Note: see setInt64() comment
|
|
373
|
+
throw new Error( 'Not implemented, sorry... any help is welcome !' )
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
setUint64Array( values, moveNext = true ) {
|
|
377
|
+
|
|
378
|
+
this._iterArray( values, this.setUint64.bind( this ), moveNext )
|
|
379
|
+
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
setFloat32( value, moveNext = true ) {
|
|
383
|
+
|
|
384
|
+
const offset = ( moveNext ) ? this._getAndUpdateOffsetBy( Byte.Four ) : this._offset
|
|
385
|
+
this._dataView.setFloat32( offset, value, this._endianness )
|
|
386
|
+
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
setFloat32Array( values, moveNext = true ) {
|
|
390
|
+
|
|
391
|
+
this._iterArray( values, this.setFloat32.bind( this ), moveNext )
|
|
392
|
+
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
setFloat64( value, moveNext = true ) {
|
|
396
|
+
|
|
397
|
+
const offset = ( moveNext ) ? this._getAndUpdateOffsetBy( Byte.Eight ) : this._offset
|
|
398
|
+
this._dataView.setFloat64( offset, value, this._endianness )
|
|
399
|
+
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
setFloat64Array( values, moveNext = true ) {
|
|
403
|
+
|
|
404
|
+
this._iterArray( values, this.setFloat64.bind( this ), moveNext )
|
|
405
|
+
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
setChar( value, moveNext = true ) {
|
|
409
|
+
|
|
410
|
+
this.setUint8( value.charCodeAt( 0 ), moveNext )
|
|
411
|
+
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
setString( values, moveNext = true ) {
|
|
415
|
+
|
|
416
|
+
this._iterArray( values, this.setChar.bind( this ), moveNext )
|
|
417
|
+
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
// setArrayBuffer ( value, moveNext = true ) {
|
|
421
|
+
//
|
|
422
|
+
// const offset = this._getAndUpdateOffsetBy( size )
|
|
423
|
+
// this._dataView.buffer.slice( offset, offset + size )
|
|
424
|
+
//
|
|
425
|
+
// }
|
|
426
|
+
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
export { TBinaryWriter }
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module Loaders
|
|
3
|
+
* @description Intermediary export file for loaders. Export [TBinaryReader]{@link TBinaryReader}, [Endianness]{@link Endianness}, and [Byte]{@link Byte}
|
|
4
|
+
*
|
|
5
|
+
* @author [Tristan Valcke]{@link https://github.com/Itee}
|
|
6
|
+
* @license [BSD-3-Clause]{@link https://opensource.org/licenses/BSD-3-Clause}
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export * from './TBinaryConverter.js'
|
|
10
|
+
export * from './TBinaryReader.js'
|
|
11
|
+
export * from './TBinarySerializer.js'
|
|
12
|
+
export * from './TBinaryWriter.js'
|
|
13
|
+
export * from './converters/NullBinaryConverter.js'
|
|
14
|
+
export * from './converters/UndefinedBinaryConverter.js'
|
|
15
|
+
export * from './converters/NumberBinaryConverter.js'
|
|
16
|
+
export * from './converters/StringBinaryConverter.js'
|
|
17
|
+
export * from './converters/DateBinaryConverter.js'
|
|
18
|
+
export * from './converters/RegExBinaryConverter.js'
|
|
19
|
+
export * from './converters/ArrayBinaryConverter.js'
|
|
20
|
+
export * from './converters/ObjectBinaryConverter.js'
|
|
21
|
+
|