├── .gitignore └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port 105 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Pusher Chatkit Migration 2 | 3 | Guide on how to Migrate Pusher Chatkit to Stream's [Chat API](https://getstream.io/chat/) 4 | Pusher has decided to shutdown their chat API by April 23rd. This gives their customers 30 days to pull of a complicated migration. 5 | 6 | If you need help be sure to contact support@getstream.io 7 | 8 | ## Migration roadmap 9 | 10 | - March 29th, Pusher added export support & Stream import support for the Pusher format. So it's now easy to download your export from Pusher and get it up and running on Stream the next day. (running an import typically takes us 1 business day) 11 | - March 26th, we received an example export from Pusher. Our team is adding support for this export format in [Stream's import systems](https://getstream.io/chat/docs/import/?language=js) 12 | - Engineering teams from Pusher and Stream are currently collaborating to create an easy way to migrate from Pusher to Stream 13 | 14 | 15 | ## Step 1 - Pusher Chatkit Export 16 | 17 | 1. Download your Chatkit export by contacting [Pusher Customer Support](support@pusher.com). 18 | 2. Create an account on [getstream.io](https://getstream.io/) 19 | 3. Email support@getstream.io with your Pusher export to get an import started. This typically takes 1 business day. At the moment it might take a bit more time since all Pusher customers need to migrate. That's why we recommend doing this as the first step. (note that we can run imports for you even if you're not yet on a paid account.) 20 | 21 | ## Step 2 - Stream Chat Tutorial 22 | 23 | Once your [Chatkit Export](https://github.com/GetStream/pusher-chatkit-migration/blob/master/README.md#step-1---pusher-chatkit-export) has been successfully imported into to the Stream platform you're ready to start building your app. Follow one of our tutorials below to get started. 24 | 25 | - [React Chat Tutorial](https://getstream.io/chat/react-chat/tutorial/) 26 | - [React Native Chat tutorial](https://getstream.io/chat/react-native-chat/tutorial/) 27 | - [Flutter Chat Tutorial](https://getstream.io/chat/flutter/tutorial/) 28 | - [Kotlin Chat Tutorial](https://getstream.io/tutorials/android-chat/#kotlin) 29 | - [Swift Chat Tutorial](https://getstream.io/tutorials/ios-chat/) 30 | 31 | Most of the integration with Chat is typically done on the frontend. Typically only token generation is done server side. 32 | SDKs are available for PHP, Python, Go, Ruby, Java, JS and Dart. 33 | 34 | ## Step 3 - Integrate Stream's chat 35 | 36 | You'll want to make sure your chat solution works. We've seen customers integrate in as little as 2 days. Though the complexity of this integration really depends on how many platforms you're supporting and how complicated your chat is. 37 | 38 | # Differences between Stream & Pusher 39 | 40 | Stream supports all the features you're used to from Pusher. The biggest engineering/conceptual differences are: 41 | 42 | * Pusher has the concept of private and public rooms. Stream has channels. There are 5 built-in types of channels. The "messaging" channel type is similar to the private room. The "livestream" channel type is similar to the public room. You can also create your own channel types. The channel types allow you to configure permissions (IE you need to be a member of a channel in order to post messages). The channel type also allows you to enable/disable features such as typing indicators etc. [Channel Type Docs](https://getstream.io/chat/docs/channel_features/?language=js) 43 | * Authorization/Tokens. Stream uses token based authentication. When the user registers or logins your backend will generate a token. This token gives the client side integration access to the chat for that user. Pusher uses a authorization URL based approach. [Token Generation](https://getstream.io/chat/docs/init_and_users/?language=js&q=token#tokens) 44 | * Cursors. ChatKit cursors are supported by Stream. On Stream Chat we refer to them as the read state for a user. 45 | Global unread counts (total unread messages/total unread channels) across all channels are returned when [establishing a new websocket connection](https://getstream.io/chat/docs/unread/?language=js). 46 | we also provide unread counts by channel (Room). use this to show a read indicator next to messages. All 47 | SDKs support this [out of the box](https://getstream.io/chat/docs/unread_channel/?language=js). 48 | 49 | # Product Differences 50 | 51 | * Stream powers chat and feeds for over 500 million end users. We believe in building products to last and you can feel confident relying on our APIs. On enterprise deals we also have a code escrow clause in place to ensure you never end up in a situation like we're seeing right now with Pusher. 52 | * Frontend components: Our SDKs for iOS, Android, Flutter, React and React Native provide both low level chat events as well as fully featured UI components. This allows you to build chat in days instead of months. (which is important since you have 30 days for this migration) 53 | * [API uptime](http://status.getstream.io/), Stream's API has near 100% uptime. On enterprise plans we offer a 99.999% uptime SLA 54 | * Reactions, Threads and Rich URL previews are supported out of the box 55 | * Unread counts are available at a per channel as well as per member level 56 | * Stream is GDPR and HIPAA compliant. There are convenient endpoints to integrate GDPR requirements in your app. [GDPR docs](https://getstream.io/chat/docs/gdpr/?language=js) 57 | * Typing indicator events work in simillar way. users are able to susbcribe to `typing.start` and `typing.stop` [events](https://getstream.io/chat/docs/typing_indicators/?language=js) 58 | * Pusher room limit is set to 500. Stream doesn't have a channel level limit. If you want to have a channel with a million members you can do that. 59 | 60 | --------------------------------------------------------------------------------