Crypto/UUID (#639)

JS: if possible, use crypto API to generate UUID
This commit is contained in:
Ivan Hetman 2022-12-07 13:33:27 +02:00 committed by GitHub
parent f77cb9d52c
commit e12f99ab49
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 56 additions and 3 deletions

View File

@ -15,8 +15,10 @@
*/ */
package org.teavm.classlib.java.util; package org.teavm.classlib.java.util;
public class TUUID { import org.teavm.classlib.PlatformDetector;
import org.teavm.jso.crypto.Crypto;
public class TUUID {
private String value; private String value;
private TUUID(String value) { private TUUID(String value) {
@ -44,9 +46,13 @@ public class TUUID {
} }
public static TUUID randomUUID() { public static TUUID randomUUID() {
if (PlatformDetector.isJavaScript() && Crypto.isSupported()) {
return new TUUID(Crypto.current().randomUUID());
} else {
String value = s4() + s4() + "-" + s4() + "-" + s4() + "-" + s4() + "-" + s4() + s4() + s4(); String value = s4() + s4() + "-" + s4() + "-" + s4() + "-" + s4() + "-" + s4() + s4() + s4();
return new TUUID(value); return new TUUID(value);
} }
}
private static String s4() { private static String s4() {
return Integer.toString((int) Math.floor((1 + Math.random()) * 65536), 16).substring(1); return Integer.toString((int) Math.floor((1 + Math.random()) * 65536), 16).substring(1);

View File

@ -0,0 +1,47 @@
/*
* Copyright 2022 ihromant.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.teavm.jso.crypto;
import org.teavm.jso.JSBody;
import org.teavm.jso.JSObject;
import org.teavm.jso.typedarrays.Int16Array;
import org.teavm.jso.typedarrays.Int32Array;
import org.teavm.jso.typedarrays.Int8Array;
import org.teavm.jso.typedarrays.Uint16Array;
import org.teavm.jso.typedarrays.Uint8Array;
import org.teavm.jso.typedarrays.Uint8ClampedArray;
public abstract class Crypto implements JSObject {
@JSBody(script = "return window.crypto != null;")
public static native boolean isSupported();
@JSBody(script = "return window.crypto;")
public static native Crypto current();
public abstract String randomUUID();
public abstract void getRandomValues(Int8Array arr);
public abstract void getRandomValues(Uint8Array arr);
public abstract void getRandomValues(Uint8ClampedArray arr);
public abstract void getRandomValues(Int16Array arr);
public abstract void getRandomValues(Uint16Array arr);
public abstract void getRandomValues(Int32Array arr);
}