@chikn-game-assets/runtime 0.1.0-rc.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/ATTRIBUTION.md +19 -0
- package/CHIKN-COMMUNITY-ASSET-NOTICE.md +20 -0
- package/COMMERCIAL_USE.md +9 -0
- package/LICENSE +201 -0
- package/README.md +46 -0
- package/catalog/asset-ids.json +1887 -0
- package/dist/index.d.ts +136 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +247 -0
- package/dist/index.js.map +1 -0
- package/package.json +16 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
export declare const CHIKN_ASSET_PACKAGE = "@chikn-game-assets/runtime";
|
|
2
|
+
export declare const CHIKN_ASSET_MANIFEST_PATH = "runtime/manifest.json";
|
|
3
|
+
export declare const CHIKN_RUNTIME_LICENSE = "Apache-2.0";
|
|
4
|
+
export declare const CHIKN_CONTENT_TERMS: {
|
|
5
|
+
readonly licenseId: "CHIKN-COMMUNITY-NONCOMMERCIAL";
|
|
6
|
+
readonly ownership: "third-party-chikn-rights-holder";
|
|
7
|
+
readonly hostingAuthorized: true;
|
|
8
|
+
readonly communityUseAuthorized: true;
|
|
9
|
+
readonly commercialUse: "separate-agreement-required";
|
|
10
|
+
readonly sublicenseGrantedByRepository: false;
|
|
11
|
+
readonly noticePath: "CHIKN-COMMUNITY-ASSET-NOTICE.md";
|
|
12
|
+
};
|
|
13
|
+
export type AssetProfileId = 'default' | 'high' | (string & {});
|
|
14
|
+
/** Absolute ceiling for a single asset response when the caller supplies no explicit limit. */
|
|
15
|
+
export declare const DEFAULT_MAX_ASSET_BYTES: number;
|
|
16
|
+
export interface ChiknAssetManifest {
|
|
17
|
+
schema: 'roost2d.assets/v1';
|
|
18
|
+
version: string;
|
|
19
|
+
generatedAt: string;
|
|
20
|
+
rightsDocumentSha256: string;
|
|
21
|
+
profiles: Record<AssetProfileId, {
|
|
22
|
+
maxAtlasSize: number;
|
|
23
|
+
scale: number;
|
|
24
|
+
gpuBudgetBytes: number;
|
|
25
|
+
}>;
|
|
26
|
+
files: Array<{
|
|
27
|
+
id: string;
|
|
28
|
+
aliases?: string[];
|
|
29
|
+
kind?: string;
|
|
30
|
+
mediaType: string;
|
|
31
|
+
license?: 'CHIKN-COMMUNITY-NONCOMMERCIAL' | 'Apache-2.0';
|
|
32
|
+
ownership?: 'third-party-chikn-rights-holder';
|
|
33
|
+
hostingAuthorized?: boolean;
|
|
34
|
+
communityUseAuthorized?: boolean;
|
|
35
|
+
sublicenseGrantedByRepository?: false;
|
|
36
|
+
commercialUse?: string;
|
|
37
|
+
attribution?: string;
|
|
38
|
+
rightsIds?: string[];
|
|
39
|
+
variants: Array<{
|
|
40
|
+
profile: AssetProfileId;
|
|
41
|
+
path: string;
|
|
42
|
+
bytes: number;
|
|
43
|
+
integrity: {
|
|
44
|
+
algorithm: 'sha256';
|
|
45
|
+
value: string;
|
|
46
|
+
};
|
|
47
|
+
scale: number;
|
|
48
|
+
frameId?: string;
|
|
49
|
+
frame?: {
|
|
50
|
+
x: number;
|
|
51
|
+
y: number;
|
|
52
|
+
width: number;
|
|
53
|
+
height: number;
|
|
54
|
+
sourceWidth: number;
|
|
55
|
+
sourceHeight: number;
|
|
56
|
+
};
|
|
57
|
+
}>;
|
|
58
|
+
}>;
|
|
59
|
+
bundles: Array<{
|
|
60
|
+
id: string;
|
|
61
|
+
lazy: boolean;
|
|
62
|
+
preload?: boolean;
|
|
63
|
+
estimatedGpuBytes?: number;
|
|
64
|
+
items: Array<{
|
|
65
|
+
assetId: string;
|
|
66
|
+
required: boolean;
|
|
67
|
+
fallbackAssetId?: string;
|
|
68
|
+
}>;
|
|
69
|
+
}>;
|
|
70
|
+
}
|
|
71
|
+
export type ChiknAssetFile = ChiknAssetManifest['files'][number];
|
|
72
|
+
export type ChiknAssetVariant = ChiknAssetFile['variants'][number];
|
|
73
|
+
export interface LoadChiknPackOptions {
|
|
74
|
+
manifestUrl?: string | URL;
|
|
75
|
+
baseUrl?: string | URL;
|
|
76
|
+
/** Required alongside `manifestUrl` before assets can be fetched; never inferred from it. */
|
|
77
|
+
assetBaseUrl?: string | URL;
|
|
78
|
+
profile?: AssetProfileId;
|
|
79
|
+
fetch?: typeof globalThis.fetch;
|
|
80
|
+
/** Pin the manifest itself. Per-asset digests are only trustworthy if the manifest is. */
|
|
81
|
+
expectedManifestSha256?: string;
|
|
82
|
+
}
|
|
83
|
+
export interface LoadedChiknPack {
|
|
84
|
+
manifest: ChiknAssetManifest;
|
|
85
|
+
manifestUrl: URL;
|
|
86
|
+
/** Root that variant paths resolve against. Undefined when only a bare `manifestUrl` was given. */
|
|
87
|
+
assetBaseUrl?: URL;
|
|
88
|
+
profile: AssetProfileId;
|
|
89
|
+
assetIds: readonly string[];
|
|
90
|
+
bundleIds: readonly string[];
|
|
91
|
+
findAsset(id: string): ChiknAssetFile | undefined;
|
|
92
|
+
}
|
|
93
|
+
/** The caller must explicitly choose a host or local base. No production host is embedded. */
|
|
94
|
+
export declare function resolveManifestUrl(baseUrl: string | URL): URL;
|
|
95
|
+
export declare function fetchManifest(baseUrl: string | URL, fetcher?: typeof fetch): Promise<ChiknAssetManifest>;
|
|
96
|
+
export declare function fetchManifestUrl(manifestUrl: string | URL, fetcher?: typeof fetch, options?: {
|
|
97
|
+
expectedManifestSha256?: string;
|
|
98
|
+
}): Promise<ChiknAssetManifest>;
|
|
99
|
+
export declare function loadChiknPack(options: LoadChiknPackOptions): Promise<LoadedChiknPack>;
|
|
100
|
+
export interface FetchAssetOptions {
|
|
101
|
+
profile?: AssetProfileId;
|
|
102
|
+
fetch?: typeof globalThis.fetch;
|
|
103
|
+
maxAssetBytes?: number;
|
|
104
|
+
signal?: AbortSignal;
|
|
105
|
+
}
|
|
106
|
+
/** Resolve the variant a given profile should use, with a documented fallback to `default`. */
|
|
107
|
+
export declare function selectVariant(file: ChiknAssetFile, profile?: AssetProfileId): ChiknAssetVariant;
|
|
108
|
+
export declare function resolveAssetUrl(pack: LoadedChiknPack, assetId: string, profile?: AssetProfileId): URL;
|
|
109
|
+
/**
|
|
110
|
+
* Low-level, uncached: fetches one asset and verifies its declared byte count and SHA-256 digest.
|
|
111
|
+
* Many logical ids share a single atlas page, so calling this per id re-downloads the same bytes.
|
|
112
|
+
* Use `createChiknAssetCache` for batches, or `@roost2d/assets` for a full cached integration.
|
|
113
|
+
*/
|
|
114
|
+
export declare function fetchAssetBytes(pack: LoadedChiknPack, assetId: string, options?: FetchAssetOptions): Promise<ArrayBuffer>;
|
|
115
|
+
export interface ChiknAssetCache {
|
|
116
|
+
fetch(assetId: string, options?: FetchAssetOptions): Promise<ArrayBuffer>;
|
|
117
|
+
unload(assetId: string, profile?: AssetProfileId): boolean;
|
|
118
|
+
clear(): void;
|
|
119
|
+
readonly size: number;
|
|
120
|
+
}
|
|
121
|
+
/** Caches verified bytes by resolved URL, so ids sharing one atlas page download it once. */
|
|
122
|
+
export declare function createChiknAssetCache(pack: LoadedChiknPack, defaults?: FetchAssetOptions): ChiknAssetCache;
|
|
123
|
+
export interface CharacterRigAdapterOptions<TDefinition, TRuntime> {
|
|
124
|
+
loadDefinition(): Promise<TDefinition>;
|
|
125
|
+
create(definition: TDefinition): TRuntime;
|
|
126
|
+
applySkin?(runtime: TRuntime, skin: string): void;
|
|
127
|
+
attachTrait?(runtime: TRuntime, groupId: string): void;
|
|
128
|
+
skin?: string;
|
|
129
|
+
traits?: readonly string[];
|
|
130
|
+
}
|
|
131
|
+
export declare function createCharacterRig<TDefinition, TRuntime>(options: CharacterRigAdapterOptions<TDefinition, TRuntime>): Promise<TRuntime>;
|
|
132
|
+
export declare function createChiknRig<TDefinition, TRuntime>(options: CharacterRigAdapterOptions<TDefinition, TRuntime>): Promise<TRuntime>;
|
|
133
|
+
export declare function createRoostrRig<TDefinition, TRuntime>(options: CharacterRigAdapterOptions<TDefinition, TRuntime>): Promise<TRuntime>;
|
|
134
|
+
export declare function selectProfile(profile?: AssetProfileId): AssetProfileId;
|
|
135
|
+
export declare function assetId(group: string, name: string): string;
|
|
136
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
export const CHIKN_ASSET_PACKAGE = '@chikn-game-assets/runtime';
|
|
2
|
+
export const CHIKN_ASSET_MANIFEST_PATH = 'runtime/manifest.json';
|
|
3
|
+
export const CHIKN_RUNTIME_LICENSE = 'Apache-2.0';
|
|
4
|
+
export const CHIKN_CONTENT_TERMS = {
|
|
5
|
+
licenseId: 'CHIKN-COMMUNITY-NONCOMMERCIAL',
|
|
6
|
+
ownership: 'third-party-chikn-rights-holder',
|
|
7
|
+
hostingAuthorized: true,
|
|
8
|
+
communityUseAuthorized: true,
|
|
9
|
+
commercialUse: 'separate-agreement-required',
|
|
10
|
+
sublicenseGrantedByRepository: false,
|
|
11
|
+
noticePath: 'CHIKN-COMMUNITY-ASSET-NOTICE.md',
|
|
12
|
+
};
|
|
13
|
+
/** Absolute ceiling for a single asset response when the caller supplies no explicit limit. */
|
|
14
|
+
export const DEFAULT_MAX_ASSET_BYTES = 64 * 1024 * 1024;
|
|
15
|
+
/** The caller must explicitly choose a host or local base. No production host is embedded. */
|
|
16
|
+
export function resolveManifestUrl(baseUrl) {
|
|
17
|
+
if (!baseUrl)
|
|
18
|
+
throw new Error('baseUrl is required');
|
|
19
|
+
return new URL(CHIKN_ASSET_MANIFEST_PATH, ensureDirectoryUrl(baseUrl));
|
|
20
|
+
}
|
|
21
|
+
export async function fetchManifest(baseUrl, fetcher = fetch) {
|
|
22
|
+
return fetchManifestUrl(resolveManifestUrl(baseUrl), fetcher);
|
|
23
|
+
}
|
|
24
|
+
export async function fetchManifestUrl(manifestUrl, fetcher = fetch, options = {}) {
|
|
25
|
+
if (!fetcher)
|
|
26
|
+
throw new Error('A fetch implementation is required');
|
|
27
|
+
const url = assertFetchableUrl(manifestUrl);
|
|
28
|
+
const response = await fetcher(url);
|
|
29
|
+
if (!response.ok)
|
|
30
|
+
throw new Error(`Unable to load Chikn asset manifest: ${response.status}`);
|
|
31
|
+
const text = await response.text();
|
|
32
|
+
if (options.expectedManifestSha256) {
|
|
33
|
+
const actual = await sha256Hex(new TextEncoder().encode(text));
|
|
34
|
+
if (actual.toLowerCase() !== options.expectedManifestSha256.toLowerCase()) {
|
|
35
|
+
throw new Error(`Chikn asset manifest digest mismatch: expected ${options.expectedManifestSha256}, got ${actual}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const manifest = JSON.parse(text);
|
|
39
|
+
if (manifest.schema !== 'roost2d.assets/v1' || !manifest.files?.length)
|
|
40
|
+
throw new Error('Invalid or empty Chikn asset manifest');
|
|
41
|
+
return manifest;
|
|
42
|
+
}
|
|
43
|
+
export async function loadChiknPack(options) {
|
|
44
|
+
if (!options.manifestUrl && !options.baseUrl)
|
|
45
|
+
throw new Error('manifestUrl or baseUrl is required');
|
|
46
|
+
const manifestUrl = options.manifestUrl ? new URL(options.manifestUrl, globalThis.location?.href) : resolveManifestUrl(options.baseUrl);
|
|
47
|
+
// `baseUrl` roots both the manifest and the assets. A bare `manifestUrl` roots only itself:
|
|
48
|
+
// deriving an asset root from it would mean guessing, so callers must say what it is.
|
|
49
|
+
const assetBaseUrl = options.assetBaseUrl
|
|
50
|
+
? ensureDirectoryUrl(options.assetBaseUrl)
|
|
51
|
+
: options.baseUrl ? ensureDirectoryUrl(options.baseUrl) : undefined;
|
|
52
|
+
const manifest = await fetchManifestUrl(manifestUrl, options.fetch, { expectedManifestSha256: options.expectedManifestSha256 });
|
|
53
|
+
const ids = [...new Set(manifest.files.flatMap(({ id, aliases = [] }) => [id, ...aliases]))];
|
|
54
|
+
const index = new Map(manifest.files.map((file) => [file.id, file]));
|
|
55
|
+
for (const file of manifest.files)
|
|
56
|
+
for (const alias of file.aliases ?? [])
|
|
57
|
+
index.set(alias, file);
|
|
58
|
+
return { manifest, manifestUrl, assetBaseUrl, profile: options.profile ?? 'default', assetIds: ids, bundleIds: manifest.bundles.map(({ id }) => id), findAsset: (id) => index.get(id) };
|
|
59
|
+
}
|
|
60
|
+
/** Resolve the variant a given profile should use, with a documented fallback to `default`. */
|
|
61
|
+
export function selectVariant(file, profile = 'default') {
|
|
62
|
+
const variant = file.variants.find((candidate) => candidate.profile === profile)
|
|
63
|
+
?? file.variants.find((candidate) => candidate.profile === 'default')
|
|
64
|
+
?? file.variants[0];
|
|
65
|
+
if (!variant)
|
|
66
|
+
throw new Error(`Asset has no variants: ${file.id}`);
|
|
67
|
+
return variant;
|
|
68
|
+
}
|
|
69
|
+
export function resolveAssetUrl(pack, assetId, profile) {
|
|
70
|
+
if (!pack.assetBaseUrl) {
|
|
71
|
+
throw new Error('assetBaseUrl is required to resolve asset URLs; pass baseUrl, or assetBaseUrl alongside manifestUrl');
|
|
72
|
+
}
|
|
73
|
+
const file = pack.findAsset(assetId);
|
|
74
|
+
if (!file)
|
|
75
|
+
throw new Error(`Unknown Chikn asset: ${assetId}`);
|
|
76
|
+
const variant = selectVariant(file, profile ?? pack.profile);
|
|
77
|
+
const reason = portablePathError(variant.path);
|
|
78
|
+
if (reason)
|
|
79
|
+
throw new Error(`${file.id}: ${reason}`);
|
|
80
|
+
const url = new URL(variant.path, pack.assetBaseUrl);
|
|
81
|
+
if (url.origin !== pack.assetBaseUrl.origin || !url.pathname.startsWith(pack.assetBaseUrl.pathname)) {
|
|
82
|
+
throw new Error(`${file.id}: resolved asset URL escapes the asset base`);
|
|
83
|
+
}
|
|
84
|
+
return url;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Low-level, uncached: fetches one asset and verifies its declared byte count and SHA-256 digest.
|
|
88
|
+
* Many logical ids share a single atlas page, so calling this per id re-downloads the same bytes.
|
|
89
|
+
* Use `createChiknAssetCache` for batches, or `@roost2d/assets` for a full cached integration.
|
|
90
|
+
*/
|
|
91
|
+
export async function fetchAssetBytes(pack, assetId, options = {}) {
|
|
92
|
+
const file = pack.findAsset(assetId);
|
|
93
|
+
if (!file)
|
|
94
|
+
throw new Error(`Unknown Chikn asset: ${assetId}`);
|
|
95
|
+
const profile = options.profile ?? pack.profile;
|
|
96
|
+
const variant = selectVariant(file, profile);
|
|
97
|
+
if (!Number.isSafeInteger(variant.bytes) || variant.bytes < 0)
|
|
98
|
+
throw new Error(`${file.id}: invalid declared byte count`);
|
|
99
|
+
if (variant.integrity?.algorithm !== 'sha256' || !/^sha256-[A-Za-z0-9+/]{43}=$/.test(variant.integrity.value)) {
|
|
100
|
+
throw new Error(`${file.id}: invalid SHA-256 integrity metadata`);
|
|
101
|
+
}
|
|
102
|
+
const url = resolveAssetUrl(pack, assetId, profile);
|
|
103
|
+
const fetcher = options.fetch ?? globalThis.fetch;
|
|
104
|
+
if (!fetcher)
|
|
105
|
+
throw new Error('A fetch implementation is required');
|
|
106
|
+
const maximum = options.maxAssetBytes ?? DEFAULT_MAX_ASSET_BYTES;
|
|
107
|
+
if (!Number.isSafeInteger(maximum) || maximum <= 0)
|
|
108
|
+
throw new Error('maxAssetBytes must be a positive safe integer');
|
|
109
|
+
const limit = Math.min(variant.bytes, maximum);
|
|
110
|
+
const response = await fetcher(url, { signal: options.signal });
|
|
111
|
+
if (!response.ok)
|
|
112
|
+
throw new Error(`Unable to load ${file.id}: ${response.status}`);
|
|
113
|
+
const bytes = await readCapped(response, limit, file.id);
|
|
114
|
+
if (bytes.byteLength !== variant.bytes) {
|
|
115
|
+
throw new Error(`${file.id}: expected ${variant.bytes} bytes, got ${bytes.byteLength}`);
|
|
116
|
+
}
|
|
117
|
+
const digest = await sha256SRI(bytes);
|
|
118
|
+
if (digest !== variant.integrity.value) {
|
|
119
|
+
throw new Error(`${file.id}: SHA-256 integrity mismatch for ${url.href}`);
|
|
120
|
+
}
|
|
121
|
+
return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
|
|
122
|
+
}
|
|
123
|
+
/** Caches verified bytes by resolved URL, so ids sharing one atlas page download it once. */
|
|
124
|
+
export function createChiknAssetCache(pack, defaults = {}) {
|
|
125
|
+
const entries = new Map();
|
|
126
|
+
const keyFor = (assetId, profile) => {
|
|
127
|
+
const file = pack.findAsset(assetId);
|
|
128
|
+
if (!file)
|
|
129
|
+
throw new Error(`Unknown Chikn asset: ${assetId}`);
|
|
130
|
+
const variant = selectVariant(file, profile);
|
|
131
|
+
// A URL alone is insufficient: a malformed manifest could assign conflicting integrity
|
|
132
|
+
// metadata to two logical ids sharing that URL. Only identical verification contracts share.
|
|
133
|
+
return `${resolveAssetUrl(pack, assetId, profile).href}\n${variant.bytes}\n${variant.integrity.algorithm}:${variant.integrity.value}`;
|
|
134
|
+
};
|
|
135
|
+
return {
|
|
136
|
+
fetch(assetId, options = {}) {
|
|
137
|
+
const merged = { ...defaults, ...options };
|
|
138
|
+
const key = keyFor(assetId, merged.profile ?? pack.profile);
|
|
139
|
+
let pending = entries.get(key);
|
|
140
|
+
if (!pending) {
|
|
141
|
+
pending = fetchAssetBytes(pack, assetId, merged).catch((error) => { entries.delete(key); throw error; });
|
|
142
|
+
entries.set(key, pending);
|
|
143
|
+
}
|
|
144
|
+
return pending;
|
|
145
|
+
},
|
|
146
|
+
unload(assetId, profile) {
|
|
147
|
+
return entries.delete(keyFor(assetId, profile ?? pack.profile));
|
|
148
|
+
},
|
|
149
|
+
clear() { entries.clear(); },
|
|
150
|
+
get size() { return entries.size; },
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
export async function createCharacterRig(options) {
|
|
154
|
+
const runtime = options.create(await options.loadDefinition());
|
|
155
|
+
if (options.skin)
|
|
156
|
+
options.applySkin?.(runtime, options.skin);
|
|
157
|
+
for (const trait of options.traits ?? [])
|
|
158
|
+
options.attachTrait?.(runtime, trait);
|
|
159
|
+
return runtime;
|
|
160
|
+
}
|
|
161
|
+
export function createChiknRig(options) { return createCharacterRig(options); }
|
|
162
|
+
export function createRoostrRig(options) { return createCharacterRig(options); }
|
|
163
|
+
export function selectProfile(profile = 'default') { return profile; }
|
|
164
|
+
export function assetId(group, name) { return `${group.replace(/^\/+|\/+$/g, '')}/${name.replace(/^\/+|\/+$/g, '')}`; }
|
|
165
|
+
function ensureDirectoryUrl(baseUrl) {
|
|
166
|
+
const url = assertFetchableUrl(baseUrl);
|
|
167
|
+
if (!url.pathname.endsWith('/'))
|
|
168
|
+
url.pathname += '/';
|
|
169
|
+
return url;
|
|
170
|
+
}
|
|
171
|
+
function assertFetchableUrl(value) {
|
|
172
|
+
const url = new URL(value, globalThis.location?.href);
|
|
173
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:') {
|
|
174
|
+
throw new Error(`Chikn asset URLs must be http(s): received ${url.protocol}`);
|
|
175
|
+
}
|
|
176
|
+
return url;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Reads at most `limit` bytes, aborting a response that overruns its declared size rather than
|
|
180
|
+
* buffering it. Falls back to `arrayBuffer()` when a fetch implementation exposes no stream.
|
|
181
|
+
*/
|
|
182
|
+
async function readCapped(response, limit, label) {
|
|
183
|
+
if (!response.body) {
|
|
184
|
+
const buffer = new Uint8Array(await response.arrayBuffer());
|
|
185
|
+
if (buffer.byteLength > limit)
|
|
186
|
+
throw new Error(`${label}: response exceeds ${limit} bytes`);
|
|
187
|
+
return buffer;
|
|
188
|
+
}
|
|
189
|
+
const reader = response.body.getReader();
|
|
190
|
+
const chunks = [];
|
|
191
|
+
let total = 0;
|
|
192
|
+
for (;;) {
|
|
193
|
+
const { done, value } = await reader.read();
|
|
194
|
+
if (done)
|
|
195
|
+
break;
|
|
196
|
+
total += value.byteLength;
|
|
197
|
+
if (total > limit) {
|
|
198
|
+
void Promise.resolve(reader.cancel()).catch(() => undefined);
|
|
199
|
+
throw new Error(`${label}: response exceeds ${limit} bytes`);
|
|
200
|
+
}
|
|
201
|
+
chunks.push(value);
|
|
202
|
+
}
|
|
203
|
+
const bytes = new Uint8Array(total);
|
|
204
|
+
let offset = 0;
|
|
205
|
+
for (const chunk of chunks) {
|
|
206
|
+
bytes.set(chunk, offset);
|
|
207
|
+
offset += chunk.byteLength;
|
|
208
|
+
}
|
|
209
|
+
return bytes;
|
|
210
|
+
}
|
|
211
|
+
async function sha256SRI(bytes) {
|
|
212
|
+
const digest = await crypto.subtle.digest('SHA-256', bytes);
|
|
213
|
+
let binary = '';
|
|
214
|
+
for (const byte of new Uint8Array(digest))
|
|
215
|
+
binary += String.fromCharCode(byte);
|
|
216
|
+
return `sha256-${btoa(binary)}`;
|
|
217
|
+
}
|
|
218
|
+
async function sha256Hex(bytes) {
|
|
219
|
+
const digest = await crypto.subtle.digest('SHA-256', bytes);
|
|
220
|
+
return [...new Uint8Array(digest)].map((byte) => byte.toString(16).padStart(2, '0')).join('');
|
|
221
|
+
}
|
|
222
|
+
/** Mirrors `scripts/manifest-utils.mjs`; manifest paths must be portable relative paths. */
|
|
223
|
+
function portablePathError(path) {
|
|
224
|
+
if (typeof path !== 'string' || !path)
|
|
225
|
+
return 'path must be a non-empty string';
|
|
226
|
+
for (const character of path) {
|
|
227
|
+
const code = character.codePointAt(0);
|
|
228
|
+
if (code < 0x20 || code === 0x7f)
|
|
229
|
+
return 'path must not contain control characters';
|
|
230
|
+
}
|
|
231
|
+
if (path.includes('\\'))
|
|
232
|
+
return 'path must use forward slashes';
|
|
233
|
+
if (/^[A-Za-z][A-Za-z0-9+.-]*:/.test(path))
|
|
234
|
+
return 'path must not carry a URL scheme or drive letter';
|
|
235
|
+
if (path.startsWith('/'))
|
|
236
|
+
return 'path must be relative';
|
|
237
|
+
if (/%(?:2e|2f|5c)/i.test(path))
|
|
238
|
+
return 'path must not contain percent-encoded separators';
|
|
239
|
+
for (const segment of path.split('/')) {
|
|
240
|
+
if (!segment)
|
|
241
|
+
return 'path must not contain empty segments';
|
|
242
|
+
if (segment === '.' || segment === '..')
|
|
243
|
+
return 'path must not contain relative segments';
|
|
244
|
+
}
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@chikn-game-assets/runtime",
|
|
3
|
+
"version": "0.1.0-rc.0",
|
|
4
|
+
"description": "Apache-2.0 manifest helpers for Chikn community non-commercial assets.",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"repository": { "type": "git", "url": "git+https://github.com/Roost2D/chikn-game-assets.git", "directory": "packages/runtime" },
|
|
7
|
+
"type": "module",
|
|
8
|
+
"sideEffects": false,
|
|
9
|
+
"files": ["dist", "catalog", "README.md", "LICENSE", "CHIKN-COMMUNITY-ASSET-NOTICE.md", "ATTRIBUTION.md", "COMMERCIAL_USE.md"],
|
|
10
|
+
"exports": {
|
|
11
|
+
".": { "types": "./dist/index.d.ts", "import": "./dist/index.js" },
|
|
12
|
+
"./catalog": "./catalog/asset-ids.json"
|
|
13
|
+
},
|
|
14
|
+
"publishConfig": { "access": "public" },
|
|
15
|
+
"scripts": { "build": "tsc -p tsconfig.json && node scripts/generate-catalog.mjs", "check": "tsc --noEmit -p tsconfig.json", "test": "node --test test/*.test.mjs" }
|
|
16
|
+
}
|