@freeappstore/sdk 0.14.36 → 0.15.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 +31 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +1 -1
- package/dist/logger.js.map +1 -1
- package/dist/push-sw.d.ts +30 -0
- package/dist/push-sw.d.ts.map +1 -0
- package/dist/push-sw.js +40 -0
- package/dist/push-sw.js.map +1 -0
- package/dist/push.d.ts +116 -0
- package/dist/push.d.ts.map +1 -0
- package/dist/push.js +237 -0
- package/dist/push.js.map +1 -0
- package/package.json +5 -1
package/README.md
CHANGED
|
@@ -161,6 +161,37 @@ const keys = await fas.keys.status();
|
|
|
161
161
|
|
|
162
162
|
Supported providers: OpenAI, Anthropic, Google AI, OpenRouter, Replicate, Stability AI, ElevenLabs, Stripe.
|
|
163
163
|
|
|
164
|
+
### Push reminders (`fas.push`)
|
|
165
|
+
|
|
166
|
+
Scheduled Web Push notifications for the signed-in user. The platform sends a push to each of the user's devices for your app when a reminder comes due (checked every 15 minutes).
|
|
167
|
+
|
|
168
|
+
```ts
|
|
169
|
+
const { supported, reason } = fas.push.isSupported();
|
|
170
|
+
// reason 'requires-home-screen': on iPhone/iPad, add the app to the Home Screen first
|
|
171
|
+
|
|
172
|
+
// From a button tap (browsers block permission prompts outside a user gesture):
|
|
173
|
+
await fas.push.subscribe(); // asks permission, registers this device
|
|
174
|
+
|
|
175
|
+
await fas.push.schedule('period-due', { at: new Date('2026-11-02T09:00') });
|
|
176
|
+
await fas.push.schedule('log', { daily: '21:00' }, { quietHours: { start: '22:00', end: '07:00' } });
|
|
177
|
+
await fas.push.schedule('refill', { everyDays: 28, at: '09:00' }, { tz: 'Europe/London' });
|
|
178
|
+
|
|
179
|
+
const reminders = await fas.push.list(); // [{ reminderId, when, tz, quietHours, nextAt }]
|
|
180
|
+
await fas.push.cancel('log');
|
|
181
|
+
await fas.push.unsubscribe(); // this device only
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Errors: `PushNotSignedInError`, `PushNotSupportedError` (with `reason`), `PushPermissionDeniedError`, `PushNotConfiguredError`.
|
|
185
|
+
|
|
186
|
+
Pushes carry **no payload**: your service worker shows the notification text, so nothing about the reminder passes through the browser's push service. With vite-plugin-pwa's `injectManifest` strategy, add this to your service worker:
|
|
187
|
+
|
|
188
|
+
```ts
|
|
189
|
+
import { registerFasPushHandler } from '@freeappstore/sdk/push-sw';
|
|
190
|
+
registerFasPushHandler({ title: 'Cycle', body: 'Time to check in.', onClick: () => '/' });
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Keep the text generic for anything sensitive; it can show on a lock screen. Limits: 10 devices and 20 reminders per user per app.
|
|
194
|
+
|
|
164
195
|
### React Hooks
|
|
165
196
|
|
|
166
197
|
Import from `@freeappstore/sdk/hooks`. Requires React 18+ as a peer dependency.
|
package/dist/index.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ import { Keys } from './keys.js';
|
|
|
7
7
|
import { Kv } from './kv.js';
|
|
8
8
|
import { Logger } from './logger.js';
|
|
9
9
|
import { ApiProxy } from './proxy.js';
|
|
10
|
+
import { Push } from './push.js';
|
|
10
11
|
import { Roles } from './roles.js';
|
|
11
12
|
import { Rooms } from './rooms.js';
|
|
12
13
|
import type { FasInitOptions } from './types.js';
|
|
@@ -15,11 +16,13 @@ export type { AuthProvider } from './auth.js';
|
|
|
15
16
|
export type { Collection, GeoBBox, QueryOptions, QueryResult } from './db.js';
|
|
16
17
|
export { Collections } from './db.js';
|
|
17
18
|
export type { Friend, FriendSearchResult, FriendshipStatus } from './friends.js';
|
|
19
|
+
export type { PushIsSupported, PushReminder, PushScheduleOptions, PushSupportReason, PushWhen, } from './push.js';
|
|
20
|
+
export { PushNotConfiguredError, PushNotSignedInError, PushNotSupportedError, PushPermissionDeniedError, } from './push.js';
|
|
18
21
|
export type { DefaultRole, RoleAssignment } from './roles.js';
|
|
19
22
|
export { DEFAULT_ROLES } from './roles.js';
|
|
20
23
|
export type { ConnectionState, Room, RoomMessage, RoomPeer } from './rooms.js';
|
|
21
24
|
export type { FasInitOptions, Unsubscribe, User } from './types.js';
|
|
22
|
-
/** Root SDK instance — provides auth, kv, collections, counters, rooms, and
|
|
25
|
+
/** Root SDK instance — provides auth, kv, collections, counters, rooms, proxy, push and the other sub-clients. */
|
|
23
26
|
export declare class FreeAppStore {
|
|
24
27
|
readonly auth: Auth;
|
|
25
28
|
readonly kv: Kv;
|
|
@@ -33,6 +36,7 @@ export declare class FreeAppStore {
|
|
|
33
36
|
readonly log: Logger;
|
|
34
37
|
readonly webhooks: Webhooks;
|
|
35
38
|
readonly friends: Friends;
|
|
39
|
+
readonly push: Push;
|
|
36
40
|
constructor(opts: FasInitOptions);
|
|
37
41
|
}
|
|
38
42
|
/** Create a new FreeAppStore SDK instance for the given app. */
|
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,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,YAAY,EAAE,MAAM,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACjF,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,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;AAOpE,
|
|
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,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,YAAY,EAAE,MAAM,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACjF,YAAY,EACV,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,QAAQ,GACT,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,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;AAOpE,kHAAkH;AAClH,qBAAa,YAAY;IACvB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;IAChB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;gBAER,IAAI,EAAE,cAAc;CAgBjC;AAED,gEAAgE;AAChE,wBAAgB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,YAAY,CAE1D"}
|
package/dist/index.js
CHANGED
|
@@ -7,17 +7,19 @@ import { Keys } from './keys.js';
|
|
|
7
7
|
import { Kv } from './kv.js';
|
|
8
8
|
import { Logger } from './logger.js';
|
|
9
9
|
import { ApiProxy } from './proxy.js';
|
|
10
|
+
import { Push } from './push.js';
|
|
10
11
|
import { Roles } from './roles.js';
|
|
11
12
|
import { Rooms } from './rooms.js';
|
|
12
13
|
import { Webhooks } from './webhooks.js';
|
|
13
14
|
export { Collections } from './db.js';
|
|
15
|
+
export { PushNotConfiguredError, PushNotSignedInError, PushNotSupportedError, PushPermissionDeniedError, } from './push.js';
|
|
14
16
|
export { DEFAULT_ROLES } from './roles.js';
|
|
15
17
|
// React-dependent exports (useVoiceInput, UseVoiceInputReturn) live in the
|
|
16
18
|
// './hooks' subpath, NOT this barrel. Re-exporting them here forced the main
|
|
17
19
|
// entry to statically import 'react' — an *optional* peer dep — so any
|
|
18
20
|
// non-React consumer doing `import { initApp } from '@freeappstore/sdk'`
|
|
19
21
|
// crashed with ERR_MODULE_NOT_FOUND: react. See prod-smoke steps 2 & 6.
|
|
20
|
-
/** Root SDK instance — provides auth, kv, collections, counters, rooms, and
|
|
22
|
+
/** Root SDK instance — provides auth, kv, collections, counters, rooms, proxy, push and the other sub-clients. */
|
|
21
23
|
export class FreeAppStore {
|
|
22
24
|
auth;
|
|
23
25
|
kv;
|
|
@@ -31,6 +33,7 @@ export class FreeAppStore {
|
|
|
31
33
|
log;
|
|
32
34
|
webhooks;
|
|
33
35
|
friends;
|
|
36
|
+
push;
|
|
34
37
|
constructor(opts) {
|
|
35
38
|
const apiBase = opts.apiBase ?? 'https://api.freeappstore.online';
|
|
36
39
|
this.auth = new Auth(opts.appId, apiBase);
|
|
@@ -45,6 +48,7 @@ export class FreeAppStore {
|
|
|
45
48
|
this.log = new Logger(opts.appId, apiBase, this.auth);
|
|
46
49
|
this.webhooks = new Webhooks(opts.appId, apiBase, this.auth);
|
|
47
50
|
this.friends = new Friends(opts.appId, apiBase, this.auth);
|
|
51
|
+
this.push = new Push(opts.appId, apiBase, this.auth);
|
|
48
52
|
}
|
|
49
53
|
}
|
|
50
54
|
/** Create a new FreeAppStore SDK instance for the given app. */
|
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,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAIzC,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/logger.d.ts
CHANGED
|
@@ -35,7 +35,7 @@ export interface BuildMeta {
|
|
|
35
35
|
viewport: string;
|
|
36
36
|
theme?: string | undefined;
|
|
37
37
|
}
|
|
38
|
-
export declare const SDK_VERSION = "0.
|
|
38
|
+
export declare const SDK_VERSION = "0.15.0";
|
|
39
39
|
export declare class Logger {
|
|
40
40
|
private readonly appId;
|
|
41
41
|
private readonly apiBase;
|
package/dist/logger.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,QAAQ,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,8DAA8D;IAC9D,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAID,eAAO,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,QAAQ,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,8DAA8D;IAC9D,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAID,eAAO,MAAM,WAAW,WAAW,CAAC;AAOpC,qBAAa,MAAM;IAYf,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAbvB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,WAAW,CAA+C;IAClE,OAAO,CAAC,aAAa,CAAS;IAK9B,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,OAAO,CAAK;gBAGD,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI;IAW7B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO;IAGrC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO;IAGpC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO;IAGpC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO;IAIrC,oDAAoD;IACpD,OAAO,IAAI,QAAQ,EAAE;IAIrB,sEAAsE;IACtE,IAAI,IAAI,MAAM;IAUd,8CAA8C;IAC9C,KAAK;IASL,+CAA+C;IACzC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,kDAAkD;IAClD,YAAY,IAAI,SAAS;IAiBzB,4CAA4C;IAC5C,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IASrF,qEAAqE;IACrE,YAAY,CACV,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;QACJ,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC3B,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACpC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAC3B;IAOH,OAAO,CAAC,GAAG;IAmBX,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,gBAAgB;YAMV,WAAW;IAYzB,OAAO,CAAC,SAAS,CAA8B;YAEjC,aAAa;IA0B3B,OAAO;CAGR"}
|
package/dist/logger.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Must track package.json version — bumped on release. Guarded by version.test.ts
|
|
2
2
|
// so a forgotten bump fails CI instead of silently misattributing telemetry.
|
|
3
|
-
export const SDK_VERSION = '0.
|
|
3
|
+
export const SDK_VERSION = '0.15.0';
|
|
4
4
|
const MEMORY_LIMIT = 200;
|
|
5
5
|
const STORAGE_LIMIT = 500;
|
|
6
6
|
const STORAGE_KEY_PREFIX = 'fas_logs:';
|
package/dist/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AA0CA,kFAAkF;AAClF,6EAA6E;AAC7E,MAAM,CAAC,MAAM,WAAW,GAAG,
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service-worker side of `fas.push`. Import it in your service worker entry
|
|
3
|
+
* (vite-plugin-pwa `strategies: 'injectManifest'`, e.g. `src/sw.ts`):
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { registerFasPushHandler } from '@freeappstore/sdk/push-sw'
|
|
7
|
+
* registerFasPushHandler({ title: 'Cycle', body: 'Time to check in.' })
|
|
8
|
+
* ```
|
|
9
|
+
*
|
|
10
|
+
* Pushes from the platform carry no payload, so the reminder's text lives
|
|
11
|
+
* here, in your app, and nothing about it passes through the browser's push
|
|
12
|
+
* service. Keep it generic for anything sensitive ("Check your calendar"),
|
|
13
|
+
* since it can show on a lock screen. Tapping the notification focuses an
|
|
14
|
+
* open window of the app, or opens one.
|
|
15
|
+
*/
|
|
16
|
+
export interface FasPushHandlerOptions {
|
|
17
|
+
/** Notification title. Default: 'Reminder'. */
|
|
18
|
+
title?: string;
|
|
19
|
+
/** Notification body. Default: 'Open the app to see what\'s due.' */
|
|
20
|
+
body?: string;
|
|
21
|
+
/** Icon URL. Default: '/icon-192.png' (the template's icon). */
|
|
22
|
+
icon?: string;
|
|
23
|
+
/** Replaces an earlier notification with the same tag instead of stacking. Default: 'fas-push'. */
|
|
24
|
+
tag?: string;
|
|
25
|
+
/** The URL to open or focus when tapped. Default: the service worker's scope (the app's start). */
|
|
26
|
+
onClick?: () => string;
|
|
27
|
+
}
|
|
28
|
+
/** Shows a notification for each fas.push push and focuses or opens the app when it's tapped. */
|
|
29
|
+
export declare function registerFasPushHandler(opts?: FasPushHandlerOptions): void;
|
|
30
|
+
//# sourceMappingURL=push-sw.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push-sw.d.ts","sourceRoot":"","sources":["../src/push-sw.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,qBAAqB;IACpC,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mGAAmG;IACnG,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mGAAmG;IACnG,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC;CACxB;AA6BD,iGAAiG;AACjG,wBAAgB,sBAAsB,CAAC,IAAI,GAAE,qBAA0B,GAAG,IAAI,CA0B7E"}
|
package/dist/push-sw.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service-worker side of `fas.push`. Import it in your service worker entry
|
|
3
|
+
* (vite-plugin-pwa `strategies: 'injectManifest'`, e.g. `src/sw.ts`):
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { registerFasPushHandler } from '@freeappstore/sdk/push-sw'
|
|
7
|
+
* registerFasPushHandler({ title: 'Cycle', body: 'Time to check in.' })
|
|
8
|
+
* ```
|
|
9
|
+
*
|
|
10
|
+
* Pushes from the platform carry no payload, so the reminder's text lives
|
|
11
|
+
* here, in your app, and nothing about it passes through the browser's push
|
|
12
|
+
* service. Keep it generic for anything sensitive ("Check your calendar"),
|
|
13
|
+
* since it can show on a lock screen. Tapping the notification focuses an
|
|
14
|
+
* open window of the app, or opens one.
|
|
15
|
+
*/
|
|
16
|
+
/** Shows a notification for each fas.push push and focuses or opens the app when it's tapped. */
|
|
17
|
+
export function registerFasPushHandler(opts = {}) {
|
|
18
|
+
const sw = globalThis;
|
|
19
|
+
sw.addEventListener('push', (event) => {
|
|
20
|
+
event.waitUntil(sw.registration.showNotification(opts.title ?? 'Reminder', {
|
|
21
|
+
body: opts.body ?? "Open the app to see what's due.",
|
|
22
|
+
icon: opts.icon ?? '/icon-192.png',
|
|
23
|
+
tag: opts.tag ?? 'fas-push',
|
|
24
|
+
}));
|
|
25
|
+
});
|
|
26
|
+
sw.addEventListener('notificationclick', (event) => {
|
|
27
|
+
const e = event;
|
|
28
|
+
e.notification.close();
|
|
29
|
+
const target = new URL(opts.onClick?.() ?? sw.registration.scope, sw.registration.scope).href;
|
|
30
|
+
e.waitUntil(sw.clients.matchAll({ type: 'window', includeUncontrolled: true }).then(async (windows) => {
|
|
31
|
+
const open = windows.find((w) => w.url.startsWith(sw.registration.scope));
|
|
32
|
+
if (!open)
|
|
33
|
+
return sw.clients.openWindow(target);
|
|
34
|
+
await open.focus();
|
|
35
|
+
if (open.url !== target && open.navigate)
|
|
36
|
+
await open.navigate(target);
|
|
37
|
+
}));
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=push-sw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push-sw.js","sourceRoot":"","sources":["../src/push-sw.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA0CH,iGAAiG;AACjG,MAAM,UAAU,sBAAsB,CAAC,OAA8B,EAAE;IACrE,MAAM,EAAE,GAAG,UAAgC,CAAC;IAE5C,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;QACnC,KAA2B,CAAC,SAAS,CACpC,EAAE,CAAC,YAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,IAAI,UAAU,EAAE;YACzD,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,iCAAiC;YACpD,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,eAAe;YAClC,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,UAAU;SAC5B,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE;QACjD,MAAM,CAAC,GAAG,KAA4B,CAAC;QACvC,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;QAC9F,CAAC,CAAC,SAAS,CACT,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YACxF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1E,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAChD,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,IAAI,CAAC,GAAG,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACxE,CAAC,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/push.d.ts
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import type { Auth } from './auth.js';
|
|
2
|
+
/**
|
|
3
|
+
* Web Push reminders for the signed-in user (`fas.push`).
|
|
4
|
+
*
|
|
5
|
+
* Register this device with `subscribe()` (from a user gesture), then set
|
|
6
|
+
* reminders with `schedule()`; the platform sends a push to every device the
|
|
7
|
+
* user subscribed for this app when a reminder comes due (every 15 minutes,
|
|
8
|
+
* so up to ~15 min late). Pushes carry no payload: the app's service worker
|
|
9
|
+
* shows its own notification text, so nothing about the reminder travels
|
|
10
|
+
* through the browser's push service. Use `@freeappstore/sdk/push-sw` in the
|
|
11
|
+
* service worker.
|
|
12
|
+
*
|
|
13
|
+
* Limits (enforced server-side): 10 devices and 20 reminders per user per app.
|
|
14
|
+
*/
|
|
15
|
+
/** No session: sign in before subscribing or scheduling. */
|
|
16
|
+
export declare class PushNotSignedInError extends Error {
|
|
17
|
+
constructor();
|
|
18
|
+
}
|
|
19
|
+
/** This browser can't receive push here; `reason` says why (see `PushIsSupported`). */
|
|
20
|
+
export declare class PushNotSupportedError extends Error {
|
|
21
|
+
readonly reason: Exclude<PushSupportReason, 'ok'>;
|
|
22
|
+
constructor(reason: Exclude<PushSupportReason, 'ok'>);
|
|
23
|
+
}
|
|
24
|
+
/** The user declined (or previously blocked) notifications for this site. */
|
|
25
|
+
export declare class PushPermissionDeniedError extends Error {
|
|
26
|
+
constructor();
|
|
27
|
+
}
|
|
28
|
+
/** The platform has push turned off (its VAPID key isn't configured yet). */
|
|
29
|
+
export declare class PushNotConfiguredError extends Error {
|
|
30
|
+
constructor();
|
|
31
|
+
}
|
|
32
|
+
export type PushSupportReason = 'ok' | 'requires-home-screen' | 'browser-unsupported';
|
|
33
|
+
export interface PushIsSupported {
|
|
34
|
+
supported: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* `'requires-home-screen'`: iPhone/iPad Safari only allows web push for
|
|
37
|
+
* apps added to the Home Screen and opened from there.
|
|
38
|
+
*/
|
|
39
|
+
reason: PushSupportReason;
|
|
40
|
+
}
|
|
41
|
+
/** When a reminder fires. Times are wall-clock `HH:MM` (24-hour) in `tz`. */
|
|
42
|
+
export type PushWhen =
|
|
43
|
+
/** Once, at this instant. */
|
|
44
|
+
{
|
|
45
|
+
at: Date | string | number;
|
|
46
|
+
}
|
|
47
|
+
/** Every day at this time. */
|
|
48
|
+
| {
|
|
49
|
+
daily: string;
|
|
50
|
+
}
|
|
51
|
+
/** Every N days at `at` (HH:MM). */
|
|
52
|
+
| {
|
|
53
|
+
everyDays: number;
|
|
54
|
+
at: string;
|
|
55
|
+
};
|
|
56
|
+
export interface PushScheduleOptions {
|
|
57
|
+
/** IANA time zone, e.g. 'Europe/London'. Defaults to this device's zone. */
|
|
58
|
+
tz?: string;
|
|
59
|
+
/** Hold reminders that fall inside this daily window until it ends (may wrap midnight). */
|
|
60
|
+
quietHours?: {
|
|
61
|
+
start: string;
|
|
62
|
+
end: string;
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export interface PushReminder {
|
|
66
|
+
reminderId: string;
|
|
67
|
+
when: PushWhen;
|
|
68
|
+
tz: string;
|
|
69
|
+
quietHours: {
|
|
70
|
+
start: string;
|
|
71
|
+
end: string;
|
|
72
|
+
} | null;
|
|
73
|
+
/** When it will next be sent. */
|
|
74
|
+
nextAt: Date;
|
|
75
|
+
}
|
|
76
|
+
export declare class Push {
|
|
77
|
+
private readonly appId;
|
|
78
|
+
private readonly apiBase;
|
|
79
|
+
private readonly auth;
|
|
80
|
+
constructor(appId: string, apiBase: string, auth: Auth);
|
|
81
|
+
/** Whether this browser can receive push for this app right now, and if not, why. */
|
|
82
|
+
isSupported(): PushIsSupported;
|
|
83
|
+
/** The notification permission for this site: 'default' (not asked yet), 'granted' or 'denied'. */
|
|
84
|
+
permission(): NotificationPermission;
|
|
85
|
+
/**
|
|
86
|
+
* Asks for notification permission and registers this device for the
|
|
87
|
+
* signed-in user. Call it from a user gesture (a button tap): browsers
|
|
88
|
+
* ignore or block permission prompts that aren't. Safe to call again; it
|
|
89
|
+
* re-registers the existing subscription.
|
|
90
|
+
*
|
|
91
|
+
* @throws PushNotSignedInError, PushNotSupportedError, PushPermissionDeniedError, PushNotConfiguredError
|
|
92
|
+
*/
|
|
93
|
+
subscribe(): Promise<void>;
|
|
94
|
+
/** Stops push on this device: removes it from the user's devices and unsubscribes the browser. */
|
|
95
|
+
unsubscribe(): Promise<void>;
|
|
96
|
+
/**
|
|
97
|
+
* Creates or replaces a reminder. `reminderId` is yours to choose
|
|
98
|
+
* (1-64 letters, digits, `_` or `-`); scheduling the same id again replaces it.
|
|
99
|
+
*
|
|
100
|
+
* ```ts
|
|
101
|
+
* await fas.push.schedule('period-due', { at: new Date('2026-11-02T09:00') })
|
|
102
|
+
* await fas.push.schedule('log', { daily: '21:00' }, { quietHours: { start: '22:00', end: '07:00' } })
|
|
103
|
+
* await fas.push.schedule('refill', { everyDays: 28, at: '09:00' }, { tz: 'Europe/London' })
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
schedule(reminderId: string, when: PushWhen, opts?: PushScheduleOptions): Promise<PushReminder>;
|
|
107
|
+
/** Cancels a reminder. Does nothing if it doesn't exist. */
|
|
108
|
+
cancel(reminderId: string): Promise<void>;
|
|
109
|
+
/** The user's reminders for this app, soonest first. */
|
|
110
|
+
list(): Promise<PushReminder[]>;
|
|
111
|
+
private requireToken;
|
|
112
|
+
private vapidPublicKey;
|
|
113
|
+
/** An app-scoped API call; `allow` lists non-2xx statuses to treat as success. */
|
|
114
|
+
private request;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=push.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../src/push.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC;;;;;;;;;;;;GAYG;AAEH,4DAA4D;AAC5D,qBAAa,oBAAqB,SAAQ,KAAK;;CAK9C;AAED,uFAAuF;AACvF,qBAAa,qBAAsB,SAAQ,KAAK;IAClC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC;gBAAxC,MAAM,EAAE,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC;CAQ9D;AAED,6EAA6E;AAC7E,qBAAa,yBAA0B,SAAQ,KAAK;;CAKnD;AAED,6EAA6E;AAC7E,qBAAa,sBAAuB,SAAQ,KAAK;;CAKhD;AAED,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,sBAAsB,GAAG,qBAAqB,CAAC;AAEtF,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED,6EAA6E;AAC7E,MAAM,MAAM,QAAQ;AAClB,6BAA6B;AAC3B;IAAE,EAAE,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;CAAE;AAChC,8BAA8B;GAC5B;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE;AACnB,oCAAoC;GAClC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC,MAAM,WAAW,mBAAmB;IAClC,4EAA4E;IAC5E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,2FAA2F;IAC3F,UAAU,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,QAAQ,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAClD,iCAAiC;IACjC,MAAM,EAAE,IAAI,CAAC;CACd;AA4DD,qBAAa,IAAI;IAEb,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,qFAAqF;IACrF,WAAW,IAAI,eAAe;IAgB9B,mGAAmG;IACnG,UAAU,IAAI,sBAAsB;IAIpC;;;;;;;OAOG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBhC,kGAAkG;IAC5F,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBlC;;;;;;;;;OASG;IACG,QAAQ,CACZ,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,QAAQ,EACd,IAAI,GAAE,mBAAwB,GAC7B,OAAO,CAAC,YAAY,CAAC;IAgBxB,4DAA4D;IACtD,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/C,wDAAwD;IAClD,IAAI,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAOrC,OAAO,CAAC,YAAY;YAMN,cAAc;IAO5B,kFAAkF;YACpE,OAAO;CAiCtB"}
|
package/dist/push.js
ADDED
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web Push reminders for the signed-in user (`fas.push`).
|
|
3
|
+
*
|
|
4
|
+
* Register this device with `subscribe()` (from a user gesture), then set
|
|
5
|
+
* reminders with `schedule()`; the platform sends a push to every device the
|
|
6
|
+
* user subscribed for this app when a reminder comes due (every 15 minutes,
|
|
7
|
+
* so up to ~15 min late). Pushes carry no payload: the app's service worker
|
|
8
|
+
* shows its own notification text, so nothing about the reminder travels
|
|
9
|
+
* through the browser's push service. Use `@freeappstore/sdk/push-sw` in the
|
|
10
|
+
* service worker.
|
|
11
|
+
*
|
|
12
|
+
* Limits (enforced server-side): 10 devices and 20 reminders per user per app.
|
|
13
|
+
*/
|
|
14
|
+
/** No session: sign in before subscribing or scheduling. */
|
|
15
|
+
export class PushNotSignedInError extends Error {
|
|
16
|
+
constructor() {
|
|
17
|
+
super('Not signed in.');
|
|
18
|
+
this.name = 'PushNotSignedInError';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/** This browser can't receive push here; `reason` says why (see `PushIsSupported`). */
|
|
22
|
+
export class PushNotSupportedError extends Error {
|
|
23
|
+
reason;
|
|
24
|
+
constructor(reason) {
|
|
25
|
+
super(reason === 'requires-home-screen'
|
|
26
|
+
? 'Notifications need the app installed: on iPhone and iPad, Share → Add to Home Screen, then open it from there.'
|
|
27
|
+
: "This browser doesn't support push notifications.");
|
|
28
|
+
this.reason = reason;
|
|
29
|
+
this.name = 'PushNotSupportedError';
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** The user declined (or previously blocked) notifications for this site. */
|
|
33
|
+
export class PushPermissionDeniedError extends Error {
|
|
34
|
+
constructor() {
|
|
35
|
+
super('Notification permission was not granted.');
|
|
36
|
+
this.name = 'PushPermissionDeniedError';
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** The platform has push turned off (its VAPID key isn't configured yet). */
|
|
40
|
+
export class PushNotConfiguredError extends Error {
|
|
41
|
+
constructor() {
|
|
42
|
+
super('Push notifications are not available on the platform yet.');
|
|
43
|
+
this.name = 'PushNotConfiguredError';
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function toRule(when) {
|
|
47
|
+
if ('daily' in when)
|
|
48
|
+
return { type: 'daily', time: when.daily };
|
|
49
|
+
if ('everyDays' in when)
|
|
50
|
+
return { type: 'every', days: when.everyDays, time: when.at };
|
|
51
|
+
const at = when.at instanceof Date
|
|
52
|
+
? when.at.getTime()
|
|
53
|
+
: typeof when.at === 'string'
|
|
54
|
+
? Date.parse(when.at)
|
|
55
|
+
: when.at;
|
|
56
|
+
if (!Number.isFinite(at))
|
|
57
|
+
throw new Error('push: `at` must be a valid date.');
|
|
58
|
+
return { type: 'at', at };
|
|
59
|
+
}
|
|
60
|
+
function fromRule(rule) {
|
|
61
|
+
if (rule.type === 'daily')
|
|
62
|
+
return { daily: rule.time };
|
|
63
|
+
if (rule.type === 'every')
|
|
64
|
+
return { everyDays: rule.days, at: rule.time };
|
|
65
|
+
return { at: new Date(rule.at) };
|
|
66
|
+
}
|
|
67
|
+
/** base64url (the VAPID key format) → bytes for `applicationServerKey`. */
|
|
68
|
+
function base64UrlToBytes(value) {
|
|
69
|
+
const b64 = value.replace(/-/g, '+').replace(/_/g, '/');
|
|
70
|
+
const bin = atob(b64 + '='.repeat((4 - (b64.length % 4)) % 4));
|
|
71
|
+
const bytes = new Uint8Array(new ArrayBuffer(bin.length));
|
|
72
|
+
for (let i = 0; i < bin.length; i++)
|
|
73
|
+
bytes[i] = bin.charCodeAt(i);
|
|
74
|
+
return bytes;
|
|
75
|
+
}
|
|
76
|
+
function isIos() {
|
|
77
|
+
const nav = navigator;
|
|
78
|
+
return (/iPad|iPhone|iPod/.test(nav.userAgent) ||
|
|
79
|
+
// iPadOS reports itself as a Mac.
|
|
80
|
+
(nav.platform === 'MacIntel' && (nav.maxTouchPoints ?? 0) > 1));
|
|
81
|
+
}
|
|
82
|
+
function isStandalone() {
|
|
83
|
+
const nav = navigator;
|
|
84
|
+
return (nav.standalone === true ||
|
|
85
|
+
(typeof matchMedia === 'function' && matchMedia('(display-mode: standalone)').matches));
|
|
86
|
+
}
|
|
87
|
+
export class Push {
|
|
88
|
+
appId;
|
|
89
|
+
apiBase;
|
|
90
|
+
auth;
|
|
91
|
+
constructor(appId, apiBase, auth) {
|
|
92
|
+
this.appId = appId;
|
|
93
|
+
this.apiBase = apiBase;
|
|
94
|
+
this.auth = auth;
|
|
95
|
+
}
|
|
96
|
+
/** Whether this browser can receive push for this app right now, and if not, why. */
|
|
97
|
+
isSupported() {
|
|
98
|
+
if (typeof window === 'undefined' || typeof navigator === 'undefined') {
|
|
99
|
+
return { supported: false, reason: 'browser-unsupported' };
|
|
100
|
+
}
|
|
101
|
+
// iOS hides the Push API until the app runs from the Home Screen, so check this first.
|
|
102
|
+
if (isIos() && !isStandalone())
|
|
103
|
+
return { supported: false, reason: 'requires-home-screen' };
|
|
104
|
+
if (!('serviceWorker' in navigator) ||
|
|
105
|
+
!('PushManager' in window) ||
|
|
106
|
+
!('Notification' in window)) {
|
|
107
|
+
return { supported: false, reason: 'browser-unsupported' };
|
|
108
|
+
}
|
|
109
|
+
return { supported: true, reason: 'ok' };
|
|
110
|
+
}
|
|
111
|
+
/** The notification permission for this site: 'default' (not asked yet), 'granted' or 'denied'. */
|
|
112
|
+
permission() {
|
|
113
|
+
return typeof Notification === 'undefined' ? 'denied' : Notification.permission;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Asks for notification permission and registers this device for the
|
|
117
|
+
* signed-in user. Call it from a user gesture (a button tap): browsers
|
|
118
|
+
* ignore or block permission prompts that aren't. Safe to call again; it
|
|
119
|
+
* re-registers the existing subscription.
|
|
120
|
+
*
|
|
121
|
+
* @throws PushNotSignedInError, PushNotSupportedError, PushPermissionDeniedError, PushNotConfiguredError
|
|
122
|
+
*/
|
|
123
|
+
async subscribe() {
|
|
124
|
+
const token = this.requireToken();
|
|
125
|
+
const support = this.isSupported();
|
|
126
|
+
if (!support.supported)
|
|
127
|
+
throw new PushNotSupportedError(support.reason);
|
|
128
|
+
// Ask first, while the user gesture is still active.
|
|
129
|
+
const permission = Notification.permission === 'granted' ? 'granted' : await Notification.requestPermission();
|
|
130
|
+
if (permission !== 'granted')
|
|
131
|
+
throw new PushPermissionDeniedError();
|
|
132
|
+
const registration = await navigator.serviceWorker.ready;
|
|
133
|
+
let subscription = await registration.pushManager.getSubscription();
|
|
134
|
+
if (!subscription) {
|
|
135
|
+
subscription = await registration.pushManager.subscribe({
|
|
136
|
+
userVisibleOnly: true,
|
|
137
|
+
applicationServerKey: base64UrlToBytes(await this.vapidPublicKey()),
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
const json = subscription.toJSON();
|
|
141
|
+
await this.request(token, 'POST', '/push/subscriptions', {
|
|
142
|
+
endpoint: json.endpoint,
|
|
143
|
+
keys: json.keys,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
/** Stops push on this device: removes it from the user's devices and unsubscribes the browser. */
|
|
147
|
+
async unsubscribe() {
|
|
148
|
+
const token = this.requireToken();
|
|
149
|
+
if (!this.isSupported().supported)
|
|
150
|
+
return;
|
|
151
|
+
const registration = await navigator.serviceWorker.ready;
|
|
152
|
+
const subscription = await registration.pushManager.getSubscription();
|
|
153
|
+
if (!subscription)
|
|
154
|
+
return;
|
|
155
|
+
await this.request(token, 'DELETE', '/push/subscriptions', { endpoint: subscription.endpoint }, [404]);
|
|
156
|
+
await subscription.unsubscribe();
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Creates or replaces a reminder. `reminderId` is yours to choose
|
|
160
|
+
* (1-64 letters, digits, `_` or `-`); scheduling the same id again replaces it.
|
|
161
|
+
*
|
|
162
|
+
* ```ts
|
|
163
|
+
* await fas.push.schedule('period-due', { at: new Date('2026-11-02T09:00') })
|
|
164
|
+
* await fas.push.schedule('log', { daily: '21:00' }, { quietHours: { start: '22:00', end: '07:00' } })
|
|
165
|
+
* await fas.push.schedule('refill', { everyDays: 28, at: '09:00' }, { tz: 'Europe/London' })
|
|
166
|
+
* ```
|
|
167
|
+
*/
|
|
168
|
+
async schedule(reminderId, when, opts = {}) {
|
|
169
|
+
const token = this.requireToken();
|
|
170
|
+
const body = {
|
|
171
|
+
rule: toRule(when),
|
|
172
|
+
tz: opts.tz ?? Intl.DateTimeFormat().resolvedOptions().timeZone,
|
|
173
|
+
...(opts.quietHours && { quietHours: opts.quietHours }),
|
|
174
|
+
};
|
|
175
|
+
const res = await this.request(token, 'PUT', `/push/schedules/${encodeURIComponent(reminderId)}`, body);
|
|
176
|
+
return toReminder((await res.json()));
|
|
177
|
+
}
|
|
178
|
+
/** Cancels a reminder. Does nothing if it doesn't exist. */
|
|
179
|
+
async cancel(reminderId) {
|
|
180
|
+
const token = this.requireToken();
|
|
181
|
+
await this.request(token, 'DELETE', `/push/schedules/${encodeURIComponent(reminderId)}`, undefined, [404]);
|
|
182
|
+
}
|
|
183
|
+
/** The user's reminders for this app, soonest first. */
|
|
184
|
+
async list() {
|
|
185
|
+
const token = this.requireToken();
|
|
186
|
+
const res = await this.request(token, 'GET', '/push/schedules');
|
|
187
|
+
const { schedules } = (await res.json());
|
|
188
|
+
return schedules.map(toReminder);
|
|
189
|
+
}
|
|
190
|
+
requireToken() {
|
|
191
|
+
const token = this.auth.token;
|
|
192
|
+
if (!token)
|
|
193
|
+
throw new PushNotSignedInError();
|
|
194
|
+
return token;
|
|
195
|
+
}
|
|
196
|
+
async vapidPublicKey() {
|
|
197
|
+
const res = await fetch(new URL('/v1/push/vapid-public-key', this.apiBase));
|
|
198
|
+
if (res.status === 503)
|
|
199
|
+
throw new PushNotConfiguredError();
|
|
200
|
+
if (!res.ok)
|
|
201
|
+
throw new Error(`push: couldn't get the VAPID key (${res.status})`);
|
|
202
|
+
return (await res.json()).publicKey;
|
|
203
|
+
}
|
|
204
|
+
/** An app-scoped API call; `allow` lists non-2xx statuses to treat as success. */
|
|
205
|
+
async request(token, method, path, body, allow = []) {
|
|
206
|
+
const res = await fetch(new URL(`/v1/apps/${encodeURIComponent(this.appId)}${path}`, this.apiBase), {
|
|
207
|
+
method,
|
|
208
|
+
headers: {
|
|
209
|
+
Authorization: `Bearer ${token}`,
|
|
210
|
+
...(body !== undefined && { 'Content-Type': 'application/json' }),
|
|
211
|
+
},
|
|
212
|
+
...(body !== undefined && { body: JSON.stringify(body) }),
|
|
213
|
+
});
|
|
214
|
+
if (res.status === 401) {
|
|
215
|
+
this.auth.handleUnauthorized();
|
|
216
|
+
throw new PushNotSignedInError();
|
|
217
|
+
}
|
|
218
|
+
if (!res.ok && !allow.includes(res.status)) {
|
|
219
|
+
const detail = await res
|
|
220
|
+
.json()
|
|
221
|
+
.then((j) => j.error)
|
|
222
|
+
.catch(() => undefined);
|
|
223
|
+
throw new Error(`push: ${method} ${path} failed (${res.status})${detail ? `: ${detail}` : ''}`);
|
|
224
|
+
}
|
|
225
|
+
return res;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
function toReminder(s) {
|
|
229
|
+
return {
|
|
230
|
+
reminderId: s.reminderId,
|
|
231
|
+
when: fromRule(s.rule),
|
|
232
|
+
tz: s.tz,
|
|
233
|
+
quietHours: s.quietHours,
|
|
234
|
+
nextAt: new Date(s.nextAt),
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=push.js.map
|
package/dist/push.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../src/push.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.15.0",
|
|
4
4
|
"description": "Browser SDK for apps on freeappstore.online — auth, per-user KV, shared counters, document collections, real-time rooms, API proxy, user API key vault, RBAC roles, React hooks, and 18 UI components.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -18,6 +18,10 @@
|
|
|
18
18
|
"./ui": {
|
|
19
19
|
"types": "./dist/ui.d.ts",
|
|
20
20
|
"import": "./dist/ui.js"
|
|
21
|
+
},
|
|
22
|
+
"./push-sw": {
|
|
23
|
+
"types": "./dist/push-sw.d.ts",
|
|
24
|
+
"import": "./dist/push-sw.js"
|
|
21
25
|
}
|
|
22
26
|
},
|
|
23
27
|
"homepage": "https://github.com/freeappstore-online/platform#readme",
|