From c9b4f89991aa16a569586f093c474b40d0752381 Mon Sep 17 00:00:00 2001 From: Wen Bo Xie Date: Tue, 16 Aug 2022 01:42:35 -0400 Subject: [PATCH] Revert "Merge pull request #462 from supabase/feat/new-realtime-api" This reverts commit bd03b65e2f9d2e73499e44cbf2b791082237b5de, reversing changes made to f37643c690f19371f00b25a2fda2795cde899c54. --- .../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, 496 insertions(+), 292 deletions(-) create mode 100644 src/lib/SupabaseQueryBuilder.ts create mode 100644 src/lib/SupabaseRealtimeClient.ts diff --git a/example/next-storage/components/ProfileList.tsx b/example/next-storage/components/ProfileList.tsx index 0e8ea08e..e0c3ab9b 100644 --- a/example/next-storage/components/ProfileList.tsx +++ b/example/next-storage/components/ProfileList.tsx @@ -1,8 +1,11 @@ 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([]) @@ -10,17 +13,13 @@ export default function ProfileList() { // getPublicProfiles() getUserProfile() - const realtimeProfiles = supabase - .channel('profiles-channel') - .on( - 'postgres_changes', - { event: '*', schema: 'public', table: 'profiles' }, - (payload: { [key: string]: any }) => profileUpdated(profiles, payload.new) - ) + realtimeProfiles = supabase + .from('profiles') + .on('*', (payload: SupabaseRealtimePayload) => profileUpdated(profiles, payload.new)) .subscribe() return () => { - if (realtimeProfiles) supabase.removeChannel(realtimeProfiles) + if (realtimeProfiles) supabase.removeSubscription(realtimeProfiles) } }, []) diff --git a/example/next-storage/package-lock.json b/example/next-storage/package-lock.json index daa444a9..ed9c3b00 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.6", - "react": "18.2.0", - "react-dom": "18.2.0" + "next": "12.1.0", + "react": "17.0.1", + "react-dom": "17.0.1" }, "devDependencies": { - "@types/react": "18.0.14", - "typescript": "4.7.4" + "@types/react": "^17.0.3", + "typescript": "^4.2.3" } }, "../..": { @@ -23,11 +23,11 @@ "version": "0.0.0-automated", "license": "MIT", "dependencies": { - "@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", + "@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", "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.13", + "typedoc": "^0.22.16", "typescript": "^4.5.5", "webpack": "^5.69.1", "webpack-cli": "^4.9.2" @@ -6641,29 +6641,14 @@ } }, "node_modules/@next/env": { - "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" - } + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@next/env/-/env-12.1.0.tgz", + "integrity": "sha512-nrIgY6t17FQ9xxwH3jj0a6EOiQ/WDHUos35Hghtr+SWN/ntHIQ7UpuvSi0vaLzZVHQWaDupKI+liO5vANcDeTQ==" }, "node_modules/@next/swc-android-arm64": { - "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==", + "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==", "cpu": [ "arm64" ], @@ -6676,9 +6661,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "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==", + "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==", "cpu": [ "arm64" ], @@ -6691,9 +6676,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "12.1.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.6.tgz", - "integrity": "sha512-9FptMnbgHJK3dRDzfTpexs9S2hGpzOQxSQbe8omz6Pcl7rnEp9x4uSEKY51ho85JCjL4d0tDLBcXEJZKKLzxNg==", + "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==", "cpu": [ "x64" ], @@ -6706,9 +6691,9 @@ } }, "node_modules/@next/swc-linux-arm-gnueabihf": { - "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==", + "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==", "cpu": [ "arm" ], @@ -6721,9 +6706,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "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==", + "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==", "cpu": [ "arm64" ], @@ -6736,9 +6721,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "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==", + "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==", "cpu": [ "arm64" ], @@ -6751,9 +6736,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "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==", + "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==", "cpu": [ "x64" ], @@ -6766,9 +6751,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "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==", + "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==", "cpu": [ "x64" ], @@ -6781,9 +6766,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "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==", + "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==", "cpu": [ "arm64" ], @@ -6796,9 +6781,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "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==", + "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==", "cpu": [ "ia32" ], @@ -6811,9 +6796,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "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==", + "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==", "cpu": [ "x64" ], @@ -6836,9 +6821,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.0.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.14.tgz", - "integrity": "sha512-x4gGuASSiWmo0xjDLpm5mPb52syZHJx02VKbqUKdLmKtAwIh63XClGsiTI1K6DO5q7ox4xAsQrU+Gl3+gGXF9Q==", + "version": "17.0.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.3.tgz", + "integrity": "sha512-wYOUxIgs2HZZ0ACNiIayItyluADNbONl7kt8lkLjVK8IitMH5QMyAh75Fwhmo37r1m7L2JaFj03sIfxBVDvRAg==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -6853,19 +6838,13 @@ "dev": true }, "node_modules/caniuse-lite": { - "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" - } - ] + "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" + } }, "node_modules/csstype": { "version": "3.0.7", @@ -6901,14 +6880,15 @@ } }, "node_modules/next": { - "version": "12.1.6", - "resolved": "https://registry.npmjs.org/next/-/next-12.1.6.tgz", - "integrity": "sha512-cebwKxL3/DhNKfg9tPZDQmbRKjueqykHHbgaoG4VBRH3AHQJ2HO0dbKFiS1hPhe1/qgc2d/hFeadsbPicmLD+A==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/next/-/next-12.1.0.tgz", + "integrity": "sha512-s885kWvnIlxsUFHq9UGyIyLiuD0G3BUC/xrH0CEnH5lHEWkwQcHOORgbDF0hbrW9vr/7am4ETfX4A7M6DjrE7Q==", "dependencies": { - "@next/env": "12.1.6", - "caniuse-lite": "^1.0.30001332", + "@next/env": "12.1.0", + "caniuse-lite": "^1.0.30001283", "postcss": "8.4.5", - "styled-jsx": "5.0.2" + "styled-jsx": "5.0.0", + "use-subscription": "1.5.1" }, "bin": { "next": "dist/bin/next" @@ -6917,18 +6897,17 @@ "node": ">=12.22.0" }, "optionalDependencies": { - "@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" + "@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" }, "peerDependencies": { "fibers": ">= 3.1.0", @@ -6949,6 +6928,14 @@ } } }, + "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", @@ -6972,34 +6959,37 @@ } }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.1.tgz", + "integrity": "sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w==", "dependencies": { - "loose-envify": "^1.1.0" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.1.tgz", + "integrity": "sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug==", "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "object-assign": "^4.1.1", + "scheduler": "^0.20.1" }, "peerDependencies": { - "react": "^18.2.0" + "react": "17.0.1" } }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", "dependencies": { - "loose-envify": "^1.1.0" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" } }, "node_modules/source-map-js": { @@ -7011,14 +7001,14 @@ } }, "node_modules/styled-jsx": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.2.tgz", - "integrity": "sha512-LqPQrbBh3egD57NBcHET4qcgshPks+yblyhPlH2GY8oaDgKs8SK4C3dBh3oSJjgzJ3G5t1SYEZGHkP+QEpX9EQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.0.tgz", + "integrity": "sha512-qUqsWoBquEdERe10EW8vLp3jT25s/ssG1/qX5gZ4wu15OZpmSMFI2v+fWlRhLfykA5rFtlJ1ME8A8pm/peV4WA==", "engines": { "node": ">= 12.0.0" }, "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + "react": ">= 16.8.0 || 17.x.x || 18.x.x" }, "peerDependenciesMeta": { "@babel/core": { @@ -7030,9 +7020,9 @@ } }, "node_modules/typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", + "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -7041,94 +7031,99 @@ "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.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 + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@next/env/-/env-12.1.0.tgz", + "integrity": "sha512-nrIgY6t17FQ9xxwH3jj0a6EOiQ/WDHUos35Hghtr+SWN/ntHIQ7UpuvSi0vaLzZVHQWaDupKI+liO5vANcDeTQ==" }, "@next/swc-android-arm64": { - "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==", + "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==", "optional": true }, "@next/swc-darwin-arm64": { - "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==", + "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==", "optional": true }, "@next/swc-darwin-x64": { - "version": "12.1.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.6.tgz", - "integrity": "sha512-9FptMnbgHJK3dRDzfTpexs9S2hGpzOQxSQbe8omz6Pcl7rnEp9x4uSEKY51ho85JCjL4d0tDLBcXEJZKKLzxNg==", + "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==", "optional": true }, "@next/swc-linux-arm-gnueabihf": { - "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==", + "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==", "optional": true }, "@next/swc-linux-arm64-gnu": { - "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==", + "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==", "optional": true }, "@next/swc-linux-arm64-musl": { - "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==", + "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==", "optional": true }, "@next/swc-linux-x64-gnu": { - "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==", + "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==", "optional": true }, "@next/swc-linux-x64-musl": { - "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==", + "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==", "optional": true }, "@next/swc-win32-arm64-msvc": { - "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==", + "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==", "optional": true }, "@next/swc-win32-ia32-msvc": { - "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==", + "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==", "optional": true }, "@next/swc-win32-x64-msvc": { - "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==", + "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==", "optional": true }, "@supabase/supabase-js": { "version": "file:../..", "requires": { - "@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", + "@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", "@types/jest": "^26.0.13", "cross-fetch": "^3.1.5", "husky": "^4.3.0", @@ -7140,7 +7135,7 @@ "semantic-release-plugin-update-version-in-files": "^1.1.0", "ts-jest": "^26.3.0", "ts-loader": "^8.0.11", - "typedoc": "^0.22.13", + "typedoc": "^0.22.16", "typescript": "^4.5.5", "webpack": "^5.69.1", "webpack-cli": "^4.9.2" @@ -13861,9 +13856,9 @@ "dev": true }, "@types/react": { - "version": "18.0.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.14.tgz", - "integrity": "sha512-x4gGuASSiWmo0xjDLpm5mPb52syZHJx02VKbqUKdLmKtAwIh63XClGsiTI1K6DO5q7ox4xAsQrU+Gl3+gGXF9Q==", + "version": "17.0.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.3.tgz", + "integrity": "sha512-wYOUxIgs2HZZ0ACNiIayItyluADNbONl7kt8lkLjVK8IitMH5QMyAh75Fwhmo37r1m7L2JaFj03sIfxBVDvRAg==", "dev": true, "requires": { "@types/prop-types": "*", @@ -13878,9 +13873,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001356", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001356.tgz", - "integrity": "sha512-/30854bktMLhxtjieIxsrJBfs2gTM1pel6MXKF3K+RdIVJZcsn2A2QdhsuR4/p9+R204fZw0zCBBhktX8xWuyQ==" + "version": "1.0.30001312", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz", + "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==" }, "csstype": { "version": "3.0.7", @@ -13907,28 +13902,33 @@ "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==" }, "next": { - "version": "12.1.6", - "resolved": "https://registry.npmjs.org/next/-/next-12.1.6.tgz", - "integrity": "sha512-cebwKxL3/DhNKfg9tPZDQmbRKjueqykHHbgaoG4VBRH3AHQJ2HO0dbKFiS1hPhe1/qgc2d/hFeadsbPicmLD+A==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/next/-/next-12.1.0.tgz", + "integrity": "sha512-s885kWvnIlxsUFHq9UGyIyLiuD0G3BUC/xrH0CEnH5lHEWkwQcHOORgbDF0hbrW9vr/7am4ETfX4A7M6DjrE7Q==", "requires": { - "@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", + "@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", "postcss": "8.4.5", - "styled-jsx": "5.0.2" + "styled-jsx": "5.0.0", + "use-subscription": "1.5.1" } }, + "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,28 +13945,31 @@ } }, "react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.1.tgz", + "integrity": "sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w==", "requires": { - "loose-envify": "^1.1.0" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" } }, "react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.1.tgz", + "integrity": "sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug==", "requires": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "object-assign": "^4.1.1", + "scheduler": "^0.20.1" } }, "scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", "requires": { - "loose-envify": "^1.1.0" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" } }, "source-map-js": { @@ -13975,16 +13978,24 @@ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" }, "styled-jsx": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.2.tgz", - "integrity": "sha512-LqPQrbBh3egD57NBcHET4qcgshPks+yblyhPlH2GY8oaDgKs8SK4C3dBh3oSJjgzJ3G5t1SYEZGHkP+QEpX9EQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.0.tgz", + "integrity": "sha512-qUqsWoBquEdERe10EW8vLp3jT25s/ssG1/qX5gZ4wu15OZpmSMFI2v+fWlRhLfykA5rFtlJ1ME8A8pm/peV4WA==", "requires": {} }, "typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", + "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", "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 0b7c9fa7..91bf1d7f 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.6", - "react": "18.2.0", - "react-dom": "18.2.0" + "next": "12.1.0", + "react": "17.0.1", + "react-dom": "17.0.1" }, "devDependencies": { - "@types/react": "18.0.14", - "typescript": "4.7.4" + "@types/react": "^17.0.3", + "typescript": "^4.2.3" } } diff --git a/example/next-todo/components/TodoList.js b/example/next-todo/components/TodoList.js index dadecad2..91dd9817 100644 --- a/example/next-todo/components/TodoList.js +++ b/example/next-todo/components/TodoList.js @@ -11,29 +11,20 @@ export default function Todos({ user }) { useEffect(() => { fetchTodos() - subscription1 = supabase - .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) - ) + .from('todos') + .on('UPDATE', (v) => console.log('UPDATE on todos', v)) + .on('INSERT', (v) => console.log('INSERT on todos', v)) .subscribe((change) => console.log('todos changed', change)) subscription2 = supabase - .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) - ) + .from('*') + .on('UPDATE', (v) => console.log('UPDATE on schema', v)) + .on('INSERT', (v) => console.log('INSERT on schema', v)) .subscribe((change) => console.log('schema changed', change)) return () => { - supabase.removeAllChannels() + supabase.removeAllSubscriptions() } }, []) @@ -47,7 +38,7 @@ export default function Todos({ user }) { } const addTodo = async (taskText) => { try { - supabase.removeChannel(subscription2) + supabase.removeSubscription(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 9b2047c9..6b4864d6 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.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", + "@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", "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.13", + "typedoc": "^0.22.16", "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.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", + "@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", "@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.13", + "typedoc": "^0.22.16", "typescript": "^4.5.5", "webpack": "^5.69.1", "webpack-cli": "^4.9.2" diff --git a/package-lock.json b/package-lock.json index f048d7da..a9244623 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.20", "@supabase/postgrest-js": "^1.0.0-next.7", - "@supabase/realtime-js": "^1.8.0-next.16", + "@supabase/realtime-js": "1.7.4", "@supabase/storage-js": "^1.8.0-next.6", "cross-fetch": "^3.1.5" }, @@ -968,9 +968,9 @@ } }, "node_modules/@supabase/realtime-js": { - "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==", + "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==", "dependencies": { "@types/phoenix": "^1.5.4", "websocket": "^1.0.34" @@ -9183,9 +9183,9 @@ } }, "@supabase/realtime-js": { - "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==", + "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==", "requires": { "@types/phoenix": "^1.5.4", "websocket": "^1.0.34" diff --git a/package.json b/package.json index a0f9656b..0146cd52 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.20", "@supabase/postgrest-js": "^1.0.0-next.7", - "@supabase/realtime-js": "^1.8.0-next.16", + "@supabase/realtime-js": "1.7.4", "@supabase/storage-js": "^1.8.0-next.6", "cross-fetch": "^3.1.5" }, diff --git a/src/SupabaseClient.ts b/src/SupabaseClient.ts index 1b11e6d4..2248d340 100644 --- a/src/SupabaseClient.ts +++ b/src/SupabaseClient.ts @@ -5,13 +5,14 @@ import { PostgrestFilterBuilder, PostgrestQueryBuilder, } from '@supabase/postgrest-js' -import { RealtimeChannel, RealtimeClient, RealtimeClientOptions } from '@supabase/realtime-js' +import { RealtimeSubscription, 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, @@ -52,11 +53,13 @@ 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 @@ -87,6 +90,7 @@ 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) { @@ -104,22 +108,26 @@ export default class SupabaseClient< global: DEFAULT_GLOBAL_OPTIONS, } - const settings = applySettingDefaults(options ?? {}, DEFAULTS) + this.settings = applySettingDefaults(options ?? {}, DEFAULTS) - this.storageKey = settings.auth?.storageKey ?? '' - this.headers = settings.global?.headers ?? {} + this.storageKey = this.settings.auth?.storageKey ?? '' + this.headers = this.settings.global?.headers ?? {} this.auth = this._initSupabaseAuthClient( - settings.auth ?? {}, + this.settings.auth ?? {}, this.headers, - settings.global?.fetch + this.settings.global?.fetch + ) + this.fetch = fetchWithAuth( + supabaseKey, + this._getAccessToken.bind(this), + this.settings.global?.fetch ) - this.fetch = fetchWithAuth(supabaseKey, this._getAccessToken.bind(this), settings.global?.fetch) - this.realtime = this._initRealtimeClient({ headers: this.headers, ...settings.realtime }) - this.rest = new PostgrestClient(`${_supabaseUrl}/rest/v1`, { + this.realtime = this._initRealtimeClient({ headers: this.headers, ...this.settings.realtime }) + this.rest = new PostgrestClient(this.restUrl, { headers: this.headers, - schema: settings.db?.schema, + schema: this.settings.db?.schema, fetch: this.fetch, }) @@ -154,7 +162,18 @@ export default class SupabaseClient< >(table: TableName): PostgrestQueryBuilder from(table: string): PostgrestQueryBuilder from(table: string): PostgrestQueryBuilder { - return this.rest.from(table) + /* + 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, + }) } /** @@ -188,38 +207,39 @@ export default class SupabaseClient< } /** - * 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. - * + * Closes and removes all subscriptions and returns a list of removed + * subscriptions and their errors. */ - channel(name: string, opts: { [key: string]: any } = {}): RealtimeChannel { - return this.realtime.channel(name, opts) - } + 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) - /** - * Returns all Realtime channels. - */ - getChannels(): RealtimeChannel[] { - return this.realtime.getChannels() + return allRemovedSubs.map(({ error }, i) => { + return { + data: { subscription: allSubs[i] }, + error, + } + }) } /** - * Unsubscribes and removes Realtime channel from Realtime client. - * - * @param {RealtimeChannel} channel - The name of the Realtime channel. + * Closes and removes a subscription and returns the number of open subscriptions. * + * @param subscription The subscription you want to close and remove. */ - removeChannel(channel: RealtimeChannel): Promise<'ok' | 'timed out' | 'error'> { - return this.realtime.removeChannel(channel) - } + 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 - /** - * Unsubscribes and removes all Realtime channels from Realtime client. - */ - removeAllChannels(): Promise<('ok' | 'timed out' | 'error')[]> { - return this.realtime.removeAllChannels() + if (allSubs.length === 0) await this.realtime.disconnect() + + return { data: { openSubscriptions: openSubCount }, error } } private async _getAccessToken() { @@ -228,6 +248,40 @@ export default class SupabaseClient< return 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 d7cbf4f4..06fb0bff 100644 --- a/src/index.ts +++ b/src/index.ts @@ -11,7 +11,7 @@ export type { } from '@supabase/postgrest-js' export * from '@supabase/realtime-js' export { default as SupabaseClient } from './SupabaseClient' -export type { SupabaseClientOptions } from './lib/types' +export type { SupabaseClientOptions, SupabaseRealtimePayload } from './lib/types' /** * Creates a new Supabase Client. diff --git a/src/lib/SupabaseQueryBuilder.ts b/src/lib/SupabaseQueryBuilder.ts new file mode 100644 index 00000000..3be60aa9 --- /dev/null +++ b/src/lib/SupabaseQueryBuilder.ts @@ -0,0 +1,59 @@ +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 new file mode 100644 index 00000000..25615014 --- /dev/null +++ b/src/lib/SupabaseRealtimeClient.ts @@ -0,0 +1,74 @@ +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 6f8bbbbd..8f53d9c5 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -5,6 +5,8 @@ type GoTrueClientOptions = ConstructorParameters[0] export interface SupabaseAuthClientOptions extends GoTrueClientOptions {} +export type GenericObject = { [key: string]: any } + export type Fetch = typeof fetch export type SupabaseClientOptions = { @@ -68,3 +70,17 @@ 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' | '*'