@httpstate/typescript 0.0.39 → 0.0.41
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 +121 -0
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.cts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/index.global.js +1 -1
- package/dist/index.global.js.map +1 -1
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# httpstate (typescript)
|
|
2
|
+
|
|
3
|
+
## Quick Start
|
|
4
|
+
|
|
5
|
+
Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @httpstate/typescript
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Import
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
import httpstate from '@httpstate/typescript';
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Pick any valid UUID v4. You can [generate one here](https://uuid.httpstate.com).
|
|
18
|
+
|
|
19
|
+
We'll use `45fb3654-0e92-44da-aa21-ca409c6bdab3` or `45fb36540e9244daaa21ca409c6bdab3` (without dashes).
|
|
20
|
+
|
|
21
|
+
Store some data with
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
await httpstate.set('45fb36540e9244daaa21ca409c6bdab3', 'Hi! 👋🏻');
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
and retrieve it with
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
const data = await httpstate.get('45fb36540e9244daaa21ca409c6bdab3');
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
You can also get realtime updates
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
const hs = httpstate('45fb36540e9244daaa21ca409c6bdab3');
|
|
37
|
+
|
|
38
|
+
hs.on('change', data => console.log(`This will change everytime data is set [${data}].`));
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
That's it! 🐙
|
|
42
|
+
|
|
43
|
+
## API
|
|
44
|
+
|
|
45
|
+
### Functions
|
|
46
|
+
|
|
47
|
+
- `get(uuid)`
|
|
48
|
+
Get state of UUIDv4.
|
|
49
|
+
|
|
50
|
+
- `load()`
|
|
51
|
+
Auto-load state from DOM elements with `httpstate` attribute.
|
|
52
|
+
|
|
53
|
+
- `post(uuid, data)`
|
|
54
|
+
Alias for `set`.
|
|
55
|
+
|
|
56
|
+
- `read(uuid)`
|
|
57
|
+
Alias for `get`.
|
|
58
|
+
|
|
59
|
+
- `set(uuid, data)`
|
|
60
|
+
Set state of UUIDv4.
|
|
61
|
+
|
|
62
|
+
- `write(uuid, data)`
|
|
63
|
+
Alias for `set`.
|
|
64
|
+
|
|
65
|
+
### HttpState Class
|
|
66
|
+
|
|
67
|
+
- `httpstate(uuid)`
|
|
68
|
+
Create a reactive state instance of UUIDv4.
|
|
69
|
+
|
|
70
|
+
- `<HttpState>.data`
|
|
71
|
+
Property with the most up-to-date state value.
|
|
72
|
+
|
|
73
|
+
<br>
|
|
74
|
+
|
|
75
|
+
- `<HttpState>.get()`
|
|
76
|
+
Get state.
|
|
77
|
+
- `<HttpState>.post(data)`
|
|
78
|
+
Alias for `set`.
|
|
79
|
+
- `<HttpState>.read()`
|
|
80
|
+
Alias for `get`.
|
|
81
|
+
- `<HttpState>.set(data)`
|
|
82
|
+
Set state.
|
|
83
|
+
- `<HttpState>.write(data)`
|
|
84
|
+
Alias for `set`.
|
|
85
|
+
|
|
86
|
+
<br>
|
|
87
|
+
|
|
88
|
+
- `<HttpState>.addEventListener(type, callback)`
|
|
89
|
+
Subscribe to realtime updates (alias for `on`).
|
|
90
|
+
- `<HttpState>.off(type, callback)`
|
|
91
|
+
Unsubscribe from realtime updates.
|
|
92
|
+
- `<HttpState>.on(type, callback)`
|
|
93
|
+
Subscribe to realtime updates.
|
|
94
|
+
- `change`: fired when state data changes. Callback receives current data as argument.
|
|
95
|
+
- `<HttpState>.removeEventListener(type, callback)`
|
|
96
|
+
Unsubscribe from realtime updates (alias for `off`).
|
|
97
|
+
|
|
98
|
+
<br>
|
|
99
|
+
|
|
100
|
+
- `<HttpState>.delete()`
|
|
101
|
+
Cleanup and delete the instance.
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## About
|
|
106
|
+
|
|
107
|
+
Alex Morales, [moralestapia.com](https://moralestapia.com)
|
|
108
|
+
|
|
109
|
+
Copyright © Alex Morales, 2026
|
|
110
|
+
|
|
111
|
+
## Contact
|
|
112
|
+
|
|
113
|
+
Comments, feature requests, etc. are welcome at **inbox @ httpstate.com**.
|
|
114
|
+
|
|
115
|
+
## License
|
|
116
|
+
|
|
117
|
+
Unless otherwise stated in particular files or directories, this software is free software.
|
|
118
|
+
|
|
119
|
+
You can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
|
120
|
+
|
|
121
|
+
See [LICENSE](LICENSE) for more information.
|
package/dist/index.cjs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var o=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var w=(n,e)=>{for(var t in e)o(n,t,{get:e[t],enumerable:!0})},p=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of c(e))!m.call(n,s)&&s!==t&&o(n,s,{get:()=>e[s],enumerable:!(i=l(e,s))||i.enumerable});return n};var v=n=>p(o({},"__esModule",{value:!0}),n);var
|
|
1
|
+
"use strict";var o=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var w=(n,e)=>{for(var t in e)o(n,t,{get:e[t],enumerable:!0})},p=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of c(e))!m.call(n,s)&&s!==t&&o(n,s,{get:()=>e[s],enumerable:!(i=l(e,s))||i.enumerable});return n};var v=n=>p(o({},"__esModule",{value:!0}),n);var P={};w(P,{default:()=>y,get:()=>a,httpstate:()=>u,load:()=>r,post:()=>b,read:()=>g,set:()=>d,write:()=>f});module.exports=v(P);var h={short:n=>{if(n=n.toLowerCase(),n.length===36&&(n=n.replace(/-/g,"")),n.length===32&&/^[0-9a-f]{12}4[0-9a-f]{3}[89ab][0-9a-f]{15}$/.test(n))return n}},a=async n=>{let e=await fetch("https://httpstate.com/"+n);if(e.status===200)return await e.text()},r=async()=>{for(let n of document.querySelectorAll("[httpstate]")){let e=n.getAttribute("httpstate");r._||(r._={}),e&&!r._[e]&&(r._[e]=u(e).on("change",t=>n.innerHTML=String(t)))}},b=async(n,e)=>d(n,e),g=async n=>a(n),d=async(n,e)=>(await fetch("https://httpstate.com/"+n,{body:e,headers:{"Content-Type":"text/plain;charset=UTF-8"},method:"POST"})).status,f=async(n,e)=>d(n,e),u=n=>{let e={data:void 0,et:{},uuid:n,addEventListener:(t,i)=>e.on(t,i),delete:()=>{delete e.data,delete e.et,delete e.uuid,e.ws.delete()},emit:(t,i)=>{if(e.et?.[t])for(let s of e.et[t])i===void 0?s.call(e):s.call(e,i);return e},get:async()=>{if(e.uuid){let t=await a(e.uuid);return t!==e.data&&setTimeout(()=>e.emit("change",e.data),0),e.data=t,e.data}},off:(t,i)=>(e.et?.[t]&&(i&&(e.et[t]=e.et[t].filter(s=>s!==i)),(!i||!e.et[t].length)&&delete e.et[t]),e),on:(t,i)=>(e.et&&(e.et[t]||(e.et[t]=[]),e.et[t].push(i)),e),post:async t=>e.set(t),read:async()=>e.get(),removeEventListener:(t,i)=>e.off(t,i),set:async t=>{if(e.uuid)return d(e.uuid,t)},write:async t=>e.set(t),ws:{_:void 0,delete:()=>{e.ws._&&(clearInterval(e.ws.pingInterval),e.ws._.close(1e3),delete e.ws._)},pingInterval:void 0,new:()=>{e.ws.delete(),e.ws._=new WebSocket("wss://httpstate.com/"+n),e.ws._.addEventListener("close",t=>{let i=e.ws.new.timeout||0;e.ws.new.timeout=Math.min(Math.max(1024,i*2),61440),setTimeout(e.ws.new,e.ws.new.timeout)},{once:!0}),e.ws._.addEventListener("error",t=>console.log("error",t)),e.ws._.addEventListener("open",()=>{e.ws._&&(e.ws._.addEventListener("message",()=>delete e.ws.new.timeout,{once:!0}),e.ws._.addEventListener("message",async t=>{let i=String(await t.data.text());e.uuid&&i&&i.length>32&&i.substring(0,32)===h.short(e.uuid)&&i.substring(45,46)==="1"&&(e.data=i.substring(46),e.emit("change",e.data))}),e.ws._.send(JSON.stringify({open:e.uuid})),e.emit("open"),e.ws.pingInterval=setInterval(()=>{e.ws._&&e.ws._.readyState===WebSocket.OPEN?e.ws._.send("0"):clearInterval(e.ws.pingInterval)},3e4))},{once:!0})}}};return e.ws.new(),setTimeout(e.get,0),e},y=Object.assign(u,{get:a,load:r,read:g,set:d,write:f});typeof document<"u"&&typeof window<"u"&&globalThis===window&&globalThis.addEventListener("DOMContentLoaded",async()=>{globalThis.httpstate&&(globalThis.httpstate=globalThis.httpstate.default),await r()},{once:!0});0&&(module.exports={get,httpstate,load,post,read,set,write});
|
|
2
2
|
//# sourceMappingURL=index.cjs.js.map
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -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 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 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 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","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 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"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
declare const get: (uuid: string) => Promise<undefined | string>;
|
|
2
2
|
declare const load: () => Promise<void>;
|
|
3
|
+
declare const post: (uuid: string, data: string) => Promise<number>;
|
|
3
4
|
declare const read: (uuid: string) => Promise<undefined | string>;
|
|
4
5
|
declare const set: (uuid: string, data: string) => Promise<number>;
|
|
5
6
|
declare const write: (uuid: string, data: string) => Promise<number>;
|
|
@@ -15,6 +16,7 @@ type HttpState = {
|
|
|
15
16
|
get(): Promise<undefined | string>;
|
|
16
17
|
off(type: string, callback?: (data?: undefined | string) => void): HttpState;
|
|
17
18
|
on(type: string, callback: (data?: undefined | string) => void): HttpState;
|
|
19
|
+
post(data: string): Promise<undefined | number>;
|
|
18
20
|
read(): Promise<undefined | string>;
|
|
19
21
|
removeEventListener(type: string, callback: (data?: undefined | string) => void): void;
|
|
20
22
|
set(data: string): Promise<undefined | number>;
|
|
@@ -35,4 +37,4 @@ declare const _default: ((uuid: string) => HttpState) & {
|
|
|
35
37
|
write: (uuid: string, data: string) => Promise<number>;
|
|
36
38
|
};
|
|
37
39
|
|
|
38
|
-
export { type HttpState, _default as default, get, httpstate, load, read, set, write };
|
|
40
|
+
export { type HttpState, _default as default, get, httpstate, load, post, read, set, write };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
declare const get: (uuid: string) => Promise<undefined | string>;
|
|
2
2
|
declare const load: () => Promise<void>;
|
|
3
|
+
declare const post: (uuid: string, data: string) => Promise<number>;
|
|
3
4
|
declare const read: (uuid: string) => Promise<undefined | string>;
|
|
4
5
|
declare const set: (uuid: string, data: string) => Promise<number>;
|
|
5
6
|
declare const write: (uuid: string, data: string) => Promise<number>;
|
|
@@ -15,6 +16,7 @@ type HttpState = {
|
|
|
15
16
|
get(): Promise<undefined | string>;
|
|
16
17
|
off(type: string, callback?: (data?: undefined | string) => void): HttpState;
|
|
17
18
|
on(type: string, callback: (data?: undefined | string) => void): HttpState;
|
|
19
|
+
post(data: string): Promise<undefined | number>;
|
|
18
20
|
read(): Promise<undefined | string>;
|
|
19
21
|
removeEventListener(type: string, callback: (data?: undefined | string) => void): void;
|
|
20
22
|
set(data: string): Promise<undefined | number>;
|
|
@@ -35,4 +37,4 @@ declare const _default: ((uuid: string) => HttpState) & {
|
|
|
35
37
|
write: (uuid: string, data: string) => Promise<number>;
|
|
36
38
|
};
|
|
37
39
|
|
|
38
|
-
export { type HttpState, _default as default, get, httpstate, load, read, set, write };
|
|
40
|
+
export { type HttpState, _default as default, get, httpstate, load, post, read, set, write };
|
package/dist/index.esm.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var u={short:n=>{if(n=n.toLowerCase(),n.length===36&&(n=n.replace(/-/g,"")),n.length===32&&/^[0-9a-f]{12}4[0-9a-f]{3}[89ab][0-9a-f]{15}$/.test(n))return n}},
|
|
1
|
+
var u={short:n=>{if(n=n.toLowerCase(),n.length===36&&(n=n.replace(/-/g,"")),n.length===32&&/^[0-9a-f]{12}4[0-9a-f]{3}[89ab][0-9a-f]{15}$/.test(n))return n}},a=async n=>{let e=await fetch("https://httpstate.com/"+n);if(e.status===200)return await e.text()},s=async()=>{for(let n of document.querySelectorAll("[httpstate]")){let e=n.getAttribute("httpstate");s._||(s._={}),e&&!s._[e]&&(s._[e]=o(e).on("change",t=>n.innerHTML=String(t)))}},l=async(n,e)=>d(n,e),g=async n=>a(n),d=async(n,e)=>(await fetch("https://httpstate.com/"+n,{body:e,headers:{"Content-Type":"text/plain;charset=UTF-8"},method:"POST"})).status,f=async(n,e)=>d(n,e),o=n=>{let e={data:void 0,et:{},uuid:n,addEventListener:(t,i)=>e.on(t,i),delete:()=>{delete e.data,delete e.et,delete e.uuid,e.ws.delete()},emit:(t,i)=>{if(e.et?.[t])for(let r of e.et[t])i===void 0?r.call(e):r.call(e,i);return e},get:async()=>{if(e.uuid){let t=await a(e.uuid);return t!==e.data&&setTimeout(()=>e.emit("change",e.data),0),e.data=t,e.data}},off:(t,i)=>(e.et?.[t]&&(i&&(e.et[t]=e.et[t].filter(r=>r!==i)),(!i||!e.et[t].length)&&delete e.et[t]),e),on:(t,i)=>(e.et&&(e.et[t]||(e.et[t]=[]),e.et[t].push(i)),e),post:async t=>e.set(t),read:async()=>e.get(),removeEventListener:(t,i)=>e.off(t,i),set:async t=>{if(e.uuid)return d(e.uuid,t)},write:async t=>e.set(t),ws:{_:void 0,delete:()=>{e.ws._&&(clearInterval(e.ws.pingInterval),e.ws._.close(1e3),delete e.ws._)},pingInterval:void 0,new:()=>{e.ws.delete(),e.ws._=new WebSocket("wss://httpstate.com/"+n),e.ws._.addEventListener("close",t=>{let i=e.ws.new.timeout||0;e.ws.new.timeout=Math.min(Math.max(1024,i*2),61440),setTimeout(e.ws.new,e.ws.new.timeout)},{once:!0}),e.ws._.addEventListener("error",t=>console.log("error",t)),e.ws._.addEventListener("open",()=>{e.ws._&&(e.ws._.addEventListener("message",()=>delete e.ws.new.timeout,{once:!0}),e.ws._.addEventListener("message",async t=>{let i=String(await t.data.text());e.uuid&&i&&i.length>32&&i.substring(0,32)===u.short(e.uuid)&&i.substring(45,46)==="1"&&(e.data=i.substring(46),e.emit("change",e.data))}),e.ws._.send(JSON.stringify({open:e.uuid})),e.emit("open"),e.ws.pingInterval=setInterval(()=>{e.ws._&&e.ws._.readyState===WebSocket.OPEN?e.ws._.send("0"):clearInterval(e.ws.pingInterval)},3e4))},{once:!0})}}};return e.ws.new(),setTimeout(e.get,0),e},c=Object.assign(o,{get:a,load:s,read:g,set:d,write:f});typeof document<"u"&&typeof window<"u"&&globalThis===window&&globalThis.addEventListener("DOMContentLoaded",async()=>{globalThis.httpstate&&(globalThis.httpstate=globalThis.httpstate.default),await s()},{once:!0});export{c as default,a as get,o as httpstate,s as load,l as post,g as read,d as set,f as write};
|
|
2
2
|
//# sourceMappingURL=index.esm.js.map
|
package/dist/index.esm.js.map
CHANGED
|
@@ -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 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 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 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","read","set","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 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"]}
|
package/dist/index.global.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var httpstate=(()=>{var o=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var w=(n,e)=>{for(var t in e)o(n,t,{get:e[t],enumerable:!0})},p=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of c(e))!m.call(n,s)&&s!==t&&o(n,s,{get:()=>e[s],enumerable:!(i=l(e,s))||i.enumerable});return n};var v=n=>p(o({},"__esModule",{value:!0}),n);var
|
|
1
|
+
"use strict";var httpstate=(()=>{var o=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var w=(n,e)=>{for(var t in e)o(n,t,{get:e[t],enumerable:!0})},p=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of c(e))!m.call(n,s)&&s!==t&&o(n,s,{get:()=>e[s],enumerable:!(i=l(e,s))||i.enumerable});return n};var v=n=>p(o({},"__esModule",{value:!0}),n);var P={};w(P,{default:()=>y,get:()=>a,httpstate:()=>u,load:()=>r,post:()=>b,read:()=>g,set:()=>d,write:()=>f});var h={short:n=>{if(n=n.toLowerCase(),n.length===36&&(n=n.replace(/-/g,"")),n.length===32&&/^[0-9a-f]{12}4[0-9a-f]{3}[89ab][0-9a-f]{15}$/.test(n))return n}},a=async n=>{let e=await fetch("https://httpstate.com/"+n);if(e.status===200)return await e.text()},r=async()=>{for(let n of document.querySelectorAll("[httpstate]")){let e=n.getAttribute("httpstate");r._||(r._={}),e&&!r._[e]&&(r._[e]=u(e).on("change",t=>n.innerHTML=String(t)))}},b=async(n,e)=>d(n,e),g=async n=>a(n),d=async(n,e)=>(await fetch("https://httpstate.com/"+n,{body:e,headers:{"Content-Type":"text/plain;charset=UTF-8"},method:"POST"})).status,f=async(n,e)=>d(n,e),u=n=>{let e={data:void 0,et:{},uuid:n,addEventListener:(t,i)=>e.on(t,i),delete:()=>{delete e.data,delete e.et,delete e.uuid,e.ws.delete()},emit:(t,i)=>{if(e.et?.[t])for(let s of e.et[t])i===void 0?s.call(e):s.call(e,i);return e},get:async()=>{if(e.uuid){let t=await a(e.uuid);return t!==e.data&&setTimeout(()=>e.emit("change",e.data),0),e.data=t,e.data}},off:(t,i)=>(e.et?.[t]&&(i&&(e.et[t]=e.et[t].filter(s=>s!==i)),(!i||!e.et[t].length)&&delete e.et[t]),e),on:(t,i)=>(e.et&&(e.et[t]||(e.et[t]=[]),e.et[t].push(i)),e),post:async t=>e.set(t),read:async()=>e.get(),removeEventListener:(t,i)=>e.off(t,i),set:async t=>{if(e.uuid)return d(e.uuid,t)},write:async t=>e.set(t),ws:{_:void 0,delete:()=>{e.ws._&&(clearInterval(e.ws.pingInterval),e.ws._.close(1e3),delete e.ws._)},pingInterval:void 0,new:()=>{e.ws.delete(),e.ws._=new WebSocket("wss://httpstate.com/"+n),e.ws._.addEventListener("close",t=>{let i=e.ws.new.timeout||0;e.ws.new.timeout=Math.min(Math.max(1024,i*2),61440),setTimeout(e.ws.new,e.ws.new.timeout)},{once:!0}),e.ws._.addEventListener("error",t=>console.log("error",t)),e.ws._.addEventListener("open",()=>{e.ws._&&(e.ws._.addEventListener("message",()=>delete e.ws.new.timeout,{once:!0}),e.ws._.addEventListener("message",async t=>{let i=String(await t.data.text());e.uuid&&i&&i.length>32&&i.substring(0,32)===h.short(e.uuid)&&i.substring(45,46)==="1"&&(e.data=i.substring(46),e.emit("change",e.data))}),e.ws._.send(JSON.stringify({open:e.uuid})),e.emit("open"),e.ws.pingInterval=setInterval(()=>{e.ws._&&e.ws._.readyState===WebSocket.OPEN?e.ws._.send("0"):clearInterval(e.ws.pingInterval)},3e4))},{once:!0})}}};return e.ws.new(),setTimeout(e.get,0),e},y=Object.assign(u,{get:a,load:r,read:g,set:d,write:f});typeof document<"u"&&typeof window<"u"&&globalThis===window&&globalThis.addEventListener("DOMContentLoaded",async()=>{globalThis.httpstate&&(globalThis.httpstate=globalThis.httpstate.default),await r()},{once:!0});return v(P);})();
|
|
2
2
|
//# sourceMappingURL=index.global.js.map
|
package/dist/index.global.js.map
CHANGED
|
@@ -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 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 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 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","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 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