@freeappstore/sdk 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -0
- package/dist/auth.d.ts +22 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +65 -0
- package/dist/auth.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 +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.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,5 @@
|
|
|
1
1
|
import type { Unsubscribe, User } from './types.js';
|
|
2
|
-
export type AuthProvider = 'github' | 'google';
|
|
2
|
+
export type AuthProvider = 'github' | 'google' | 'email';
|
|
3
3
|
/** OAuth authentication — sign in, sign out, session management. */
|
|
4
4
|
export declare class Auth {
|
|
5
5
|
private readonly appId;
|
|
@@ -22,6 +22,19 @@ export declare class Auth {
|
|
|
22
22
|
* hash-based router state otherwise.
|
|
23
23
|
*/
|
|
24
24
|
signIn(provider?: AuthProvider): void;
|
|
25
|
+
/**
|
|
26
|
+
* Email magic-link sign-in. Sends the user an email with a one-time link
|
|
27
|
+
* that completes auth and redirects back here with `#fas_session=…`.
|
|
28
|
+
*
|
|
29
|
+
* Resolves once the email has been queued. The caller should show a
|
|
30
|
+
* "check your inbox" message — the actual sign-in happens later when
|
|
31
|
+
* the user clicks the link.
|
|
32
|
+
*
|
|
33
|
+
* Throws on validation or server errors. Resolves with `{ ok: true }`
|
|
34
|
+
* regardless of whether the email is already registered (no account-
|
|
35
|
+
* enumeration leak).
|
|
36
|
+
*/
|
|
37
|
+
signInWithEmail(email: string): Promise<void>;
|
|
25
38
|
/** Clear the session and notify listeners. */
|
|
26
39
|
signOut(): void;
|
|
27
40
|
/**
|
|
@@ -44,6 +57,14 @@ export declare class Auth {
|
|
|
44
57
|
* render();
|
|
45
58
|
*/
|
|
46
59
|
init(): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Set the user's platform-level date of birth. Set-once: throws if it's
|
|
62
|
+
* already set (status 409 from the backend) or if age < 13. After success
|
|
63
|
+
* the cached user is updated and listeners are notified.
|
|
64
|
+
*
|
|
65
|
+
* @param dateOfBirth ISO 'YYYY-MM-DD' string.
|
|
66
|
+
*/
|
|
67
|
+
setDateOfBirth(dateOfBirth: string): Promise<User>;
|
|
47
68
|
private fetchUser;
|
|
48
69
|
private readStorage;
|
|
49
70
|
private writeStorage;
|
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;AAEpD,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,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,GAAG,OAAO,CAAC;AAazD,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;IAa/C;;;;;;;;;;;OAWG;IACG,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAenD,8CAA8C;IAC9C,OAAO,IAAI,IAAI;IAQf;;;;OAIG;IACH,kBAAkB,IAAI,IAAI;IAI1B;;;;;;;;;;;;OAYG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B3B;;;;;;OAMG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YA4B1C,SAAS;IAQvB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,IAAI;CAGb"}
|
package/dist/auth.js
CHANGED
|
@@ -39,6 +39,9 @@ export class Auth {
|
|
|
39
39
|
signIn(provider = 'github') {
|
|
40
40
|
if (typeof window === 'undefined')
|
|
41
41
|
return;
|
|
42
|
+
if (provider === 'email') {
|
|
43
|
+
throw new Error('Use signInWithEmail(email) for email magic-link sign-in.');
|
|
44
|
+
}
|
|
42
45
|
const here = new URL(window.location.href);
|
|
43
46
|
here.hash = '';
|
|
44
47
|
const url = new URL(`/v1/auth/${provider}/start`, this.apiBase);
|
|
@@ -46,6 +49,33 @@ export class Auth {
|
|
|
46
49
|
url.searchParams.set('return_to', here.toString());
|
|
47
50
|
window.location.assign(url.toString());
|
|
48
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* Email magic-link sign-in. Sends the user an email with a one-time link
|
|
54
|
+
* that completes auth and redirects back here with `#fas_session=…`.
|
|
55
|
+
*
|
|
56
|
+
* Resolves once the email has been queued. The caller should show a
|
|
57
|
+
* "check your inbox" message — the actual sign-in happens later when
|
|
58
|
+
* the user clicks the link.
|
|
59
|
+
*
|
|
60
|
+
* Throws on validation or server errors. Resolves with `{ ok: true }`
|
|
61
|
+
* regardless of whether the email is already registered (no account-
|
|
62
|
+
* enumeration leak).
|
|
63
|
+
*/
|
|
64
|
+
async signInWithEmail(email) {
|
|
65
|
+
if (typeof window === 'undefined')
|
|
66
|
+
return;
|
|
67
|
+
const here = new URL(window.location.href);
|
|
68
|
+
here.hash = '';
|
|
69
|
+
const res = await fetch(new URL('/v1/auth/email/start', this.apiBase), {
|
|
70
|
+
method: 'POST',
|
|
71
|
+
headers: { 'Content-Type': 'application/json' },
|
|
72
|
+
body: JSON.stringify({ email, appId: this.appId, returnTo: here.toString() }),
|
|
73
|
+
});
|
|
74
|
+
if (!res.ok) {
|
|
75
|
+
const body = await res.text();
|
|
76
|
+
throw new Error(`Magic-link request failed: ${res.status} ${body}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
49
79
|
/** Clear the session and notify listeners. */
|
|
50
80
|
signOut() {
|
|
51
81
|
this.session = null;
|
|
@@ -107,6 +137,41 @@ export class Auth {
|
|
|
107
137
|
// won't get stuck in a retry loop. Silently remain signed out.
|
|
108
138
|
}
|
|
109
139
|
}
|
|
140
|
+
/**
|
|
141
|
+
* Set the user's platform-level date of birth. Set-once: throws if it's
|
|
142
|
+
* already set (status 409 from the backend) or if age < 13. After success
|
|
143
|
+
* the cached user is updated and listeners are notified.
|
|
144
|
+
*
|
|
145
|
+
* @param dateOfBirth ISO 'YYYY-MM-DD' string.
|
|
146
|
+
*/
|
|
147
|
+
async setDateOfBirth(dateOfBirth) {
|
|
148
|
+
if (!this.session)
|
|
149
|
+
throw new Error('Not signed in.');
|
|
150
|
+
const response = await fetch(new URL('/v1/auth/me/date-of-birth', this.apiBase), {
|
|
151
|
+
method: 'PATCH',
|
|
152
|
+
headers: {
|
|
153
|
+
Authorization: `Bearer ${this.session.token}`,
|
|
154
|
+
'Content-Type': 'application/json',
|
|
155
|
+
},
|
|
156
|
+
body: JSON.stringify({ dateOfBirth }),
|
|
157
|
+
});
|
|
158
|
+
if (response.status === 401) {
|
|
159
|
+
this.handleUnauthorized();
|
|
160
|
+
throw new Error('Not signed in.');
|
|
161
|
+
}
|
|
162
|
+
if (response.status === 409) {
|
|
163
|
+
throw new Error('Date of birth already set.');
|
|
164
|
+
}
|
|
165
|
+
if (!response.ok) {
|
|
166
|
+
const body = await response.text();
|
|
167
|
+
throw new Error(`setDateOfBirth failed (${response.status}): ${body}`);
|
|
168
|
+
}
|
|
169
|
+
const user = (await response.json());
|
|
170
|
+
this.session = { ...this.session, user };
|
|
171
|
+
this.writeStorage(this.session);
|
|
172
|
+
this.emit();
|
|
173
|
+
return user;
|
|
174
|
+
}
|
|
110
175
|
async fetchUser(token) {
|
|
111
176
|
const response = await fetch(new URL('/v1/auth/me', this.apiBase), {
|
|
112
177
|
headers: { Authorization: `Bearer ${token}` },
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,MAAM,WAAW,GAAG,aAAa,CAAC;AAOlC,oEAAoE;AACpE,MAAM,OAAO,IAAI;IAKI;IACA;IALX,OAAO,GAAmB,IAAI,CAAC;IAC/B,SAAS,GAAG,IAAI,GAAG,EAA+B,CAAC;IAE3D,YACmB,KAAa,EACb,OAAe;QADf,UAAK,GAAL,KAAK,CAAQ;QACb,YAAO,GAAP,OAAO,CAAQ;QAEhC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACpC,CAAC;IAED,4DAA4D;IAC5D,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI,CAAC;IACpC,CAAC;IAED,2DAA2D;IAC3D,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC;IACrC,CAAC;IAED,kGAAkG;IAClG,QAAQ,CAAC,QAAqC;QAC5C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,WAAyB,QAAQ;QACtC,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO;QAC1C,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,YAAY,QAAQ,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAChE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,8CAA8C;IAC9C,OAAO;QACL,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,kBAAkB;QAChB,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IACnC,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO;QAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;YAAE,OAAO;QAE9C,sEAAsE;QACtE,sEAAsE;QACtE,uCAAuC;QACvC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAElF,IAAI,KAAa,CAAC;QAClB,IAAI,CAAC;YACH,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;QACjE,CAAC;QAAC,MAAM,CAAC;YACP,qEAAqE;YACrE,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACzC,IAAI,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YAC/B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChC,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,wEAAwE;YACxE,+DAA+D;QACjE,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,KAAa;QACnC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;YACjE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;SAC9C,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACrE,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAS,CAAC;IACzC,CAAC;IAEO,WAAW;QACjB,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC;QAC/C,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACrD,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,OAAgB;QACnC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACpE,CAAC;IAEO,IAAI;QACV,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS;YAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
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":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
import { Auth } from './auth.js';
|
|
2
2
|
import { Counters } from './counters.js';
|
|
3
|
+
import { Db } from './db.js';
|
|
3
4
|
import { Kv } from './kv.js';
|
|
4
5
|
import { ApiProxy } from './proxy.js';
|
|
5
6
|
import { Rooms } from './rooms.js';
|
|
6
7
|
import type { FasInitOptions } from './types.js';
|
|
7
8
|
export type { AuthProvider } from './auth.js';
|
|
9
|
+
export type { Collection, QueryOptions, QueryResult } from './db.js';
|
|
8
10
|
export type { ConnectionState, Room, RoomMessage, RoomPeer } from './rooms.js';
|
|
9
11
|
export type { FasInitOptions, Unsubscribe, User } from './types.js';
|
|
10
|
-
/** Root SDK instance — provides auth, kv, counters, rooms, and proxy sub-clients. */
|
|
12
|
+
/** Root SDK instance — provides auth, kv, db, counters, rooms, and proxy sub-clients. */
|
|
11
13
|
export declare class FreeAppStore {
|
|
12
14
|
readonly auth: Auth;
|
|
13
15
|
readonly kv: Kv;
|
|
16
|
+
readonly db: Db;
|
|
14
17
|
readonly counters: Counters;
|
|
15
18
|
readonly rooms: Rooms;
|
|
16
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,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,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,12 +1,14 @@
|
|
|
1
1
|
import { Auth } from './auth.js';
|
|
2
2
|
import { Counters } from './counters.js';
|
|
3
|
+
import { Db } from './db.js';
|
|
3
4
|
import { Kv } from './kv.js';
|
|
4
5
|
import { ApiProxy } from './proxy.js';
|
|
5
6
|
import { Rooms } from './rooms.js';
|
|
6
|
-
/** Root SDK instance — provides auth, kv, counters, rooms, and proxy sub-clients. */
|
|
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;
|
|
@@ -14,6 +16,7 @@ export class FreeAppStore {
|
|
|
14
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/types.d.ts
CHANGED
|
@@ -3,6 +3,12 @@ export interface User {
|
|
|
3
3
|
id: string;
|
|
4
4
|
login: string;
|
|
5
5
|
avatarUrl: string | null;
|
|
6
|
+
/**
|
|
7
|
+
* Platform-level date of birth in `YYYY-MM-DD` form. Null until the user
|
|
8
|
+
* has set it through any app — once set, it propagates across the
|
|
9
|
+
* platform and cannot be changed without contacting support.
|
|
10
|
+
*/
|
|
11
|
+
dateOfBirth: string | null;
|
|
6
12
|
}
|
|
7
13
|
/** Options for initializing the SDK via `initApp()`. */
|
|
8
14
|
export interface FasInitOptions {
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;;;OAIG;IACH,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,wDAAwD;AACxD,MAAM,WAAW,cAAc;IAC7B,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,oEAAoE;AACpE,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@freeappstore/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
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",
|