mirror of
https://github.com/Start9Labs/start-sdk.git
synced 2026-03-31 04:33:40 +00:00
feat: Add crypto, getRandomString
This commit is contained in:
10
lib/types.ts
10
lib/types.ts
@@ -390,10 +390,12 @@ export type Effects = {
|
|||||||
|
|
||||||
stopped(packageId?: string): Promise<boolean>
|
stopped(packageId?: string): Promise<boolean>
|
||||||
|
|
||||||
vaultList(): Promise<string[]>
|
vault: {
|
||||||
vaultSet(opt: { key: string; value: string }): Promise<void>
|
list(): Promise<string[]>
|
||||||
vaultMove(opt: { fromKey: string; toKey: string }): Promise<void>
|
set(opt: { key: string; value: string }): Promise<void>
|
||||||
vaultDelete(opt: { key: string }): Promise<void>
|
move(opt: { fromKey: string; toKey: string }): Promise<void>
|
||||||
|
delete(opt: { key: string }): Promise<void>
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
|
|||||||
@@ -1,112 +1,10 @@
|
|||||||
import { DefaultString } from "../config/configTypes"
|
import { DefaultString } from "../config/configTypes"
|
||||||
|
import { getRandomString } from "./getRandomString"
|
||||||
|
|
||||||
export function getDefaultString(defaultSpec: DefaultString): string {
|
export function getDefaultString(defaultSpec: DefaultString): string {
|
||||||
if (typeof defaultSpec === "string") {
|
if (typeof defaultSpec === "string") {
|
||||||
return defaultSpec
|
return defaultSpec
|
||||||
} else {
|
} else {
|
||||||
let s = ""
|
return getRandomString(defaultSpec)
|
||||||
for (let i = 0; i < defaultSpec.len; i++) {
|
|
||||||
s = s + getRandomCharInSet(defaultSpec.charset)
|
|
||||||
}
|
|
||||||
|
|
||||||
return s
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// a,g,h,A-Z,,,,-
|
|
||||||
export function getRandomCharInSet(charset: string): string {
|
|
||||||
const set = stringToCharSet(charset)
|
|
||||||
let charIdx = Math.floor(Math.random() * set.len)
|
|
||||||
for (let range of set.ranges) {
|
|
||||||
if (range.len > charIdx) {
|
|
||||||
return String.fromCharCode(range.start.charCodeAt(0) + charIdx)
|
|
||||||
}
|
|
||||||
charIdx -= range.len
|
|
||||||
}
|
|
||||||
throw new Error("unreachable")
|
|
||||||
}
|
|
||||||
|
|
||||||
function stringToCharSet(charset: string): CharSet {
|
|
||||||
let set: CharSet = { ranges: [], len: 0 }
|
|
||||||
let start: string | null = null
|
|
||||||
let end: string | null = null
|
|
||||||
let in_range = false
|
|
||||||
for (let char of charset) {
|
|
||||||
switch (char) {
|
|
||||||
case ",":
|
|
||||||
if (start !== null && end !== null) {
|
|
||||||
if (start!.charCodeAt(0) > end!.charCodeAt(0)) {
|
|
||||||
throw new Error("start > end of charset")
|
|
||||||
}
|
|
||||||
const len = end.charCodeAt(0) - start.charCodeAt(0) + 1
|
|
||||||
set.ranges.push({
|
|
||||||
start,
|
|
||||||
end,
|
|
||||||
len,
|
|
||||||
})
|
|
||||||
set.len += len
|
|
||||||
start = null
|
|
||||||
end = null
|
|
||||||
in_range = false
|
|
||||||
} else if (start !== null && !in_range) {
|
|
||||||
set.len += 1
|
|
||||||
set.ranges.push({ start, end: start, len: 1 })
|
|
||||||
start = null
|
|
||||||
} else if (start !== null && in_range) {
|
|
||||||
end = ","
|
|
||||||
} else if (start === null && end === null && !in_range) {
|
|
||||||
start = ","
|
|
||||||
} else {
|
|
||||||
throw new Error('unexpected ","')
|
|
||||||
}
|
|
||||||
break
|
|
||||||
case "-":
|
|
||||||
if (start === null) {
|
|
||||||
start = "-"
|
|
||||||
} else if (!in_range) {
|
|
||||||
in_range = true
|
|
||||||
} else if (in_range && end === null) {
|
|
||||||
end = "-"
|
|
||||||
} else {
|
|
||||||
throw new Error('unexpected "-"')
|
|
||||||
}
|
|
||||||
break
|
|
||||||
default:
|
|
||||||
if (start === null) {
|
|
||||||
start = char
|
|
||||||
} else if (in_range && end === null) {
|
|
||||||
end = char
|
|
||||||
} else {
|
|
||||||
throw new Error(`unexpected "${char}"`)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (start !== null && end !== null) {
|
|
||||||
if (start!.charCodeAt(0) > end!.charCodeAt(0)) {
|
|
||||||
throw new Error("start > end of charset")
|
|
||||||
}
|
|
||||||
const len = end.charCodeAt(0) - start.charCodeAt(0) + 1
|
|
||||||
set.ranges.push({
|
|
||||||
start,
|
|
||||||
end,
|
|
||||||
len,
|
|
||||||
})
|
|
||||||
set.len += len
|
|
||||||
} else if (start !== null) {
|
|
||||||
set.len += 1
|
|
||||||
set.ranges.push({
|
|
||||||
start,
|
|
||||||
end: start,
|
|
||||||
len: 1,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return set
|
|
||||||
}
|
|
||||||
type CharSet = {
|
|
||||||
ranges: {
|
|
||||||
start: string
|
|
||||||
end: string
|
|
||||||
len: number
|
|
||||||
}[]
|
|
||||||
len: number
|
|
||||||
}
|
|
||||||
|
|||||||
98
lib/util/getRandomCharInSet.ts
Normal file
98
lib/util/getRandomCharInSet.ts
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
// a,g,h,A-Z,,,,-
|
||||||
|
|
||||||
|
import crypto from "crypto"
|
||||||
|
export function getRandomCharInSet(charset: string): string {
|
||||||
|
const set = stringToCharSet(charset)
|
||||||
|
let charIdx = crypto.randomInt(0, set.len)
|
||||||
|
for (let range of set.ranges) {
|
||||||
|
if (range.len > charIdx) {
|
||||||
|
return String.fromCharCode(range.start.charCodeAt(0) + charIdx)
|
||||||
|
}
|
||||||
|
charIdx -= range.len
|
||||||
|
}
|
||||||
|
throw new Error("unreachable")
|
||||||
|
}
|
||||||
|
function stringToCharSet(charset: string): CharSet {
|
||||||
|
let set: CharSet = { ranges: [], len: 0 }
|
||||||
|
let start: string | null = null
|
||||||
|
let end: string | null = null
|
||||||
|
let in_range = false
|
||||||
|
for (let char of charset) {
|
||||||
|
switch (char) {
|
||||||
|
case ",":
|
||||||
|
if (start !== null && end !== null) {
|
||||||
|
if (start!.charCodeAt(0) > end!.charCodeAt(0)) {
|
||||||
|
throw new Error("start > end of charset")
|
||||||
|
}
|
||||||
|
const len = end.charCodeAt(0) - start.charCodeAt(0) + 1
|
||||||
|
set.ranges.push({
|
||||||
|
start,
|
||||||
|
end,
|
||||||
|
len,
|
||||||
|
})
|
||||||
|
set.len += len
|
||||||
|
start = null
|
||||||
|
end = null
|
||||||
|
in_range = false
|
||||||
|
} else if (start !== null && !in_range) {
|
||||||
|
set.len += 1
|
||||||
|
set.ranges.push({ start, end: start, len: 1 })
|
||||||
|
start = null
|
||||||
|
} else if (start !== null && in_range) {
|
||||||
|
end = ","
|
||||||
|
} else if (start === null && end === null && !in_range) {
|
||||||
|
start = ","
|
||||||
|
} else {
|
||||||
|
throw new Error('unexpected ","')
|
||||||
|
}
|
||||||
|
break
|
||||||
|
case "-":
|
||||||
|
if (start === null) {
|
||||||
|
start = "-"
|
||||||
|
} else if (!in_range) {
|
||||||
|
in_range = true
|
||||||
|
} else if (in_range && end === null) {
|
||||||
|
end = "-"
|
||||||
|
} else {
|
||||||
|
throw new Error('unexpected "-"')
|
||||||
|
}
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
if (start === null) {
|
||||||
|
start = char
|
||||||
|
} else if (in_range && end === null) {
|
||||||
|
end = char
|
||||||
|
} else {
|
||||||
|
throw new Error(`unexpected "${char}"`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (start !== null && end !== null) {
|
||||||
|
if (start!.charCodeAt(0) > end!.charCodeAt(0)) {
|
||||||
|
throw new Error("start > end of charset")
|
||||||
|
}
|
||||||
|
const len = end.charCodeAt(0) - start.charCodeAt(0) + 1
|
||||||
|
set.ranges.push({
|
||||||
|
start,
|
||||||
|
end,
|
||||||
|
len,
|
||||||
|
})
|
||||||
|
set.len += len
|
||||||
|
} else if (start !== null) {
|
||||||
|
set.len += 1
|
||||||
|
set.ranges.push({
|
||||||
|
start,
|
||||||
|
end: start,
|
||||||
|
len: 1,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return set
|
||||||
|
}
|
||||||
|
type CharSet = {
|
||||||
|
ranges: {
|
||||||
|
start: string
|
||||||
|
end: string
|
||||||
|
len: number
|
||||||
|
}[]
|
||||||
|
len: number
|
||||||
|
}
|
||||||
11
lib/util/getRandomString.ts
Normal file
11
lib/util/getRandomString.ts
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import { RandomString } from "../config/configTypes"
|
||||||
|
import { getRandomCharInSet } from "./getRandomCharInSet"
|
||||||
|
|
||||||
|
export function getRandomString(generator: RandomString): string {
|
||||||
|
let s = ""
|
||||||
|
for (let i = 0; i < generator.len; i++) {
|
||||||
|
s = s + getRandomCharInSet(generator.charset)
|
||||||
|
}
|
||||||
|
|
||||||
|
return s
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user