@symbiote-native/screen-capture 0.0.0-stage → 0.1.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.
Files changed (102) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +137 -2
  3. package/build/angular/index.d.ts +4 -0
  4. package/build/angular/index.js +4 -0
  5. package/build/angular/services/permissions.service/index.d.ts +5 -0
  6. package/build/angular/services/permissions.service/index.js +59 -0
  7. package/build/angular/services/prevent-screen-capture.service/index.d.ts +4 -0
  8. package/build/angular/services/prevent-screen-capture.service/index.js +65 -0
  9. package/build/angular/services/screenshot-listener.service/index.d.ts +4 -0
  10. package/build/angular/services/screenshot-listener.service/index.js +65 -0
  11. package/build/core/index.d.ts +2 -0
  12. package/build/core/index.js +2 -0
  13. package/build/core/native-module.d.ts +13 -0
  14. package/build/core/native-module.js +4 -0
  15. package/build/core/permissions-runtime.d.ts +5 -0
  16. package/build/core/permissions-runtime.js +16 -0
  17. package/build/core/screen-capture.d.ts +16 -0
  18. package/build/core/screen-capture.js +68 -0
  19. package/build/react/hooks/use-permissions/index.d.ts +7 -0
  20. package/build/react/hooks/use-permissions/index.js +37 -0
  21. package/build/react/hooks/use-prevent-screen-capture/index.d.ts +1 -0
  22. package/build/react/hooks/use-prevent-screen-capture/index.js +12 -0
  23. package/build/react/hooks/use-screenshot-listener/index.d.ts +1 -0
  24. package/build/react/hooks/use-screenshot-listener/index.js +12 -0
  25. package/build/react/index.d.ts +4 -0
  26. package/build/react/index.js +4 -0
  27. package/build/solid/index.d.ts +4 -0
  28. package/build/solid/index.js +4 -0
  29. package/build/solid/primitives/create-permissions.d.ts +8 -0
  30. package/build/solid/primitives/create-permissions.js +25 -0
  31. package/build/solid/primitives/create-prevent-screen-capture.d.ts +1 -0
  32. package/build/solid/primitives/create-prevent-screen-capture.js +11 -0
  33. package/build/solid/primitives/create-screenshot-listener.d.ts +1 -0
  34. package/build/solid/primitives/create-screenshot-listener.js +10 -0
  35. package/build/svelte/index.d.ts +4 -0
  36. package/build/svelte/index.js +4 -0
  37. package/build/svelte/use-permissions.svelte.d.ts +7 -0
  38. package/build/svelte/use-permissions.svelte.js +27 -0
  39. package/build/svelte/use-prevent-screen-capture.svelte.d.ts +1 -0
  40. package/build/svelte/use-prevent-screen-capture.svelte.js +10 -0
  41. package/build/svelte/use-screenshot-listener.svelte.d.ts +1 -0
  42. package/build/svelte/use-screenshot-listener.svelte.js +11 -0
  43. package/build/vue/composables/use-permissions/index.d.ts +8 -0
  44. package/build/vue/composables/use-permissions/index.js +19 -0
  45. package/build/vue/composables/use-prevent-screen-capture/index.d.ts +1 -0
  46. package/build/vue/composables/use-prevent-screen-capture/index.js +12 -0
  47. package/build/vue/composables/use-screenshot-listener/index.d.ts +1 -0
  48. package/build/vue/composables/use-screenshot-listener/index.js +13 -0
  49. package/build/vue/index.d.ts +4 -0
  50. package/build/vue/index.js +4 -0
  51. package/build-ngc/angular/index.d.ts +4 -0
  52. package/build-ngc/angular/index.js +5 -0
  53. package/build-ngc/angular/index.js.map +1 -0
  54. package/build-ngc/angular/services/permissions.service/index.d.ts +8 -0
  55. package/build-ngc/angular/services/permissions.service/index.js +16 -0
  56. package/build-ngc/angular/services/permissions.service/index.js.map +1 -0
  57. package/build-ngc/angular/services/prevent-screen-capture.service/index.d.ts +7 -0
  58. package/build-ngc/angular/services/prevent-screen-capture.service/index.js +23 -0
  59. package/build-ngc/angular/services/prevent-screen-capture.service/index.js.map +1 -0
  60. package/build-ngc/angular/services/screenshot-listener.service/index.d.ts +7 -0
  61. package/build-ngc/angular/services/screenshot-listener.service/index.js +23 -0
  62. package/build-ngc/angular/services/screenshot-listener.service/index.js.map +1 -0
  63. package/build-ngc/core/index.d.ts +2 -0
  64. package/build-ngc/core/index.js +3 -0
  65. package/build-ngc/core/index.js.map +1 -0
  66. package/build-ngc/core/native-module.d.ts +13 -0
  67. package/build-ngc/core/native-module.js +5 -0
  68. package/build-ngc/core/native-module.js.map +1 -0
  69. package/build-ngc/core/permissions-runtime.d.ts +5 -0
  70. package/build-ngc/core/permissions-runtime.js +17 -0
  71. package/build-ngc/core/permissions-runtime.js.map +1 -0
  72. package/build-ngc/core/screen-capture.d.ts +16 -0
  73. package/build-ngc/core/screen-capture.js +69 -0
  74. package/build-ngc/core/screen-capture.js.map +1 -0
  75. package/native-link.json +12 -0
  76. package/package.json +148 -3
  77. package/src/angular/index.ts +4 -0
  78. package/src/angular/services/permissions.service/index.ts +11 -0
  79. package/src/angular/services/prevent-screen-capture.service/index.ts +25 -0
  80. package/src/angular/services/screenshot-listener.service/index.ts +22 -0
  81. package/src/core/index.ts +17 -0
  82. package/src/core/native-module.ts +27 -0
  83. package/src/core/permissions-runtime.ts +26 -0
  84. package/src/core/screen-capture.ts +102 -0
  85. package/src/react/hooks/use-permissions/index.ts +49 -0
  86. package/src/react/hooks/use-prevent-screen-capture/index.ts +17 -0
  87. package/src/react/hooks/use-screenshot-listener/index.ts +14 -0
  88. package/src/react/index.ts +4 -0
  89. package/src/solid/index.ts +4 -0
  90. package/src/solid/primitives/create-permissions.ts +39 -0
  91. package/src/solid/primitives/create-prevent-screen-capture.ts +14 -0
  92. package/src/solid/primitives/create-screenshot-listener.ts +13 -0
  93. package/src/svelte/index.ts +4 -0
  94. package/src/svelte/svelte-ambient.d.ts +3 -0
  95. package/src/svelte/svelte-compile.test-helper.ts +7 -0
  96. package/src/svelte/use-permissions.svelte.ts +41 -0
  97. package/src/svelte/use-prevent-screen-capture.svelte.ts +12 -0
  98. package/src/svelte/use-screenshot-listener.svelte.ts +13 -0
  99. package/src/vue/composables/use-permissions/index.ts +33 -0
  100. package/src/vue/composables/use-prevent-screen-capture/index.ts +18 -0
  101. package/src/vue/composables/use-screenshot-listener/index.ts +18 -0
  102. package/src/vue/index.ts +4 -0
