From fdb7bf56b313d1247409c97f7c8ed464ffca6238 Mon Sep 17 00:00:00 2001 From: Wen Bo Xie Date: Tue, 16 Aug 2022 06:52:45 -0400 Subject: [PATCH] Revert "Revert "Merge pull request #462 from supabase/feat/new-realtime-api"" This reverts commit c9b4f89991aa16a569586f093c474b40d0752381. --- .../next-storage/components/ProfileList.tsx | 15 +- example/next-storage/package-lock.json | 423 +++++++++--------- example/next-storage/package.json | 10 +- example/next-todo/components/TodoList.js | 25 +- example/next-todo/package-lock.json | 24 +- package-lock.json | 14 +- package.json | 2 +- src/SupabaseClient.ts | 124 ++--- src/index.ts | 2 +- src/lib/SupabaseQueryBuilder.ts | 59 --- src/lib/SupabaseRealtimeClient.ts | 74 --- src/lib/types.ts | 16 - 12 files changed, 292 insertions(+), 496 deletions(-) delete mode 100644 src/lib/SupabaseQueryBuilder.ts delete mode 100644 src/lib/SupabaseRealtimeClient.ts diff --git a/example/next-storage/components/ProfileList.tsx b/example/next-storage/components/ProfileList.tsx index e0c3ab9b..0e8ea08e 100644 --- a/example/next-storage/components/ProfileList.tsx +++ b/example/next-storage/components/ProfileList.tsx @@ -1,11 +1,8 @@ import ProfileCard from '../components/ProfileCard' import { Profile } from '../lib/constants' -import { Subscription, SupabaseRealtimePayload } from '@supabase/supabase-js' import { supabase } from '../lib/api' import { useState, useEffect } from 'react' -var realtimeProfiles: Subscription | null = null - export default function ProfileList() { const [profiles, setProfiles] = useState([]) @@ -13,13 +10,17 @@ export default function ProfileList() { // getPublicProfiles() getUserProfile() - realtimeProfiles = supabase - .from('profiles') - .on('*', (payload: SupabaseRealtimePayload) => profileUpdated(profiles, payload.new)) + const realtimeProfiles = supabase + .channel('profiles-channel') + .on( + 'postgres_changes', + { event: '*', schema: 'public', table: 'profiles' }, + (payload: { [key: string]: any }) => profileUpdated(profiles, payload.new) + ) .subscribe() return () => { - if (realtimeProfiles) supabase.removeSubscription(realtimeProfiles) + if (realtimeProfiles) supabase.removeChannel(realtimeProfiles) } }, []) diff --git a/example/next-storage/package-lock.json b/example/next-storage/package-lock.json index ed9c3b00..daa444a9 100644 --- a/example/next-storage/package-lock.json +++ b/example/next-storage/package-lock.json @@ -9,13 +9,13 @@ "version": "0.1.0", "dependencies": { "@supabase/supabase-js": "file:../..", - "next": "12.1.0", - "react": "17.0.1", - "react-dom": "17.0.1" + "next": "12.1.6", + "react": "18.2.0", + "react-dom": "18.2.0" }, "devDependencies": { - "@types/react": "^17.0.3", - "typescript": "^4.2.3" + "@types/react": "18.0.14", + "typescript": "4.7.4" } }, "../..": { @@ -23,11 +23,11 @@ "version": "0.0.0-automated", "license": "MIT", "dependencies": { - "@supabase/functions-js": "^1.4.0-next.5", - "@supabase/gotrue-js": "^1.23.0-next.20", - "@supabase/postgrest-js": "^1.0.0-next.7", - "@supabase/realtime-js": "1.7.4", - "@supabase/storage-js": "^1.8.0-next.6", + "@supabase/functions-js": "^1.3.3", + "@supabase/gotrue-js": "^1.23.0-next.3", + "@supabase/postgrest-js": "^0.37.2", + "@supabase/realtime-js": "^1.7.2", + "@supabase/storage-js": "^1.7.0", "cross-fetch": "^3.1.5" }, "devDependencies": { @@ -41,7 +41,7 @@ "semantic-release-plugin-update-version-in-files": "^1.1.0", "ts-jest": "^26.3.0", "ts-loader": "^8.0.11", - "typedoc": "^0.22.16", + "typedoc": "^0.22.13", "typescript": "^4.5.5", "webpack": "^5.69.1", "webpack-cli": "^4.9.2" @@ -6641,14 +6641,29 @@ } }, "node_modules/@next/env": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/env/-/env-12.1.0.tgz", - "integrity": "sha512-nrIgY6t17FQ9xxwH3jj0a6EOiQ/WDHUos35Hghtr+SWN/ntHIQ7UpuvSi0vaLzZVHQWaDupKI+liO5vANcDeTQ==" + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/@next/env/-/env-12.1.6.tgz", + "integrity": "sha512-Te/OBDXFSodPU6jlXYPAXpmZr/AkG6DCATAxttQxqOWaq6eDFX25Db3dK0120GZrSZmv4QCe9KsZmJKDbWs4OA==" + }, + "node_modules/@next/swc-android-arm-eabi": { + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.1.6.tgz", + "integrity": "sha512-BxBr3QAAAXWgk/K7EedvzxJr2dE014mghBSA9iOEAv0bMgF+MRq4PoASjuHi15M2zfowpcRG8XQhMFtxftCleQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } }, "node_modules/@next/swc-android-arm64": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.1.0.tgz", - "integrity": "sha512-/280MLdZe0W03stA69iL+v6I+J1ascrQ6FrXBlXGCsGzrfMaGr7fskMa0T5AhQIVQD4nA/46QQWxG//DYuFBcA==", + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.1.6.tgz", + "integrity": "sha512-EboEk3ROYY7U6WA2RrMt/cXXMokUTXXfnxe2+CU+DOahvbrO8QSWhlBl9I9ZbFzJx28AGB9Yo3oQHCvph/4Lew==", "cpu": [ "arm64" ], @@ -6661,9 +6676,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.0.tgz", - "integrity": "sha512-R8vcXE2/iONJ1Unf5Ptqjk6LRW3bggH+8drNkkzH4FLEQkHtELhvcmJwkXcuipyQCsIakldAXhRbZmm3YN1vXg==", + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.6.tgz", + "integrity": "sha512-P0EXU12BMSdNj1F7vdkP/VrYDuCNwBExtRPDYawgSUakzi6qP0iKJpya2BuLvNzXx+XPU49GFuDC5X+SvY0mOw==", "cpu": [ "arm64" ], @@ -6676,9 +6691,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.0.tgz", - "integrity": "sha512-ieAz0/J0PhmbZBB8+EA/JGdhRHBogF8BWaeqR7hwveb6SYEIJaDNQy0I+ZN8gF8hLj63bEDxJAs/cEhdnTq+ug==", + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.6.tgz", + "integrity": "sha512-9FptMnbgHJK3dRDzfTpexs9S2hGpzOQxSQbe8omz6Pcl7rnEp9x4uSEKY51ho85JCjL4d0tDLBcXEJZKKLzxNg==", "cpu": [ "x64" ], @@ -6691,9 +6706,9 @@ } }, "node_modules/@next/swc-linux-arm-gnueabihf": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.0.tgz", - "integrity": "sha512-njUd9hpl6o6A5d08dC0cKAgXKCzm5fFtgGe6i0eko8IAdtAPbtHxtpre3VeSxdZvuGFh+hb0REySQP9T1ttkog==", + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.6.tgz", + "integrity": "sha512-PvfEa1RR55dsik/IDkCKSFkk6ODNGJqPY3ysVUZqmnWMDSuqFtf7BPWHFa/53znpvVB5XaJ5Z1/6aR5CTIqxPw==", "cpu": [ "arm" ], @@ -6706,9 +6721,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.0.tgz", - "integrity": "sha512-OqangJLkRxVxMhDtcb7Qn1xjzFA3s50EIxY7mljbSCLybU+sByPaWAHY4px97ieOlr2y4S0xdPKkQ3BCAwyo6Q==", + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.6.tgz", + "integrity": "sha512-53QOvX1jBbC2ctnmWHyRhMajGq7QZfl974WYlwclXarVV418X7ed7o/EzGY+YVAEKzIVaAB9JFFWGXn8WWo0gQ==", "cpu": [ "arm64" ], @@ -6721,9 +6736,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.0.tgz", - "integrity": "sha512-hB8cLSt4GdmOpcwRe2UzI5UWn6HHO/vLkr5OTuNvCJ5xGDwpPXelVkYW/0+C3g5axbDW2Tym4S+MQCkkH9QfWA==", + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.6.tgz", + "integrity": "sha512-CMWAkYqfGdQCS+uuMA1A2UhOfcUYeoqnTW7msLr2RyYAys15pD960hlDfq7QAi8BCAKk0sQ2rjsl0iqMyziohQ==", "cpu": [ "arm64" ], @@ -6736,9 +6751,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.0.tgz", - "integrity": "sha512-OKO4R/digvrVuweSw/uBM4nSdyzsBV5EwkUeeG4KVpkIZEe64ZwRpnFB65bC6hGwxIBnTv5NMSnJ+0K/WmG78A==", + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.6.tgz", + "integrity": "sha512-AC7jE4Fxpn0s3ujngClIDTiEM/CQiB2N2vkcyWWn6734AmGT03Duq6RYtPMymFobDdAtZGFZd5nR95WjPzbZAQ==", "cpu": [ "x64" ], @@ -6751,9 +6766,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.0.tgz", - "integrity": "sha512-JohhgAHZvOD3rQY7tlp7NlmvtvYHBYgY0x5ZCecUT6eCCcl9lv6iV3nfu82ErkxNk1H893fqH0FUpznZ/H3pSw==", + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.6.tgz", + "integrity": "sha512-c9Vjmi0EVk0Kou2qbrynskVarnFwfYIi+wKufR9Ad7/IKKuP6aEhOdZiIIdKsYWRtK2IWRF3h3YmdnEa2WLUag==", "cpu": [ "x64" ], @@ -6766,9 +6781,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.0.tgz", - "integrity": "sha512-T/3gIE6QEfKIJ4dmJk75v9hhNiYZhQYAoYm4iVo1TgcsuaKLFa+zMPh4056AHiG6n9tn2UQ1CFE8EoybEsqsSw==", + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.6.tgz", + "integrity": "sha512-3UTOL/5XZSKFelM7qN0it35o3Cegm6LsyuERR3/OoqEExyj3aCk7F025b54/707HTMAnjlvQK3DzLhPu/xxO4g==", "cpu": [ "arm64" ], @@ -6781,9 +6796,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.0.tgz", - "integrity": "sha512-iwnKgHJdqhIW19H9PRPM9j55V6RdcOo6rX+5imx832BCWzkDbyomWnlzBfr6ByUYfhohb8QuH4hSGEikpPqI0Q==", + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.6.tgz", + "integrity": "sha512-8ZWoj6nCq6fI1yCzKq6oK0jE6Mxlz4MrEsRyu0TwDztWQWe7rh4XXGLAa2YVPatYcHhMcUL+fQQbqd1MsgaSDA==", "cpu": [ "ia32" ], @@ -6796,9 +6811,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.0.tgz", - "integrity": "sha512-aBvcbMwuanDH4EMrL2TthNJy+4nP59Bimn8egqv6GHMVj0a44cU6Au4PjOhLNqEh9l+IpRGBqMTzec94UdC5xg==", + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.6.tgz", + "integrity": "sha512-4ZEwiRuZEicXhXqmhw3+de8Z4EpOLQj/gp+D9fFWo6ii6W1kBkNNvvEx4A90ugppu+74pT1lIJnOuz3A9oQeJA==", "cpu": [ "x64" ], @@ -6821,9 +6836,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.3.tgz", - "integrity": "sha512-wYOUxIgs2HZZ0ACNiIayItyluADNbONl7kt8lkLjVK8IitMH5QMyAh75Fwhmo37r1m7L2JaFj03sIfxBVDvRAg==", + "version": "18.0.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.14.tgz", + "integrity": "sha512-x4gGuASSiWmo0xjDLpm5mPb52syZHJx02VKbqUKdLmKtAwIh63XClGsiTI1K6DO5q7ox4xAsQrU+Gl3+gGXF9Q==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -6838,13 +6853,19 @@ "dev": true }, "node_modules/caniuse-lite": { - "version": "1.0.30001312", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz", - "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } + "version": "1.0.30001356", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001356.tgz", + "integrity": "sha512-/30854bktMLhxtjieIxsrJBfs2gTM1pel6MXKF3K+RdIVJZcsn2A2QdhsuR4/p9+R204fZw0zCBBhktX8xWuyQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] }, "node_modules/csstype": { "version": "3.0.7", @@ -6880,15 +6901,14 @@ } }, "node_modules/next": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/next/-/next-12.1.0.tgz", - "integrity": "sha512-s885kWvnIlxsUFHq9UGyIyLiuD0G3BUC/xrH0CEnH5lHEWkwQcHOORgbDF0hbrW9vr/7am4ETfX4A7M6DjrE7Q==", + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/next/-/next-12.1.6.tgz", + "integrity": "sha512-cebwKxL3/DhNKfg9tPZDQmbRKjueqykHHbgaoG4VBRH3AHQJ2HO0dbKFiS1hPhe1/qgc2d/hFeadsbPicmLD+A==", "dependencies": { - "@next/env": "12.1.0", - "caniuse-lite": "^1.0.30001283", + "@next/env": "12.1.6", + "caniuse-lite": "^1.0.30001332", "postcss": "8.4.5", - "styled-jsx": "5.0.0", - "use-subscription": "1.5.1" + "styled-jsx": "5.0.2" }, "bin": { "next": "dist/bin/next" @@ -6897,17 +6917,18 @@ "node": ">=12.22.0" }, "optionalDependencies": { - "@next/swc-android-arm64": "12.1.0", - "@next/swc-darwin-arm64": "12.1.0", - "@next/swc-darwin-x64": "12.1.0", - "@next/swc-linux-arm-gnueabihf": "12.1.0", - "@next/swc-linux-arm64-gnu": "12.1.0", - "@next/swc-linux-arm64-musl": "12.1.0", - "@next/swc-linux-x64-gnu": "12.1.0", - "@next/swc-linux-x64-musl": "12.1.0", - "@next/swc-win32-arm64-msvc": "12.1.0", - "@next/swc-win32-ia32-msvc": "12.1.0", - "@next/swc-win32-x64-msvc": "12.1.0" + "@next/swc-android-arm-eabi": "12.1.6", + "@next/swc-android-arm64": "12.1.6", + "@next/swc-darwin-arm64": "12.1.6", + "@next/swc-darwin-x64": "12.1.6", + "@next/swc-linux-arm-gnueabihf": "12.1.6", + "@next/swc-linux-arm64-gnu": "12.1.6", + "@next/swc-linux-arm64-musl": "12.1.6", + "@next/swc-linux-x64-gnu": "12.1.6", + "@next/swc-linux-x64-musl": "12.1.6", + "@next/swc-win32-arm64-msvc": "12.1.6", + "@next/swc-win32-ia32-msvc": "12.1.6", + "@next/swc-win32-x64-msvc": "12.1.6" }, "peerDependencies": { "fibers": ">= 3.1.0", @@ -6928,14 +6949,6 @@ } } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -6959,37 +6972,34 @@ } }, "node_modules/react": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.1.tgz", - "integrity": "sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.1.tgz", - "integrity": "sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", "dependencies": { "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.1" + "scheduler": "^0.23.0" }, "peerDependencies": { - "react": "17.0.1" + "react": "^18.2.0" } }, "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" } }, "node_modules/source-map-js": { @@ -7001,14 +7011,14 @@ } }, "node_modules/styled-jsx": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.0.tgz", - "integrity": "sha512-qUqsWoBquEdERe10EW8vLp3jT25s/ssG1/qX5gZ4wu15OZpmSMFI2v+fWlRhLfykA5rFtlJ1ME8A8pm/peV4WA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.2.tgz", + "integrity": "sha512-LqPQrbBh3egD57NBcHET4qcgshPks+yblyhPlH2GY8oaDgKs8SK4C3dBh3oSJjgzJ3G5t1SYEZGHkP+QEpX9EQ==", "engines": { "node": ">= 12.0.0" }, "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || 18.x.x" + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" }, "peerDependenciesMeta": { "@babel/core": { @@ -7020,9 +7030,9 @@ } }, "node_modules/typescript": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", - "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -7031,99 +7041,94 @@ "engines": { "node": ">=4.2.0" } - }, - "node_modules/use-subscription": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz", - "integrity": "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==", - "dependencies": { - "object-assign": "^4.1.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0" - } } }, "dependencies": { "@next/env": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/env/-/env-12.1.0.tgz", - "integrity": "sha512-nrIgY6t17FQ9xxwH3jj0a6EOiQ/WDHUos35Hghtr+SWN/ntHIQ7UpuvSi0vaLzZVHQWaDupKI+liO5vANcDeTQ==" + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/@next/env/-/env-12.1.6.tgz", + "integrity": "sha512-Te/OBDXFSodPU6jlXYPAXpmZr/AkG6DCATAxttQxqOWaq6eDFX25Db3dK0120GZrSZmv4QCe9KsZmJKDbWs4OA==" + }, + "@next/swc-android-arm-eabi": { + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.1.6.tgz", + "integrity": "sha512-BxBr3QAAAXWgk/K7EedvzxJr2dE014mghBSA9iOEAv0bMgF+MRq4PoASjuHi15M2zfowpcRG8XQhMFtxftCleQ==", + "optional": true }, "@next/swc-android-arm64": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.1.0.tgz", - "integrity": "sha512-/280MLdZe0W03stA69iL+v6I+J1ascrQ6FrXBlXGCsGzrfMaGr7fskMa0T5AhQIVQD4nA/46QQWxG//DYuFBcA==", + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.1.6.tgz", + "integrity": "sha512-EboEk3ROYY7U6WA2RrMt/cXXMokUTXXfnxe2+CU+DOahvbrO8QSWhlBl9I9ZbFzJx28AGB9Yo3oQHCvph/4Lew==", "optional": true }, "@next/swc-darwin-arm64": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.0.tgz", - "integrity": "sha512-R8vcXE2/iONJ1Unf5Ptqjk6LRW3bggH+8drNkkzH4FLEQkHtELhvcmJwkXcuipyQCsIakldAXhRbZmm3YN1vXg==", + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.6.tgz", + "integrity": "sha512-P0EXU12BMSdNj1F7vdkP/VrYDuCNwBExtRPDYawgSUakzi6qP0iKJpya2BuLvNzXx+XPU49GFuDC5X+SvY0mOw==", "optional": true }, "@next/swc-darwin-x64": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.0.tgz", - "integrity": "sha512-ieAz0/J0PhmbZBB8+EA/JGdhRHBogF8BWaeqR7hwveb6SYEIJaDNQy0I+ZN8gF8hLj63bEDxJAs/cEhdnTq+ug==", + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.6.tgz", + "integrity": "sha512-9FptMnbgHJK3dRDzfTpexs9S2hGpzOQxSQbe8omz6Pcl7rnEp9x4uSEKY51ho85JCjL4d0tDLBcXEJZKKLzxNg==", "optional": true }, "@next/swc-linux-arm-gnueabihf": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.0.tgz", - "integrity": "sha512-njUd9hpl6o6A5d08dC0cKAgXKCzm5fFtgGe6i0eko8IAdtAPbtHxtpre3VeSxdZvuGFh+hb0REySQP9T1ttkog==", + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.6.tgz", + "integrity": "sha512-PvfEa1RR55dsik/IDkCKSFkk6ODNGJqPY3ysVUZqmnWMDSuqFtf7BPWHFa/53znpvVB5XaJ5Z1/6aR5CTIqxPw==", "optional": true }, "@next/swc-linux-arm64-gnu": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.0.tgz", - "integrity": "sha512-OqangJLkRxVxMhDtcb7Qn1xjzFA3s50EIxY7mljbSCLybU+sByPaWAHY4px97ieOlr2y4S0xdPKkQ3BCAwyo6Q==", + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.6.tgz", + "integrity": "sha512-53QOvX1jBbC2ctnmWHyRhMajGq7QZfl974WYlwclXarVV418X7ed7o/EzGY+YVAEKzIVaAB9JFFWGXn8WWo0gQ==", "optional": true }, "@next/swc-linux-arm64-musl": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.0.tgz", - "integrity": "sha512-hB8cLSt4GdmOpcwRe2UzI5UWn6HHO/vLkr5OTuNvCJ5xGDwpPXelVkYW/0+C3g5axbDW2Tym4S+MQCkkH9QfWA==", + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.6.tgz", + "integrity": "sha512-CMWAkYqfGdQCS+uuMA1A2UhOfcUYeoqnTW7msLr2RyYAys15pD960hlDfq7QAi8BCAKk0sQ2rjsl0iqMyziohQ==", "optional": true }, "@next/swc-linux-x64-gnu": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.0.tgz", - "integrity": "sha512-OKO4R/digvrVuweSw/uBM4nSdyzsBV5EwkUeeG4KVpkIZEe64ZwRpnFB65bC6hGwxIBnTv5NMSnJ+0K/WmG78A==", + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.6.tgz", + "integrity": "sha512-AC7jE4Fxpn0s3ujngClIDTiEM/CQiB2N2vkcyWWn6734AmGT03Duq6RYtPMymFobDdAtZGFZd5nR95WjPzbZAQ==", "optional": true }, "@next/swc-linux-x64-musl": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.0.tgz", - "integrity": "sha512-JohhgAHZvOD3rQY7tlp7NlmvtvYHBYgY0x5ZCecUT6eCCcl9lv6iV3nfu82ErkxNk1H893fqH0FUpznZ/H3pSw==", + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.6.tgz", + "integrity": "sha512-c9Vjmi0EVk0Kou2qbrynskVarnFwfYIi+wKufR9Ad7/IKKuP6aEhOdZiIIdKsYWRtK2IWRF3h3YmdnEa2WLUag==", "optional": true }, "@next/swc-win32-arm64-msvc": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.0.tgz", - "integrity": "sha512-T/3gIE6QEfKIJ4dmJk75v9hhNiYZhQYAoYm4iVo1TgcsuaKLFa+zMPh4056AHiG6n9tn2UQ1CFE8EoybEsqsSw==", + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.6.tgz", + "integrity": "sha512-3UTOL/5XZSKFelM7qN0it35o3Cegm6LsyuERR3/OoqEExyj3aCk7F025b54/707HTMAnjlvQK3DzLhPu/xxO4g==", "optional": true }, "@next/swc-win32-ia32-msvc": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.0.tgz", - "integrity": "sha512-iwnKgHJdqhIW19H9PRPM9j55V6RdcOo6rX+5imx832BCWzkDbyomWnlzBfr6ByUYfhohb8QuH4hSGEikpPqI0Q==", + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.6.tgz", + "integrity": "sha512-8ZWoj6nCq6fI1yCzKq6oK0jE6Mxlz4MrEsRyu0TwDztWQWe7rh4XXGLAa2YVPatYcHhMcUL+fQQbqd1MsgaSDA==", "optional": true }, "@next/swc-win32-x64-msvc": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.0.tgz", - "integrity": "sha512-aBvcbMwuanDH4EMrL2TthNJy+4nP59Bimn8egqv6GHMVj0a44cU6Au4PjOhLNqEh9l+IpRGBqMTzec94UdC5xg==", + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.6.tgz", + "integrity": "sha512-4ZEwiRuZEicXhXqmhw3+de8Z4EpOLQj/gp+D9fFWo6ii6W1kBkNNvvEx4A90ugppu+74pT1lIJnOuz3A9oQeJA==", "optional": true }, "@supabase/supabase-js": { "version": "file:../..", "requires": { - "@supabase/functions-js": "^1.4.0-next.5", - "@supabase/gotrue-js": "^1.23.0-next.20", - "@supabase/postgrest-js": "^1.0.0-next.7", - "@supabase/realtime-js": "1.7.4", - "@supabase/storage-js": "^1.8.0-next.6", + "@supabase/functions-js": "^1.3.3", + "@supabase/gotrue-js": "^1.23.0-next.3", + "@supabase/postgrest-js": "^0.37.2", + "@supabase/realtime-js": "^1.7.2", + "@supabase/storage-js": "^1.7.0", "@types/jest": "^26.0.13", "cross-fetch": "^3.1.5", "husky": "^4.3.0", @@ -7135,7 +7140,7 @@ "semantic-release-plugin-update-version-in-files": "^1.1.0", "ts-jest": "^26.3.0", "ts-loader": "^8.0.11", - "typedoc": "^0.22.16", + "typedoc": "^0.22.13", "typescript": "^4.5.5", "webpack": "^5.69.1", "webpack-cli": "^4.9.2" @@ -13856,9 +13861,9 @@ "dev": true }, "@types/react": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.3.tgz", - "integrity": "sha512-wYOUxIgs2HZZ0ACNiIayItyluADNbONl7kt8lkLjVK8IitMH5QMyAh75Fwhmo37r1m7L2JaFj03sIfxBVDvRAg==", + "version": "18.0.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.14.tgz", + "integrity": "sha512-x4gGuASSiWmo0xjDLpm5mPb52syZHJx02VKbqUKdLmKtAwIh63XClGsiTI1K6DO5q7ox4xAsQrU+Gl3+gGXF9Q==", "dev": true, "requires": { "@types/prop-types": "*", @@ -13873,9 +13878,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001312", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz", - "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==" + "version": "1.0.30001356", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001356.tgz", + "integrity": "sha512-/30854bktMLhxtjieIxsrJBfs2gTM1pel6MXKF3K+RdIVJZcsn2A2QdhsuR4/p9+R204fZw0zCBBhktX8xWuyQ==" }, "csstype": { "version": "3.0.7", @@ -13902,33 +13907,28 @@ "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==" }, "next": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/next/-/next-12.1.0.tgz", - "integrity": "sha512-s885kWvnIlxsUFHq9UGyIyLiuD0G3BUC/xrH0CEnH5lHEWkwQcHOORgbDF0hbrW9vr/7am4ETfX4A7M6DjrE7Q==", + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/next/-/next-12.1.6.tgz", + "integrity": "sha512-cebwKxL3/DhNKfg9tPZDQmbRKjueqykHHbgaoG4VBRH3AHQJ2HO0dbKFiS1hPhe1/qgc2d/hFeadsbPicmLD+A==", "requires": { - "@next/env": "12.1.0", - "@next/swc-android-arm64": "12.1.0", - "@next/swc-darwin-arm64": "12.1.0", - "@next/swc-darwin-x64": "12.1.0", - "@next/swc-linux-arm-gnueabihf": "12.1.0", - "@next/swc-linux-arm64-gnu": "12.1.0", - "@next/swc-linux-arm64-musl": "12.1.0", - "@next/swc-linux-x64-gnu": "12.1.0", - "@next/swc-linux-x64-musl": "12.1.0", - "@next/swc-win32-arm64-msvc": "12.1.0", - "@next/swc-win32-ia32-msvc": "12.1.0", - "@next/swc-win32-x64-msvc": "12.1.0", - "caniuse-lite": "^1.0.30001283", + "@next/env": "12.1.6", + "@next/swc-android-arm-eabi": "12.1.6", + "@next/swc-android-arm64": "12.1.6", + "@next/swc-darwin-arm64": "12.1.6", + "@next/swc-darwin-x64": "12.1.6", + "@next/swc-linux-arm-gnueabihf": "12.1.6", + "@next/swc-linux-arm64-gnu": "12.1.6", + "@next/swc-linux-arm64-musl": "12.1.6", + "@next/swc-linux-x64-gnu": "12.1.6", + "@next/swc-linux-x64-musl": "12.1.6", + "@next/swc-win32-arm64-msvc": "12.1.6", + "@next/swc-win32-ia32-msvc": "12.1.6", + "@next/swc-win32-x64-msvc": "12.1.6", + "caniuse-lite": "^1.0.30001332", "postcss": "8.4.5", - "styled-jsx": "5.0.0", - "use-subscription": "1.5.1" + "styled-jsx": "5.0.2" } }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -13945,31 +13945,28 @@ } }, "react": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.1.tgz", - "integrity": "sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" } }, "react-dom": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.1.tgz", - "integrity": "sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", "requires": { "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.1" + "scheduler": "^0.23.0" } }, "scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" } }, "source-map-js": { @@ -13978,24 +13975,16 @@ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" }, "styled-jsx": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.0.tgz", - "integrity": "sha512-qUqsWoBquEdERe10EW8vLp3jT25s/ssG1/qX5gZ4wu15OZpmSMFI2v+fWlRhLfykA5rFtlJ1ME8A8pm/peV4WA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.2.tgz", + "integrity": "sha512-LqPQrbBh3egD57NBcHET4qcgshPks+yblyhPlH2GY8oaDgKs8SK4C3dBh3oSJjgzJ3G5t1SYEZGHkP+QEpX9EQ==", "requires": {} }, "typescript": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", - "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", "dev": true - }, - "use-subscription": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz", - "integrity": "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==", - "requires": { - "object-assign": "^4.1.1" - } } } } diff --git a/example/next-storage/package.json b/example/next-storage/package.json index 91bf1d7f..0b7c9fa7 100644 --- a/example/next-storage/package.json +++ b/example/next-storage/package.json @@ -9,12 +9,12 @@ }, "dependencies": { "@supabase/supabase-js": "file:../..", - "next": "12.1.0", - "react": "17.0.1", - "react-dom": "17.0.1" + "next": "12.1.6", + "react": "18.2.0", + "react-dom": "18.2.0" }, "devDependencies": { - "@types/react": "^17.0.3", - "typescript": "^4.2.3" + "@types/react": "18.0.14", + "typescript": "4.7.4" } } diff --git a/example/next-todo/components/TodoList.js b/example/next-todo/components/TodoList.js index 91dd9817..dadecad2 100644 --- a/example/next-todo/components/TodoList.js +++ b/example/next-todo/components/TodoList.js @@ -11,20 +11,29 @@ export default function Todos({ user }) { useEffect(() => { fetchTodos() + subscription1 = supabase - .from('todos') - .on('UPDATE', (v) => console.log('UPDATE on todos', v)) - .on('INSERT', (v) => console.log('INSERT on todos', v)) + .channel('todos-table-channel') + .on('postgres_changes', { event: 'UPDATE', schema: 'public', table: 'todos' }, (v) => + console.log('UPDATE on todos', v) + ) + .on('postgres_changes', { event: 'INSERT', schema: 'public', table: 'todos' }, (v) => + console.log('INSERT on todos', v) + ) .subscribe((change) => console.log('todos changed', change)) subscription2 = supabase - .from('*') - .on('UPDATE', (v) => console.log('UPDATE on schema', v)) - .on('INSERT', (v) => console.log('INSERT on schema', v)) + .channel('public-schema-channel') + .on('postgres_changes', { event: 'UPDATE', schema: 'public' }, (v) => + console.log('UPDATE on schema', v) + ) + .on('postgres_changes', { event: 'INSERT', schema: 'public' }, (v) => + console.log('INSERT on schema', v) + ) .subscribe((change) => console.log('schema changed', change)) return () => { - supabase.removeAllSubscriptions() + supabase.removeAllChannels() } }, []) @@ -38,7 +47,7 @@ export default function Todos({ user }) { } const addTodo = async (taskText) => { try { - supabase.removeSubscription(subscription2) + supabase.removeChannel(subscription2) let task = taskText.trim() if (task.length) { diff --git a/example/next-todo/package-lock.json b/example/next-todo/package-lock.json index 6b4864d6..9b2047c9 100644 --- a/example/next-todo/package-lock.json +++ b/example/next-todo/package-lock.json @@ -25,11 +25,11 @@ "version": "0.0.0-automated", "license": "MIT", "dependencies": { - "@supabase/functions-js": "^1.4.0-next.5", - "@supabase/gotrue-js": "^1.23.0-next.20", - "@supabase/postgrest-js": "^1.0.0-next.7", - "@supabase/realtime-js": "1.7.4", - "@supabase/storage-js": "^1.8.0-next.6", + "@supabase/functions-js": "^1.3.3", + "@supabase/gotrue-js": "^1.23.0-next.3", + "@supabase/postgrest-js": "^0.37.2", + "@supabase/realtime-js": "^1.7.2", + "@supabase/storage-js": "^1.7.0", "cross-fetch": "^3.1.5" }, "devDependencies": { @@ -43,7 +43,7 @@ "semantic-release-plugin-update-version-in-files": "^1.1.0", "ts-jest": "^26.3.0", "ts-loader": "^8.0.11", - "typedoc": "^0.22.16", + "typedoc": "^0.22.13", "typescript": "^4.5.5", "webpack": "^5.69.1", "webpack-cli": "^4.9.2" @@ -9577,11 +9577,11 @@ "@supabase/supabase-js": { "version": "file:../..", "requires": { - "@supabase/functions-js": "^1.4.0-next.5", - "@supabase/gotrue-js": "^1.23.0-next.20", - "@supabase/postgrest-js": "^1.0.0-next.7", - "@supabase/realtime-js": "1.7.4", - "@supabase/storage-js": "^1.8.0-next.6", + "@supabase/functions-js": "^1.3.3", + "@supabase/gotrue-js": "^1.23.0-next.3", + "@supabase/postgrest-js": "^0.37.2", + "@supabase/realtime-js": "^1.7.2", + "@supabase/storage-js": "^1.7.0", "@types/jest": "^26.0.13", "cross-fetch": "^3.1.5", "husky": "^4.3.0", @@ -9593,7 +9593,7 @@ "semantic-release-plugin-update-version-in-files": "^1.1.0", "ts-jest": "^26.3.0", "ts-loader": "^8.0.11", - "typedoc": "^0.22.16", + "typedoc": "^0.22.13", "typescript": "^4.5.5", "webpack": "^5.69.1", "webpack-cli": "^4.9.2" diff --git a/package-lock.json b/package-lock.json index 2adee5a4..111b237d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@supabase/functions-js": "^1.4.0-next.5", "@supabase/gotrue-js": "^1.23.0-next.24", "@supabase/postgrest-js": "^1.0.0-next.7", - "@supabase/realtime-js": "1.7.4", + "@supabase/realtime-js": "^1.8.0-next.16", "@supabase/storage-js": "^1.8.0-next.6", "cross-fetch": "^3.1.5" }, @@ -981,9 +981,9 @@ } }, "node_modules/@supabase/realtime-js": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-1.7.4.tgz", - "integrity": "sha512-h/Jk3PCLkIVonsNavof/LvHbvF41UD+D+mWcA3m8yHzJ2TLbV3S4XDYId+A3AkvFOAork7Ns/9O8rK0uY4F4zw==", + "version": "1.8.0-next.16", + "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-1.8.0-next.16.tgz", + "integrity": "sha512-xSS5tI5lFa5o9eQq072RBTC4C8SV/wiOgxt+zmEtTHt9y0iUL+MxtQGnpJ7Iiw82VuRX/fFleNtOMTdH3MRLWg==", "dependencies": { "@types/phoenix": "^1.5.4", "websocket": "^1.0.34" @@ -9261,9 +9261,9 @@ } }, "@supabase/realtime-js": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-1.7.4.tgz", - "integrity": "sha512-h/Jk3PCLkIVonsNavof/LvHbvF41UD+D+mWcA3m8yHzJ2TLbV3S4XDYId+A3AkvFOAork7Ns/9O8rK0uY4F4zw==", + "version": "1.8.0-next.16", + "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-1.8.0-next.16.tgz", + "integrity": "sha512-xSS5tI5lFa5o9eQq072RBTC4C8SV/wiOgxt+zmEtTHt9y0iUL+MxtQGnpJ7Iiw82VuRX/fFleNtOMTdH3MRLWg==", "requires": { "@types/phoenix": "^1.5.4", "websocket": "^1.0.34" diff --git a/package.json b/package.json index ec0e0aa0..f9747e53 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "@supabase/functions-js": "^1.4.0-next.5", "@supabase/gotrue-js": "^1.23.0-next.24", "@supabase/postgrest-js": "^1.0.0-next.7", - "@supabase/realtime-js": "1.7.4", + "@supabase/realtime-js": "^1.8.0-next.16", "@supabase/storage-js": "^1.8.0-next.6", "cross-fetch": "^3.1.5" }, diff --git a/src/SupabaseClient.ts b/src/SupabaseClient.ts index 174b6e6a..57ba4386 100644 --- a/src/SupabaseClient.ts +++ b/src/SupabaseClient.ts @@ -5,14 +5,13 @@ import { PostgrestFilterBuilder, PostgrestQueryBuilder, } from '@supabase/postgrest-js' -import { RealtimeSubscription, RealtimeClient, RealtimeClientOptions } from '@supabase/realtime-js' +import { RealtimeChannel, RealtimeClient, RealtimeClientOptions } from '@supabase/realtime-js' import { StorageClient as SupabaseStorageClient } from '@supabase/storage-js' import { DEFAULT_HEADERS } from './lib/constants' import { fetchWithAuth } from './lib/fetch' import { stripTrailingSlash, applySettingDefaults } from './lib/helpers' import { SupabaseAuthClient } from './lib/SupabaseAuthClient' import { Fetch, GenericSchema, SupabaseClientOptions, SupabaseAuthClientOptions } from './lib/types' -import { SupabaseQueryBuilder } from './lib/SupabaseQueryBuilder' const DEFAULT_GLOBAL_OPTIONS = { headers: DEFAULT_HEADERS, @@ -53,13 +52,11 @@ export default class SupabaseClient< protected authUrl: string protected storageUrl: string protected functionsUrl: string - protected restUrl: string protected realtime: RealtimeClient protected rest: PostgrestClient protected storageKey: string protected fetch?: Fetch protected changedAccessToken: string | undefined - protected settings: SupabaseClientOptions = {} protected headers: { [key: string]: string @@ -90,7 +87,6 @@ export default class SupabaseClient< this.realtimeUrl = `${_supabaseUrl}/realtime/v1`.replace('http', 'ws') this.authUrl = `${_supabaseUrl}/auth/v1` this.storageUrl = `${_supabaseUrl}/storage/v1` - this.restUrl = `${_supabaseUrl}/rest/v1` const isPlatform = _supabaseUrl.match(/(supabase\.co)|(supabase\.in)/) if (isPlatform) { @@ -108,26 +104,22 @@ export default class SupabaseClient< global: DEFAULT_GLOBAL_OPTIONS, } - this.settings = applySettingDefaults(options ?? {}, DEFAULTS) + const settings = applySettingDefaults(options ?? {}, DEFAULTS) - this.storageKey = this.settings.auth?.storageKey ?? '' - this.headers = this.settings.global?.headers ?? {} + this.storageKey = settings.auth?.storageKey ?? '' + this.headers = settings.global?.headers ?? {} this.auth = this._initSupabaseAuthClient( - this.settings.auth ?? {}, + settings.auth ?? {}, this.headers, - this.settings.global?.fetch - ) - this.fetch = fetchWithAuth( - supabaseKey, - this._getAccessToken.bind(this), - this.settings.global?.fetch + settings.global?.fetch ) + this.fetch = fetchWithAuth(supabaseKey, this._getAccessToken.bind(this), settings.global?.fetch) - this.realtime = this._initRealtimeClient({ headers: this.headers, ...this.settings.realtime }) - this.rest = new PostgrestClient(this.restUrl, { + this.realtime = this._initRealtimeClient({ headers: this.headers, ...settings.realtime }) + this.rest = new PostgrestClient(`${_supabaseUrl}/rest/v1`, { headers: this.headers, - schema: this.settings.db?.schema, + schema: settings.db?.schema, fetch: this.fetch, }) @@ -162,18 +154,7 @@ export default class SupabaseClient< >(table: TableName): PostgrestQueryBuilder from(table: string): PostgrestQueryBuilder from(table: string): PostgrestQueryBuilder { - /* - This is temporary and will be swapped back for this.rest.from(table) - once realtime-js v2 migration is complete. - */ - const url = new URL(`${this.restUrl}/${table}`) - return new SupabaseQueryBuilder(url, { - headers: { ...{ Authorization: `Bearer ${this.supabaseKey}` }, ...this.headers }, - fetch: this.fetch, - realtime: this.realtime, - schema: this.settings.db?.schema, - table, - }) + return this.rest.from(table) } /** @@ -207,39 +188,38 @@ export default class SupabaseClient< } /** - * Closes and removes all subscriptions and returns a list of removed - * subscriptions and their errors. + * Creates a Realtime channel with Broadcast, Presence, and Postgres Changes. + * + * @param {string} name - The name of the Realtime channel. + * @param {Object} opts - The options to pass to the Realtime channel. + * */ - async removeAllSubscriptions(): Promise< - { data: { subscription: RealtimeSubscription }; error: Error | null }[] - > { - const allSubs: RealtimeSubscription[] = this.getSubscriptions().slice() - const allSubPromises = allSubs.map((sub) => this.removeSubscription(sub)) - const allRemovedSubs = await Promise.all(allSubPromises) + channel(name: string, opts: { [key: string]: any } = {}): RealtimeChannel { + return this.realtime.channel(name, opts) + } - return allRemovedSubs.map(({ error }, i) => { - return { - data: { subscription: allSubs[i] }, - error, - } - }) + /** + * Returns all Realtime channels. + */ + getChannels(): RealtimeChannel[] { + return this.realtime.getChannels() } /** - * Closes and removes a subscription and returns the number of open subscriptions. + * Unsubscribes and removes Realtime channel from Realtime client. + * + * @param {RealtimeChannel} channel - The name of the Realtime channel. * - * @param subscription The subscription you want to close and remove. */ - async removeSubscription( - subscription: RealtimeSubscription - ): Promise<{ data: { openSubscriptions: number }; error: Error | null }> { - const { error } = await this._closeSubscription(subscription) - const allSubs: RealtimeSubscription[] = this.getSubscriptions() - const openSubCount = allSubs.filter((chan) => chan.isJoined()).length - - if (allSubs.length === 0) await this.realtime.disconnect() + removeChannel(channel: RealtimeChannel): Promise<'ok' | 'timed out' | 'error'> { + return this.realtime.removeChannel(channel) + } - return { data: { openSubscriptions: openSubCount }, error } + /** + * Unsubscribes and removes all Realtime channels from Realtime client. + */ + removeAllChannels(): Promise<('ok' | 'timed out' | 'error')[]> { + return this.realtime.removeAllChannels() } private async _getAccessToken() { @@ -248,40 +228,6 @@ export default class SupabaseClient< return data.session?.access_token ?? null } - private async _closeSubscription( - subscription: RealtimeSubscription - ): Promise<{ error: Error | null }> { - let error = null - - if (!subscription.isClosed()) { - const { error: unsubError } = await this._unsubscribeSubscription(subscription) - error = unsubError - } - - this.realtime.remove(subscription) - - return { error } - } - - private _unsubscribeSubscription( - subscription: RealtimeSubscription - ): Promise<{ error: Error | null }> { - return new Promise((resolve) => { - subscription - .unsubscribe() - .receive('ok', () => resolve({ error: null })) - .receive('error', (error: Error) => resolve({ error })) - .receive('timeout', () => resolve({ error: new Error('timed out') })) - }) - } - - /** - * Returns an array of all your subscriptions. - */ - getSubscriptions(): RealtimeSubscription[] { - return this.realtime.channels as RealtimeSubscription[] - } - private _initSupabaseAuthClient( { autoRefreshToken, diff --git a/src/index.ts b/src/index.ts index 40f4d101..c0bba47e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -17,7 +17,7 @@ export { } from '@supabase/functions-js' export * from '@supabase/realtime-js' export { default as SupabaseClient } from './SupabaseClient' -export type { SupabaseClientOptions, SupabaseRealtimePayload } from './lib/types' +export type { SupabaseClientOptions } from './lib/types' /** * Creates a new Supabase Client. diff --git a/src/lib/SupabaseQueryBuilder.ts b/src/lib/SupabaseQueryBuilder.ts deleted file mode 100644 index 3be60aa9..00000000 --- a/src/lib/SupabaseQueryBuilder.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { PostgrestQueryBuilder } from '@supabase/postgrest-js' -import { SupabaseRealtimeClient } from './SupabaseRealtimeClient' -import { RealtimeClient } from '@supabase/realtime-js' -import { Fetch, GenericTable, SupabaseEventTypes, SupabaseRealtimePayload } from './types' - -export class SupabaseQueryBuilder
extends PostgrestQueryBuilder
{ - private _subscription: SupabaseRealtimeClient | null = null - private _realtime: RealtimeClient - private _headers: Record - private _schema: string - private _table: string - - constructor( - url: URL, - { - headers = {}, - fetch, - realtime, - schema, - table, - }: { - headers: Record - realtime: RealtimeClient - table: string - schema?: string - fetch?: Fetch - } - ) { - super(new URL(url), { headers, schema, fetch }) - - this._realtime = realtime - this._headers = headers - this._schema = schema ?? 'public' - this._table = table - } - - /** - * Subscribe to realtime changes in your database. - * @param event The database event which you would like to receive updates for, or you can use the special wildcard `*` to listen to all changes. - * @param callback A callback that will handle the payload that is sent whenever your database changes. - */ - on( - event: SupabaseEventTypes, - callback: (payload: SupabaseRealtimePayload) => void - ): SupabaseRealtimeClient { - if (!this._realtime.isConnected()) { - this._realtime.connect() - } - if (!this._subscription) { - this._subscription = new SupabaseRealtimeClient( - this._realtime, - this._headers, - this._schema, - this._table - ) - } - return this._subscription.on(event, callback) - } -} diff --git a/src/lib/SupabaseRealtimeClient.ts b/src/lib/SupabaseRealtimeClient.ts deleted file mode 100644 index 25615014..00000000 --- a/src/lib/SupabaseRealtimeClient.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { RealtimeSubscription, RealtimeClient, Transformers } from '@supabase/realtime-js' -import { GenericObject, SupabaseEventTypes, SupabaseRealtimePayload } from './types' - -export class SupabaseRealtimeClient { - subscription: RealtimeSubscription - - constructor(socket: RealtimeClient, headers: GenericObject, schema: string, tableName: string) { - const chanParams: GenericObject = {} - const topic = tableName === '*' ? `realtime:${schema}` : `realtime:${schema}:${tableName}` - const userToken = headers['Authorization'].split(' ')[1] - - if (userToken) { - chanParams['user_token'] = userToken - } - - this.subscription = socket.channel(topic, chanParams) as RealtimeSubscription - } - - private getPayloadRecords(payload: any) { - const records = { - new: {}, - old: {}, - } - - if (payload.type === 'INSERT' || payload.type === 'UPDATE') { - records.new = Transformers.convertChangeData(payload.columns, payload.record) - } - - if (payload.type === 'UPDATE' || payload.type === 'DELETE') { - records.old = Transformers.convertChangeData(payload.columns, payload.old_record) - } - - return records - } - - /** - * The event you want to listen to. - * - * @param event The event - * @param callback A callback function that is called whenever the event occurs. - */ - on(event: SupabaseEventTypes, callback: (payload: SupabaseRealtimePayload) => void) { - this.subscription.on(event, (payload: any) => { - let enrichedPayload: SupabaseRealtimePayload = { - schema: payload.schema, - table: payload.table, - commit_timestamp: payload.commit_timestamp, - eventType: payload.type, - new: {}, - old: {}, - errors: payload.errors, - } - - enrichedPayload = { ...enrichedPayload, ...this.getPayloadRecords(payload) } - - callback(enrichedPayload) - }) - return this - } - - /** - * Enables the subscription. - */ - subscribe(callback: Function = () => {}) { - this.subscription.onError((e: Error) => callback('SUBSCRIPTION_ERROR', e)) - this.subscription.onClose(() => callback('CLOSED')) - this.subscription - .subscribe() - .receive('ok', () => callback('SUBSCRIBED')) - .receive('error', (e: Error) => callback('SUBSCRIPTION_ERROR', e)) - .receive('timeout', () => callback('RETRYING_AFTER_TIMEOUT')) - return this.subscription - } -} diff --git a/src/lib/types.ts b/src/lib/types.ts index 8f53d9c5..6f8bbbbd 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -5,8 +5,6 @@ type GoTrueClientOptions = ConstructorParameters[0] export interface SupabaseAuthClientOptions extends GoTrueClientOptions {} -export type GenericObject = { [key: string]: any } - export type Fetch = typeof fetch export type SupabaseClientOptions = { @@ -70,17 +68,3 @@ export type GenericSchema = { Tables: Record Functions: Record } - -export type SupabaseRealtimePayload = { - commit_timestamp: string - eventType: 'INSERT' | 'UPDATE' | 'DELETE' - schema: string - table: string - /** The new record. Present for 'INSERT' and 'UPDATE' events. */ - new: T - /** The previous record. Present for 'UPDATE' and 'DELETE' events. */ - old: T - errors: string[] | null -} - -export type SupabaseEventTypes = 'INSERT' | 'UPDATE' | 'DELETE' | '*'