@httpstate/typescript 0.0.40 → 0.0.42

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/README.md CHANGED
@@ -30,7 +30,7 @@ and retrieve it with
30
30
  const data = await httpstate.get('45fb36540e9244daaa21ca409c6bdab3');
31
31
  ```
32
32
 
33
- You can also get real-time updates
33
+ You can also get realtime updates
34
34
 
35
35
  ```typescript
36
36
  const hs = httpstate('45fb36540e9244daaa21ca409c6bdab3');
@@ -86,14 +86,14 @@ That's it! 🐙
86
86
  <br>
87
87
 
88
88
  - `<HttpState>.addEventListener(type, callback)`
89
- Subscribe to real-time updates (alias for `on`).
89
+ Subscribe to realtime updates (alias for `on`).
90
90
  - `<HttpState>.off(type, callback)`
91
- Unsubscribe from real-time updates.
91
+ Unsubscribe from realtime updates.
92
92
  - `<HttpState>.on(type, callback)`
93
- Subscribe to real-time updates.
93
+ Subscribe to realtime updates.
94
94
  - `change`: fired when state data changes. Callback receives current data as argument.
95
95
  - `<HttpState>.removeEventListener(type, callback)`
96
- Unsubscribe from real-time updates (alias for `off`).
96
+ Unsubscribe from realtime updates (alias for `off`).
97
97
 
98
98
  <br>
