From 212ed58b3b498da1bb5503d7d6e0f4e8875fd521 Mon Sep 17 00:00:00 2001 From: Arian Flores Date: Fri, 23 Feb 2024 14:45:20 -0800 Subject: [PATCH 1/4] Adds product_type to types package --- packages/@magic-sdk/types/src/core/json-rpc-types.ts | 1 + packages/@magic-sdk/types/src/core/message-types.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/@magic-sdk/types/src/core/json-rpc-types.ts b/packages/@magic-sdk/types/src/core/json-rpc-types.ts index 181e0aedb..fb9b469de 100644 --- a/packages/@magic-sdk/types/src/core/json-rpc-types.ts +++ b/packages/@magic-sdk/types/src/core/json-rpc-types.ts @@ -32,6 +32,7 @@ export interface JsonRpcResponsePayload { id: string | number | null; result?: ResultType | null; error?: JsonRpcError | null; + product_type?: 'magic' | 'connect'; } export interface UserInfo { diff --git a/packages/@magic-sdk/types/src/core/message-types.ts b/packages/@magic-sdk/types/src/core/message-types.ts index 8adf585f9..131f10c3b 100644 --- a/packages/@magic-sdk/types/src/core/message-types.ts +++ b/packages/@magic-sdk/types/src/core/message-types.ts @@ -7,6 +7,7 @@ export enum MagicIncomingWindowMessage { MAGIC_HIDE_OVERLAY = 'MAGIC_HIDE_OVERLAY', MAGIC_HANDLE_EVENT = 'MAGIC_HANDLE_EVENT', MAGIC_MG_BOX_SEND_RECEIPT = 'MAGIC_MG_BOX_SEND_RECEIPT', + MAGIC_SEND_PRODUCT_TYPE = 'MAGIC_SEND_PRODUCT_TYPE', } export enum MagicOutgoingWindowMessage { From 1824010cedacd75e526d2794b7e8feba9c58ae01 Mon Sep 17 00:00:00 2001 From: Arian Flores Date: Fri, 23 Feb 2024 14:46:03 -0800 Subject: [PATCH 2/4] Adds new deprecation warning to provider --- .../provider/src/core/sdk-exceptions.ts | 6 +++++- .../provider/src/core/view-controller.ts | 19 ++++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/packages/@magic-sdk/provider/src/core/sdk-exceptions.ts b/packages/@magic-sdk/provider/src/core/sdk-exceptions.ts index 0f72f57cc..49578b3b6 100644 --- a/packages/@magic-sdk/provider/src/core/sdk-exceptions.ts +++ b/packages/@magic-sdk/provider/src/core/sdk-exceptions.ts @@ -204,8 +204,12 @@ export function createDeprecationWarning(options: { }) { const { method, removalVersions, useInstead } = options; + const preventDisruptionLanguage = 'to prevent disruption of the wallet service'; + const removalVersion = removalVersions[SDKEnvironment.sdkName]; - const useInsteadSuffix = useInstead ? ` Use \`${useInstead}\` instead.` : ''; + const useInsteadSuffix = useInstead + ? ` Use \`${useInstead}\` instead ${useInstead.includes('Dedicated Wallet') ? preventDisruptionLanguage : ''}.` + : ''; const message = `\`${method}\` will be removed from \`${SDKEnvironment.sdkName}\` in version \`${removalVersion}\`.${useInsteadSuffix}`; return new MagicSDKWarning(SDKWarningCode.DeprecationNotice, message); diff --git a/packages/@magic-sdk/provider/src/core/view-controller.ts b/packages/@magic-sdk/provider/src/core/view-controller.ts index 104d9b648..f8582a94f 100644 --- a/packages/@magic-sdk/provider/src/core/view-controller.ts +++ b/packages/@magic-sdk/provider/src/core/view-controller.ts @@ -10,7 +10,7 @@ import { createPromise } from '../util/promise-tools'; import { getItem, setItem } from '../util/storage'; import { createJwt } from '../util/web-crypto'; import { SDKEnvironment } from './sdk-environment'; -import { createModalNotReadyError } from './sdk-exceptions'; +import { createDeprecationWarning, createModalNotReadyError } from './sdk-exceptions'; import { clearDeviceShares, encryptAndPersistDeviceShare, @@ -34,6 +34,13 @@ interface StandardizedMagicRequest { deviceShare?: string; } +export const UniversalWalletRemovalVersions = { + 'magic-sdk': 'v23.0.0', + '@magic-sdk/react-native': 'v14.0.0', + '@magic-sdk/react-native-bare': 'v24.0.0', + '@magic-sdk/react-native-expo': 'v24.0.0', +}; + /** * Get the originating payload from a batch request using the specified `id`. */ @@ -259,5 +266,15 @@ export abstract class ViewController { this.on(MagicIncomingWindowMessage.MAGIC_SHOW_OVERLAY, () => { this.showOverlay(); }); + + this.on(MagicIncomingWindowMessage.MAGIC_SEND_PRODUCT_TYPE, (event: MagicMessageEvent) => { + if (event.data.response.result.product_type === 'connect') { + createDeprecationWarning({ + method: 'Usage of Universal Wallet API Keys', + removalVersions: UniversalWalletRemovalVersions, + useInstead: 'Dedicated Wallet API Key', + }).log(); + } + }); } } From bdd8dde83e01fe979aa7f9e14ad5c1e5e61bd91e Mon Sep 17 00:00:00 2001 From: Arian Flores Date: Fri, 23 Feb 2024 15:00:08 -0800 Subject: [PATCH 3/4] Update Tests --- .../sdk-exceptions/warning-factories.spec.ts | 23 ++++++++++++++++++- .../test/spec/core/view-controller/on.spec.ts | 2 +- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/packages/@magic-sdk/provider/test/spec/core/sdk-exceptions/warning-factories.spec.ts b/packages/@magic-sdk/provider/test/spec/core/sdk-exceptions/warning-factories.spec.ts index e81ef7783..14996b07c 100644 --- a/packages/@magic-sdk/provider/test/spec/core/sdk-exceptions/warning-factories.spec.ts +++ b/packages/@magic-sdk/provider/test/spec/core/sdk-exceptions/warning-factories.spec.ts @@ -115,6 +115,27 @@ test('Creates a `DEPRECATION_NOTICE` warning with `useInstead` suffix', async () warningAssertions( warning, 'DEPRECATION_NOTICE', - '`test()` will be removed from `magic-sdk` in version `v999`. Use `test2()` instead.', + '`test()` will be removed from `magic-sdk` in version `v999`. Use `test2()` instead .', + ); +}); + +test('Creates a `DEPRECATION_NOTICE` warning with `useInstead` containing "Dedicated Wallet" suffix', async () => { + mockSDKEnvironmentConstant({ sdkName: 'magic-sdk' }); + + const { createDeprecationWarning } = require('../../../../src/core/sdk-exceptions'); + const warning = createDeprecationWarning({ + method: 'test()', + removalVersions: { + 'magic-sdk': 'v999', + '@magic-sdk/react-native-bare': 'v888', + '@magic-sdk/react-native-expo': 'v777', + }, + useInstead: 'Dedicated Wallet', + }); + + warningAssertions( + warning, + 'DEPRECATION_NOTICE', + '`test()` will be removed from `magic-sdk` in version `v999`. Use `Dedicated Wallet` instead to prevent disruption of the wallet service.', ); }); diff --git a/packages/@magic-sdk/provider/test/spec/core/view-controller/on.spec.ts b/packages/@magic-sdk/provider/test/spec/core/view-controller/on.spec.ts index f13d543f3..1150fefaf 100644 --- a/packages/@magic-sdk/provider/test/spec/core/view-controller/on.spec.ts +++ b/packages/@magic-sdk/provider/test/spec/core/view-controller/on.spec.ts @@ -9,7 +9,7 @@ beforeEach(() => { /** * We start with 3 listeners whenever a `ViewController` is created. */ -const baselineListeners = 3; +const baselineListeners = 4; test('Adds the event listener callback to the internal state', () => { const viewController = createViewController(); From 26b53a04df735edb2b9f420dcd26bc0eddcb55af Mon Sep 17 00:00:00 2001 From: Arian Flores Date: Fri, 23 Feb 2024 15:13:07 -0800 Subject: [PATCH 4/4] Adds more Test coverage --- .../@magic-sdk/provider/test/constants.ts | 1 + .../spec/core/view-controller/listen.spec.ts | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/packages/@magic-sdk/provider/test/constants.ts b/packages/@magic-sdk/provider/test/constants.ts index 0b016d2b5..57d8e6c79 100644 --- a/packages/@magic-sdk/provider/test/constants.ts +++ b/packages/@magic-sdk/provider/test/constants.ts @@ -10,4 +10,5 @@ export const MSG_TYPES = (parameters = ENCODED_QUERY_PARAMS) => ({ MAGIC_HIDE_OVERLAY: `MAGIC_HIDE_OVERLAY-${parameters}`, MAGIC_HANDLE_REQUEST: `MAGIC_HANDLE_REQUEST-${parameters}`, MAGIC_HANDLE_EVENT: `MAGIC_HANDLE_EVENT-${parameters}`, + MAGIC_SEND_PRODUCT_TYPE: `MAGIC_SEND_PRODUCT_TYPE-${parameters}`, }); diff --git a/packages/@magic-sdk/provider/test/spec/core/view-controller/listen.spec.ts b/packages/@magic-sdk/provider/test/spec/core/view-controller/listen.spec.ts index a8ce90a73..6b8dd21bd 100644 --- a/packages/@magic-sdk/provider/test/spec/core/view-controller/listen.spec.ts +++ b/packages/@magic-sdk/provider/test/spec/core/view-controller/listen.spec.ts @@ -1,11 +1,18 @@ import browserEnv from '@ikscodes/browser-env'; import { createViewController } from '../../../factories'; import { MSG_TYPES } from '../../../constants'; +import { createDeprecationWarning } from '../../../../src/core/sdk-exceptions'; +import { UniversalWalletRemovalVersions } from '../../../../src/core/view-controller'; beforeEach(() => { browserEnv(); }); +jest.mock('../../../../src/core/sdk-exceptions', () => ({ + ...jest.requireActual('../../../../src/core/sdk-exceptions'), + createDeprecationWarning: jest.fn(), +})); + test('Receive MAGIC_HIDE_OVERLAY, call `hideOverlay`', (done) => { const overlay = createViewController(''); const hideOverlayStub = jest.fn(); @@ -31,3 +38,32 @@ test('Receive MAGIC_SHOW_OVERLAY, call `showOverlay`', (done) => { done(); }, 0); }); + +test('Receive MAGIC_SEND_PRODUCT_TYPE with product_type "connect", call `createDeprecationWarning`', (done) => { + const overlay = createViewController(''); + + // Cast the imported function to its mocked version + const mockCreateDeprecationWarning = createDeprecationWarning as jest.Mock; + + // Mock the return value + mockCreateDeprecationWarning.mockReturnValue({ + log: jest.fn(), + }); + + window.postMessage( + { + msgType: MSG_TYPES().MAGIC_SEND_PRODUCT_TYPE, + response: { result: { product_type: 'connect' } }, + }, + '*', + ); + + setTimeout(() => { + expect(mockCreateDeprecationWarning).toBeCalledWith({ + method: 'Usage of Universal Wallet API Keys', + removalVersions: UniversalWalletRemovalVersions, + useInstead: 'Dedicated Wallet API Key', + }); + done(); + }, 0); +});