@ianlucas/cs2-lib-inspect 5.1.0 → 5.2.1

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.
@@ -0,0 +1,16 @@
1
+ import { type CS2ItemTypeValues } from "@ianlucas/cs2-lib";
2
+ export declare const CS2PreviewRarity: {
3
+ "#ded6cc": number;
4
+ "#b0c3d9": number;
5
+ "#5e98d9": number;
6
+ "#4b69ff": number;
7
+ "#8847ff": number;
8
+ "#d32ce6": number;
9
+ "#eb4b4b": number;
10
+ "#e4ae39": number;
11
+ };
12
+ export declare const CS2_PREVIEW_HAS_STICKERS: CS2ItemTypeValues[];
13
+ export declare const CS2_PREVIEW_INSPECTABLE_ITEMS: CS2ItemTypeValues[];
14
+ export declare const CS2_PREVIEW_ATTRIBUTELESS_ITEMS: CS2ItemTypeValues[];
15
+ export declare const CS2_PREVIEW_URL = "steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20";
16
+ export declare const CS2_PREVIEW_COMMAND = "csgo_econ_action_preview ";
@@ -0,0 +1,42 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) candyboyz, Ian Lucas. All rights reserved.
3
+ * Licensed under the MIT License. See License.txt in the project root for license information.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import { CS2ItemType, CS2RarityColor } from "@ianlucas/cs2-lib";
6
+ export const CS2PreviewRarity = {
7
+ [CS2RarityColor.Default]: 0,
8
+ [CS2RarityColor.Common]: 1,
9
+ [CS2RarityColor.Uncommon]: 2,
10
+ [CS2RarityColor.Rare]: 3,
11
+ [CS2RarityColor.Mythical]: 4,
12
+ [CS2RarityColor.Legendary]: 5,
13
+ [CS2RarityColor.Ancient]: 6,
14
+ [CS2RarityColor.Immortal]: 7
15
+ };
16
+ export const CS2_PREVIEW_HAS_STICKERS = [
17
+ CS2ItemType.Graffiti,
18
+ CS2ItemType.Patch,
19
+ CS2ItemType.Sticker
20
+ ];
21
+ export const CS2_PREVIEW_INSPECTABLE_ITEMS = [
22
+ CS2ItemType.Agent,
23
+ CS2ItemType.Collectible,
24
+ CS2ItemType.Container,
25
+ CS2ItemType.Gloves,
26
+ CS2ItemType.Graffiti,
27
+ CS2ItemType.Keychain,
28
+ CS2ItemType.Melee,
29
+ CS2ItemType.MusicKit,
30
+ CS2ItemType.Patch,
31
+ CS2ItemType.Sticker,
32
+ CS2ItemType.Weapon
33
+ ];
34
+ export const CS2_PREVIEW_ATTRIBUTELESS_ITEMS = [
35
+ ...CS2_PREVIEW_HAS_STICKERS,
36
+ CS2ItemType.Collectible,
37
+ CS2ItemType.Keychain,
38
+ CS2ItemType.MusicKit
39
+ ];
40
+ export const CS2_PREVIEW_URL = "steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20";
41
+ export const CS2_PREVIEW_COMMAND = "csgo_econ_action_preview ";
42
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,OAAO,EAAE,WAAW,EAA0B,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExF,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC5B,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;IAC3B,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;IAC1B,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC5B,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;IACxB,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC5B,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;IAC7B,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;IAC3B,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;CAC/B,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAwB;IACzD,WAAW,CAAC,QAAQ;IACpB,WAAW,CAAC,KAAK;IACjB,WAAW,CAAC,OAAO;CACtB,CAAC;AAEF,MAAM,CAAC,MAAM,6BAA6B,GAAwB;IAC9D,WAAW,CAAC,KAAK;IACjB,WAAW,CAAC,WAAW;IACvB,WAAW,CAAC,SAAS;IACrB,WAAW,CAAC,MAAM;IAClB,WAAW,CAAC,QAAQ;IACpB,WAAW,CAAC,QAAQ;IACpB,WAAW,CAAC,KAAK;IACjB,WAAW,CAAC,QAAQ;IACpB,WAAW,CAAC,KAAK;IACjB,WAAW,CAAC,OAAO;IACnB,WAAW,CAAC,MAAM;CACrB,CAAC;AAEF,MAAM,CAAC,MAAM,+BAA+B,GAAwB;IAChE,GAAG,wBAAwB;IAC3B,WAAW,CAAC,WAAW;IACvB,WAAW,CAAC,QAAQ;IACpB,WAAW,CAAC,QAAQ;CACvB,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,oEAAoE,CAAC;AACpG,MAAM,CAAC,MAAM,mBAAmB,GAAG,2BAA2B,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { CS2EconomyItem, CS2InventoryItem } from "@ianlucas/cs2-lib";
2
+ export declare function generateInspectLink(item: CS2EconomyItem | CS2InventoryItem): string;
@@ -0,0 +1,85 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) candyboyz, Ian Lucas. All rights reserved.
3
+ * Licensed under the MIT License. See License.txt in the project root for license information.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import { CS2EconomyItem, CS2InventoryItem, CS2_MIN_SEED, CS2_MIN_STICKER_WEAR } from "@ianlucas/cs2-lib";
6
+ import { Buffer } from "buffer";
7
+ import CRC32 from "crc-32";
8
+ import { CS2PreviewRarity, CS2_PREVIEW_COMMAND, CS2_PREVIEW_HAS_STICKERS, CS2_PREVIEW_URL } from "./constants.js";
9
+ import { CEconItemPreviewDataBlock } from "./Protobufs/cstrike15_gcmessages.js";
10
+ import { floatToBytes } from "./utils.js";
11
+ function getEconomyItemPreviewData(item) {
12
+ const { def, index, rarity, type, tint } = item;
13
+ const hasStickers = CS2_PREVIEW_HAS_STICKERS.includes(type);
14
+ const hasPaintIndex = !hasStickers && !item.isMusicKit();
15
+ const hasKeychains = item.isKeychain();
16
+ return {
17
+ defindex: def,
18
+ keychains: hasKeychains ? [{ stickerId: index, slot: 0 }] : [],
19
+ musicindex: item.isMusicKit() ? index : undefined,
20
+ paintindex: hasPaintIndex ? index : undefined,
21
+ paintseed: item.hasSeed() ? CS2_MIN_SEED : undefined,
22
+ paintwear: item.hasWear() ? floatToBytes(item.getMinimumWear()) : undefined,
23
+ rarity: CS2PreviewRarity[rarity] ?? 0,
24
+ stickers: hasStickers ? [{ tintId: tint, stickerId: index, slot: 0 }] : []
25
+ };
26
+ }
27
+ function getInventoryItemPreviewData(item) {
28
+ const { nameTag, seed, statTrak, stickers, patches, keychains } = item;
29
+ const baseAttributes = getEconomyItemPreviewData(item);
30
+ return {
31
+ ...baseAttributes,
32
+ customname: nameTag,
33
+ killeaterscoretype: statTrak !== undefined ? 0 : undefined,
34
+ killeatervalue: statTrak,
35
+ paintseed: item.hasSeed() ? (seed ?? CS2_MIN_SEED) : undefined,
36
+ paintwear: item.hasWear() ? floatToBytes(item.getWear()) : undefined,
37
+ stickers: stickers !== undefined
38
+ ? item.someStickers().map(([slot, { id, wear, rotation, x, y, schema }]) => ({
39
+ offsetX: x,
40
+ offsetY: y,
41
+ rotation,
42
+ slot: schema ?? slot,
43
+ stickerId: item.economy.getById(id).index,
44
+ wear: wear ?? CS2_MIN_STICKER_WEAR
45
+ }))
46
+ : patches !== undefined
47
+ ? item
48
+ .somePatches()
49
+ .map(([slot, patchId]) => ({ slot, stickerId: item.economy.getById(patchId).index }))
50
+ : baseAttributes.stickers,
51
+ keychains: keychains !== undefined
52
+ ? item.someKeychains().map(([slot, { id, x, y, seed }]) => ({
53
+ offsetX: x,
54
+ offsetY: y,
55
+ pattern: seed,
56
+ slot,
57
+ stickerId: item.economy.getById(id).index
58
+ }))
59
+ : item.isKeychain()
60
+ ? baseAttributes.keychains.map((keychain) => {
61
+ keychain.pattern = seed;
62
+ return keychain;
63
+ })
64
+ : baseAttributes.keychains
65
+ };
66
+ }
67
+ function generateHex(attributes) {
68
+ const payload = Buffer.concat([Uint8Array.from([0]), CEconItemPreviewDataBlock.toBinary(attributes)]);
69
+ const crc = CRC32.buf(payload);
70
+ const xCrc = (crc & 0xffff) ^ (CEconItemPreviewDataBlock.toBinary(attributes).byteLength * crc);
71
+ const crcBuffer = Buffer.alloc(4);
72
+ crcBuffer.writeUInt32BE((xCrc & 0xffffffff) >>> 0, 0);
73
+ const buffer = Buffer.concat([payload, crcBuffer]);
74
+ return buffer.toString("hex").toUpperCase();
75
+ }
76
+ export function generateInspectLink(item) {
77
+ const attributes = item instanceof CS2InventoryItem ? getInventoryItemPreviewData(item) : getEconomyItemPreviewData(item);
78
+ const hex = generateHex(attributes);
79
+ // There's a char limit for launching the game using the steam:// protocol.
80
+ if (CS2_PREVIEW_URL.length + hex.length > 300) {
81
+ return `${CS2_PREVIEW_COMMAND}${hex}`;
82
+ }
83
+ return `${CS2_PREVIEW_URL}${hex}`;
84
+ }
85
+ //# sourceMappingURL=generate-inspect-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-inspect-link.js","sourceRoot":"","sources":["../src/generate-inspect-link.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,59 +1,5 @@
1
- import { type CS2BaseInventoryItem, CS2EconomyInstance, CS2EconomyItem, CS2InventoryItem, type CS2ItemTypeValues } from "@ianlucas/cs2-lib";
2
- export declare const CS2PreviewRarity: {
3
- "#ded6cc": number;
4
- "#b0c3d9": number;
5
- "#5e98d9": number;
6
- "#4b69ff": number;
7
- "#8847ff": number;
8
- "#d32ce6": number;
9
- "#eb4b4b": number;
10
- "#e4ae39": number;
11
- };
12
- export declare const CS2_PREVIEW_HAS_STICKERS: CS2ItemTypeValues[];
13
- export declare const CS2_PREVIEW_INSPECTABLE_ITEMS: CS2ItemTypeValues[];
14
- export declare const CS2_PREVIEW_ATTRIBUTELESS_ITEMS: CS2ItemTypeValues[];
15
- export declare const CS2_PREVIEW_URL = "steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20";
16
- export declare const CS2_PREVIEW_COMMAND = "csgo_econ_action_preview ";
17
- export declare function generateInspectLink(item: CS2EconomyItem | CS2InventoryItem): string;
18
- export declare function isCommandInspect(inspectLink: string): boolean;
19
- export declare function isSteamInspectLink(inspectLink: string): boolean;
20
- export interface CSFloatStickerInfo {
21
- slot: number;
22
- stickerId: number;
23
- wear?: number;
24
- rotation?: number;
25
- offsetX?: number;
26
- offsetY?: number;
27
- tintId?: number;
28
- pattern?: number;
29
- }
30
- export interface CSFloatItemInfo {
31
- defindex: number;
32
- paintindex?: number;
33
- paintseed?: number;
34
- floatvalue?: number;
35
- killeatervalue?: number;
36
- customname?: string;
37
- musicindex?: number;
38
- stickers?: CSFloatStickerInfo[];
39
- keychains?: CSFloatStickerInfo[];
40
- origin?: number;
41
- quality?: number;
42
- rarity?: number;
43
- floatid?: number;
44
- imageurl?: string;
45
- min?: number;
46
- max?: number;
47
- weapon_type?: string;
48
- item_name?: string;
49
- rarity_name?: string;
50
- quality_name?: string;
51
- wear_name?: string;
52
- full_item_name?: string;
53
- s?: string;
54
- a?: string;
55
- d?: string;
56
- m?: string;
57
- }
58
- export declare function parseInspectLink(economy: CS2EconomyInstance, inspectLink: string): CS2BaseInventoryItem;
59
- export declare function parseCSFloatItemInfo(economy: CS2EconomyInstance, itemInfo: CSFloatItemInfo): CS2BaseInventoryItem;
1
+ export { CS2_PREVIEW_ATTRIBUTELESS_ITEMS, CS2_PREVIEW_COMMAND, CS2_PREVIEW_HAS_STICKERS, CS2_PREVIEW_INSPECTABLE_ITEMS, CS2_PREVIEW_URL, CS2PreviewRarity } from "./constants.js";
2
+ export { generateInspectLink } from "./generate-inspect-link.js";
3
+ export { parseCSFloatItemInfo } from "./parse-csfloat-item-info.js";
4
+ export type { CSFloatItemInfo, CSFloatStickerInfo } from "./parse-csfloat-item-info.js";
5
+ export { isCommandInspect, isSteamInspectLink, parseInspectLink } from "./parse-inspect-link.js";
package/dist/index.js CHANGED
@@ -2,355 +2,8 @@
2
2
  * Copyright (c) candyboyz, Ian Lucas. All rights reserved.