@@ -0,0 +1,25 @@
1
+ // Solid lifecycle wiring over core/screen-capture.ts. The synchronous fetch has nobody to reject
2
+ // to, so its failure lands in `error` instead of escaping as an unhandled rejection
3
+ import { createSignal, onCleanup } from 'solid-js';
4
+ import { getPermissionsAsync, requestPermissionsAsync } from '../../core/index.js';
5
+ import { createPermissionsApi } from '../../core/permissions-runtime.js';
6
+ export function createPermissions() {
7
+ const [status, setStatus] = createSignal(null);
8
+ const [error, setError] = createSignal(null);
9
+ let isDisposed = false;
10
+ const api = createPermissionsApi(getPermissionsAsync, requestPermissionsAsync, response => {
11
+ if (isDisposed)
12
+ return;
13
+ setStatus(response);
14
+ setError(null);
15
+ });
16
+ api.get().catch((cause) => {
17
+ if (isDisposed)
18
+ return;
19
+ setError(cause instanceof Error ? cause : new Error(String(cause)));
20
+ });
21
+ onCleanup(() => {
22
+ isDisposed = true;
23
+ });
24
+ return { status, error, request: api.request, get: api.get };
25
+ }
@@ -0,0 +1 @@
1
+ export declare function createPreventScreenCapture(key?: string): void;
@@ -0,0 +1,11 @@
1
+ // Solid twin of `../../react`'s `usePreventScreenCapture`: prevents synchronously in the
2
+ // primitive body, allows on `onCleanup` - same "nothing can interleave" reasoning as
3
+ // `create-keep-awake.ts` (`@symbiote-native/keep-awake`)
4
+ import { onCleanup } from 'solid-js';
5
+ import { allowScreenCaptureAsync, preventScreenCaptureAsync } from '../../core/index.js';
6
+ export function createPreventScreenCapture(key = 'default') {
7
+ preventScreenCaptureAsync(key);
8
+ onCleanup(() => {
9
+ allowScreenCaptureAsync(key);
10
+ });
11
+ }
@@ -0,0 +1 @@
1
+ export declare function createScreenshotListener(listener: () => void): void;
@@ -0,0 +1,10 @@
1
+ // Solid twin of `../../react`'s `useScreenshotListener`: subscribes synchronously in the
2
+ // primitive body, unsubscribes on `onCleanup`
3
+ import { onCleanup } from 'solid-js';
4
+ import { addScreenshotListener } from '../../core/index.js';
5
+ export function createScreenshotListener(listener) {
6
+ const subscription = addScreenshotListener(listener);
7
+ onCleanup(() => {
8
+ subscription.remove();
9
+ });
10
+ }
@@ -0,0 +1,4 @@
1
+ export * from '../core';
2
+ export { usePreventScreenCapture } from './use-prevent-screen-capture.svelte';
3
+ export { useScreenshotListener } from './use-screenshot-listener.svelte';
4
+ export { usePermissions } from './use-permissions.svelte';
@@ -0,0 +1,4 @@
1
+ export * from '../core/index.js';
2
+ export { usePreventScreenCapture } from './use-prevent-screen-capture.svelte';
3
+ export { useScreenshotListener } from './use-screenshot-listener.svelte';
4
+ export { usePermissions } from './use-permissions.svelte';
@@ -0,0 +1,7 @@
1
+ import type { PermissionResponse } from '../core';
2
+ export declare function usePermissions(): {
3
+ readonly status: PermissionResponse | null;
4
+ readonly error: Error | null;
5
+ request: () => Promise<PermissionResponse>;
6
+ get: () => Promise<PermissionResponse>;
7
+ };
@@ -0,0 +1,27 @@
1
+ // Boxed-getter shape matches `@symbiote-native/brightness`'s own rune by design - each package
2
+ // owns its copy rather than depend on a sibling install-optional package
3
+ import { getPermissionsAsync, requestPermissionsAsync } from '../core/index.js';
4
+ import { createPermissionsApi } from '../core/permissions-runtime.js';
5
+ export function usePermissions() {
6
+ let status = $state(null);
7
+ let error = $state(null);
8
+ const api = createPermissionsApi(getPermissionsAsync, requestPermissionsAsync, response => {
9
+ status = response;
10
+ error = null;
11
+ });
12
+ $effect(() => {
13
+ api.get().catch((cause) => {
14
+ error = cause instanceof Error ? cause : new Error(String(cause));
15
+ });
16
+ });
17
+ return {
18
+ get status() {
19
+ return status;
20
+ },
21
+ get error() {
22
+ return error;
23
+ },
24
+ request: api.request,
25
+ get: api.get,
26
+ };
27
+ }
@@ -0,0 +1 @@
1
+ export declare function usePreventScreenCapture(key?: string): void;
@@ -0,0 +1,10 @@
1
+ // Svelte twin of `../react`'s `usePreventScreenCapture`: prevents on mount, allows on unmount
2
+ import { allowScreenCaptureAsync, preventScreenCaptureAsync } from '../core/index.js';
3
+ export function usePreventScreenCapture(key = 'default') {
4
+ $effect(() => {
5
+ preventScreenCaptureAsync(key);
6
+ return () => {
7
+ allowScreenCaptureAsync(key);
8
+ };
9
+ });
10
+ }
@@ -0,0 +1 @@
1
+ export declare function useScreenshotListener(listener: () => void): void;
@@ -0,0 +1,11 @@
1
+ // Svelte twin of `../react`'s `useScreenshotListener`: subscribes on mount, unsubscribes on
2
+ // unmount
3
+ import { addScreenshotListener } from '../core/index.js';
4
+ export function useScreenshotListener(listener) {
5
+ $effect(() => {
6
+ const subscription = addScreenshotListener(listener);
7
+ return () => {
8
+ subscription.remove();
9
+ };
10
+ });
11
+ }
@@ -0,0 +1,8 @@
1
+ import { type Ref } from '@vue/runtime-core';
2
+ import type { PermissionResponse } from '../../../core';
3
+ export declare function usePermissions(): {
4
+ status: Ref<PermissionResponse | null>;
5
+ error: Ref<Error | null>;
6
+ request: () => Promise<PermissionResponse>;
7
+ get: () => Promise<PermissionResponse>;
8
+ };
@@ -0,0 +1,19 @@
1
+ // Vue lifecycle wiring over core/screen-capture.ts. The mount fetch has nobody to reject to,
2
+ // so its failure lands in `error` instead of escaping as an unhandled rejection
3
+ import { onMounted, ref } from '@vue/runtime-core';
4
+ import { getPermissionsAsync, requestPermissionsAsync } from '../../../core/index.js';
5
+ import { createPermissionsApi } from '../../../core/permissions-runtime.js';
6
+ export function usePermissions() {
7
+ const status = ref(null);
8
+ const error = ref(null);
9
+ const api = createPermissionsApi(getPermissionsAsync, requestPermissionsAsync, response => {
10
+ status.value = response;
11
+ error.value = null;
12
+ });
13
+ onMounted(() => {
14
+ api.get().catch((cause) => {
15
+ error.value = cause instanceof Error ? cause : new Error(String(cause));
16
+ });
17
+ });
18
+ return { status, error, request: api.request, get: api.get };
19
+ }
@@ -0,0 +1 @@
1
+ export declare function usePreventScreenCapture(key?: string): void;
@@ -0,0 +1,12 @@
1
+ // Vue lifecycle wiring over the framework-agnostic core (core/screen-capture.ts): prevents on
2
+ // mount, allows on unmount, mirroring React's `usePreventScreenCapture` hook
3
+ import { onMounted, onUnmounted } from '@vue/runtime-core';
4
+ import { allowScreenCaptureAsync, preventScreenCaptureAsync, } from '../../../core/index.js';
5
+ export function usePreventScreenCapture(key = 'default') {
6
+ onMounted(() => {
7
+ preventScreenCaptureAsync(key);
8
+ });
9
+ onUnmounted(() => {
10
+ allowScreenCaptureAsync(key);
11
+ });
12
+ }
@@ -0,0 +1 @@
1
+ export declare function useScreenshotListener(listener: () => void): void;
@@ -0,0 +1,13 @@
1
+ // Vue lifecycle wiring over the framework-agnostic core (core/screen-capture.ts): subscribes on
2
+ // mount, unsubscribes on unmount, mirroring React's `useScreenshotListener` hook
3
+ import { onMounted, onUnmounted } from '@vue/runtime-core';
4
+ import { addScreenshotListener } from '../../../core/index.js';
5
+ export function useScreenshotListener(listener) {
6
+ let subscription;
7
+ onMounted(() => {
8
+ subscription = addScreenshotListener(listener);
9
+ });
10
+ onUnmounted(() => {
11
+ subscription?.remove();
12
+ });
13
+ }
@@ -0,0 +1,4 @@
1
+ export * from '../core';
2
+ export { usePreventScreenCapture } from './composables/use-prevent-screen-capture';
3
+ export { useScreenshotListener } from './composables/use-screenshot-listener';
4
+ export { usePermissions } from './composables/use-permissions';
@@ -0,0 +1,4 @@
1
+ export * from '../core/index.js';
2
+ export { usePreventScreenCapture } from './composables/use-prevent-screen-capture/index.js';
3
+ export { useScreenshotListener } from './composables/use-screenshot-listener/index.js';
4
+ export { usePermissions } from './composables/use-permissions/index.js';
@@ -0,0 +1,4 @@
1
+ export * from '../core';
2
+ export { PreventScreenCaptureService } from './services/prevent-screen-capture.service';
3
+ export { ScreenshotListenerService } from './services/screenshot-listener.service';
4
+ export { PermissionsService } from './services/permissions.service';
@@ -0,0 +1,5 @@
1
+ export * from '../core';
2
+ export { PreventScreenCaptureService } from './services/prevent-screen-capture.service';
3
+ export { ScreenshotListenerService } from './services/screenshot-listener.service';
4
+ export { PermissionsService } from './services/permissions.service';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/angular/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,2BAA2B,EAAE,MAAM,2CAA2C,CAAC;AACxF,OAAO,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { PermissionsServiceBase } from '@symbiote-native/angular';
2
+ import type { PermissionResponse } from '../../../core';
3
+ import * as i0 from "@angular/core";
4
+ export declare class PermissionsService extends PermissionsServiceBase<PermissionResponse> {
5
+ constructor();
6
+ static ɵfac: i0.ɵɵFactoryDeclaration<PermissionsService, never>;
7
+ static ɵprov: i0.ɵɵInjectableDeclaration<PermissionsService>;
8
+ }
@@ -0,0 +1,16 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { PermissionsServiceBase } from '@symbiote-native/angular';
3
+ import { getPermissionsAsync, requestPermissionsAsync } from '../../../core';
4
+ import * as i0 from "@angular/core";
5
+ export class PermissionsService extends PermissionsServiceBase {
6
+ constructor() {
7
+ super(getPermissionsAsync, requestPermissionsAsync);
8
+ }
9
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PermissionsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
10
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PermissionsService, providedIn: 'root' });
11
+ }
12
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PermissionsService, decorators: [{
13
+ type: Injectable,
14
+ args: [{ providedIn: 'root' }]
15
+ }], ctorParameters: () => [] });
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/angular/services/permissions.service/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;;AAI7E,MAAM,OAAO,kBAAmB,SAAQ,sBAA0C;IAChF;QACE,KAAK,CAAC,mBAAmB,EAAE,uBAAuB,CAAC,CAAC;IACtD,CAAC;uGAHU,kBAAkB;2GAAlB,kBAAkB,cADL,MAAM;;2FACnB,kBAAkB;kBAD9B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE"}
@@ -0,0 +1,7 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class PreventScreenCaptureService {
3
+ private readonly injector;
4
+ connect(key?: string): void;
5
+ static ɵfac: i0.ɵɵFactoryDeclaration<PreventScreenCaptureService, never>;
6
+ static ɵprov: i0.ɵɵInjectableDeclaration<PreventScreenCaptureService>;
7
+ }
@@ -0,0 +1,23 @@
1
+ // Angular twin of `../../react`'s `usePreventScreenCapture`, `connect()` shape matching
2
+ // `@symbiote-native/keep-awake`'s own `KeepAwakeService`
3
+ import { effect, inject, Injectable, Injector } from '@angular/core';
4
+ import { allowScreenCaptureAsync, preventScreenCaptureAsync, } from '../../../core';
5
+ import * as i0 from "@angular/core";
6
+ export class PreventScreenCaptureService {
7
+ injector = inject(Injector);
8
+ connect(key = 'default') {
9
+ effect(onCleanup => {
10
+ preventScreenCaptureAsync(key);
11
+ onCleanup(() => {
12
+ allowScreenCaptureAsync(key);
13
+ });
14
+ }, { injector: this.injector });
15
+ }
16
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PreventScreenCaptureService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
17
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PreventScreenCaptureService, providedIn: 'root' });
18
+ }
19
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PreventScreenCaptureService, decorators: [{
20
+ type: Injectable,
21
+ args: [{ providedIn: 'root' }]
22
+ }] });
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/angular/services/prevent-screen-capture.service/index.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,yDAAyD;AAEzD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EACL,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,eAAe,CAAC;;AAGvB,MAAM,OAAO,2BAA2B;IACrB,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE7C,OAAO,CAAC,MAAc,SAAS;QAC7B,MAAM,CACJ,SAAS,CAAC,EAAE;YACV,yBAAyB,CAAC,GAAG,CAAC,CAAC;YAC/B,SAAS,CAAC,GAAG,EAAE;gBACb,uBAAuB,CAAC,GAAG,CAAC,CAAC;YAC/B,CAAC,CAAC,CAAC;QACL,CAAC,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC5B,CAAC;IACJ,CAAC;uGAbU,2BAA2B;2GAA3B,2BAA2B,cADd,MAAM;;2FACnB,2BAA2B;kBADvC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE"}
@@ -0,0 +1,7 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class ScreenshotListenerService {
3
+ private readonly injector;
4
+ connect(listener: () => void): void;
5
+ static ɵfac: i0.ɵɵFactoryDeclaration<ScreenshotListenerService, never>;
6
+ static ɵprov: i0.ɵɵInjectableDeclaration<ScreenshotListenerService>;
7
+ }
@@ -0,0 +1,23 @@
1
+ // Angular twin of `../../react`'s `useScreenshotListener`, `connect()` shape matching
2
+ // `@symbiote-native/keep-awake`'s own `KeepAwakeService`
3
+ import { effect, inject, Injectable, Injector } from '@angular/core';
4
+ import { addScreenshotListener } from '../../../core';
5
+ import * as i0 from "@angular/core";
6
+ export class ScreenshotListenerService {
7
+ injector = inject(Injector);
8
+ connect(listener) {
9
+ effect(onCleanup => {
10
+ const subscription = addScreenshotListener(listener);
11
+ onCleanup(() => {
12
+ subscription.remove();
13
+ });
14
+ }, { injector: this.injector });
15
+ }
16
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ScreenshotListenerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
17
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ScreenshotListenerService, providedIn: 'root' });
18
+ }
19
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ScreenshotListenerService, decorators: [{
20
+ type: Injectable,
21
+ args: [{ providedIn: 'root' }]
22
+ }] });
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/angular/services/screenshot-listener.service/index.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,yDAAyD;AAEzD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;;AAGtD,MAAM,OAAO,yBAAyB;IACnB,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE7C,OAAO,CAAC,QAAoB;QAC1B,MAAM,CACJ,SAAS,CAAC,EAAE;YACV,MAAM,YAAY,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;YACrD,SAAS,CAAC,GAAG,EAAE;gBACb,YAAY,CAAC,MAAM,EAAE,CAAC;YACxB,CAAC,CAAC,CAAC;QACL,CAAC,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC5B,CAAC;IACJ,CAAC;uGAbU,yBAAyB;2GAAzB,yBAAyB,cADZ,MAAM;;2FACnB,yBAAyB;kBADrC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE"}
@@ -0,0 +1,2 @@
1
+ export { addScreenshotListener, allowScreenCaptureAsync, disableAppSwitcherProtectionAsync, enableAppSwitcherProtectionAsync, getPermissionsAsync, isAvailableAsync, preventScreenCaptureAsync, removeScreenshotListener, requestPermissionsAsync, } from './screen-capture';
2
+ export { PermissionStatus, type EventSubscription, type PermissionExpiration, type PermissionResponse, } from 'expo-modules-core';
@@ -0,0 +1,3 @@
1
+ export { addScreenshotListener, allowScreenCaptureAsync, disableAppSwitcherProtectionAsync, enableAppSwitcherProtectionAsync, getPermissionsAsync, isAvailableAsync, preventScreenCaptureAsync, removeScreenshotListener, requestPermissionsAsync, } from './screen-capture';
2
+ export { PermissionStatus, } from 'expo-modules-core';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,iCAAiC,EACjC,gCAAgC,EAChC,mBAAmB,EACnB,gBAAgB,EAChB,yBAAyB,EACzB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,gBAAgB,GAIjB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { EventSubscription, PermissionResponse } from 'expo-modules-core';
2
+ export declare const ON_SCREENSHOT_EVENT_NAME = "onScreenshot";
3
+ export type INativeScreenCaptureModule = {
4
+ addListener(eventName: typeof ON_SCREENSHOT_EVENT_NAME, listener: () => void): EventSubscription;
5
+ removeAllListeners(eventName: typeof ON_SCREENSHOT_EVENT_NAME): void;
6
+ preventScreenCapture?(): Promise<void>;
7
+ allowScreenCapture?(): Promise<void>;
8
+ enableAppSwitcherProtection?(blurIntensity: number): Promise<void>;
9
+ disableAppSwitcherProtection?(): Promise<void>;
10
+ getPermissionsAsync?(): Promise<PermissionResponse>;
11
+ requestPermissionsAsync?(): Promise<PermissionResponse>;
12
+ };
13
+ export declare const expoScreenCapture: INativeScreenCaptureModule;
@@ -0,0 +1,5 @@
1
+ import { requireNativeModule } from 'expo-modules-core';
2
+ const EXPO_SCREEN_CAPTURE_MODULE_NAME = 'ExpoScreenCapture';
3
+ export const ON_SCREENSHOT_EVENT_NAME = 'onScreenshot';
4
+ export const expoScreenCapture = requireNativeModule(EXPO_SCREEN_CAPTURE_MODULE_NAME);
5
+ //# sourceMappingURL=native-module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-module.js","sourceRoot":"","sources":["../../src/core/native-module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAGxD,MAAM,+BAA+B,GAAG,mBAAmB,CAAC;AAE5D,MAAM,CAAC,MAAM,wBAAwB,GAAG,cAAc,CAAC;AAkBvD,MAAM,CAAC,MAAM,iBAAiB,GAC5B,mBAAmB,CACjB,+BAA+B,CAChC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export type IPermissionsApi<TPermission> = {
2
+ get: () => Promise<TPermission>;
3
+ request: () => Promise<TPermission>;
4
+ };
5
+ export declare function createPermissionsApi<TPermission>(getMethod: () => Promise<TPermission>, requestMethod: () => Promise<TPermission>, record: (response: TPermission) => void): IPermissionsApi<TPermission>;
@@ -0,0 +1,17 @@
1
+ // The get/request wrapper every adapter's `usePermissions` needs, extracted once so
2
+ // `src/vue`/`src/solid`/`src/svelte`/`src/react` each supply only their own state primitive
3
+ export function createPermissionsApi(getMethod, requestMethod, record) {
4
+ return {
5
+ get: async () => {
6
+ const response = await getMethod();
7
+ record(response);
8
+ return response;
9
+ },
10
+ request: async () => {
11
+ const response = await requestMethod();
12
+ record(response);
13
+ return response;
14
+ },
15
+ };
16
+ }
17
+ //# sourceMappingURL=permissions-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions-runtime.js","sourceRoot":"","sources":["../../src/core/permissions-runtime.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,4FAA4F;AAO5F,MAAM,UAAU,oBAAoB,CAClC,SAAqC,EACrC,aAAyC,EACzC,MAAuC;IAEvC,OAAO;QACL,GAAG,EAAE,KAAK,IAAI,EAAE;YACd,MAAM,QAAQ,GAAG,MAAM,SAAS,EAAE,CAAC;YACnC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACjB,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,QAAQ,GAAG,MAAM,aAAa,EAAE,CAAC;YACvC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACjB,OAAO,QAAQ,CAAC;QAClB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { EventSubscription, PermissionResponse } from 'expo-modules-core';
2
+ export declare function isAvailableAsync(): Promise<boolean>;
3
+ /** Repeated calls with the same `key` are no-ops until a matching `allowScreenCaptureAsync`. */
4
+ export declare function preventScreenCaptureAsync(key?: string): Promise<void>;
5
+ export declare function allowScreenCaptureAsync(key?: string): Promise<void>;
6
+ /** iOS only; throws `UnavailabilityError` on Android. */
7
+ export declare function enableAppSwitcherProtectionAsync(blurIntensity?: number): Promise<void>;
8
+ /** iOS only; throws `UnavailabilityError` on Android. */
9
+ export declare function disableAppSwitcherProtectionAsync(): Promise<void>;
10
+ export declare function addScreenshotListener(listener: () => void): EventSubscription;
11
+ /** @deprecated use `subscription.remove()` instead. */
12
+ export declare function removeScreenshotListener(subscription: EventSubscription): void;
13
+ /** Only Android requires a permission to detect screenshots; iOS always resolves granted. */
14
+ export declare function getPermissionsAsync(): Promise<PermissionResponse>;
15
+ /** Only Android requires a permission to detect screenshots; iOS always resolves granted. */
16
+ export declare function requestPermissionsAsync(): Promise<PermissionResponse>;
@@ -0,0 +1,69 @@
1
+ import { PermissionStatus, UnavailabilityError } from 'expo-modules-core';
2
+ import { expoScreenCapture, ON_SCREENSHOT_EVENT_NAME } from './native-module';
3
+ const NATIVE_MODULE_NAME = 'ScreenCapture';
4
+ const activeKeys = new Set();
5
+ export async function isAvailableAsync() {
6
+ return (!!expoScreenCapture.preventScreenCapture &&
7
+ !!expoScreenCapture.allowScreenCapture);
8
+ }
9
+ /** Repeated calls with the same `key` are no-ops until a matching `allowScreenCaptureAsync`. */
10
+ export async function preventScreenCaptureAsync(key = 'default') {
11
+ if (!expoScreenCapture.preventScreenCapture) {
12
+ throw new UnavailabilityError(NATIVE_MODULE_NAME, 'preventScreenCaptureAsync');
13
+ }
14
+ if (!activeKeys.has(key)) {
15
+ activeKeys.add(key);
16
+ await expoScreenCapture.preventScreenCapture();
17
+ }
18
+ }
19
+ export async function allowScreenCaptureAsync(key = 'default') {
20
+ if (!expoScreenCapture.allowScreenCapture) {
21
+ throw new UnavailabilityError(NATIVE_MODULE_NAME, 'allowScreenCaptureAsync');
22
+ }
23
+ activeKeys.delete(key);
24
+ if (activeKeys.size === 0) {
25
+ await expoScreenCapture.allowScreenCapture();
26
+ }
27
+ }
28
+ /** iOS only; throws `UnavailabilityError` on Android. */
29
+ export async function enableAppSwitcherProtectionAsync(blurIntensity = 0.5) {
30
+ if (!expoScreenCapture.enableAppSwitcherProtection) {
31
+ throw new UnavailabilityError(NATIVE_MODULE_NAME, 'enableAppSwitcherProtectionAsync');
32
+ }
33
+ await expoScreenCapture.enableAppSwitcherProtection(blurIntensity);
34
+ }
35
+ /** iOS only; throws `UnavailabilityError` on Android. */
36
+ export async function disableAppSwitcherProtectionAsync() {
37
+ if (!expoScreenCapture.disableAppSwitcherProtection) {
38
+ throw new UnavailabilityError(NATIVE_MODULE_NAME, 'disableAppSwitcherProtectionAsync');
39
+ }
40
+ await expoScreenCapture.disableAppSwitcherProtection();
41
+ }
42
+ export function addScreenshotListener(listener) {
43
+ return expoScreenCapture.addListener(ON_SCREENSHOT_EVENT_NAME, listener);
44
+ }
45
+ /** @deprecated use `subscription.remove()` instead. */
46
+ export function removeScreenshotListener(subscription) {
47
+ subscription.remove();
48
+ }
49
+ const defaultPermissionsResponse = {
50
+ granted: true,
51
+ expires: 'never',
52
+ canAskAgain: true,
53
+ status: PermissionStatus.GRANTED,
54
+ };
55
+ /** Only Android requires a permission to detect screenshots; iOS always resolves granted. */
56
+ export async function getPermissionsAsync() {
57
+ if (expoScreenCapture.getPermissionsAsync) {
58
+ return expoScreenCapture.getPermissionsAsync();
59
+ }
60
+ return defaultPermissionsResponse;
61
+ }
62
+ /** Only Android requires a permission to detect screenshots; iOS always resolves granted. */
63
+ export async function requestPermissionsAsync() {
64
+ if (expoScreenCapture.requestPermissionsAsync) {
65
+ return expoScreenCapture.requestPermissionsAsync();
66
+ }
67
+ return defaultPermissionsResponse;
68
+ }
69
+ //# sourceMappingURL=screen-capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen-capture.js","sourceRoot":"","sources":["../../src/core/screen-capture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ {
2
+ "android": {
3
+ "gradleProjectName": "expo-screen-capture",
4
+ "modules": [
5
+ {
6
+ "importPath": "expo.modules.screencapture.ScreenCaptureModule",
7
+ "className": "ScreenCaptureModule",
8
+ "nativeName": "ExpoScreenCapture"
9
+ }
10
+ ]
11
+ }
12
+ }