@freeappstore/sdk 0.5.1 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -0
- package/dist/auth.d.ts +4 -3
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +15 -15
- package/dist/auth.js.map +1 -1
- package/dist/counters.d.ts +1 -1
- package/dist/counters.d.ts.map +1 -1
- package/dist/counters.js +5 -5
- package/dist/counters.js.map +1 -1
- package/dist/db.d.ts +48 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +124 -0
- package/dist/db.js.map +1 -0
- package/dist/index.d.ts +13 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -7
- package/dist/index.js.map +1 -1
- package/dist/kv.d.ts +1 -1
- package/dist/kv.d.ts.map +1 -1
- package/dist/kv.js +13 -13
- package/dist/kv.js.map +1 -1
- package/dist/proxy.d.ts +1 -1
- package/dist/proxy.js +6 -6
- package/dist/rooms.d.ts +3 -3
- package/dist/rooms.d.ts.map +1 -1
- package/dist/rooms.js +16 -16
- package/dist/rooms.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -101,6 +101,36 @@ room.close();
|
|
|
101
101
|
|
|
102
102
|
Limits (server-enforced): 32 peers per room, 100 msgs/sec per peer, 4KB per message, 24h idle eviction, 64 active rooms per app.
|
|
103
103
|
|
|
104
|
+
### Collections (document database)
|
|
105
|
+
|
|
106
|
+
Simple document store for apps that need public, queryable data. No SQL required — just JSON in, JSON out.
|
|
107
|
+
|
|
108
|
+
```ts
|
|
109
|
+
const posts = fas.db.collection('posts');
|
|
110
|
+
|
|
111
|
+
// Create (auth required, you become the owner)
|
|
112
|
+
const post = await posts.create({ title: 'Hello', body: '...' });
|
|
113
|
+
|
|
114
|
+
// Query (public read)
|
|
115
|
+
const { documents, total } = await posts.query({
|
|
116
|
+
limit: 20,
|
|
117
|
+
orderBy: 'created_at',
|
|
118
|
+
order: 'desc',
|
|
119
|
+
owner: userId, // optional: filter by creator
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
// Get single document
|
|
123
|
+
const doc = await posts.get('doc-id');
|
|
124
|
+
|
|
125
|
+
// Update (owner only)
|
|
126
|
+
await posts.update('doc-id', { title: 'Updated' });
|
|
127
|
+
|
|
128
|
+
// Delete (owner only)
|
|
129
|
+
await posts.delete('doc-id');
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Limits: 10,000 documents per collection, 64KB per document.
|
|
133
|
+
|
|
104
134
|
### Secret-injecting proxy
|
|
105
135
|
|
|
106
136
|
Call third-party APIs without exposing your keys in the browser. The platform Worker authenticates the call, injects the developer's stored API key server-side, and forwards the request.
|
package/dist/auth.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type { Unsubscribe, User } from
|
|
2
|
-
|
|
1
|
+
import type { Unsubscribe, User } from './types.js';
|
|
2
|
+
export type AuthProvider = 'github' | 'google';
|
|
3
|
+
/** OAuth authentication — sign in, sign out, session management. */
|
|
3
4
|
export declare class Auth {
|
|
4
5
|
private readonly appId;
|
|
5
6
|
private readonly apiBase;
|
|
@@ -20,7 +21,7 @@ export declare class Auth {
|
|
|
20
21
|
* the OAuth callback writes its own `#fas_session=…` and would clobber any
|
|
21
22
|
* hash-based router state otherwise.
|
|
22
23
|
*/
|
|
23
|
-
signIn(): void;
|
|
24
|
+
signIn(provider?: AuthProvider): void;
|
|
24
25
|
/** Clear the session and notify listeners. */
|
|
25
26
|
signOut(): void;
|
|
26
27
|
/**
|
package/dist/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAa/C,oEAAoE;AACpE,qBAAa,IAAI;IAKb,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAL1B,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,SAAS,CAA0C;gBAGxC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM;IAKlC,4DAA4D;IAC5D,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,CAEtB;IAED,2DAA2D;IAC3D,IAAI,KAAK,IAAI,MAAM,GAAG,IAAI,CAEzB;IAED,kGAAkG;IAClG,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,WAAW;IAM5D;;;;;;;OAOG;IACH,MAAM,CAAC,QAAQ,GAAE,YAAuB,GAAG,IAAI;IAU/C,8CAA8C;IAC9C,OAAO,IAAI,IAAI;IAQf;;;;OAIG;IACH,kBAAkB,IAAI,IAAI;IAI1B;;;;;;;;;;;;OAYG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YA8Bb,SAAS;IAQvB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,IAAI;CAGb"}
|
package/dist/auth.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Shared across all FAS apps on the same origin — this is intentional SSO.
|
|
3
3
|
* A user signed in on one FAS app is signed in on all of them.
|
|
4
4
|
*/
|
|
5
|
-
const STORAGE_KEY =
|
|
6
|
-
/**
|
|
5
|
+
const STORAGE_KEY = 'fas:session';
|
|
6
|
+
/** OAuth authentication — sign in, sign out, session management. */
|
|
7
7
|
export class Auth {
|
|
8
8
|
appId;
|
|
9
9
|
apiBase;
|
|
@@ -36,20 +36,20 @@ export class Auth {
|
|
|
36
36
|
* the OAuth callback writes its own `#fas_session=…` and would clobber any
|
|
37
37
|
* hash-based router state otherwise.
|
|
38
38
|
*/
|
|
39
|
-
signIn() {
|
|
40
|
-
if (typeof window ===
|
|
39
|
+
signIn(provider = 'github') {
|
|
40
|
+
if (typeof window === 'undefined')
|
|
41
41
|
return;
|
|
42
42
|
const here = new URL(window.location.href);
|
|
43
|
-
here.hash =
|
|
44
|
-
const url = new URL(
|
|
45
|
-
url.searchParams.set(
|
|
46
|
-
url.searchParams.set(
|
|
43
|
+
here.hash = '';
|
|
44
|
+
const url = new URL(`/v1/auth/${provider}/start`, this.apiBase);
|
|
45
|
+
url.searchParams.set('app_id', this.appId);
|
|
46
|
+
url.searchParams.set('return_to', here.toString());
|
|
47
47
|
window.location.assign(url.toString());
|
|
48
48
|
}
|
|
49
49
|
/** Clear the session and notify listeners. */
|
|
50
50
|
signOut() {
|
|
51
51
|
this.session = null;
|
|
52
|
-
if (typeof window !==
|
|
52
|
+
if (typeof window !== 'undefined') {
|
|
53
53
|
window.localStorage.removeItem(STORAGE_KEY);
|
|
54
54
|
}
|
|
55
55
|
this.emit();
|
|
@@ -77,18 +77,18 @@ export class Auth {
|
|
|
77
77
|
* render();
|
|
78
78
|
*/
|
|
79
79
|
async init() {
|
|
80
|
-
if (typeof window ===
|
|
80
|
+
if (typeof window === 'undefined')
|
|
81
81
|
return;
|
|
82
82
|
const hash = window.location.hash;
|
|
83
|
-
if (!hash.startsWith(
|
|
83
|
+
if (!hash.startsWith('#fas_session='))
|
|
84
84
|
return;
|
|
85
85
|
// Always clear the hash before doing anything else — even on failure.
|
|
86
86
|
// Otherwise a bad token gets re-tried on every reload and the user is
|
|
87
87
|
// permanently stuck on a "broken" URL.
|
|
88
|
-
history.replaceState(null,
|
|
88
|
+
history.replaceState(null, '', window.location.pathname + window.location.search);
|
|
89
89
|
let token;
|
|
90
90
|
try {
|
|
91
|
-
token = decodeURIComponent(hash.slice(
|
|
91
|
+
token = decodeURIComponent(hash.slice('#fas_session='.length));
|
|
92
92
|
}
|
|
93
93
|
catch {
|
|
94
94
|
// Malformed hash (% with nothing after, etc.). Hash already cleared.
|
|
@@ -108,7 +108,7 @@ export class Auth {
|
|
|
108
108
|
}
|
|
109
109
|
}
|
|
110
110
|
async fetchUser(token) {
|
|
111
|
-
const response = await fetch(new URL(
|
|
111
|
+
const response = await fetch(new URL('/v1/auth/me', this.apiBase), {
|
|
112
112
|
headers: { Authorization: `Bearer ${token}` },
|
|
113
113
|
});
|
|
114
114
|
if (!response.ok)
|
|
@@ -116,7 +116,7 @@ export class Auth {
|
|
|
116
116
|
return (await response.json());
|
|
117
117
|
}
|
|
118
118
|
readStorage() {
|
|
119
|
-
if (typeof window ===
|
|
119
|
+
if (typeof window === 'undefined')
|
|
120
120
|
return null;
|
|
121
121
|
const raw = window.localStorage.getItem(STORAGE_KEY);
|
|
122
122
|
if (!raw)
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/counters.d.ts
CHANGED
package/dist/counters.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"counters.d.ts","sourceRoot":"","sources":["../src/counters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC;;;;GAIG;AACH,qBAAa,QAAQ;IAEjB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAFJ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI;IAG7B,yEAAyE;IACnE,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAQvE,6DAA6D;IACvD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"counters.d.ts","sourceRoot":"","sources":["../src/counters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC;;;;GAIG;AACH,qBAAa,QAAQ;IAEjB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAFJ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI;IAG7B,yEAAyE;IACnE,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAQvE,6DAA6D;IACvD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWvC,4EAA4E;IACtE,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,OAAO,CAAC,MAAM,CAAC;CAsB1D"}
|
package/dist/counters.js
CHANGED
|
@@ -16,7 +16,7 @@ export class Counters {
|
|
|
16
16
|
async list(opts) {
|
|
17
17
|
const url = new URL(`/v1/apps/${encodeURIComponent(this.appId)}/counters`, this.apiBase);
|
|
18
18
|
if (opts?.prefix)
|
|
19
|
-
url.searchParams.set(
|
|
19
|
+
url.searchParams.set('prefix', opts.prefix);
|
|
20
20
|
const response = await fetch(url);
|
|
21
21
|
if (!response.ok)
|
|
22
22
|
throw new Error(`counters.list failed: ${response.status}`);
|
|
@@ -34,19 +34,19 @@ export class Counters {
|
|
|
34
34
|
/** Increment (or decrement) a counter. Requires auth. Returns new value. */
|
|
35
35
|
async increment(key, amount = 1) {
|
|
36
36
|
if (!this.auth.token)
|
|
37
|
-
throw new Error(
|
|
37
|
+
throw new Error('Not signed in.');
|
|
38
38
|
const url = new URL(`/v1/apps/${encodeURIComponent(this.appId)}/counters/${encodeURIComponent(key)}`, this.apiBase);
|
|
39
39
|
const response = await fetch(url, {
|
|
40
|
-
method:
|
|
40
|
+
method: 'POST',
|
|
41
41
|
headers: {
|
|
42
42
|
Authorization: `Bearer ${this.auth.token}`,
|
|
43
|
-
|
|
43
|
+
'Content-Type': 'application/json',
|
|
44
44
|
},
|
|
45
45
|
body: JSON.stringify({ increment: amount }),
|
|
46
46
|
});
|
|
47
47
|
if (response.status === 401) {
|
|
48
48
|
this.auth.handleUnauthorized();
|
|
49
|
-
throw new Error(
|
|
49
|
+
throw new Error('Not signed in.');
|
|
50
50
|
}
|
|
51
51
|
if (!response.ok)
|
|
52
52
|
throw new Error(`counters.increment failed: ${response.status}`);
|
package/dist/counters.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"counters.js","sourceRoot":"","sources":["../src/counters.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,OAAO,QAAQ;IAEA;IACA;IACA;IAHnB,YACmB,KAAa,EACb,OAAe,EACf,IAAU;QAFV,UAAK,GAAL,KAAK,CAAQ;QACb,YAAO,GAAP,OAAO,CAAQ;QACf,SAAI,GAAJ,IAAI,CAAM;IAC1B,CAAC;IAEJ,yEAAyE;IACzE,KAAK,CAAC,IAAI,CAAC,IAA0B;QACnC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,YAAY,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACzF,IAAI,IAAI,EAAE,MAAM;YAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9E,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA2B,CAAC;IAC3D,CAAC;IAED,6DAA6D;IAC7D,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,GAAG,GAAG,IAAI,GAAG,
|
|
1
|
+
{"version":3,"file":"counters.js","sourceRoot":"","sources":["../src/counters.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,OAAO,QAAQ;IAEA;IACA;IACA;IAHnB,YACmB,KAAa,EACb,OAAe,EACf,IAAU;QAFV,UAAK,GAAL,KAAK,CAAQ;QACb,YAAO,GAAP,OAAO,CAAQ;QACf,SAAI,GAAJ,IAAI,CAAM;IAC1B,CAAC;IAEJ,yEAAyE;IACzE,KAAK,CAAC,IAAI,CAAC,IAA0B;QACnC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,YAAY,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACzF,IAAI,IAAI,EAAE,MAAM;YAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9E,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA2B,CAAC;IAC3D,CAAC;IAED,6DAA6D;IAC7D,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,YAAY,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAChF,IAAI,CAAC,OAAO,CACb,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7E,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsB,CAAC;QAC1D,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,4EAA4E;IAC5E,KAAK,CAAC,SAAS,CAAC,GAAW,EAAE,MAAM,GAAG,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACxD,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,YAAY,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAChF,IAAI,CAAC,OAAO,CACb,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;gBAC1C,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;SAC5C,CAAC,CAAC;QACH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACnF,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsB,CAAC;QAC1D,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}
|
package/dist/db.d.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Auth } from './auth.js';
|
|
2
|
+
export interface QueryOptions {
|
|
3
|
+
owner?: string;
|
|
4
|
+
limit?: number;
|
|
5
|
+
offset?: number;
|
|
6
|
+
orderBy?: string;
|
|
7
|
+
order?: 'asc' | 'desc';
|
|
8
|
+
}
|
|
9
|
+
export interface QueryResult<T> {
|
|
10
|
+
documents: (T & {
|
|
11
|
+
id: string;
|
|
12
|
+
})[];
|
|
13
|
+
total: number;
|
|
14
|
+
}
|
|
15
|
+
/** Document database — organize data into named collections. */
|
|
16
|
+
export declare class Db {
|
|
17
|
+
private readonly appId;
|
|
18
|
+
private readonly apiBase;
|
|
19
|
+
private readonly auth;
|
|
20
|
+
constructor(appId: string, apiBase: string, auth: Auth);
|
|
21
|
+
/** Get a collection handle for the given name. */
|
|
22
|
+
collection(name: string): Collection;
|
|
23
|
+
}
|
|
24
|
+
/** A named collection of JSON documents. */
|
|
25
|
+
export declare class Collection {
|
|
26
|
+
private readonly appId;
|
|
27
|
+
private readonly name;
|
|
28
|
+
private readonly apiBase;
|
|
29
|
+
private readonly auth;
|
|
30
|
+
constructor(appId: string, name: string, apiBase: string, auth: Auth);
|
|
31
|
+
/** Create a new document. Auth required. Returns the document with its generated `id`. */
|
|
32
|
+
create<T extends Record<string, unknown>>(doc: T): Promise<T & {
|
|
33
|
+
id: string;
|
|
34
|
+
}>;
|
|
35
|
+
/** Get a document by ID. Returns null if not found. Public read. */
|
|
36
|
+
get<T = Record<string, unknown>>(id: string): Promise<(T & {
|
|
37
|
+
id: string;
|
|
38
|
+
}) | null>;
|
|
39
|
+
/** Query documents with optional filtering and pagination. Public read. */
|
|
40
|
+
query<T = Record<string, unknown>>(opts?: QueryOptions): Promise<QueryResult<T>>;
|
|
41
|
+
/** Update a document by merging the patch into the existing data. Auth required, owner only. */
|
|
42
|
+
update<T extends Record<string, unknown>>(id: string, patch: Partial<T>): Promise<T & {
|
|
43
|
+
id: string;
|
|
44
|
+
}>;
|
|
45
|
+
/** Delete a document. Auth required, owner only. */
|
|
46
|
+
delete(id: string): Promise<void>;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=db.d.ts.map
|
package/dist/db.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,SAAS,EAAE,CAAC,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,gEAAgE;AAChE,qBAAa,EAAE;IAEX,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAFJ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI;IAG7B,kDAAkD;IAClD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;CAGrC;AAED,4CAA4C;AAC5C,qBAAa,UAAU;IAEnB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAHJ,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI;IAG7B,0FAA0F;IACpF,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IA0BpF,oEAAoE;IAC9D,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IAWxF,2EAA2E;IACrE,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAetF,gGAAgG;IAC1F,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5C,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAChB,OAAO,CAAC,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IA0B9B,oDAAoD;IAC9C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAoBxC"}
|
package/dist/db.js
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/** Document database — organize data into named collections. */
|
|
2
|
+
export class Db {
|
|
3
|
+
appId;
|
|
4
|
+
apiBase;
|
|
5
|
+
auth;
|
|
6
|
+
constructor(appId, apiBase, auth) {
|
|
7
|
+
this.appId = appId;
|
|
8
|
+
this.apiBase = apiBase;
|
|
9
|
+
this.auth = auth;
|
|
10
|
+
}
|
|
11
|
+
/** Get a collection handle for the given name. */
|
|
12
|
+
collection(name) {
|
|
13
|
+
return new Collection(this.appId, name, this.apiBase, this.auth);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/** A named collection of JSON documents. */
|
|
17
|
+
export class Collection {
|
|
18
|
+
appId;
|
|
19
|
+
name;
|
|
20
|
+
apiBase;
|
|
21
|
+
auth;
|
|
22
|
+
constructor(appId, name, apiBase, auth) {
|
|
23
|
+
this.appId = appId;
|
|
24
|
+
this.name = name;
|
|
25
|
+
this.apiBase = apiBase;
|
|
26
|
+
this.auth = auth;
|
|
27
|
+
}
|
|
28
|
+
/** Create a new document. Auth required. Returns the document with its generated `id`. */
|
|
29
|
+
async create(doc) {
|
|
30
|
+
const token = this.auth.token;
|
|
31
|
+
if (!token)
|
|
32
|
+
throw new Error('Not signed in.');
|
|
33
|
+
const url = new URL(`/v1/apps/${encodeURIComponent(this.appId)}/db/${encodeURIComponent(this.name)}`, this.apiBase);
|
|
34
|
+
const response = await fetch(url, {
|
|
35
|
+
method: 'POST',
|
|
36
|
+
headers: {
|
|
37
|
+
Authorization: `Bearer ${token}`,
|
|
38
|
+
'Content-Type': 'application/json',
|
|
39
|
+
},
|
|
40
|
+
body: JSON.stringify(doc),
|
|
41
|
+
});
|
|
42
|
+
if (response.status === 401) {
|
|
43
|
+
this.auth.handleUnauthorized();
|
|
44
|
+
throw new Error('Not signed in.');
|
|
45
|
+
}
|
|
46
|
+
if (!response.ok) {
|
|
47
|
+
const text = await response.text();
|
|
48
|
+
throw new Error(`db.create failed (${response.status}): ${text}`);
|
|
49
|
+
}
|
|
50
|
+
return (await response.json());
|
|
51
|
+
}
|
|
52
|
+
/** Get a document by ID. Returns null if not found. Public read. */
|
|
53
|
+
async get(id) {
|
|
54
|
+
const url = new URL(`/v1/apps/${encodeURIComponent(this.appId)}/db/${encodeURIComponent(this.name)}/${encodeURIComponent(id)}`, this.apiBase);
|
|
55
|
+
const response = await fetch(url);
|
|
56
|
+
if (response.status === 404)
|
|
57
|
+
return null;
|
|
58
|
+
if (!response.ok)
|
|
59
|
+
throw new Error(`db.get failed: ${response.status}`);
|
|
60
|
+
return (await response.json());
|
|
61
|
+
}
|
|
62
|
+
/** Query documents with optional filtering and pagination. Public read. */
|
|
63
|
+
async query(opts) {
|
|
64
|
+
const url = new URL(`/v1/apps/${encodeURIComponent(this.appId)}/db/${encodeURIComponent(this.name)}`, this.apiBase);
|
|
65
|
+
if (opts?.owner)
|
|
66
|
+
url.searchParams.set('owner', opts.owner);
|
|
67
|
+
if (opts?.limit !== undefined)
|
|
68
|
+
url.searchParams.set('limit', String(opts.limit));
|
|
69
|
+
if (opts?.offset !== undefined)
|
|
70
|
+
url.searchParams.set('offset', String(opts.offset));
|
|
71
|
+
if (opts?.orderBy)
|
|
72
|
+
url.searchParams.set('orderBy', opts.orderBy);
|
|
73
|
+
if (opts?.order)
|
|
74
|
+
url.searchParams.set('order', opts.order);
|
|
75
|
+
const response = await fetch(url);
|
|
76
|
+
if (!response.ok)
|
|
77
|
+
throw new Error(`db.query failed: ${response.status}`);
|
|
78
|
+
return (await response.json());
|
|
79
|
+
}
|
|
80
|
+
/** Update a document by merging the patch into the existing data. Auth required, owner only. */
|
|
81
|
+
async update(id, patch) {
|
|
82
|
+
const token = this.auth.token;
|
|
83
|
+
if (!token)
|
|
84
|
+
throw new Error('Not signed in.');
|
|
85
|
+
const url = new URL(`/v1/apps/${encodeURIComponent(this.appId)}/db/${encodeURIComponent(this.name)}/${encodeURIComponent(id)}`, this.apiBase);
|
|
86
|
+
const response = await fetch(url, {
|
|
87
|
+
method: 'PUT',
|
|
88
|
+
headers: {
|
|
89
|
+
Authorization: `Bearer ${token}`,
|
|
90
|
+
'Content-Type': 'application/json',
|
|
91
|
+
},
|
|
92
|
+
body: JSON.stringify(patch),
|
|
93
|
+
});
|
|
94
|
+
if (response.status === 401) {
|
|
95
|
+
this.auth.handleUnauthorized();
|
|
96
|
+
throw new Error('Not signed in.');
|
|
97
|
+
}
|
|
98
|
+
if (!response.ok) {
|
|
99
|
+
const text = await response.text();
|
|
100
|
+
throw new Error(`db.update failed (${response.status}): ${text}`);
|
|
101
|
+
}
|
|
102
|
+
return (await response.json());
|
|
103
|
+
}
|
|
104
|
+
/** Delete a document. Auth required, owner only. */
|
|
105
|
+
async delete(id) {
|
|
106
|
+
const token = this.auth.token;
|
|
107
|
+
if (!token)
|
|
108
|
+
throw new Error('Not signed in.');
|
|
109
|
+
const url = new URL(`/v1/apps/${encodeURIComponent(this.appId)}/db/${encodeURIComponent(this.name)}/${encodeURIComponent(id)}`, this.apiBase);
|
|
110
|
+
const response = await fetch(url, {
|
|
111
|
+
method: 'DELETE',
|
|
112
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
113
|
+
});
|
|
114
|
+
if (response.status === 401) {
|
|
115
|
+
this.auth.handleUnauthorized();
|
|
116
|
+
throw new Error('Not signed in.');
|
|
117
|
+
}
|
|
118
|
+
if (!response.ok && response.status !== 404) {
|
|
119
|
+
const text = await response.text();
|
|
120
|
+
throw new Error(`db.delete failed (${response.status}): ${text}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=db.js.map
|
package/dist/db.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAeA,gEAAgE;AAChE,MAAM,OAAO,EAAE;IAEM;IACA;IACA;IAHnB,YACmB,KAAa,EACb,OAAe,EACf,IAAU;QAFV,UAAK,GAAL,KAAK,CAAQ;QACb,YAAO,GAAP,OAAO,CAAQ;QACf,SAAI,GAAJ,IAAI,CAAM;IAC1B,CAAC;IAEJ,kDAAkD;IAClD,UAAU,CAAC,IAAY;QACrB,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC;CACF;AAED,4CAA4C;AAC5C,MAAM,OAAO,UAAU;IAEF;IACA;IACA;IACA;IAJnB,YACmB,KAAa,EACb,IAAY,EACZ,OAAe,EACf,IAAU;QAHV,UAAK,GAAL,KAAK,CAAQ;QACb,SAAI,GAAJ,IAAI,CAAQ;QACZ,YAAO,GAAP,OAAO,CAAQ;QACf,SAAI,GAAJ,IAAI,CAAM;IAC1B,CAAC;IAEJ,0FAA0F;IAC1F,KAAK,CAAC,MAAM,CAAoC,GAAM;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9B,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,YAAY,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAChF,IAAI,CAAC,OAAO,CACb,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,KAAK,EAAE;gBAChC,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;SAC1B,CAAC,CAAC;QACH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAuB,CAAC;IACvD,CAAC;IAED,oEAAoE;IACpE,KAAK,CAAC,GAAG,CAA8B,EAAU;QAC/C,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,YAAY,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAC1G,IAAI,CAAC,OAAO,CACb,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACvE,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAuB,CAAC;IACvD,CAAC;IAED,2EAA2E;IAC3E,KAAK,CAAC,KAAK,CAA8B,IAAmB;QAC1D,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,YAAY,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAChF,IAAI,CAAC,OAAO,CACb,CAAC;QACF,IAAI,IAAI,EAAE,KAAK;YAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3D,IAAI,IAAI,EAAE,KAAK,KAAK,SAAS;YAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACjF,IAAI,IAAI,EAAE,MAAM,KAAK,SAAS;YAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACpF,IAAI,IAAI,EAAE,OAAO;YAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACjE,IAAI,IAAI,EAAE,KAAK;YAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACzE,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAmB,CAAC;IACnD,CAAC;IAED,gGAAgG;IAChG,KAAK,CAAC,MAAM,CACV,EAAU,EACV,KAAiB;QAEjB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9B,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,YAAY,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAC1G,IAAI,CAAC,OAAO,CACb,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,KAAK,EAAE;gBAChC,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SAC5B,CAAC,CAAC;QACH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAuB,CAAC;IACvD,CAAC;IAED,oDAAoD;IACpD,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9B,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,YAAY,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAC1G,IAAI,CAAC,OAAO,CACb,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;SAC9C,CAAC,CAAC;QACH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;CACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
|
-
import { Auth } from
|
|
2
|
-
import { Counters } from
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
7
|
-
|
|
8
|
-
export type {
|
|
9
|
-
|
|
1
|
+
import { Auth } from './auth.js';
|
|
2
|
+
import { Counters } from './counters.js';
|
|
3
|
+
import { Db } from './db.js';
|
|
4
|
+
import { Kv } from './kv.js';
|
|
5
|
+
import { ApiProxy } from './proxy.js';
|
|
6
|
+
import { Rooms } from './rooms.js';
|
|
7
|
+
import type { FasInitOptions } from './types.js';
|
|
8
|
+
export type { AuthProvider } from './auth.js';
|
|
9
|
+
export type { Collection, QueryOptions, QueryResult } from './db.js';
|
|
10
|
+
export type { ConnectionState, Room, RoomMessage, RoomPeer } from './rooms.js';
|
|
11
|
+
export type { FasInitOptions, Unsubscribe, User } from './types.js';
|
|
12
|
+
/** Root SDK instance — provides auth, kv, db, counters, rooms, and proxy sub-clients. */
|
|
10
13
|
export declare class FreeAppStore {
|
|
11
14
|
readonly auth: Auth;
|
|
12
15
|
readonly kv: Kv;
|
|
16
|
+
readonly db: Db;
|
|
13
17
|
readonly counters: Counters;
|
|
14
18
|
readonly rooms: Rooms;
|
|
15
19
|
readonly proxy: ApiProxy;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,YAAY,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC/E,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEpE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACrE,YAAY,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC/E,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEpE,yFAAyF;AACzF,qBAAa,YAAY;IACvB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;IAChB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;gBAEb,IAAI,EAAE,cAAc;CASjC;AAED,gEAAgE;AAChE,wBAAgB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,YAAY,CAE1D"}
|
package/dist/index.js
CHANGED
|
@@ -1,19 +1,22 @@
|
|
|
1
|
-
import { Auth } from
|
|
2
|
-
import { Counters } from
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
1
|
+
import { Auth } from './auth.js';
|
|
2
|
+
import { Counters } from './counters.js';
|
|
3
|
+
import { Db } from './db.js';
|
|
4
|
+
import { Kv } from './kv.js';
|
|
5
|
+
import { ApiProxy } from './proxy.js';
|
|
6
|
+
import { Rooms } from './rooms.js';
|
|
7
|
+
/** Root SDK instance — provides auth, kv, db, counters, rooms, and proxy sub-clients. */
|
|
7
8
|
export class FreeAppStore {
|
|
8
9
|
auth;
|
|
9
10
|
kv;
|
|
11
|
+
db;
|
|
10
12
|
counters;
|
|
11
13
|
rooms;
|
|
12
14
|
proxy;
|
|
13
15
|
constructor(opts) {
|
|
14
|
-
const apiBase = opts.apiBase ??
|
|
16
|
+
const apiBase = opts.apiBase ?? 'https://api.freeappstore.online';
|
|
15
17
|
this.auth = new Auth(opts.appId, apiBase);
|
|
16
18
|
this.kv = new Kv(opts.appId, apiBase, this.auth);
|
|
19
|
+
this.db = new Db(opts.appId, apiBase, this.auth);
|
|
17
20
|
this.counters = new Counters(opts.appId, apiBase, this.auth);
|
|
18
21
|
this.rooms = new Rooms(opts.appId, apiBase, this.auth);
|
|
19
22
|
this.proxy = new ApiProxy(opts.appId, apiBase, this.auth);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAQnC,yFAAyF;AACzF,MAAM,OAAO,YAAY;IACd,IAAI,CAAO;IACX,EAAE,CAAK;IACP,EAAE,CAAK;IACP,QAAQ,CAAW;IACnB,KAAK,CAAQ;IACb,KAAK,CAAW;IAEzB,YAAY,IAAoB;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,iCAAiC,CAAC;QAClE,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC;CACF;AAED,gEAAgE;AAChE,MAAM,UAAU,OAAO,CAAC,IAAoB;IAC1C,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC"}
|
package/dist/kv.d.ts
CHANGED
package/dist/kv.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kv.d.ts","sourceRoot":"","sources":["../src/kv.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAyBtC,qBAAa,EAAE;IAEX,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAFJ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI;IAG7B,gEAAgE;IAC1D,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAoB/E,iHAAiH;IAC3G,OAAO,CAAC,CAAC,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"kv.d.ts","sourceRoot":"","sources":["../src/kv.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAyBtC,qBAAa,EAAE;IAEX,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAFJ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI;IAG7B,gEAAgE;IAC1D,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAoB/E,iHAAiH;IAC3G,OAAO,CAAC,CAAC,GAAG,OAAO,EACvB,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAC9B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAiB1B,qDAAqD;IAC/C,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAQvF,2DAA2D;IACrD,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAc7F,oDAAoD;IAC9C,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAQ3D,OAAO;CAuBtB"}
|
package/dist/kv.js
CHANGED
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
*/
|
|
13
13
|
const MAX_KEY_LENGTH = 128;
|
|
14
14
|
function assertValidKey(key) {
|
|
15
|
-
if (typeof key !==
|
|
16
|
-
throw new Error(
|
|
15
|
+
if (typeof key !== 'string' || key.length === 0) {
|
|
16
|
+
throw new Error('kv key must be a non-empty string.');
|
|
17
17
|
}
|
|
18
18
|
if (key.length > MAX_KEY_LENGTH) {
|
|
19
19
|
throw new Error(`kv key exceeds ${MAX_KEY_LENGTH} chars.`);
|
|
@@ -32,17 +32,17 @@ export class Kv {
|
|
|
32
32
|
async list(opts) {
|
|
33
33
|
const token = this.auth.token;
|
|
34
34
|
if (!token)
|
|
35
|
-
throw new Error(
|
|
35
|
+
throw new Error('Not signed in.');
|
|
36
36
|
const url = new URL(`/v1/apps/${encodeURIComponent(this.appId)}/kv`, this.apiBase);
|
|
37
37
|
if (opts?.prefix)
|
|
38
|
-
url.searchParams.set(
|
|
38
|
+
url.searchParams.set('prefix', opts.prefix);
|
|
39
39
|
const listResponse = await fetch(url, {
|
|
40
40
|
headers: { Authorization: `Bearer ${token}` },
|
|
41
41
|
...(opts?.signal && { signal: opts.signal }),
|
|
42
42
|
});
|
|
43
43
|
if (listResponse.status === 401) {
|
|
44
44
|
this.auth.handleUnauthorized();
|
|
45
|
-
throw new Error(
|
|
45
|
+
throw new Error('Not signed in.');
|
|
46
46
|
}
|
|
47
47
|
if (!listResponse.ok)
|
|
48
48
|
throw new Error(`kv.list failed: ${listResponse.status}`);
|
|
@@ -63,7 +63,7 @@ export class Kv {
|
|
|
63
63
|
results.set(key, stored);
|
|
64
64
|
}));
|
|
65
65
|
// If ALL requests failed with auth error, re-throw so callers know
|
|
66
|
-
const allFailed = settled.every((s) => s.status ===
|
|
66
|
+
const allFailed = settled.every((s) => s.status === 'rejected');
|
|
67
67
|
if (allFailed && settled.length > 0) {
|
|
68
68
|
throw settled[0].reason;
|
|
69
69
|
}
|
|
@@ -72,7 +72,7 @@ export class Kv {
|
|
|
72
72
|
/** Get a value by key. Returns null if not found. */
|
|
73
73
|
async get(key, opts) {
|
|
74
74
|
assertValidKey(key);
|
|
75
|
-
const getResponse = await this.request(
|
|
75
|
+
const getResponse = await this.request('GET', key, undefined, opts?.signal);
|
|
76
76
|
if (getResponse.status === 404)
|
|
77
77
|
return null;
|
|
78
78
|
if (!getResponse.ok)
|
|
@@ -85,9 +85,9 @@ export class Kv {
|
|
|
85
85
|
// JSON.stringify(undefined) returns undefined, which would store an empty
|
|
86
86
|
// body and break later get() calls. Reject up front instead.
|
|
87
87
|
if (value === undefined) {
|
|
88
|
-
throw new Error(
|
|
88
|
+
throw new Error('kv.set: value is undefined. Use kv.delete(key) to remove a key.');
|
|
89
89
|
}
|
|
90
|
-
const setResponse = await this.request(
|
|
90
|
+
const setResponse = await this.request('PUT', key, JSON.stringify(value), opts?.signal);
|
|
91
91
|
if (!setResponse.ok) {
|
|
92
92
|
const text = await setResponse.text();
|
|
93
93
|
throw new Error(`kv.set failed (${setResponse.status}): ${text}`);
|
|
@@ -96,7 +96,7 @@ export class Kv {
|
|
|
96
96
|
/** Delete a key. No-op if the key doesn't exist. */
|
|
97
97
|
async delete(key, opts) {
|
|
98
98
|
assertValidKey(key);
|
|
99
|
-
const deleteResponse = await this.request(
|
|
99
|
+
const deleteResponse = await this.request('DELETE', key, undefined, opts?.signal);
|
|
100
100
|
if (!deleteResponse.ok && deleteResponse.status !== 404) {
|
|
101
101
|
throw new Error(`kv.delete failed: ${deleteResponse.status}`);
|
|
102
102
|
}
|
|
@@ -104,18 +104,18 @@ export class Kv {
|
|
|
104
104
|
async request(method, key, body, signal) {
|
|
105
105
|
const token = this.auth.token;
|
|
106
106
|
if (!token)
|
|
107
|
-
throw new Error(
|
|
107
|
+
throw new Error('Not signed in.');
|
|
108
108
|
const url = new URL(`/v1/apps/${encodeURIComponent(this.appId)}/kv/${encodeURIComponent(key)}`, this.apiBase);
|
|
109
109
|
const headers = { Authorization: `Bearer ${token}` };
|
|
110
110
|
if (body !== undefined)
|
|
111
|
-
headers[
|
|
111
|
+
headers['Content-Type'] = 'application/json';
|
|
112
112
|
const init = { method, headers, ...(signal && { signal }) };
|
|
113
113
|
if (body !== undefined)
|
|
114
114
|
init.body = body;
|
|
115
115
|
const kvResponse = await fetch(url, init);
|
|
116
116
|
if (kvResponse.status === 401) {
|
|
117
117
|
this.auth.handleUnauthorized();
|
|
118
|
-
throw new Error(
|
|
118
|
+
throw new Error('Not signed in.');
|
|
119
119
|
}
|
|
120
120
|
return kvResponse;
|
|
121
121
|
}
|
package/dist/kv.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kv.js","sourceRoot":"","sources":["../src/kv.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B,SAAS,cAAc,CAAC,GAAW;IACjC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,kBAAkB,cAAc,SAAS,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED,MAAM,OAAO,EAAE;IAEM;IACA;IACA;IAHnB,YACmB,KAAa,EACb,OAAe,EACf,IAAU;QAFV,UAAK,GAAL,KAAK,CAAQ;QACb,YAAO,GAAP,OAAO,CAAQ;QACf,SAAI,GAAJ,IAAI,CAAM;IAC1B,CAAC;IAEJ,gEAAgE;IAChE,KAAK,CAAC,IAAI,CAAC,IAAgD;QACzD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9B,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,YAAY,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACnF,IAAI,IAAI,EAAE,MAAM;YAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9D,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YACpC,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;YAC7C,GAAG,CAAC,IAAI,EAAE,MAAM,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;SAC7C,CAAC,CAAC;QACH,IAAI,YAAY,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;QAChF,IAAI,IAAI,GAAG,CAAC,MAAM,YAAY,CAAC,IAAI,EAAE,CAAa,CAAC;QACnD,yEAAyE;QACzE,IAAI,IAAI,EAAE,MAAM;YAAE,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,MAAO,CAAC,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iHAAiH;IACjH,KAAK,CAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"kv.js","sourceRoot":"","sources":["../src/kv.ts"],"names":[],"mappings":"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"}
|
package/dist/proxy.d.ts
CHANGED
package/dist/proxy.js
CHANGED
|
@@ -30,15 +30,15 @@ export class ApiProxy {
|
|
|
30
30
|
*/
|
|
31
31
|
async fetch(target, init) {
|
|
32
32
|
if (!this.auth.token) {
|
|
33
|
-
throw new Error(
|
|
33
|
+
throw new Error('proxy.fetch: not signed in. Call fas.auth.signIn() first.');
|
|
34
34
|
}
|
|
35
35
|
const url = `${this.apiBase}/v1/apps/${encodeURIComponent(this.appId)}/proxy/${normalizeTarget(target)}`;
|
|
36
36
|
const headers = new Headers(init?.headers);
|
|
37
|
-
headers.set(
|
|
37
|
+
headers.set('Authorization', `Bearer ${this.auth.token}`);
|
|
38
38
|
const proxyResponse = await fetch(url, { ...init, headers });
|
|
39
39
|
if (proxyResponse.status === 401) {
|
|
40
40
|
this.auth.handleUnauthorized();
|
|
41
|
-
throw new Error(
|
|
41
|
+
throw new Error('proxy.fetch: session expired. User has been signed out.');
|
|
42
42
|
}
|
|
43
43
|
return proxyResponse;
|
|
44
44
|
}
|
|
@@ -56,12 +56,12 @@ export function normalizeTarget(target) {
|
|
|
56
56
|
const schemeMatch = target.match(/^([a-z][a-z0-9+.-]*):\/\//i);
|
|
57
57
|
if (schemeMatch) {
|
|
58
58
|
const scheme = schemeMatch[1].toLowerCase();
|
|
59
|
-
if (scheme ===
|
|
59
|
+
if (scheme === 'http' || scheme === 'https') {
|
|
60
60
|
return target.slice(schemeMatch[0].length);
|
|
61
61
|
}
|
|
62
|
-
throw new Error(
|
|
62
|
+
throw new Error('proxy.fetch: only http(s) targets are supported');
|
|
63
63
|
}
|
|
64
64
|
// Already in "host/path" form.
|
|
65
|
-
return target.replace(/^\/+/,
|
|
65
|
+
return target.replace(/^\/+/, '');
|
|
66
66
|
}
|
|
67
67
|
//# sourceMappingURL=proxy.js.map
|
package/dist/rooms.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { Auth } from
|
|
2
|
-
import type { Unsubscribe } from
|
|
1
|
+
import type { Auth } from './auth.js';
|
|
2
|
+
import type { Unsubscribe } from './types.js';
|
|
3
3
|
/**
|
|
4
4
|
* Light realtime room — Durable-Object-backed WebSocket fan-out.
|
|
5
5
|
*
|
|
@@ -22,7 +22,7 @@ export interface RoomMessage<T = unknown> {
|
|
|
22
22
|
data: T;
|
|
23
23
|
at: number;
|
|
24
24
|
}
|
|
25
|
-
export type ConnectionState =
|
|
25
|
+
export type ConnectionState = 'connecting' | 'open' | 'closed' | 'error';
|
|
26
26
|
export declare class Rooms {
|
|
27
27
|
private readonly appId;
|
|
28
28
|
private readonly apiBase;
|
package/dist/rooms.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rooms.d.ts","sourceRoot":"","sources":["../src/rooms.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,CAAC,CAAC;IACR,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEzE,qBAAa,KAAK;IAEd,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAFJ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI;IAG7B,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAG3B;AAKD,qBAAa,IAAI;IAYb,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAdzB,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,SAAS,CAAyC;IAC1D,OAAO,CAAC,aAAa,CAA0C;IAC/D,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,eAAe,CAAiC;IACxD,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,gBAAgB,CAAS;gBAGd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM;IAKjC,gCAAgC;IAChC,IAAI,KAAK,IAAI,eAAe,CAE3B;IAED,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI;IAKtB,SAAS,CAAC,CAAC,GAAG,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,WAAW;IAK5E,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,IAAI,GAAG,WAAW;IAM3D,iBAAiB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GAAG,WAAW;IAM1E,+DAA+D;IAC/D,KAAK,IAAI,IAAI;IAcb,OAAO,CAAC,OAAO;
|
|
1
|
+
{"version":3,"file":"rooms.d.ts","sourceRoot":"","sources":["../src/rooms.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,CAAC,CAAC;IACR,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEzE,qBAAa,KAAK;IAEd,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAFJ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI;IAG7B,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAG3B;AAKD,qBAAa,IAAI;IAYb,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAdzB,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,SAAS,CAAyC;IAC1D,OAAO,CAAC,aAAa,CAA0C;IAC/D,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,eAAe,CAAiC;IACxD,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,gBAAgB,CAAS;gBAGd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM;IAKjC,gCAAgC;IAChC,IAAI,KAAK,IAAI,eAAe,CAE3B;IAED,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI;IAKtB,SAAS,CAAC,CAAC,GAAG,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,WAAW;IAK5E,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,IAAI,GAAG,WAAW;IAM3D,iBAAiB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GAAG,WAAW;IAM1E,+DAA+D;IAC/D,KAAK,IAAI,IAAI;IAcb,OAAO,CAAC,OAAO;IA4Df,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,QAAQ;CAKjB"}
|
package/dist/rooms.js
CHANGED
|
@@ -23,7 +23,7 @@ export class Room {
|
|
|
23
23
|
peerListeners = new Set();
|
|
24
24
|
stateListeners = new Set();
|
|
25
25
|
peers = [];
|
|
26
|
-
connectionState =
|
|
26
|
+
connectionState = 'connecting';
|
|
27
27
|
reconnectAttempt = 0;
|
|
28
28
|
reconnectTimer = null;
|
|
29
29
|
explicitlyClosed = false;
|
|
@@ -41,7 +41,7 @@ export class Room {
|
|
|
41
41
|
send(data) {
|
|
42
42
|
if (!this.socket || this.socket.readyState !== WebSocket.OPEN)
|
|
43
43
|
return;
|
|
44
|
-
this.socket.send(JSON.stringify({ kind:
|
|
44
|
+
this.socket.send(JSON.stringify({ kind: 'msg', data }));
|
|
45
45
|
}
|
|
46
46
|
onMessage(listener) {
|
|
47
47
|
this.listeners.add(listener);
|
|
@@ -66,7 +66,7 @@ export class Room {
|
|
|
66
66
|
}
|
|
67
67
|
this.socket?.close();
|
|
68
68
|
this.socket = null;
|
|
69
|
-
this.setState(
|
|
69
|
+
this.setState('closed');
|
|
70
70
|
this.listeners.clear();
|
|
71
71
|
this.peerListeners.clear();
|
|
72
72
|
this.stateListeners.clear();
|
|
@@ -75,28 +75,28 @@ export class Room {
|
|
|
75
75
|
const token = this.auth.token;
|
|
76
76
|
if (!token) {
|
|
77
77
|
// Auth state may have changed (sign-out). Stop trying.
|
|
78
|
-
this.setState(
|
|
78
|
+
this.setState('closed');
|
|
79
79
|
return;
|
|
80
80
|
}
|
|
81
|
-
this.setState(
|
|
81
|
+
this.setState('connecting');
|
|
82
82
|
const url = new URL(`/v1/apps/${encodeURIComponent(this.appId)}/rooms/${encodeURIComponent(this.roomId)}`, this.apiBase);
|
|
83
|
-
url.protocol = url.protocol ===
|
|
84
|
-
url.searchParams.set(
|
|
83
|
+
url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';
|
|
84
|
+
url.searchParams.set('token', token);
|
|
85
85
|
const socket = new WebSocket(url.toString());
|
|
86
86
|
this.socket = socket;
|
|
87
|
-
socket.addEventListener(
|
|
87
|
+
socket.addEventListener('open', () => {
|
|
88
88
|
this.reconnectAttempt = 0;
|
|
89
|
-
this.setState(
|
|
89
|
+
this.setState('open');
|
|
90
90
|
});
|
|
91
|
-
socket.addEventListener(
|
|
91
|
+
socket.addEventListener('message', (ev) => {
|
|
92
92
|
try {
|
|
93
93
|
const parsed = JSON.parse(ev.data);
|
|
94
|
-
if (parsed.kind ===
|
|
94
|
+
if (parsed.kind === 'msg') {
|
|
95
95
|
for (const l of this.listeners) {
|
|
96
96
|
l({ from: parsed.from, data: parsed.data, at: parsed.at });
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
|
-
else if (parsed.kind ===
|
|
99
|
+
else if (parsed.kind === 'peers') {
|
|
100
100
|
this.peers = parsed.peers;
|
|
101
101
|
for (const l of this.peerListeners)
|
|
102
102
|
l(this.peers);
|
|
@@ -108,21 +108,21 @@ export class Room {
|
|
|
108
108
|
// come through `kind: 'error'` instead.
|
|
109
109
|
}
|
|
110
110
|
});
|
|
111
|
-
socket.addEventListener(
|
|
111
|
+
socket.addEventListener('close', () => {
|
|
112
112
|
// Only one of close/error fires the reconnect; we use close because
|
|
113
113
|
// it always fires, even after an error, and is the canonical signal.
|
|
114
114
|
if (this.socket === socket)
|
|
115
115
|
this.socket = null;
|
|
116
116
|
if (this.explicitlyClosed)
|
|
117
117
|
return;
|
|
118
|
-
this.setState(
|
|
118
|
+
this.setState('closed');
|
|
119
119
|
this.scheduleReconnect();
|
|
120
120
|
});
|
|
121
|
-
socket.addEventListener(
|
|
121
|
+
socket.addEventListener('error', () => {
|
|
122
122
|
// We let the close handler do the actual reconnect logic. error is
|
|
123
123
|
// informational and may or may not be followed by close (it always is
|
|
124
124
|
// in browsers per spec).
|
|
125
|
-
this.setState(
|
|
125
|
+
this.setState('error');
|
|
126
126
|
});
|
|
127
127
|
}
|
|
128
128
|
scheduleReconnect() {
|
package/dist/rooms.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rooms.js","sourceRoot":"","sources":["../src/rooms.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"rooms.js","sourceRoot":"","sources":["../src/rooms.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@freeappstore/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.1",
|
|
4
4
|
"description": "Browser SDK for free apps on freeappstore.online — auth, per-user KV, light realtime rooms, secret-injecting proxy for third-party APIs.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|