99
99
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// HTTP State, https://httpstate.com/\n// Copyright (C) Alex Morales, 2026\n//\n// Unless otherwise stated in particular files or directories, this software is free software.\n// You can redistribute it and/or modify it under the terms of the GNU Affero\n// General Public License as published by the Free Software Foundation, either\n// version 3 of the License, or (at your option) any later version.\n\nconst UUIDV4:{ short(s:string):undefined|string; } = { short:(s:string):undefined|string => {\n s = s.toLowerCase();\n\n if(s.length === 36)\n s = s.replace(/-/g, '');\n\n if(\n s.length === 32\n && /^[0-9a-f]{12}4[0-9a-f]{3}[89ab][0-9a-f]{15}$/.test(s)\n )\n return s;\n} };\n\nexport const get:(uuid:string) => Promise<undefined|string> = async (uuid:string):Promise<undefined|string> => {\n const response:Response = await fetch('https://httpstate.com/' + uuid);\n\n if(response.status === 200)\n return await response.text();\n};\n\nexport const load:() => Promise<void> = async ():Promise<void> => {\n for(const node of document.querySelectorAll('[httpstate]')) {\n const uuid:null|string = node.getAttribute('httpstate');\n\n if(!(load as any)._)\n (load as any)._ = {};\n\n if(\n uuid\n && !(load as any)._[uuid]\n )\n (load as any)._[uuid] = httpstate(uuid)\n .on('change', (data:undefined|string) => node.innerHTML = String(data));\n }\n};\n\nexport const post:(uuid:string, data:string) => Promise<number> = async (uuid:string, data:string):Promise<number> => set(uuid, data);\n\nexport const read:(uuid:string) => Promise<undefined|string> = async (uuid:string):Promise<undefined|string> => get(uuid);\n\nexport const set:(uuid:string, data:string) => Promise<number> = async (uuid:string, data:string):Promise<number> => {\n const response:Response = await fetch('https://httpstate.com/' + uuid, {\n body:data,\n headers:{ 'Content-Type':'text/plain;charset=UTF-8' },\n method:'POST'\n });\n\n return response.status;\n};\n\nexport const write:(uuid:string, data:string) => Promise<number> = async (uuid:string, data:string):Promise<number> => set(uuid, data);\n\n// HTTP State\nexport type HttpState = {\n data?:undefined|string;\n et?:undefined|{ [type:string]:((data?:undefined|string) => void)[] };\n uuid?:undefined|string;\n\n addEventListener(type:string, callback:(data?:undefined|string) => void):void;\n delete():void;\n emit(type:string, data?:undefined|string):HttpState;\n get():Promise<undefined|string>;\n off(type:string, callback?:(data?:undefined|string) => void):HttpState;\n on(type:string, callback:(data?:undefined|string) => void):HttpState;\n post(data:string):Promise<undefined|number>;\n read():Promise<undefined|string>;\n removeEventListener(type:string, callback:(data?:undefined|string) => void):void;\n set(data:string):Promise<undefined|number>;\n write(data:string):Promise<undefined|number>;\n ws:{\n _?:undefined|WebSocket,\n delete:() => void,\n new:() => void,\n pingInterval?:undefined|number\n };\n};\n\nexport const httpstate:(uuid:string) => HttpState = (uuid:string):HttpState => {\n const _:HttpState = {\n data:undefined,\n et:{},\n uuid,\n\n addEventListener:(type:string, callback:(data?:undefined|string) => void) => _.on(type, callback),\n delete:() => {\n delete _.data;\n delete _.et;\n delete _.uuid;\n\n _.ws.delete();\n },\n emit:(type:string, data?:undefined|string) => {\n if(_.et?.[type])\n for(const callback of _.et[type])\n if(data === undefined)\n callback.call(_);\n else\n callback.call(_, data);\n\n return _;\n },\n get:async ():Promise<undefined|string> => {\n if(_.uuid) {\n const data:undefined|string = await get(_.uuid);\n\n if(data !== _.data)\n setTimeout(() => _.emit('change', _.data), 0);\n \n _.data = data;\n\n return _.data;\n }\n },\n off:(type:string, callback?:(data?:undefined|string) => void) => {\n if(_.et?.[type]) {\n if(callback)\n _.et[type] = _.et[type].filter(_callback => _callback !== callback);\n\n if(!callback || !_.et[type].length)\n delete _.et[type];\n }\n\n return _;\n },\n on:(type:string, callback:(data?:undefined|string) => void) => {\n if(_.et) {\n if(!_.et[type])\n _.et[type] = [];\n\n _.et[type].push(callback);\n }\n\n return _;\n },\n post:async (data:string):Promise<undefined|number> => _.set(data),\n read:async ():Promise<undefined|string> => _.get(),\n removeEventListener:(type:string, callback:(data?:undefined|string) => void) => _.off(type, callback),\n set:async (data:string):Promise<undefined|number> => {\n if(_.uuid)\n return set(_.uuid, data);\n },\n write:async (data:string):Promise<undefined|number> => _.set(data),\n ws:{\n _:undefined,\n delete:():void => {\n if(_.ws._) {\n clearInterval(_.ws.pingInterval);\n _.ws._.close(1000);\n\n delete _.ws._;\n }\n },\n pingInterval:undefined,\n new:():void => {\n _.ws.delete();\n\n _.ws._ = new WebSocket('wss://httpstate.com/' + uuid);\n\n _.ws._.addEventListener('close', e => {\n let timeout = (_.ws.new as any).timeout||0;\n (_.ws.new as any).timeout = Math.min(Math.max(1024, timeout*2), 1024*60); // ~1 SECOND TO ~1 MINUTE\n\n setTimeout(_.ws.new, (_.ws.new as any).timeout);\n }, { once:true });\n _.ws._.addEventListener('error', e => console.log('error', e));\n _.ws._.addEventListener('open', () => {\n if(_.ws._) {\n _.ws._.addEventListener('message', () => delete (_.ws.new as any).timeout, { once:true });\n _.ws._.addEventListener('message', async e => {\n const data:string = String(await e.data.text());\n\n if(\n _.uuid\n && data\n && data.length > 32\n && data.substring(0, 32) === UUIDV4.short(_.uuid)\n && data.substring(45, 46) === '1'\n ) {\n _.data = data.substring(46);\n\n _.emit('change', _.data);\n }\n });\n\n _.ws._.send(JSON.stringify({ open:_.uuid }));\n\n _.emit('open');\n\n _.ws.pingInterval = setInterval(() => {\n if(\n _.ws._\n && _.ws._.readyState === WebSocket.OPEN\n )\n _.ws._.send('0');\n else\n clearInterval(_.ws.pingInterval);\n }, 1000*30); // 30 SECONDS\n }\n }, { once:true });\n }\n }\n };\n\n _.ws.new();\n\n setTimeout(_.get, 0);\n\n return _;\n};\n\nexport default Object.assign(httpstate, {\n get,\n load,\n read,\n set,\n write\n});\n\nif(\n typeof document !== 'undefined'\n && typeof window !== 'undefined'\n && globalThis === window\n)\n globalThis.addEventListener('DOMContentLoaded', async () => {\n if((globalThis as any).httpstate)\n (globalThis as any).httpstate = (globalThis as any).httpstate.default;\n\n await load();\n }, { once:true });\n"],"mappings":"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","names":["index_exports","__export","index_default","get","httpstate","load","post","read","set","write","__toCommonJS","UUIDV4","s","uuid","response","node","data","_","type","callback","_callback","e","timeout"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// HTTP State, https://httpstate.com/\n// Copyright (C) Alex Morales, 2026\n//\n// Unless otherwise stated in particular files or directories, this software is free software.\n// You can redistribute it and/or modify it under the terms of the GNU Affero\n// General Public License as published by the Free Software Foundation, either\n// version 3 of the License, or (at your option) any later version.\n\nconst UUIDV4:{ short(s:string):undefined|string; } = { short:(s:string):undefined|string => {\n s = s.toLowerCase();\n\n if(s.length === 36)\n s = s.replace(/-/g, '');\n\n if(\n s.length === 32\n && /^[0-9a-f]{12}4[0-9a-f]{3}[89ab][0-9a-f]{15}$/.test(s)\n )\n return s;\n} };\n\nexport const get:(uuid:string) => Promise<undefined|string> = async (uuid:string):Promise<undefined|string> => {\n const response:Response = await fetch('https://httpstate.com/' + uuid);\n\n if(response.status === 200)\n return await response.text();\n};\n\nexport const load:() => Promise<void> = async ():Promise<void> => {\n for(const node of document.querySelectorAll('[httpstate]')) {\n const uuid:null|string = node.getAttribute('httpstate');\n\n if(!(load as any)._)\n (load as any)._ = {};\n\n //T = IF CALLED MORE THAN ONCE, IT SHOULDN'T BE BOUND MORE THAN ONCE\n if(\n uuid\n && !(load as any)._[uuid]\n )\n (load as any)._[uuid] = httpstate(uuid)\n .on('change', (data:undefined|string) => node.innerHTML = String(data));\n }\n};\n\nexport const post:(uuid:string, data:string) => Promise<number> = async (uuid:string, data:string):Promise<number> => set(uuid, data);\n\nexport const read:(uuid:string) => Promise<undefined|string> = async (uuid:string):Promise<undefined|string> => get(uuid);\n\nexport const set:(uuid:string, data:string) => Promise<number> = async (uuid:string, data:string):Promise<number> => {\n const response:Response = await fetch('https://httpstate.com/' + uuid, {\n body:data,\n headers:{ 'Content-Type':'text/plain;charset=UTF-8' },\n method:'POST'\n });\n\n return response.status;\n};\n\nexport const write:(uuid:string, data:string) => Promise<number> = async (uuid:string, data:string):Promise<number> => set(uuid, data);\n\n// HTTP State\nexport type HttpState = {\n data?:undefined|string;\n et?:undefined|{ [type:string]:((data?:undefined|string) => void)[] };\n uuid?:undefined|string;\n\n addEventListener(type:string, callback:(data?:undefined|string) => void):void;\n delete():void;\n emit(type:string, data?:undefined|string):HttpState;\n get():Promise<undefined|string>;\n off(type:string, callback?:(data?:undefined|string) => void):HttpState;\n on(type:string, callback:(data?:undefined|string) => void):HttpState;\n post(data:string):Promise<undefined|number>;\n read():Promise<undefined|string>;\n removeEventListener(type:string, callback:(data?:undefined|string) => void):void;\n set(data:string):Promise<undefined|number>;\n write(data:string):Promise<undefined|number>;\n ws:{\n _?:undefined|WebSocket,\n delete:() => void,\n new:() => void,\n pingInterval?:undefined|number\n };\n};\n\nexport const httpstate:(uuid:string) => HttpState = (uuid:string):HttpState => {\n const _:HttpState = {\n data:undefined,\n et:{},\n uuid,\n\n addEventListener:(type:string, callback:(data?:undefined|string) => void) => _.on(type, callback),\n delete:() => {\n delete _.data;\n delete _.et;\n delete _.uuid;\n\n _.ws.delete();\n },\n emit:(type:string, data?:undefined|string) => {\n if(_.et?.[type])\n for(const callback of _.et[type])\n if(data === undefined)\n callback.call(_);\n else\n callback.call(_, data);\n\n return _;\n },\n get:async ():Promise<undefined|string> => {\n if(_.uuid) {\n const data:undefined|string = await get(_.uuid);\n\n if(data !== _.data)\n setTimeout(() => _.emit('change', _.data), 0);\n \n _.data = data;\n\n return _.data;\n }\n },\n off:(type:string, callback?:(data?:undefined|string) => void) => {\n if(_.et?.[type]) {\n if(callback)\n _.et[type] = _.et[type].filter(_callback => _callback !== callback);\n\n if(!callback || !_.et[type].length)\n delete _.et[type];\n }\n\n return _;\n },\n on:(type:string, callback:(data?:undefined|string) => void) => {\n if(_.et) {\n if(!_.et[type])\n _.et[type] = [];\n\n _.et[type].push(callback);\n }\n\n return _;\n },\n post:async (data:string):Promise<undefined|number> => _.set(data),\n read:async ():Promise<undefined|string> => _.get(),\n removeEventListener:(type:string, callback:(data?:undefined|string) => void) => _.off(type, callback),\n set:async (data:string):Promise<undefined|number> => {\n if(_.uuid)\n return set(_.uuid, data);\n },\n write:async (data:string):Promise<undefined|number> => _.set(data),\n ws:{\n _:undefined,\n delete:():void => {\n if(_.ws._) {\n clearInterval(_.ws.pingInterval);\n _.ws._.close(1000);\n\n delete _.ws._;\n }\n },\n pingInterval:undefined,\n new:():void => {\n _.ws.delete();\n\n _.ws._ = new WebSocket('wss://httpstate.com/' + uuid);\n\n _.ws._.addEventListener('close', e => {\n let timeout = (_.ws.new as any).timeout||0;\n (_.ws.new as any).timeout = Math.min(Math.max(1024, timeout*2), 1024*60); // ~1 SECOND TO ~1 MINUTE\n\n setTimeout(_.ws.new, (_.ws.new as any).timeout);\n }, { once:true });\n _.ws._.addEventListener('error', e => console.log('error', e));\n _.ws._.addEventListener('open', () => {\n if(_.ws._) {\n _.ws._.addEventListener('message', () => delete (_.ws.new as any).timeout, { once:true });\n _.ws._.addEventListener('message', async e => {\n const data:string = String(await e.data.text());\n\n if(\n _.uuid\n && data\n && data.length > 32\n && data.substring(0, 32) === UUIDV4.short(_.uuid)\n && data.substring(45, 46) === '1'\n ) {\n _.data = data.substring(46);\n\n _.emit('change', _.data);\n }\n });\n\n _.ws._.send(JSON.stringify({ open:_.uuid }));\n\n _.emit('open');\n\n _.ws.pingInterval = setInterval(() => {\n if(\n _.ws._\n && _.ws._.readyState === WebSocket.OPEN\n )\n _.ws._.send('0');\n else\n clearInterval(_.ws.pingInterval);\n }, 1000*30); // 30 SECONDS\n }\n }, { once:true });\n }\n }\n };\n\n _.ws.new();\n\n setTimeout(_.get, 0);\n\n return _;\n};\n\nexport default Object.assign(httpstate, {\n get,\n load,\n read,\n set,\n write\n});\n\nif(\n typeof document !== 'undefined'\n && typeof window !== 'undefined'\n && globalThis === window\n)\n globalThis.addEventListener('DOMContentLoaded', async () => {\n if((globalThis as any).httpstate)\n (globalThis as any).httpstate = (globalThis as any).httpstate.default;\n\n await load();\n }, { once:true });\n"],"mappings":"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","names":["index_exports","__export","index_default","get","httpstate","load","post","read","set","write","__toCommonJS","UUIDV4","s","uuid","response","node","data","_","type","callback","_callback","e","timeout"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// HTTP State, https://httpstate.com/\n// Copyright (C) Alex Morales, 2026\n//\n// Unless otherwise stated in particular files or directories, this software is free software.\n// You can redistribute it and/or modify it under the terms of the GNU Affero\n// General Public License as published by the Free Software Foundation, either\n// version 3 of the License, or (at your option) any later version.\n\nconst UUIDV4:{ short(s:string):undefined|string; } = { short:(s:string):undefined|string => {\n s = s.toLowerCase();\n\n if(s.length === 36)\n s = s.replace(/-/g, '');\n\n if(\n s.length === 32\n && /^[0-9a-f]{12}4[0-9a-f]{3}[89ab][0-9a-f]{15}$/.test(s)\n )\n return s;\n} };\n\nexport const get:(uuid:string) => Promise<undefined|string> = async (uuid:string):Promise<undefined|string> => {\n const response:Response = await fetch('https://httpstate.com/' + uuid);\n\n if(response.status === 200)\n return await response.text();\n};\n\nexport const load:() => Promise<void> = async ():Promise<void> => {\n for(const node of document.querySelectorAll('[httpstate]')) {\n const uuid:null|string = node.getAttribute('httpstate');\n\n if(!(load as any)._)\n (load as any)._ = {};\n\n if(\n uuid\n && !(load as any)._[uuid]\n )\n (load as any)._[uuid] = httpstate(uuid)\n .on('change', (data:undefined|string) => node.innerHTML = String(data));\n }\n};\n\nexport const post:(uuid:string, data:string) => Promise<number> = async (uuid:string, data:string):Promise<number> => set(uuid, data);\n\nexport const read:(uuid:string) => Promise<undefined|string> = async (uuid:string):Promise<undefined|string> => get(uuid);\n\nexport const set:(uuid:string, data:string) => Promise<number> = async (uuid:string, data:string):Promise<number> => {\n const response:Response = await fetch('https://httpstate.com/' + uuid, {\n body:data,\n headers:{ 'Content-Type':'text/plain;charset=UTF-8' },\n method:'POST'\n });\n\n return response.status;\n};\n\nexport const write:(uuid:string, data:string) => Promise<number> = async (uuid:string, data:string):Promise<number> => set(uuid, data);\n\n// HTTP State\nexport type HttpState = {\n data?:undefined|string;\n et?:undefined|{ [type:string]:((data?:undefined|string) => void)[] };\n uuid?:undefined|string;\n\n addEventListener(type:string, callback:(data?:undefined|string) => void):void;\n delete():void;\n emit(type:string, data?:undefined|string):HttpState;\n get():Promise<undefined|string>;\n off(type:string, callback?:(data?:undefined|string) => void):HttpState;\n on(type:string, callback:(data?:undefined|string) => void):HttpState;\n post(data:string):Promise<undefined|number>;\n read():Promise<undefined|string>;\n removeEventListener(type:string, callback:(data?:undefined|string) => void):void;\n set(data:string):Promise<undefined|number>;\n write(data:string):Promise<undefined|number>;\n ws:{\n _?:undefined|WebSocket,\n delete:() => void,\n new:() => void,\n pingInterval?:undefined|number\n };\n};\n\nexport const httpstate:(uuid:string) => HttpState = (uuid:string):HttpState => {\n const _:HttpState = {\n data:undefined,\n et:{},\n uuid,\n\n addEventListener:(type:string, callback:(data?:undefined|string) => void) => _.on(type, callback),\n delete:() => {\n delete _.data;\n delete _.et;\n delete _.uuid;\n\n _.ws.delete();\n },\n emit:(type:string, data?:undefined|string) => {\n if(_.et?.[type])\n for(const callback of _.et[type])\n if(data === undefined)\n callback.call(_);\n else\n callback.call(_, data);\n\n return _;\n },\n get:async ():Promise<undefined|string> => {\n if(_.uuid) {\n const data:undefined|string = await get(_.uuid);\n\n if(data !== _.data)\n setTimeout(() => _.emit('change', _.data), 0);\n \n _.data = data;\n\n return _.data;\n }\n },\n off:(type:string, callback?:(data?:undefined|string) => void) => {\n if(_.et?.[type]) {\n if(callback)\n _.et[type] = _.et[type].filter(_callback => _callback !== callback);\n\n if(!callback || !_.et[type].length)\n delete _.et[type];\n }\n\n return _;\n },\n on:(type:string, callback:(data?:undefined|string) => void) => {\n if(_.et) {\n if(!_.et[type])\n _.et[type] = [];\n\n _.et[type].push(callback);\n }\n\n return _;\n },\n post:async (data:string):Promise<undefined|number> => _.set(data),\n read:async ():Promise<undefined|string> => _.get(),\n removeEventListener:(type:string, callback:(data?:undefined|string) => void) => _.off(type, callback),\n set:async (data:string):Promise<undefined|number> => {\n if(_.uuid)\n return set(_.uuid, data);\n },\n write:async (data:string):Promise<undefined|number> => _.set(data),\n ws:{\n _:undefined,\n delete:():void => {\n if(_.ws._) {\n clearInterval(_.ws.pingInterval);\n _.ws._.close(1000);\n\n delete _.ws._;\n }\n },\n pingInterval:undefined,\n new:():void => {\n _.ws.delete();\n\n _.ws._ = new WebSocket('wss://httpstate.com/' + uuid);\n\n _.ws._.addEventListener('close', e => {\n let timeout = (_.ws.new as any).timeout||0;\n (_.ws.new as any).timeout = Math.min(Math.max(1024, timeout*2), 1024*60); // ~1 SECOND TO ~1 MINUTE\n\n setTimeout(_.ws.new, (_.ws.new as any).timeout);\n }, { once:true });\n _.ws._.addEventListener('error', e => console.log('error', e));\n _.ws._.addEventListener('open', () => {\n if(_.ws._) {\n _.ws._.addEventListener('message', () => delete (_.ws.new as any).timeout, { once:true });\n _.ws._.addEventListener('message', async e => {\n const data:string = String(await e.data.text());\n\n if(\n _.uuid\n && data\n && data.length > 32\n && data.substring(0, 32) === UUIDV4.short(_.uuid)\n && data.substring(45, 46) === '1'\n ) {\n _.data = data.substring(46);\n\n _.emit('change', _.data);\n }\n });\n\n _.ws._.send(JSON.stringify({ open:_.uuid }));\n\n _.emit('open');\n\n _.ws.pingInterval = setInterval(() => {\n if(\n _.ws._\n && _.ws._.readyState === WebSocket.OPEN\n )\n _.ws._.send('0');\n else\n clearInterval(_.ws.pingInterval);\n }, 1000*30); // 30 SECONDS\n }\n }, { once:true });\n }\n }\n };\n\n _.ws.new();\n\n setTimeout(_.get, 0);\n\n return _;\n};\n\nexport default Object.assign(httpstate, {\n get,\n load,\n read,\n set,\n write\n});\n\nif(\n typeof document !== 'undefined'\n && typeof window !== 'undefined'\n && globalThis === window\n)\n globalThis.addEventListener('DOMContentLoaded', async () => {\n if((globalThis as any).httpstate)\n (globalThis as any).httpstate = (globalThis as any).httpstate.default;\n\n await load();\n }, { once:true });\n"],"mappings":"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","names":["UUIDV4","s","get","uuid","response","load","node","httpstate","data","post","set","read","write","_","type","callback","_callback","e","timeout","index_default"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// HTTP State, https://httpstate.com/\n// Copyright (C) Alex Morales, 2026\n//\n// Unless otherwise stated in particular files or directories, this software is free software.\n// You can redistribute it and/or modify it under the terms of the GNU Affero\n// General Public License as published by the Free Software Foundation, either\n// version 3 of the License, or (at your option) any later version.\n\nconst UUIDV4:{ short(s:string):undefined|string; } = { short:(s:string):undefined|string => {\n s = s.toLowerCase();\n\n if(s.length === 36)\n s = s.replace(/-/g, '');\n\n if(\n s.length === 32\n && /^[0-9a-f]{12}4[0-9a-f]{3}[89ab][0-9a-f]{15}$/.test(s)\n )\n return s;\n} };\n\nexport const get:(uuid:string) => Promise<undefined|string> = async (uuid:string):Promise<undefined|string> => {\n const response:Response = await fetch('https://httpstate.com/' + uuid);\n\n if(response.status === 200)\n return await response.text();\n};\n\nexport const load:() => Promise<void> = async ():Promise<void> => {\n for(const node of document.querySelectorAll('[httpstate]')) {\n const uuid:null|string = node.getAttribute('httpstate');\n\n if(!(load as any)._)\n (load as any)._ = {};\n\n //T = IF CALLED MORE THAN ONCE, IT SHOULDN'T BE BOUND MORE THAN ONCE\n if(\n uuid\n && !(load as any)._[uuid]\n )\n (load as any)._[uuid] = httpstate(uuid)\n .on('change', (data:undefined|string) => node.innerHTML = String(data));\n }\n};\n\nexport const post:(uuid:string, data:string) => Promise<number> = async (uuid:string, data:string):Promise<number> => set(uuid, data);\n\nexport const read:(uuid:string) => Promise<undefined|string> = async (uuid:string):Promise<undefined|string> => get(uuid);\n\nexport const set:(uuid:string, data:string) => Promise<number> = async (uuid:string, data:string):Promise<number> => {\n const response:Response = await fetch('https://httpstate.com/' + uuid, {\n body:data,\n headers:{ 'Content-Type':'text/plain;charset=UTF-8' },\n method:'POST'\n });\n\n return response.status;\n};\n\nexport const write:(uuid:string, data:string) => Promise<number> = async (uuid:string, data:string):Promise<number> => set(uuid, data);\n\n// HTTP State\nexport type HttpState = {\n data?:undefined|string;\n et?:undefined|{ [type:string]:((data?:undefined|string) => void)[] };\n uuid?:undefined|string;\n\n addEventListener(type:string, callback:(data?:undefined|string) => void):void;\n delete():void;\n emit(type:string, data?:undefined|string):HttpState;\n get():Promise<undefined|string>;\n off(type:string, callback?:(data?:undefined|string) => void):HttpState;\n on(type:string, callback:(data?:undefined|string) => void):HttpState;\n post(data:string):Promise<undefined|number>;\n read():Promise<undefined|string>;\n removeEventListener(type:string, callback:(data?:undefined|string) => void):void;\n set(data:string):Promise<undefined|number>;\n write(data:string):Promise<undefined|number>;\n ws:{\n _?:undefined|WebSocket,\n delete:() => void,\n new:() => void,\n pingInterval?:undefined|number\n };\n};\n\nexport const httpstate:(uuid:string) => HttpState = (uuid:string):HttpState => {\n const _:HttpState = {\n data:undefined,\n et:{},\n uuid,\n\n addEventListener:(type:string, callback:(data?:undefined|string) => void) => _.on(type, callback),\n delete:() => {\n delete _.data;\n delete _.et;\n delete _.uuid;\n\n _.ws.delete();\n },\n emit:(type:string, data?:undefined|string) => {\n if(_.et?.[type])\n for(const callback of _.et[type])\n if(data === undefined)\n callback.call(_);\n else\n callback.call(_, data);\n\n return _;\n },\n get:async ():Promise<undefined|string> => {\n if(_.uuid) {\n const data:undefined|string = await get(_.uuid);\n\n if(data !== _.data)\n setTimeout(() => _.emit('change', _.data), 0);\n \n _.data = data;\n\n return _.data;\n }\n },\n off:(type:string, callback?:(data?:undefined|string) => void) => {\n if(_.et?.[type]) {\n if(callback)\n _.et[type] = _.et[type].filter(_callback => _callback !== callback);\n\n if(!callback || !_.et[type].length)\n delete _.et[type];\n }\n\n return _;\n },\n on:(type:string, callback:(data?:undefined|string) => void) => {\n if(_.et) {\n if(!_.et[type])\n _.et[type] = [];\n\n _.et[type].push(callback);\n }\n\n return _;\n },\n post:async (data:string):Promise<undefined|number> => _.set(data),\n read:async ():Promise<undefined|string> => _.get(),\n removeEventListener:(type:string, callback:(data?:undefined|string) => void) => _.off(type, callback),\n set:async (data:string):Promise<undefined|number> => {\n if(_.uuid)\n return set(_.uuid, data);\n },\n write:async (data:string):Promise<undefined|number> => _.set(data),\n ws:{\n _:undefined,\n delete:():void => {\n if(_.ws._) {\n clearInterval(_.ws.pingInterval);\n _.ws._.close(1000);\n\n delete _.ws._;\n }\n },\n pingInterval:undefined,\n new:():void => {\n _.ws.delete();\n\n _.ws._ = new WebSocket('wss://httpstate.com/' + uuid);\n\n _.ws._.addEventListener('close', e => {\n let timeout = (_.ws.new as any).timeout||0;\n (_.ws.new as any).timeout = Math.min(Math.max(1024, timeout*2), 1024*60); // ~1 SECOND TO ~1 MINUTE\n\n setTimeout(_.ws.new, (_.ws.new as any).timeout);\n }, { once:true });\n _.ws._.addEventListener('error', e => console.log('error', e));\n _.ws._.addEventListener('open', () => {\n if(_.ws._) {\n _.ws._.addEventListener('message', () => delete (_.ws.new as any).timeout, { once:true });\n _.ws._.addEventListener('message', async e => {\n const data:string = String(await e.data.text());\n\n if(\n _.uuid\n && data\n && data.length > 32\n && data.substring(0, 32) === UUIDV4.short(_.uuid)\n && data.substring(45, 46) === '1'\n ) {\n _.data = data.substring(46);\n\n _.emit('change', _.data);\n }\n });\n\n _.ws._.send(JSON.stringify({ open:_.uuid }));\n\n _.emit('open');\n\n _.ws.pingInterval = setInterval(() => {\n if(\n _.ws._\n && _.ws._.readyState === WebSocket.OPEN\n )\n _.ws._.send('0');\n else\n clearInterval(_.ws.pingInterval);\n }, 1000*30); // 30 SECONDS\n }\n }, { once:true });\n }\n }\n };\n\n _.ws.new();\n\n setTimeout(_.get, 0);\n\n return _;\n};\n\nexport default Object.assign(httpstate, {\n get,\n load,\n read,\n set,\n write\n});\n\nif(\n typeof document !== 'undefined'\n && typeof window !== 'undefined'\n && globalThis === window\n)\n globalThis.addEventListener('DOMContentLoaded', async () => {\n if((globalThis as any).httpstate)\n (globalThis as any).httpstate = (globalThis as any).httpstate.default;\n\n await load();\n }, { once:true });\n"],"mappings":"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","names":["UUIDV4","s","get","uuid","response","load","node","httpstate","data","post","set","read","write","_","type","callback","_callback","e","timeout","index_default"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// HTTP State, https://httpstate.com/\n// Copyright (C) Alex Morales, 2026\n//\n// Unless otherwise stated in particular files or directories, this software is free software.\n// You can redistribute it and/or modify it under the terms of the GNU Affero\n// General Public License as published by the Free Software Foundation, either\n// version 3 of the License, or (at your option) any later version.\n\nconst UUIDV4:{ short(s:string):undefined|string; } = { short:(s:string):undefined|string => {\n s = s.toLowerCase();\n\n if(s.length === 36)\n s = s.replace(/-/g, '');\n\n if(\n s.length === 32\n && /^[0-9a-f]{12}4[0-9a-f]{3}[89ab][0-9a-f]{15}$/.test(s)\n )\n return s;\n} };\n\nexport const get:(uuid:string) => Promise<undefined|string> = async (uuid:string):Promise<undefined|string> => {\n const response:Response = await fetch('https://httpstate.com/' + uuid);\n\n if(response.status === 200)\n return await response.text();\n};\n\nexport const load:() => Promise<void> = async ():Promise<void> => {\n for(const node of document.querySelectorAll('[httpstate]')) {\n const uuid:null|string = node.getAttribute('httpstate');\n\n if(!(load as any)._)\n (load as any)._ = {};\n\n if(\n uuid\n && !(load as any)._[uuid]\n )\n (load as any)._[uuid] = httpstate(uuid)\n .on('change', (data:undefined|string) => node.innerHTML = String(data));\n }\n};\n\nexport const post:(uuid:string, data:string) => Promise<number> = async (uuid:string, data:string):Promise<number> => set(uuid, data);\n\nexport const read:(uuid:string) => Promise<undefined|string> = async (uuid:string):Promise<undefined|string> => get(uuid);\n\nexport const set:(uuid:string, data:string) => Promise<number> = async (uuid:string, data:string):Promise<number> => {\n const response:Response = await fetch('https://httpstate.com/' + uuid, {\n body:data,\n headers:{ 'Content-Type':'text/plain;charset=UTF-8' },\n method:'POST'\n });\n\n return response.status;\n};\n\nexport const write:(uuid:string, data:string) => Promise<number> = async (uuid:string, data:string):Promise<number> => set(uuid, data);\n\n// HTTP State\nexport type HttpState = {\n data?:undefined|string;\n et?:undefined|{ [type:string]:((data?:undefined|string) => void)[] };\n uuid?:undefined|string;\n\n addEventListener(type:string, callback:(data?:undefined|string) => void):void;\n delete():void;\n emit(type:string, data?:undefined|string):HttpState;\n get():Promise<undefined|string>;\n off(type:string, callback?:(data?:undefined|string) => void):HttpState;\n on(type:string, callback:(data?:undefined|string) => void):HttpState;\n post(data:string):Promise<undefined|number>;\n read():Promise<undefined|string>;\n removeEventListener(type:string, callback:(data?:undefined|string) => void):void;\n set(data:string):Promise<undefined|number>;\n write(data:string):Promise<undefined|number>;\n ws:{\n _?:undefined|WebSocket,\n delete:() => void,\n new:() => void,\n pingInterval?:undefined|number\n };\n};\n\nexport const httpstate:(uuid:string) => HttpState = (uuid:string):HttpState => {\n const _:HttpState = {\n data:undefined,\n et:{},\n uuid,\n\n addEventListener:(type:string, callback:(data?:undefined|string) => void) => _.on(type, callback),\n delete:() => {\n delete _.data;\n delete _.et;\n delete _.uuid;\n\n _.ws.delete();\n },\n emit:(type:string, data?:undefined|string) => {\n if(_.et?.[type])\n for(const callback of _.et[type])\n if(data === undefined)\n callback.call(_);\n else\n callback.call(_, data);\n\n return _;\n },\n get:async ():Promise<undefined|string> => {\n if(_.uuid) {\n const data:undefined|string = await get(_.uuid);\n\n if(data !== _.data)\n setTimeout(() => _.emit('change', _.data), 0);\n \n _.data = data;\n\n return _.data;\n }\n },\n off:(type:string, callback?:(data?:undefined|string) => void) => {\n if(_.et?.[type]) {\n if(callback)\n _.et[type] = _.et[type].filter(_callback => _callback !== callback);\n\n if(!callback || !_.et[type].length)\n delete _.et[type];\n }\n\n return _;\n },\n on:(type:string, callback:(data?:undefined|string) => void) => {\n if(_.et) {\n if(!_.et[type])\n _.et[type] = [];\n\n _.et[type].push(callback);\n }\n\n return _;\n },\n post:async (data:string):Promise<undefined|number> => _.set(data),\n read:async ():Promise<undefined|string> => _.get(),\n removeEventListener:(type:string, callback:(data?:undefined|string) => void) => _.off(type, callback),\n set:async (data:string):Promise<undefined|number> => {\n if(_.uuid)\n return set(_.uuid, data);\n },\n write:async (data:string):Promise<undefined|number> => _.set(data),\n ws:{\n _:undefined,\n delete:():void => {\n if(_.ws._) {\n clearInterval(_.ws.pingInterval);\n _.ws._.close(1000);\n\n delete _.ws._;\n }\n },\n pingInterval:undefined,\n new:():void => {\n _.ws.delete();\n\n _.ws._ = new WebSocket('wss://httpstate.com/' + uuid);\n\n _.ws._.addEventListener('close', e => {\n let timeout = (_.ws.new as any).timeout||0;\n (_.ws.new as any).timeout = Math.min(Math.max(1024, timeout*2), 1024*60); // ~1 SECOND TO ~1 MINUTE\n\n setTimeout(_.ws.new, (_.ws.new as any).timeout);\n }, { once:true });\n _.ws._.addEventListener('error', e => console.log('error', e));\n _.ws._.addEventListener('open', () => {\n if(_.ws._) {\n _.ws._.addEventListener('message', () => delete (_.ws.new as any).timeout, { once:true });\n _.ws._.addEventListener('message', async e => {\n const data:string = String(await e.data.text());\n\n if(\n _.uuid\n && data\n && data.length > 32\n && data.substring(0, 32) === UUIDV4.short(_.uuid)\n && data.substring(45, 46) === '1'\n ) {\n _.data = data.substring(46);\n\n _.emit('change', _.data);\n }\n });\n\n _.ws._.send(JSON.stringify({ open:_.uuid }));\n\n _.emit('open');\n\n _.ws.pingInterval = setInterval(() => {\n if(\n _.ws._\n && _.ws._.readyState === WebSocket.OPEN\n )\n _.ws._.send('0');\n else\n clearInterval(_.ws.pingInterval);\n }, 1000*30); // 30 SECONDS\n }\n }, { once:true });\n }\n }\n };\n\n _.ws.new();\n\n setTimeout(_.get, 0);\n\n return _;\n};\n\nexport default Object.assign(httpstate, {\n get,\n load,\n read,\n set,\n write\n});\n\nif(\n typeof document !== 'undefined'\n && typeof window !== 'undefined'\n && globalThis === window\n)\n globalThis.addEventListener('DOMContentLoaded', async () => {\n if((globalThis as any).httpstate)\n (globalThis as any).httpstate = (globalThis as any).httpstate.default;\n\n await load();\n }, { once:true });\n"],"mappings":"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","names":["index_exports","__export","index_default","get","httpstate","load","post","read","set","write","UUIDV4","s","uuid","response","node","data","_","type","callback","_callback","e","timeout"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// HTTP State, https://httpstate.com/\n// Copyright (C) Alex Morales, 2026\n//\n// Unless otherwise stated in particular files or directories, this software is free software.\n// You can redistribute it and/or modify it under the terms of the GNU Affero\n// General Public License as published by the Free Software Foundation, either\n// version 3 of the License, or (at your option) any later version.\n\nconst UUIDV4:{ short(s:string):undefined|string; } = { short:(s:string):undefined|string => {\n s = s.toLowerCase();\n\n if(s.length === 36)\n s = s.replace(/-/g, '');\n\n if(\n s.length === 32\n && /^[0-9a-f]{12}4[0-9a-f]{3}[89ab][0-9a-f]{15}$/.test(s)\n )\n return s;\n} };\n\nexport const get:(uuid:string) => Promise<undefined|string> = async (uuid:string):Promise<undefined|string> => {\n const response:Response = await fetch('https://httpstate.com/' + uuid);\n\n if(response.status === 200)\n return await response.text();\n};\n\nexport const load:() => Promise<void> = async ():Promise<void> => {\n for(const node of document.querySelectorAll('[httpstate]')) {\n const uuid:null|string = node.getAttribute('httpstate');\n\n if(!(load as any)._)\n (load as any)._ = {};\n\n //T = IF CALLED MORE THAN ONCE, IT SHOULDN'T BE BOUND MORE THAN ONCE\n if(\n uuid\n && !(load as any)._[uuid]\n )\n (load as any)._[uuid] = httpstate(uuid)\n .on('change', (data:undefined|string) => node.innerHTML = String(data));\n }\n};\n\nexport const post:(uuid:string, data:string) => Promise<number> = async (uuid:string, data:string):Promise<number> => set(uuid, data);\n\nexport const read:(uuid:string) => Promise<undefined|string> = async (uuid:string):Promise<undefined|string> => get(uuid);\n\nexport const set:(uuid:string, data:string) => Promise<number> = async (uuid:string, data:string):Promise<number> => {\n const response:Response = await fetch('https://httpstate.com/' + uuid, {\n body:data,\n headers:{ 'Content-Type':'text/plain;charset=UTF-8' },\n method:'POST'\n });\n\n return response.status;\n};\n\nexport const write:(uuid:string, data:string) => Promise<number> = async (uuid:string, data:string):Promise<number> => set(uuid, data);\n\n// HTTP State\nexport type HttpState = {\n data?:undefined|string;\n et?:undefined|{ [type:string]:((data?:undefined|string) => void)[] };\n uuid?:undefined|string;\n\n addEventListener(type:string, callback:(data?:undefined|string) => void):void;\n delete():void;\n emit(type:string, data?:undefined|string):HttpState;\n get():Promise<undefined|string>;\n off(type:string, callback?:(data?:undefined|string) => void):HttpState;\n on(type:string, callback:(data?:undefined|string) => void):HttpState;\n post(data:string):Promise<undefined|number>;\n read():Promise<undefined|string>;\n removeEventListener(type:string, callback:(data?:undefined|string) => void):void;\n set(data:string):Promise<undefined|number>;\n write(data:string):Promise<undefined|number>;\n ws:{\n _?:undefined|WebSocket,\n delete:() => void,\n new:() => void,\n pingInterval?:undefined|number\n };\n};\n\nexport const httpstate:(uuid:string) => HttpState = (uuid:string):HttpState => {\n const _:HttpState = {\n data:undefined,\n et:{},\n uuid,\n\n addEventListener:(type:string, callback:(data?:undefined|string) => void) => _.on(type, callback),\n delete:() => {\n delete _.data;\n delete _.et;\n delete _.uuid;\n\n _.ws.delete();\n },\n emit:(type:string, data?:undefined|string) => {\n if(_.et?.[type])\n for(const callback of _.et[type])\n if(data === undefined)\n callback.call(_);\n else\n callback.call(_, data);\n\n return _;\n },\n get:async ():Promise<undefined|string> => {\n if(_.uuid) {\n const data:undefined|string = await get(_.uuid);\n\n if(data !== _.data)\n setTimeout(() => _.emit('change', _.data), 0);\n \n _.data = data;\n\n return _.data;\n }\n },\n off:(type:string, callback?:(data?:undefined|string) => void) => {\n if(_.et?.[type]) {\n if(callback)\n _.et[type] = _.et[type].filter(_callback => _callback !== callback);\n\n if(!callback || !_.et[type].length)\n delete _.et[type];\n }\n\n return _;\n },\n on:(type:string, callback:(data?:undefined|string) => void) => {\n if(_.et) {\n if(!_.et[type])\n _.et[type] = [];\n\n _.et[type].push(callback);\n }\n\n return _;\n },\n post:async (data:string):Promise<undefined|number> => _.set(data),\n read:async ():Promise<undefined|string> => _.get(),\n removeEventListener:(type:string, callback:(data?:undefined|string) => void) => _.off(type, callback),\n set:async (data:string):Promise<undefined|number> => {\n if(_.uuid)\n return set(_.uuid, data);\n },\n write:async (data:string):Promise<undefined|number> => _.set(data),\n ws:{\n _:undefined,\n delete:():void => {\n if(_.ws._) {\n clearInterval(_.ws.pingInterval);\n _.ws._.close(1000);\n\n delete _.ws._;\n }\n },\n pingInterval:undefined,\n new:():void => {\n _.ws.delete();\n\n _.ws._ = new WebSocket('wss://httpstate.com/' + uuid);\n\n _.ws._.addEventListener('close', e => {\n let timeout = (_.ws.new as any).timeout||0;\n (_.ws.new as any).timeout = Math.min(Math.max(1024, timeout*2), 1024*60); // ~1 SECOND TO ~1 MINUTE\n\n setTimeout(_.ws.new, (_.ws.new as any).timeout);\n }, { once:true });\n _.ws._.addEventListener('error', e => console.log('error', e));\n _.ws._.addEventListener('open', () => {\n if(_.ws._) {\n _.ws._.addEventListener('message', () => delete (_.ws.new as any).timeout, { once:true });\n _.ws._.addEventListener('message', async e => {\n const data:string = String(await e.data.text());\n\n if(\n _.uuid\n && data\n && data.length > 32\n && data.substring(0, 32) === UUIDV4.short(_.uuid)\n && data.substring(45, 46) === '1'\n ) {\n _.data = data.substring(46);\n\n _.emit('change', _.data);\n }\n });\n\n _.ws._.send(JSON.stringify({ open:_.uuid }));\n\n _.emit('open');\n\n _.ws.pingInterval = setInterval(() => {\n if(\n _.ws._\n && _.ws._.readyState === WebSocket.OPEN\n )\n _.ws._.send('0');\n else\n clearInterval(_.ws.pingInterval);\n }, 1000*30); // 30 SECONDS\n }\n }, { once:true });\n }\n }\n };\n\n _.ws.new();\n\n setTimeout(_.get, 0);\n\n return _;\n};\n\nexport default Object.assign(httpstate, {\n get,\n load,\n read,\n set,\n write\n});\n\nif(\n typeof document !== 'undefined'\n && typeof window !== 'undefined'\n && globalThis === window\n)\n globalThis.addEventListener('DOMContentLoaded', async () => {\n if((globalThis as any).httpstate)\n (globalThis as any).httpstate = (globalThis as any).httpstate.default;\n\n await load();\n }, { once:true });\n"],"mappings":"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","names":["index_exports","__export","index_default","get","httpstate","load","post","read","set","write","UUIDV4","s","uuid","response","node","data","_","type","callback","_callback","e","timeout"]}
package/package.json CHANGED
@@ -25,5 +25,5 @@
25
25
  },
26
26
  "type": "module",
27
27
  "types": "dist/index.d.ts",
28
- "version": "0.0.40"
28
+ "version": "0.0.42"
29
29
  }