3
3
  * Licensed under the MIT License. See License.txt in the project root for license information.
4
4
  *--------------------------------------------------------------------------------------------*/
5
- import { CS2EconomyInstance, CS2EconomyItem, CS2InventoryItem, CS2ItemType, CS2RarityColor, CS2_MIN_SEED, CS2_MIN_STICKER_WEAR, CS2_MIN_WEAR, ensure } from "@ianlucas/cs2-lib";
6
- import { Buffer } from "buffer";
7
- import CRC32 from "crc-32";
8
- import { CEconItemPreviewDataBlock } from "./Protobufs/cstrike15_gcmessages.js";
9
- export const CS2PreviewRarity = {
10
- [CS2RarityColor.Default]: 0,
11
- [CS2RarityColor.Common]: 1,
12
- [CS2RarityColor.Uncommon]: 2,
13
- [CS2RarityColor.Rare]: 3,
14
- [CS2RarityColor.Mythical]: 4,
15
- [CS2RarityColor.Legendary]: 5,
16
- [CS2RarityColor.Ancient]: 6,
17
- [CS2RarityColor.Immortal]: 7
18
- };
19
- export const CS2_PREVIEW_HAS_STICKERS = [
20
- CS2ItemType.Graffiti,
21
- CS2ItemType.Patch,
22
- CS2ItemType.Sticker
23
- ];
24
- export const CS2_PREVIEW_INSPECTABLE_ITEMS = [
25
- CS2ItemType.Agent,
26
- CS2ItemType.Collectible,
27
- CS2ItemType.Container,
28
- CS2ItemType.Gloves,
29
- CS2ItemType.Graffiti,
30
- CS2ItemType.Keychain,
31
- CS2ItemType.Melee,
32
- CS2ItemType.MusicKit,
33
- CS2ItemType.Patch,
34
- CS2ItemType.Sticker,
35
- CS2ItemType.Weapon
36
- ];
37
- export const CS2_PREVIEW_ATTRIBUTELESS_ITEMS = [
38
- ...CS2_PREVIEW_HAS_STICKERS,
39
- CS2ItemType.Collectible,
40
- CS2ItemType.Keychain,
41
- CS2ItemType.MusicKit
42
- ];
43
- export const CS2_PREVIEW_URL = "steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20";
44
- export const CS2_PREVIEW_COMMAND = "csgo_econ_action_preview ";
45
- function floatToBytes(floatValue) {
46
- const floatArray = new Float32Array(1);
47
- floatArray[0] = floatValue;
48
- const byteArray = new Uint32Array(floatArray.buffer);
49
- return byteArray[0];
50
- }
51
- function bytesToFloat(byteValue) {
52
- const byteArray = new Uint32Array(1);
53
- byteArray[0] = byteValue;
54
- const floatArray = new Float32Array(byteArray.buffer);
55
- return floatArray[0];
56
- }
57
- function getEconomyItemPreviewData(item) {
58
- const { def, index, rarity, type, tint } = item;
59
- const hasStickers = CS2_PREVIEW_HAS_STICKERS.includes(type);
60
- const hasPaintIndex = !hasStickers && !item.isMusicKit();
61
- const hasKeychains = item.isKeychain();
62
- return {
63
- defindex: def,
64
- keychains: hasKeychains ? [{ stickerId: index, slot: 0 }] : [],
65
- musicindex: item.isMusicKit() ? index : undefined,
66
- paintindex: hasPaintIndex ? index : undefined,
67
- paintseed: item.hasSeed() ? CS2_MIN_SEED : undefined,
68
- paintwear: item.hasWear() ? floatToBytes(item.getMinimumWear()) : undefined,
69
- rarity: CS2PreviewRarity[rarity] ?? 0,
70
- stickers: hasStickers ? [{ tintId: tint, stickerId: index, slot: 0 }] : []
71
- };
72
- }
73
- function getInventoryItemPreviewData(item) {
74
- const { nameTag, seed, statTrak, stickers, patches, keychains } = item;
75
- const baseAttributes = getEconomyItemPreviewData(item);
76
- return {
77
- ...baseAttributes,
78
- customname: nameTag,
79
- killeaterscoretype: statTrak !== undefined ? 0 : undefined,
80
- killeatervalue: statTrak,
81
- paintseed: item.hasSeed() ? (seed ?? CS2_MIN_SEED) : undefined,
82
- paintwear: item.hasWear() ? floatToBytes(item.getWear()) : undefined,
83
- stickers: stickers !== undefined
84
- ? item.someStickers().map(([slot, { id, wear, rotation, x, y }]) => ({
85
- offsetX: x,
86
- offsetY: y,
87
- rotation,
88
- slot,
89
- stickerId: item.economy.getById(id).index,
90
- wear: wear ?? CS2_MIN_STICKER_WEAR
91
- }))
92
- : patches !== undefined
93
- ? item
94
- .somePatches()
95
- .map(([slot, patchId]) => ({ slot, stickerId: item.economy.getById(patchId).index }))
96
- : baseAttributes.stickers,
97
- keychains: keychains !== undefined
98
- ? item.someKeychains().map(([slot, { id, x, y, seed }]) => ({
99
- offsetX: x,
100
- offsetY: y,
101
- pattern: seed,
102
- slot,
103
- stickerId: item.economy.getById(id).index
104
- }))
105
- : item.isKeychain()
106
- ? baseAttributes.keychains.map((keychain) => {
107
- keychain.pattern = seed;
108
- return keychain;
109
- })
110
- : baseAttributes.keychains
111
- };
112
- }
113
- function generateHex(attributes) {
114
- const payload = Buffer.concat([Uint8Array.from([0]), CEconItemPreviewDataBlock.toBinary(attributes)]);
115
- const crc = CRC32.buf(payload);
116
- const xCrc = (crc & 0xffff) ^ (CEconItemPreviewDataBlock.toBinary(attributes).byteLength * crc);
117
- const crcBuffer = Buffer.alloc(4);
118
- crcBuffer.writeUInt32BE((xCrc & 0xffffffff) >>> 0, 0);
119
- const buffer = Buffer.concat([payload, crcBuffer]);
120
- return buffer.toString("hex").toUpperCase();
121
- }
122
- export function generateInspectLink(item) {
123
- const attributes = item instanceof CS2InventoryItem ? getInventoryItemPreviewData(item) : getEconomyItemPreviewData(item);
124
- const hex = generateHex(attributes);
125
- // There's a char limit for launching the game using the steam:// protocol.
126
- if (CS2_PREVIEW_URL.length + hex.length > 300) {
127
- return `${CS2_PREVIEW_COMMAND}${hex}`;
128
- }
129
- return `${CS2_PREVIEW_URL}${hex}`;
130
- }
131
- export function isCommandInspect(inspectLink) {
132
- return inspectLink.startsWith(CS2_PREVIEW_COMMAND);
133
- }
134
- export function isSteamInspectLink(inspectLink) {
135
- try {
136
- const decoded = decodeURI(inspectLink);
137
- return /^steam:\/\/rungame\/730\/\d+\/[+ ]csgo_econ_action_preview [SM]\d+A\d+D\d+$/.test(decoded);
138
- }
139
- catch {
140
- return false;
141
- }
142
- }
143
- function parseHex(hexString) {
144
- // Convert hex string to buffer
145
- const buffer = Buffer.from(hexString.toLowerCase(), "hex");
146
- // First byte should be 0
147
- if (buffer[0] !== 0) {
148
- throw new Error("Invalid format: First byte should be 0");
149
- }
150
- // Extract the data and CRC portions
151
- const payload = buffer.slice(0, -4); // Everything except last 4 bytes
152
- const providedCrcBuffer = buffer.slice(-4); // Last 4 bytes
153
- const providedCrc = providedCrcBuffer.readUInt32BE(0);
154
- // Extract just the attributes data (removing the first byte)
155
- const attributesData = payload.slice(1);
156
- // Verify CRC
157
- const calculatedCrc = CRC32.buf(payload);
158
- const calculatedXCrc = (calculatedCrc & 0xffff) ^ (attributesData.byteLength * calculatedCrc);
159
- const finalCalculatedCrc = (calculatedXCrc & 0xffffffff) >>> 0;
160
- if (finalCalculatedCrc !== providedCrc) {
161
- throw new Error("CRC verification failed");
162
- }
163
- // Convert the binary data back to CEconItemPreviewDataBlock
164
- return CEconItemPreviewDataBlock.fromBinary(attributesData);
165
- }
166
- export function parseInspectLink(economy, inspectLink) {
167
- const hex = isCommandInspect(inspectLink)
168
- ? inspectLink.replace(CS2_PREVIEW_COMMAND, "")
169
- : inspectLink.replace(CS2_PREVIEW_URL, "");
170
- const attributes = parseHex(hex);
171
- let economyItem = economy.itemsAsArray.find((item) => item.def === attributes.defindex);
172
- let baseInventoryItem;
173
- if (economyItem !== undefined && CS2_PREVIEW_HAS_STICKERS.includes(economyItem.type)) {
174
- // Collectible comes from the initial assignment.
175
- if (attributes.stickers.length === 1) {
176
- // Patch, Sticker, and Graffiti
177
- economyItem = economy.itemsAsArray.find((item) => item.def === attributes.defindex &&
178
- item.index === attributes.stickers[0].stickerId &&
179
- item.tint === attributes.stickers[0].tintId);
180
- }
181
- if (economyItem !== undefined) {
182
- baseInventoryItem = { id: economyItem.id };
183
- }
184
- }
185
- else {
186
- if (attributes.musicindex !== undefined) {
187
- // Music Kit
188
- economyItem = economy.itemsAsArray.find((item) => item.isMusicKit() && item.index === attributes.musicindex);
189
- if (economyItem !== undefined) {
190
- baseInventoryItem = { id: economyItem.id, statTrak: attributes.killeatervalue };
191
- }
192
- }
193
- else {
194
- economyItem = economy.itemsAsArray.find(attributes.paintindex !== undefined
195
- ? (item) => item.def === attributes.defindex && item.index === attributes.paintindex
196
- : (item) => item.def === attributes.defindex);
197
- }
198
- if (economyItem !== undefined && baseInventoryItem === undefined) {
199
- if (economyItem.isKeychain()) {
200
- baseInventoryItem = {
201
- id: economyItem.id,
202
- seed: attributes.keychains[0]?.pattern ?? attributes.paintseed
203
- };
204
- }
205
- else {
206
- baseInventoryItem = {
207
- id: economyItem.id,
208
- seed: attributes.paintseed,
209
- wear: attributes.paintwear !== undefined ? bytesToFloat(attributes.paintwear) : undefined,
210
- statTrak: attributes.killeatervalue,
211
- nameTag: attributes.customname,
212
- keychains: attributes.keychains.length > 0
213
- ? Object.fromEntries(attributes.keychains.map(({ offsetX, offsetY, pattern, slot, stickerId }) => [
214
- ensure(slot),
215
- {
216
- id: ensure(economy.itemsAsArray.find((item) => item.isKeychain() && item.index === stickerId)?.id),
217
- seed: pattern,
218
- x: offsetX,
219
- y: offsetY
220
- }
221
- ]))
222
- : undefined,
223
- stickers: !economyItem.isAgent() && attributes.stickers.length > 0
224
- ? Object.fromEntries(attributes.stickers?.map(({ slot, stickerId, offsetX, offsetY, wear, rotation }) => [
225
- ensure(slot),
226
- {
227
- id: ensure(economy.itemsAsArray.find((item) => item.isSticker() && item.index === stickerId)?.id),
228
- rotation,
229
- wear,
230
- x: offsetX,
231
- y: offsetY
232
- }
233
- ]))
234
- : undefined,
235
- patches: economyItem.isAgent() && attributes.stickers.length > 0
236
- ? Object.fromEntries(attributes.stickers.map(({ slot, stickerId }) => [
237
- ensure(slot),
238
- ensure(economy.itemsAsArray.find((item) => item.isPatch() && item.index === stickerId)?.id)
239
- ]))
240
- : undefined
241
- };
242
- }
243
- }
244
- }
245
- if (baseInventoryItem !== undefined) {
246
- if (baseInventoryItem.seed === CS2_MIN_SEED) {
247
- baseInventoryItem.seed = undefined;
248
- }
249
- if (baseInventoryItem.wear === CS2_MIN_WEAR) {
250
- baseInventoryItem.wear = undefined;
251
- }
252
- if (baseInventoryItem.stickers !== undefined) {
253
- for (const sticker of Object.values(baseInventoryItem.stickers)) {
254
- if (sticker.wear === CS2_MIN_STICKER_WEAR) {
255
- sticker.wear = undefined;
256
- }
257
- }
258
- }
259
- }
260
- return ensure(baseInventoryItem);
261
- }
262
- export function parseCSFloatItemInfo(economy, itemInfo) {
263
- const stickers = itemInfo.stickers ?? [];
264
- const keychains = itemInfo.keychains ?? [];
265
- let economyItem = economy.itemsAsArray.find((item) => item.def === itemInfo.defindex);
266
- let baseInventoryItem;
267
- if (economyItem !== undefined && CS2_PREVIEW_HAS_STICKERS.includes(economyItem.type)) {
268
- // Collectible comes from the initial assignment.
269
- if (stickers.length === 1) {
270
- // Patch, Sticker, and Graffiti
271
- economyItem = economy.itemsAsArray.find((item) => item.def === itemInfo.defindex &&
272
- item.index === stickers[0].stickerId &&
273
- item.tint === stickers[0].tintId);
274
- }
275
- if (economyItem !== undefined) {
276
- baseInventoryItem = { id: economyItem.id };
277
- }
278
- }
279
- else {
280
- if (itemInfo.musicindex !== undefined) {
281
- // Music Kit
282
- economyItem = economy.itemsAsArray.find((item) => item.isMusicKit() && item.index === itemInfo.musicindex);
283
- if (economyItem !== undefined) {
284
- baseInventoryItem = { id: economyItem.id, statTrak: itemInfo.killeatervalue };
285
- }
286
- }
287
- else {
288
- economyItem = economy.itemsAsArray.find(itemInfo.paintindex !== undefined
289
- ? (item) => item.def === itemInfo.defindex && item.index === itemInfo.paintindex
290
- : (item) => item.def === itemInfo.defindex);
291
- }
292
- if (economyItem !== undefined && baseInventoryItem === undefined) {
293
- if (economyItem.isKeychain()) {
294
- baseInventoryItem = {
295
- id: economyItem.id,
296
- seed: keychains[0]?.pattern ?? itemInfo.paintseed
297
- };
298
- }
299
- else {
300
- baseInventoryItem = {
301
- id: economyItem.id,
302
- seed: itemInfo.paintseed,
303
- wear: itemInfo.floatvalue,
304
- statTrak: itemInfo.killeatervalue,
305
- nameTag: itemInfo.customname,
306
- keychains: keychains.length > 0
307
- ? Object.fromEntries(keychains.map(({ offsetX, offsetY, pattern, slot, stickerId }) => [
308
- slot,
309
- {
310
- id: ensure(economy.itemsAsArray.find((item) => item.isKeychain() && item.index === stickerId)?.id),
311
- seed: pattern,
312
- x: offsetX,
313
- y: offsetY
314
- }
315
- ]))
316
- : undefined,
317
- stickers: !economyItem.isAgent() && stickers.length > 0
318
- ? Object.fromEntries(stickers.map(({ slot, stickerId, offsetX, offsetY, wear, rotation }) => [
319
- slot,
320
- {
321
- id: ensure(economy.itemsAsArray.find((item) => item.isSticker() && item.index === stickerId)?.id),
322
- rotation,
323
- wear,
324
- x: offsetX,
325
- y: offsetY
326
- }
327
- ]))
328
- : undefined,
329
- patches: economyItem.isAgent() && stickers.length > 0
330
- ? Object.fromEntries(stickers.map(({ slot, stickerId }) => [
331
- slot,
332
- ensure(economy.itemsAsArray.find((item) => item.isPatch() && item.index === stickerId)?.id)
333
- ]))
334
- : undefined
335
- };
336
- }
337
- }
338
- }
339
- if (baseInventoryItem !== undefined) {
340
- if (baseInventoryItem.seed === CS2_MIN_SEED) {
341
- baseInventoryItem.seed = undefined;
342
- }
343
- if (baseInventoryItem.wear === CS2_MIN_WEAR) {
344
- baseInventoryItem.wear = undefined;
345
- }
346
- if (baseInventoryItem.stickers !== undefined) {
347
- for (const sticker of Object.values(baseInventoryItem.stickers)) {
348
- if (sticker.wear === CS2_MIN_STICKER_WEAR) {
349
- sticker.wear = undefined;
350
- }
351
- }
352
- }
353
- }
354
- return ensure(baseInventoryItem);
355
- }
5
+ export { CS2_PREVIEW_ATTRIBUTELESS_ITEMS, CS2_PREVIEW_COMMAND, CS2_PREVIEW_HAS_STICKERS, CS2_PREVIEW_INSPECTABLE_ITEMS, CS2_PREVIEW_URL, CS2PreviewRarity } from "./constants.js";
6
+ export { generateInspectLink } from "./generate-inspect-link.js";
7
+ export { parseCSFloatItemInfo } from "./parse-csfloat-item-info.js";
8
+ export { isCommandInspect, isSteamInspectLink, parseInspectLink } from "./parse-inspect-link.js";
356
9
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,OAAO,EACH,+BAA+B,EAC/B,mBAAmB,EACnB,wBAAwB,EACxB,6BAA6B,EAC7B,eAAe,EACf,gBAAgB,EACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { type CS2BaseInventoryItem, CS2EconomyInstance } from "@ianlucas/cs2-lib";
2
+ export interface CSFloatStickerInfo {
3
+ slot: number;
4
+ stickerId: number;
5
+ wear?: number;
6
+ rotation?: number;
7
+ offsetX?: number;
8
+ offsetY?: number;
9
+ tintId?: number;
10
+ pattern?: number;
11
+ }
12
+ export interface CSFloatItemInfo {
13
+ defindex: number;
14
+ paintindex?: number;
15
+ paintseed?: number;
16
+ floatvalue?: number;
17
+ killeatervalue?: number;
18
+ customname?: string;
19
+ musicindex?: number;
20
+ stickers?: CSFloatStickerInfo[];
21
+ keychains?: CSFloatStickerInfo[];
22
+ origin?: number;
23
+ quality?: number;
24
+ rarity?: number;
25
+ floatid?: number;
26
+ imageurl?: string;
27
+ min?: number;
28
+ max?: number;
29
+ weapon_type?: string;
30
+ item_name?: string;
31
+ rarity_name?: string;
32
+ quality_name?: string;
33
+ wear_name?: string;
34
+ full_item_name?: string;
35
+ s?: string;
36
+ a?: string;
37
+ d?: string;
38
+ m?: string;
39
+ }
40
+ export declare function parseCSFloatItemInfo(economy: CS2EconomyInstance, itemInfo: CSFloatItemInfo): CS2BaseInventoryItem;
@@ -0,0 +1,20 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) candyboyz, Ian Lucas. All rights reserved.
3
+ * Licensed under the MIT License. See License.txt in the project root for license information.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import { CS2EconomyInstance } from "@ianlucas/cs2-lib";
6
+ import { parseGCInventoryItem } from "./parse-gc-inventory-item.js";
7
+ export function parseCSFloatItemInfo(economy, itemInfo) {
8
+ return parseGCInventoryItem(economy, {
9
+ defindex: itemInfo.defindex,
10
+ paintindex: itemInfo.paintindex,
11
+ paintseed: itemInfo.paintseed,
12
+ floatvalue: itemInfo.floatvalue,
13
+ killeatervalue: itemInfo.killeatervalue,
14
+ customname: itemInfo.customname,
15
+ musicindex: itemInfo.musicindex,
16
+ stickers: itemInfo.stickers ?? [],
17
+ keychains: itemInfo.keychains ?? []
18
+ });
19
+ }
20
+ //# sourceMappingURL=parse-csfloat-item-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-csfloat-item-info.js","sourceRoot":"","sources":["../src/parse-csfloat-item-info.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,OAAO,EAA6B,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AA0CpE,MAAM,UAAU,oBAAoB,CAAC,OAA2B,EAAE,QAAyB;IACvF,OAAO,oBAAoB,CAAC,OAAO,EAAE;QACjC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,cAAc,EAAE,QAAQ,CAAC,cAAc;QACvC,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,EAAE;QACjC,SAAS,EAAE,QAAQ,CAAC,SAAS,IAAI,EAAE;KACtC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { type CS2BaseInventoryItem, CS2EconomyInstance } from "@ianlucas/cs2-lib";
2
+ export interface CS2GCInventoryItemSticker {
3
+ slot?: number;
4
+ stickerId?: number;
5
+ wear?: number;
6
+ rotation?: number;
7
+ offsetX?: number;
8
+ offsetY?: number;
9
+ tintId?: number;
10
+ pattern?: number;
11
+ }
12
+ export interface CS2GCInventoryItem {
13
+ defindex: number;
14
+ paintindex?: number;
15
+ paintseed?: number;
16
+ floatvalue?: number;
17
+ killeatervalue?: number;
18
+ customname?: string;
19
+ musicindex?: number;
20
+ stickers: CS2GCInventoryItemSticker[];
21
+ keychains: CS2GCInventoryItemSticker[];
22
+ }
23
+ export declare function parseGCInventoryItem(economy: CS2EconomyInstance, data: CS2GCInventoryItem): CS2BaseInventoryItem;
@@ -0,0 +1,94 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) candyboyz, Ian Lucas. All rights reserved.
3
+ * Licensed under the MIT License. See License.txt in the project root for license information.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import { CS2EconomyInstance, CS2_MIN_SEED, CS2_MIN_STICKER_WEAR, CS2_MIN_WEAR, CS2_STICKER_WEAR_FACTOR, CS2_WEAR_FACTOR, assert, ensure } from "@ianlucas/cs2-lib";
6
+ import { CS2_PREVIEW_HAS_STICKERS } from "./constants.js";
7
+ import { truncate } from "./utils.js";
8
+ export function parseGCInventoryItem(economy, data) {
9
+ const { defindex, paintindex, paintseed, floatvalue, killeatervalue, customname, musicindex, stickers, keychains } = data;
10
+ let economyItem = economy.itemsAsArray.find((item) => item.def === defindex);
11
+ if (economyItem !== undefined && CS2_PREVIEW_HAS_STICKERS.includes(economyItem.type)) {
12
+ if (stickers.length === 1) {
13
+ // Patch, Sticker, and Graffiti
14
+ economyItem = economy.itemsAsArray.find((item) => item.def === defindex && item.index === stickers[0].stickerId && item.tint === stickers[0].tintId);
15
+ }
16
+ return ensure(economyItem !== undefined ? { id: economyItem.id } : undefined);
17
+ }
18
+ else if (musicindex !== undefined) {
19
+ // Music Kit
20
+ economyItem = economy.itemsAsArray.find((item) => item.isMusicKit() && item.index === musicindex);
21
+ return ensure(economyItem !== undefined ? stripMinValues({ id: economyItem.id, statTrak: killeatervalue }) : undefined);
22
+ }
23
+ else {
24
+ if (economyItem?.isKeychain() && keychains.length > 0) {
25
+ economyItem = economy.itemsAsArray.find((item) => item.def === defindex && item.index === keychains[0].stickerId);
26
+ }
27
+ else if (paintindex !== undefined) {
28
+ economyItem = economy.itemsAsArray.find((item) => item.def === defindex && item.index === paintindex);
29
+ }
30
+ assert(economyItem !== undefined);
31
+ if (economyItem.isKeychain()) {
32
+ return stripMinValues({
33
+ id: economyItem.id,
34
+ seed: keychains[0]?.pattern ?? paintseed
35
+ });
36
+ }
37
+ return stripMinValues({
38
+ id: economyItem.id,
39
+ seed: economyItem.hasSeed() ? paintseed : undefined,
40
+ wear: economyItem.hasWear() && floatvalue !== undefined ? truncate(floatvalue, CS2_WEAR_FACTOR) : undefined,
41
+ statTrak: economyItem.hasStatTrak() ? killeatervalue : undefined,
42
+ nameTag: economyItem.hasNametag() ? customname : undefined,
43
+ keychains: economyItem.hasKeychains() && keychains.length > 0
44
+ ? Object.fromEntries(keychains.map(({ offsetX, offsetY, pattern, slot, stickerId }) => [
45
+ slot,
46
+ {
47
+ id: ensure(economy.itemsAsArray.find((item) => item.isKeychain() && item.index === stickerId)
48
+ ?.id),
49
+ seed: pattern,
50
+ x: offsetX,
51
+ y: offsetY
52
+ }
53
+ ]))
54
+ : undefined,
55
+ stickers: economyItem.hasStickers() && stickers.length > 0
56
+ ? Object.fromEntries(stickers.map(({ slot, stickerId, offsetX, offsetY, wear, rotation }, index) => [
57
+ index,
58
+ {
59
+ id: ensure(economy.itemsAsArray.find((item) => item.isSticker() && item.index === stickerId)
60
+ ?.id),
61
+ rotation: rotation !== undefined ? Math.trunc(rotation) : undefined,
62
+ schema: slot,
63
+ wear: wear !== undefined ? truncate(wear, CS2_STICKER_WEAR_FACTOR) : undefined,
64
+ x: offsetX,
65
+ y: offsetY
66
+ }
67
+ ]))
68
+ : undefined,
69
+ patches: economyItem.hasPatches() && stickers.length > 0
70
+ ? Object.fromEntries(stickers.map(({ slot, stickerId }) => [
71
+ slot,
72
+ ensure(economy.itemsAsArray.find((item) => item.isPatch() && item.index === stickerId)?.id)
73
+ ]))
74
+ : undefined
75
+ });
76
+ }
77
+ }
78
+ function stripMinValues(item) {
79
+ if (item.seed === CS2_MIN_SEED) {
80
+ item.seed = undefined;
81
+ }
82
+ if (item.wear === CS2_MIN_WEAR) {
83
+ item.wear = undefined;
84
+ }
85
+ if (item.stickers !== undefined) {
86
+ for (const sticker of Object.values(item.stickers)) {
87
+ if (sticker.wear === CS2_MIN_STICKER_WEAR) {
88
+ sticker.wear = undefined;
89
+ }
90
+ }
91
+ }
92
+ return item;
93
+ }
94
+ //# sourceMappingURL=parse-gc-inventory-item.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-gc-inventory-item.js","sourceRoot":"","sources":["../src/parse-gc-inventory-item.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type CS2BaseInventoryItem, CS2EconomyInstance } from "@ianlucas/cs2-lib";
2
+ export declare function isCommandInspect(inspectLink: string): boolean;
3
+ export declare function isSteamInspectLink(inspectLink: string): boolean;
4
+ export declare function parseInspectLink(economy: CS2EconomyInstance, inspectLink: string): CS2BaseInventoryItem;
@@ -0,0 +1,65 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) candyboyz, Ian Lucas. All rights reserved.
3
+ * Licensed under the MIT License. See License.txt in the project root for license information.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import { CS2EconomyInstance } from "@ianlucas/cs2-lib";
6
+ import { Buffer } from "buffer";
7
+ import CRC32 from "crc-32";
8
+ import { CS2_PREVIEW_COMMAND, CS2_PREVIEW_URL } from "./constants.js";
9
+ import { parseGCInventoryItem } from "./parse-gc-inventory-item.js";
10
+ import { CEconItemPreviewDataBlock } from "./Protobufs/cstrike15_gcmessages.js";
11
+ import { bytesToFloat } from "./utils.js";
12
+ export function isCommandInspect(inspectLink) {
13
+ return inspectLink.startsWith(CS2_PREVIEW_COMMAND);
14
+ }
15
+ export function isSteamInspectLink(inspectLink) {
16
+ try {
17
+ const decoded = decodeURI(inspectLink);
18
+ return /^steam:\/\/rungame\/730\/\d+\/[+ ]csgo_econ_action_preview [SM]\d+A\d+D\d+$/.test(decoded);
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ }
24
+ function parseHex(hexString) {
25
+ // Convert hex string to buffer
26
+ const buffer = Buffer.from(hexString.toLowerCase(), "hex");
27
+ // XOR bytes 1..N-1 with the first byte (CS2 native format; no-op when first byte is 0)
28
+ const xorKey = buffer[0];
29
+ for (let i = 1; i < buffer.length; i++) {
30
+ buffer[i] ^= xorKey;
31
+ }
32
+ // Extract the data and CRC portions
33
+ const payload = buffer.slice(0, -4); // Everything except last 4 bytes
34
+ const providedCrcBuffer = buffer.slice(-4); // Last 4 bytes
35
+ const providedCrc = providedCrcBuffer.readUInt32BE(0);
36
+ // Extract just the attributes data (removing the first byte)
37
+ const attributesData = payload.slice(1);
38
+ // Verify CRC
39
+ const calculatedCrc = CRC32.buf(payload);
40
+ const calculatedXCrc = (calculatedCrc & 0xffff) ^ (attributesData.byteLength * calculatedCrc);
41
+ const finalCalculatedCrc = (calculatedXCrc & 0xffffffff) >>> 0;
42
+ if (finalCalculatedCrc !== providedCrc) {
43
+ throw new Error("CRC verification failed");
44
+ }
45
+ // Convert the binary data back to CEconItemPreviewDataBlock
46
+ return CEconItemPreviewDataBlock.fromBinary(attributesData);
47
+ }
48
+ export function parseInspectLink(economy, inspectLink) {
49
+ const hex = isCommandInspect(inspectLink)
50
+ ? inspectLink.replace(CS2_PREVIEW_COMMAND, "")
51
+ : inspectLink.replace(CS2_PREVIEW_URL, "");
52
+ const attributes = parseHex(hex);
53
+ return parseGCInventoryItem(economy, {
54
+ defindex: attributes.defindex ?? 0,
55
+ paintindex: attributes.paintindex,
56
+ paintseed: attributes.paintseed,
57
+ floatvalue: attributes.paintwear !== undefined ? bytesToFloat(attributes.paintwear) : undefined,
58
+ killeatervalue: attributes.killeatervalue,
59
+ customname: attributes.customname,
60
+ musicindex: attributes.musicindex,
61
+ stickers: attributes.stickers,
62
+ keychains: attributes.keychains
63
+ });
64
+ }
65
+ //# sourceMappingURL=parse-inspect-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-inspect-link.js","sourceRoot":"","sources":["../src/parse-inspect-link.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,OAAO,EAA6B,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,MAAM,QAAQ,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAChD,OAAO,WAAW,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,WAAmB;IAClD,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;QACvC,OAAO,6EAA6E,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvG,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED,SAAS,QAAQ,CAAC,SAAiB;IAC/B,+BAA+B;IAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,CAAC;IAC3D,uFAAuF;IACvF,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IACxB,CAAC;IACD,oCAAoC;IACpC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,iCAAiC;IACtE,MAAM,iBAAiB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe;IAC3D,MAAM,WAAW,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACtD,6DAA6D;IAC7D,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACxC,aAAa;IACb,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,cAAc,GAAG,CAAC,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,UAAU,GAAG,aAAa,CAAC,CAAC;IAC9F,MAAM,kBAAkB,GAAG,CAAC,cAAc,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC/D,IAAI,kBAAkB,KAAK,WAAW,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC/C,CAAC;IACD,4DAA4D;IAC5D,OAAO,yBAAyB,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAA2B,EAAE,WAAmB;IAC7E,MAAM,GAAG,GAAG,gBAAgB,CAAC,WAAW,CAAC;QACrC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;QAC9C,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,oBAAoB,CAAC,OAAO,EAAE;QACjC,QAAQ,EAAE,UAAU,CAAC,QAAQ,IAAI,CAAC;QAClC,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,SAAS,EAAE,UAAU,CAAC,SAAS;QAC/B,UAAU,EAAE,UAAU,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;QAC/F,cAAc,EAAE,UAAU,CAAC,cAAc;QACzC,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,QAAQ,EAAE,UAAU,CAAC,QAAQ;QAC7B,SAAS,EAAE,UAAU,CAAC,SAAS;KAClC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function floatToBytes(floatValue: number): number;
2
+ export declare function bytesToFloat(byteValue: number): number;
3
+ export declare function truncate(value: number, factor: number): number;
package/dist/utils.js ADDED
@@ -0,0 +1,20 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) candyboyz, Ian Lucas. All rights reserved.
3
+ * Licensed under the MIT License. See License.txt in the project root for license information.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ export function floatToBytes(floatValue) {
6
+ const floatArray = new Float32Array(1);
7
+ floatArray[0] = floatValue;
8
+ const byteArray = new Uint32Array(floatArray.buffer);
9
+ return byteArray[0];
10
+ }
11
+ export function bytesToFloat(byteValue) {
12
+ const byteArray = new Uint32Array(1);
13
+ byteArray[0] = byteValue;
14
+ const floatArray = new Float32Array(byteArray.buffer);
15
+ return floatArray[0];
16
+ }
17
+ export function truncate(value, factor) {
18
+ return parseFloat(String(value).substring(0, String(factor).length));
19
+ }
20
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,MAAM,UAAU,YAAY,CAAC,UAAkB;IAC3C,MAAM,UAAU,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;IACvC,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;IAC3B,MAAM,SAAS,GAAG,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACrD,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC1C,MAAM,SAAS,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;IACrC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACzB,MAAM,UAAU,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACtD,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,MAAc;IAClD,OAAO,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACzE,CAAC"}
package/package.json CHANGED
@@ -43,5 +43,5 @@
43
43
  "engines": {
44
44
  "node": ">=20"
45
45
  },
46
- "version": "5.1.0"
46
+ "version": "5.2.1"
47
47
  }