1/* 2 * Copyright (c) 2024 SwanLink (Jiangsu) Technology Development Co., LTD. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15import { MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS'; 16import napitest from 'libnapitest.so'; 17// import napitest from 'libentry.so'; 18 19const workerPort: ThreadWorkerGlobalScope = worker.workerPort; 20 21/** 22 * Defines the event handler to be called when the worker thread receives a message sent by the host thread. 23 * The event handler is executed in the worker thread. 24 * 25 * @param e message data 26 */ 27workerPort.onmessage = (e: MessageEvents) => { 28 console.info('Worker received message:', e.data); 29 switch (e.data) { 30 case 'getLastError': { 31 let getLastErrorValue = napitest.napiSerialize(); 32 console.info('Worker: napiSerialize value is ' + getLastErrorValue); 33 workerPort.postMessage(getLastErrorValue); 34 break; 35 } 36 case 'isError': { 37 let isErrorValue = napitest.isError(true); 38 console.info('Worker: isError ret is ' + isErrorValue); 39 workerPort.postMessage(isErrorValue); 40 break; 41 } 42 case 'createError': { 43 let createErrorValue = napitest.createError(); 44 console.info('Worker: createError value is ' + createErrorValue); 45 workerPort.postMessage(createErrorValue); 46 break; 47 } 48 case 'createRangeError': { 49 let createRangeErrorValue = napitest.createRangeError(); 50 console.info('Worker: createRangeError value is ' + createRangeErrorValue); 51 workerPort.postMessage(createRangeErrorValue); 52 break; 53 } 54 case 'isExceptionPending': { 55 let isExceptionPendingValue = napitest.isExceptionPending(); 56 console.info('Worker: isExceptionPending value is ' + isExceptionPendingValue); 57 workerPort.postMessage(isExceptionPendingValue); 58 break; 59 } 60 case 'createReference': { 61 let createReferenceValue = napitest.createReference(); 62 console.info('Worker: createReference value is ' + createReferenceValue); 63 workerPort.postMessage(createReferenceValue); 64 break; 65 } 66 case 'referenceRefAndUnref': { 67 let referenceRefAndUnrefValue = napitest.referenceRefAndUnref(); 68 console.info('Worker: referenceRefAndUnref value is ' + referenceRefAndUnrefValue); 69 workerPort.postMessage(referenceRefAndUnrefValue); 70 break; 71 } 72 case 'createArrayAndGetLength': { 73 let array = [1, 2]; 74 let createArrayAndGetLengthValue = napitest.createArrayAndGetLength(array); 75 let createArrayAndGetLengthObj = JSON.stringify(createArrayAndGetLengthValue); 76 console.info('Worker: createArrayAndGetLength value is ' + createArrayAndGetLengthObj); 77 workerPort.postMessage(createArrayAndGetLengthObj); 78 break; 79 } 80 case 'createExternal': { 81 let createExternalValue = napitest.createExternal(); 82 console.info('Worker: createExternal value is ' + createExternalValue); 83 workerPort.postMessage(createExternalValue); 84 break; 85 } 86 case 'createExternalArraybuffer': { 87 let createExternalArraybufferValue = napitest.createExternalArraybuffer(); 88 console.info('Worker: createExternalArraybuffer value is ', createExternalArraybufferValue); 89 let createExternalArraybufferRes = createExternalArraybufferValue instanceof ArrayBuffer; 90 workerPort.postMessage(createExternalArraybufferRes); 91 break; 92 } 93 case 'createObject': { 94 let createObjectValue = napitest.createObject(); 95 console.info('Worker: createObject value is ', createObjectValue); 96 let createObjectRes = createObjectValue instanceof Object; 97 workerPort.postMessage(createObjectRes); 98 break; 99 } 100 case 'createSymbol': { 101 let symbolValue = napitest.createSymbol('symbol'); 102 console.info('Worker: createSymbol value is ' + symbolValue); 103 workerPort.postMessage(symbolValue); 104 break; 105 } 106 case 'createTypeArray': { 107 let typeArrayValue = napitest.createTypeArray(); 108 console.info('Worker: createTypeArray value is ', typeArrayValue); 109 workerPort.postMessage(typeArrayValue instanceof Int32Array); 110 break; 111 } 112 case 'getValueBool': { 113 let boolValue = napitest.getValueBool(false); 114 console.info('Worker: getValueBool value is ', boolValue); 115 workerPort.postMessage(boolValue); 116 break; 117 } 118 case 'createAndGetInt32': { 119 let int32Value = napitest.createAndGetInt32(32); 120 console.info('Worker: createAndGetInt32 value is ', int32Value); 121 workerPort.postMessage(int32Value); 122 break; 123 } 124 case 'createAndGetUInt32': { 125 let uInt32Value = napitest.createAndGetUInt32(32); 126 console.info('Worker: createAndGetUInt32 value is ', uInt32Value); 127 workerPort.postMessage(uInt32Value); 128 break; 129 } 130 case 'createAndGetInt64': { 131 let int64Value = napitest.createAndGetInt64(23); 132 console.info('Worker: createAndGetInt64 value is ', int64Value); 133 workerPort.postMessage(int64Value); 134 break; 135 } 136 case 'createDouble': { 137 let doubleValue = napitest.createDouble(24.67); 138 console.info('Worker: createDouble value is ', doubleValue); 139 workerPort.postMessage(doubleValue); 140 break; 141 } 142 case 'createAndGetStringUtf16': { 143 let utf16Value = napitest.createAndGetStringUtf16('he'); 144 console.info('Worker: createAndGetStringUtf16 value is ', utf16Value); 145 workerPort.postMessage(utf16Value); 146 break; 147 } 148 case 'stringUtf16OfCase': { 149 let utf16CaseValue = napitest.stringUtf16OfCase('abc2r42'); 150 console.info('Worker: stringUtf16OfCase value is ', utf16CaseValue); 151 workerPort.postMessage(utf16CaseValue); 152 break; 153 } 154 case 'getValueDouble': { 155 let valueDouble = napitest.getValueDouble(24.5); 156 console.info('Worker: getValueDouble value is ', valueDouble); 157 workerPort.postMessage(valueDouble); 158 break; 159 } 160 case 'getValueExternal': { 161 let externalValue = napitest.getValueExternal(); 162 console.info('Worker: getValueExternal value is ', externalValue); 163 workerPort.postMessage(externalValue); 164 break; 165 } 166 case 'getNull': { 167 let nullValue = napitest.getNull(); 168 console.info('Worker: getNull value is ', nullValue); 169 workerPort.postMessage(nullValue); 170 break; 171 } 172 case 'getUndefined': { 173 let undefinedValue = napitest.getUndefined(); 174 console.info('Worker: getUndefined value is ', undefinedValue); 175 workerPort.postMessage(undefinedValue); 176 break; 177 } 178 case 'coerceToBool': { 179 let coerceBoolValue = napitest.coerceToBool(0); 180 console.info('Worker: coerceToBool value is ', coerceBoolValue); 181 workerPort.postMessage(coerceBoolValue); 182 break; 183 } 184 case 'coerceToNumber': { 185 let coerceNumberValue = napitest.coerceToNumber('12'); 186 console.info('Worker: coerceToNumber value is ', coerceNumberValue); 187 workerPort.postMessage(coerceNumberValue); 188 break; 189 } 190 case 'coerceToObject': { 191 let obj = napitest.coerceToObject([2, 3]); 192 console.info('Worker: coerceToObject value is: ', obj); 193 workerPort.postMessage(JSON.stringify(obj)); 194 break; 195 } 196 case 'coerceToString': { 197 let value = napitest.coerceToString(123); 198 console.info('Worker: coerceToString value is: ', value); 199 workerPort.postMessage(value); 200 break; 201 } 202 case 'typeOf': { 203 let value = napitest.typeOf('test'); 204 console.info('Worker: typeOf value is: ', value); 205 workerPort.postMessage(value); 206 break; 207 } 208 case 'isArray': { 209 let value = napitest.isArray(); 210 console.info('Worker: isArray value is: ', value); 211 workerPort.postMessage(value); 212 break; 213 } 214 case 'strictEquals': { 215 let value = napitest.strictEquals(); 216 console.info('Worker: strictEquals value is: ', value); 217 workerPort.postMessage(value); 218 break; 219 } 220 case 'getPropertyNames': { 221 let value = napitest.getPropertyNames(); 222 console.info('Worker: getPropertyNames value is: ', value); 223 workerPort.postMessage(value); 224 break; 225 } 226 case 'setProperty': { 227 let value = napitest.setProperty(); 228 console.info('Worker: setProperty value is: ', value); 229 workerPort.postMessage(value instanceof Object); 230 break; 231 } 232 case 'getProperty': { 233 let value = napitest.getProperty(); 234 console.info('Worker: getProperty value is: ', value); 235 workerPort.postMessage(value instanceof Object); 236 break; 237 } 238 case 'hasProperty': { 239 let value = napitest.hasProperty(); 240 console.info('Worker: hasProperty value is: ', value); 241 workerPort.postMessage(value); 242 break; 243 } 244 case 'setAndDeleteProperty': { 245 interface Person { 246 name: string, 247 age: number 248 } 249 250 let peop: Person = { name: 'John', age: 30 }; 251 let value = napitest.setAndDeleteProperty(peop, 'a'); 252 console.info('Worker: setAndDeleteProperty value is: ', value); 253 workerPort.postMessage(value); 254 break; 255 } 256 case 'hasOwnProperty': { 257 interface Person { 258 name: string, 259 age: number 260 } 261 262 let peop: Person = { 263 name: 'zhangsan', 264 age: 18 265 }; 266 let value = napitest.hasOwnProperty(peop, 'name'); 267 console.info('Worker: hasOwnProperty value is: ', value); 268 workerPort.postMessage(value); 269 break; 270 } 271 case 'setNamedProperty': { 272 let value = napitest.setNamedProperty([1, 2], 'e', false); 273 console.info('Worker: setNamedProperty value is: ', value); 274 workerPort.postMessage(value); 275 break; 276 } 277 case 'getNamedProperty': { 278 interface Person { 279 name: string, 280 age: number 281 } 282 283 let peop: Person = { 284 name: 'zhangsan', 285 age: 18 286 }; 287 let value = napitest.getNamedProperty(peop, 'name'); 288 console.info('Worker: getNamedProperty value is: ', value); 289 workerPort.postMessage(value); 290 break; 291 } 292 case 'hasNamedProperty': { 293 interface Person { 294 name: string, 295 age: number 296 } 297 298 let peop: Person = { 299 name: 'zhangsan', 300 age: 18 301 }; 302 let value = napitest.hasNamedProperty(peop, 'name'); 303 console.info('Worker: hasNamedProperty value is: ', value); 304 workerPort.postMessage(value); 305 break; 306 } 307 case 'setElement': { 308 let value = napitest.setElement(); 309 console.info('Worker: setElement value is: ', value); 310 workerPort.postMessage(value instanceof Object); 311 break; 312 } 313 case 'getElement': { 314 let value = napitest.getElement(); 315 console.info('Worker: getElement value is: ', value); 316 workerPort.postMessage(value instanceof Object); 317 break; 318 } 319 case 'hasElement': { 320 let value = napitest.hasElement(); 321 console.info('Worker: hasElement value is: ', value); 322 workerPort.postMessage(value instanceof Object); 323 break; 324 } 325 case 'deleteElement': { 326 let value = napitest.deleteElement(); 327 console.info('Worker: deleteElement value is: ', value); 328 workerPort.postMessage(value instanceof Object); 329 break; 330 } 331 case 'defineProperties': { 332 let value = napitest.defineProperties(); 333 console.info('Worker: defineProperties value is: ', value); 334 workerPort.postMessage(value instanceof Object); 335 break; 336 } 337 case 'callFunctionNull': { 338 let value = napitest.callFunctionNull(null); 339 console.info('Worker: callFunctionNull value is: ', value); 340 workerPort.postMessage(value); 341 break; 342 } 343 case 'napiCreateFunctionFuncNull': { 344 let value = napitest.napiCreateFunctionFuncNull(); 345 console.info('Worker: napiCreateFunctionFuncNull value is: ', value); 346 workerPort.postMessage(value); 347 break; 348 } 349 case 'napiGetCbInfo': { 350 let value = napitest.napiGetCbInfo(12.06); 351 console.info('Worker: napiGetCbInfo value is: ', value); 352 workerPort.postMessage(value); 353 break; 354 } 355 case 'unwrap': { 356 let value = napitest.unwrap(); 357 console.info('Worker: unwrap value is: ', value); 358 workerPort.postMessage(value); 359 break; 360 } 361 case 'removeWrap': { 362 let value = napitest.removeWrap(); 363 console.info('Worker: removeWrap value is: ', value); 364 workerPort.postMessage(value); 365 break; 366 } 367 case 'getVersion': { 368 let value = napitest.getVersion(); 369 console.info('Worker: getVersion value is: ', value); 370 workerPort.postMessage(value); 371 break; 372 } 373 case 'createPromise': { 374 let value = napitest.createPromise(); 375 console.info('Worker: createPromise value is: ', value); 376 workerPort.postMessage(value); 377 break; 378 } 379 case 'resolveAndRejectDeferred': { 380 let value = napitest.resolveAndRejectDeferred(); 381 console.info('Worker: resolveAndRejectDeferred value is: ', value); 382 workerPort.postMessage(value); 383 break; 384 } 385 case 'isPromise': { 386 let value = napitest.isPromise(); 387 console.info('Worker: isPromise value is: ', value); 388 workerPort.postMessage(value); 389 break; 390 } 391 case 'napiCreateThreadsafeFunction': { 392 let value = napitest.napiCreateThreadsafeFunction(); 393 console.info('Worker: napiCreateThreadsafeFunction value is: ', value); 394 workerPort.postMessage(value); 395 break; 396 } 397 case 'napiDeleteSerializationDataTest': { 398 let value = napitest.napiDeleteSerializationData(); 399 console.info('Worker: napiDeleteSerializationDataTest value is: ', value); 400 workerPort.postMessage(value); 401 break; 402 } 403 case 'napiCallThreadsafeFunction': { 404 let value = napitest.napiCallThreadsafeFunction(); 405 console.info('Worker: napiCallThreadsafeFunction value is: ', value); 406 workerPort.postMessage(value); 407 break; 408 } 409 case 'napiAnotherThreadSafeTest': { 410 let value = napitest.ThreadSafeTestNull(() => 666); 411 console.info('Worker: napiAnotherThreadSafeTest value is: ', value); 412 workerPort.postMessage(value); 413 break; 414 } 415 case 'napiRefThreadsafeFunction': { 416 let value = napitest.napiRefthreadSafeFunction(); 417 console.info('Worker: napiRefThreadsafeFunction value is: ', value); 418 workerPort.postMessage(value); 419 break; 420 } 421 case 'napiCreateDate': { 422 let value = napitest.napiCreateDate(); 423 console.info('Worker: napiCreateDate value is: ', value); 424 workerPort.postMessage(value); 425 break; 426 } 427 case 'napiCreateBigintInt64': { 428 let value = napitest.napiCreateBigintInt64(); 429 console.info('Worker: napiCreateBigintInt64 value is: ', value); 430 workerPort.postMessage(value); 431 break; 432 } 433 case 'napiCreateBigintUint64': { 434 let value = napitest.napiCreateBigintUint64(); 435 console.info('Worker: napiCreateBigintUint64 value is: ', value); 436 workerPort.postMessage(value); 437 break; 438 } 439 case 'napiCreateBigintWords': { 440 let value = napitest.napiCreateBigintWords(); 441 console.info('Worker: napiCreateBigintWords value is: ', value); 442 workerPort.postMessage(value); 443 break; 444 } 445 case 'GetAllPropertyNamesEnvNull': { 446 let value = napitest.GetAllPropertyNamesEnvNull(); 447 console.info('Worker: GetAllPropertyNamesEnvNull value is: ', value); 448 workerPort.postMessage(value); 449 break; 450 } 451 case 'napiSetInstanceData': { 452 let value = napitest.napiSetInstanceData(); 453 console.info('Worker: napiSetInstanceData value is: ', value); 454 workerPort.postMessage(value); 455 break; 456 } 457 case 'getModuleFileName': { 458 let value = napitest.getModuleFileName().indexOf('.so'); 459 console.info('Worker: getModuleFileName value is: ', value); 460 workerPort.postMessage(value); 461 break; 462 } 463 case 'createAsyncResource': { 464 let value = napitest.createAsyncResource({ 465 foo: 'bar' 466 }, false); 467 console.info('Worker: createAsyncResource value is: ', value); 468 workerPort.postMessage(value); 469 break; 470 } 471 case 'asyncWorkWithQos': { 472 let value = napitest.asyncWorkWithQos(1000, (input) => { 473 console.info('Worker: asyncWorkWithQos ' + (input * 2)); 474 return input * 2; 475 }); 476 console.info('Worker: asyncWorkWithQos value is: ', value); 477 workerPort.postMessage(value); 478 break; 479 } 480 case 'napiRunScriptPathEnvNull': { 481 let value = napitest.napiRunScriptPathEnvNull(); 482 console.info('Worker: napiRunScriptPathEnvNull value is: ', value); 483 workerPort.postMessage(value); 484 break; 485 } 486 case 'napiLoadModuleTest': { 487 let value = napitest.napiLoadModule(); 488 console.info('Worker: napiLoadModuleTest value is: ', value); 489 workerPort.postMessage(value); 490 break; 491 } 492 case 'createObjectWithProperties': { 493 let value = napitest.createObjectWithProperties(); 494 console.info('Worker: createObjectWithProperties value is: ', value); 495 workerPort.postMessage(value); 496 break; 497 } 498 case 'createObjectWithNamedProperties': { 499 let value = napitest.createObjectWithNamedProperties(); 500 console.info('Worker: createObjectWithNamedProperties value is: ', value); 501 workerPort.postMessage(value); 502 break; 503 } 504 case 'coerceToNativeBindingObjectEnvNull': { 505 let value = napitest.coerceToNativeBindingObjectEnvNull(null); 506 console.info('Worker: coerceToNativeBindingObjectEnvNull value is: ', value); 507 workerPort.postMessage(value); 508 break; 509 } 510 case 'napiSerializeTest': { 511 let value = napitest.napiSerialize(); 512 console.info('Worker: napiSerializeTest value is: ', value); 513 workerPort.postMessage(value); 514 break; 515 } 516 case 'napiDeSerializeTest': { 517 let value = napitest.napiDeSerialize(); 518 console.info('Worker: napiDeSerializeTest value is: ', value); 519 workerPort.postMessage(value); 520 break; 521 } 522 case 'napiIsSendableTest': { 523 let value = napitest.NapiIsSendable([1, 2]); 524 console.info('Worker: napiIsSendableTest value is: ', value); 525 workerPort.postMessage(value); 526 break; 527 } 528 case 'NapiCreateSendableObject': { 529 let value = napitest.NapiCreateSendableObject(); 530 console.info('Worker: NapiCreateSendableObject value is: ', value); 531 workerPort.postMessage(napitest.NapiIsSendable(value)); 532 break; 533 } 534 case 'NapiCreateSendableArray': { 535 let value = napitest.NapiCreateSendableArray(); 536 console.info('Worker: NapiCreateSendableArray value is: ', value); 537 let res = value.length == 0; 538 workerPort.postMessage(res && napitest.NapiIsSendable(value)); 539 break; 540 } 541 case 'NapiCreateSendableArrayWithLength': { 542 let value = napitest.NapiCreateSendableArrayWithLength(); 543 console.info('Worker: NapiCreateSendableArrayWithLength value is: ', value); 544 let res = value.length == 1; 545 workerPort.postMessage(res && napitest.NapiIsSendable(value)); 546 break; 547 } 548 case 'NapiCreateSendableArrayBuffer': { 549 let value = napitest.NapiCreateSendableArrayBuffer(); 550 console.info('Worker: NapiCreateSendableArrayBuffer value is: ', value); 551 let res = value.byteLength == 1024; 552 workerPort.postMessage(res && napitest.NapiIsSendable(value)); 553 break; 554 } 555 case 'NapiCreateSendableTypedArray': { 556 let value = napitest.NapiCreateSendableTypedArray(); 557 console.info('Worker: NapiCreateSendableTypedArray value is: ', value); 558 let res = value.byteLength == 1024; 559 workerPort.postMessage(res && napitest.NapiIsSendable(value)); 560 break; 561 } 562 case 'NapiWrapSendable': { 563 let value = napitest.NapiCreateSendableObject(); 564 napitest.NapiWrapSendable(value, 'data'); 565 console.info('Worker: NapiWrapSendable value is: ', value); 566 let res1 = napitest.NapiUnwrapSendable(value) == 'data'; 567 let res2 = napitest.NapiRemoveWrapSendable(value) == 'data'; 568 let res3 = napitest.NapiUnwrapSendable(value) == undefined; 569 workerPort.postMessage(res1 && res2 && res3); 570 break; 571 } 572 case 'NapiWrapSendableWithSize': { 573 let value = napitest.NapiCreateSendableObject(); 574 napitest.NapiWrapSendableWithSize(value, 'data'); 575 console.info('Worker: NapiWrapSendableWithSize value is: ', value); 576 let res1 = napitest.NapiUnwrapSendable(value) == 'data'; 577 let res2 = napitest.NapiRemoveWrapSendable(value) == 'data'; 578 let res3 = napitest.NapiUnwrapSendable(value) == undefined; 579 workerPort.postMessage(res1 && res2 && res3); 580 break; 581 } 582 default: 583 break; 584 } 585};