UNPKG

3.93 kBPlain TextView Raw
1import { RCTDeviceEventEmitter, CodedError, UnavailabilityError } from '@unimodules/core';
2import { EventEmitter, EventSubscription } from 'fbemitter';
3
4import ExpoUpdates from './ExpoUpdates';
5import {
6 Listener,
7 LocalAssets,
8 Manifest,
9 UpdateCheckResult,
10 UpdateEvent,
11 UpdateFetchResult,
12} from './Updates.types';
13
14export * from './Updates.types';
15
16export const updateId: string | null =
17 ExpoUpdates.updateId && typeof ExpoUpdates.updateId === 'string'
18 ? ExpoUpdates.updateId.toLowerCase()
19 : null;
20export const releaseChannel: string = ExpoUpdates.releaseChannel ?? 'default';
21export const localAssets: LocalAssets = ExpoUpdates.localAssets ?? {};
22export const isEmergencyLaunch: boolean = ExpoUpdates.isEmergencyLaunch || false;
23export const isUsingEmbeddedAssets: boolean = ExpoUpdates.isUsingEmbeddedAssets || false;
24
25let _manifest = ExpoUpdates.manifest;
26if (ExpoUpdates.manifestString) {
27 _manifest = JSON.parse(ExpoUpdates.manifestString);
28}
29export const manifest: Manifest | object = _manifest ?? {};
30
31export 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
46export 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
68export 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
90export 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
96let _emitter: EventEmitter | null;
97
98function _getEmitter(): EventEmitter {
99 if (!_emitter) {
100 _emitter = new EventEmitter();
101 RCTDeviceEventEmitter.addListener('Expo.nativeUpdatesEvent', _emitEvent);
102 }
103 return _emitter;
104}
105
106function _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
122export function addListener(listener: Listener<UpdateEvent>): EventSubscription {
123 const emitter = _getEmitter();
124 return emitter.addListener('Expo.updatesEvent', listener);
125}