1 | import { RCTDeviceEventEmitter, CodedError, UnavailabilityError } from '@unimodules/core';
|
2 | import { EventEmitter, EventSubscription } from 'fbemitter';
|
3 |
|
4 | import ExpoUpdates from './ExpoUpdates';
|
5 | import {
|
6 | Listener,
|
7 | LocalAssets,
|
8 | Manifest,
|
9 | UpdateCheckResult,
|
10 | UpdateEvent,
|
11 | UpdateFetchResult,
|
12 | } from './Updates.types';
|
13 |
|
14 | export * from './Updates.types';
|
15 |
|
16 | export const updateId: string | null =
|
17 | ExpoUpdates.updateId && typeof ExpoUpdates.updateId === 'string'
|
18 | ? ExpoUpdates.updateId.toLowerCase()
|
19 | : null;
|
20 | export const releaseChannel: string = ExpoUpdates.releaseChannel ?? 'default';
|
21 | export const localAssets: LocalAssets = ExpoUpdates.localAssets ?? {};
|
22 | export const isEmergencyLaunch: boolean = ExpoUpdates.isEmergencyLaunch || false;
|
23 | export const isUsingEmbeddedAssets: boolean = ExpoUpdates.isUsingEmbeddedAssets || false;
|
24 |
|
25 | let _manifest = ExpoUpdates.manifest;
|
26 | if (ExpoUpdates.manifestString) {
|
27 | _manifest = JSON.parse(ExpoUpdates.manifestString);
|
28 | }
|
29 | export const manifest: Manifest | object = _manifest ?? {};
|
30 |
|
31 | export async function reloadAsync(): Promise<void> {
|
32 | if (!ExpoUpdates.reload) {
|
33 | throw new UnavailabilityError('Updates', 'reloadAsync');
|
34 | }
|
35 | if (__DEV__) {
|
36 | throw new CodedError(
|
37 | 'ERR_UPDATES_DISABLED',
|
38 | 'You cannot use the Updates module in development mode. To test manual updates, make a ' +
|
39 | 'release build with `npm run ios --configuration Release` or ' +
|
40 | '`npm run android --variant Release`.'
|
41 | );
|
42 | }
|
43 | await ExpoUpdates.reload();
|
44 | }
|
45 |
|
46 | export async function checkForUpdateAsync(): Promise<UpdateCheckResult> {
|
47 | if (!ExpoUpdates.checkForUpdateAsync) {
|
48 | throw new UnavailabilityError('Updates', 'checkForUpdateAsync');
|
49 | }
|
50 | if (__DEV__) {
|
51 | throw new CodedError(
|
52 | 'ERR_UPDATES_DISABLED',
|
53 | 'You cannot check for updates in development mode. To test manual updates, make a ' +
|
54 | 'release build with `npm run ios --configuration Release` or ' +
|
55 | '`npm run android --variant Release`.'
|
56 | );
|
57 | }
|
58 |
|
59 | const result = await ExpoUpdates.checkForUpdateAsync();
|
60 | if (result.manifestString) {
|
61 | result.manifest = JSON.parse(result.manifestString);
|
62 | delete result.manifestString;
|
63 | }
|
64 |
|
65 | return result;
|
66 | }
|
67 |
|
68 | export async function fetchUpdateAsync(): Promise<UpdateFetchResult> {
|
69 | if (!ExpoUpdates.fetchUpdateAsync) {
|
70 | throw new UnavailabilityError('Updates', 'fetchUpdateAsync');
|
71 | }
|
72 | if (__DEV__) {
|
73 | throw new CodedError(
|
74 | 'ERR_UPDATES_DISABLED',
|
75 | 'You cannot fetch updates in development mode. To test manual updates, make a ' +
|
76 | 'release build with `npm run ios --configuration Release` or ' +
|
77 | '`npm run android --variant Release`.'
|
78 | );
|
79 | }
|
80 |
|
81 | const result = await ExpoUpdates.fetchUpdateAsync();
|
82 | if (result.manifestString) {
|
83 | result.manifest = JSON.parse(result.manifestString);
|
84 | delete result.manifestString;
|
85 | }
|
86 |
|
87 | return result;
|
88 | }
|
89 |
|
90 | export function clearUpdateCacheExperimentalAsync(_sdkVersion?: string) {
|
91 | console.warn(
|
92 | "This method is no longer necessary. `expo-updates` now automatically deletes your app's old bundle files!"
|
93 | );
|
94 | }
|
95 |
|
96 | let _emitter: EventEmitter | null;
|
97 |
|
98 | function _getEmitter(): EventEmitter {
|
99 | if (!_emitter) {
|
100 | _emitter = new EventEmitter();
|
101 | RCTDeviceEventEmitter.addListener('Expo.nativeUpdatesEvent', _emitEvent);
|
102 | }
|
103 | return _emitter;
|
104 | }
|
105 |
|
106 | function _emitEvent(params): void {
|
107 | let newParams = params;
|
108 | if (typeof params === 'string') {
|
109 | newParams = JSON.parse(params);
|
110 | }
|
111 | if (newParams.manifestString) {
|
112 | newParams.manifest = JSON.parse(newParams.manifestString);
|
113 | delete newParams.manifestString;
|
114 | }
|
115 |
|
116 | if (!_emitter) {
|
117 | throw new Error(`EventEmitter must be initialized to use from its listener`);
|
118 | }
|
119 | _emitter.emit('Expo.updatesEvent', newParams);
|
120 | }
|
121 |
|
122 | export function addListener(listener: Listener<UpdateEvent>): EventSubscription {
|
123 | const emitter = _getEmitter();
|
124 | return emitter.addListener('Expo.updatesEvent', listener);
|
125 | }
|