How to stream video with rtmp URL? - ant-media-server

I have created a broadcast using ant rest api
https://xyz.antmedia.io:5443/LiveApp/rest/broadcast/create/?name=Testing
and it's successfully created it and return json.
dummy example:
{
"streamId": "043428553080627566897529",
"status": "created",
"type": "liveStream",
"name": "zrft",
"description": null,
"publish": true,
"date": 1558978714814,
"plannedStartDate": null,
"duration": null,
"endPointList": null,
"publicStream": true,
"is360": false,
"listenerHookURL": null,
"category": null,
"ipAddr": null,
"username": "******",
"password": "*****",
"quality": null,
"speed": 0,
"streamUrl": null,
"originAdress": null,
"mp4Enabled": 0,
"expireDurationMS": 0,
"rtmpURL": "rtmp://***.**.**.17/LiveApp/043428553080627566897522",
"zombi": false,
"pendingPacketSize": 0,
"hlsViewerCount": 0,
"webRTCViewerCount": 0,
"rtmpViewerCount": 0
}
Here rtmpURL = "rtmp://*..**.server_ip/LiveApp/043428553080627566897522"
so now is there any thrird party app or player where I can connect this rtmp url and start live stream ?

Sure you play RTMP streams with tools like ffplay and vlc player.
If you use ffplay just don't forget to add live=1 end the of the url.
ffplay "rtmp://*..**.server_ip/LiveApp/043428553080627566897522 live=1"
If you want to publish live stream to Ant Media Server, you can use OBS
If you want ultra low latency, you can publish/play with WebRTC as well.

Related

How to send post request for apache durid in python

I want to send a post requests with SQL query to a druid API. I used requests package to make the request:
payload = {
"query": "select count(1) from table1",
"resultFormat": "array",
"header": True,
"typesHeader": True,
"sqlTypesHeader": True,
"context": {
"somekeys":"somevalues"
}
}
druidURL = "someurl:8888/durid/v2/sql"
x = requests.post(druidUrl,json=payload)
The only result I got is code:405.When I inspect the network in Chrome when the POST request succussed with the result on the druid console, the URL and Payload are exactly the same except there is an additional property called Remote Address.
You have a typo in the URL ("durid"):
import requests
payload = {
"query": "select 1+1",
"resultFormat": "array",
"header": True,
"typesHeader": True,
"sqlTypesHeader": True,
"context": {
"somekeys":"somevalues"
}
}
druidUrl = "http://localhost:8888/druid/v2/sql"
x = requests.post(druidUrl, json=payload)
print(x)

Identity Server Random "invalid_grant"

Hello I have an issue with IdentityServer 4.
When we intiate a cal to IDP with Swagger for the first time I can get a token
[12:36:21 DBG] Getting claims for identity token for subject: 3680d5aa-4b35-4e39-a1ce-cfbc6961f4c3 and client: Idp.UserIdentitySwagger
[12:36:21 DBG] In addition to an id_token, an access_token was requested. No claims other than sub are included in the id_token. To obtain more user claims, either use the user info endpoint or set AlwaysIncludeUserClaimsInIdToken on the client configuration.
[12:36:21 VRB] Creating JWT identity token
[12:36:21 INF] {"ClientId": "Idp.UserIdentitySwagger", "ClientName": "Idp.UserIdentity Swagger", "RedirectUri": null, "Endpoint": "Token", "SubjectId": "3680d5aa-4b35-4e39-a1ce-cfbc6961f4c3", "Scopes": "openid profile email", "GrantType": "authorization_code", "Tokens": [{"TokenType": "id_token", "TokenValue": "****dlrQ", "$type": "Token"}, {"TokenType": "access_token", "TokenValue": "****g_rw", "$type": "Token"}], "Category": "Token", "Name": "Token Issued Success", "EventType": "Success", "Id": 2000, "Message": null, "ActivityId": "0HMJ7TTLK79RA:0000000E", "TimeStamp": "2022-07-17T12:36:21.0000000Z", "ProcessId": 1, "LocalIpAddress": "10.244.1.16:443", "RemoteIpAddress": "10.244.0.9", "$type": "TokenIssuedSuccessEvent"}
[12:36:21 VRB] Identity token issued for Idp.UserIdentitySwagger (Idp.UserIdentity Swagger) / 3680d5aa-4b35-4e39-a1ce-cfbc6961f4c3: eyJhbGciOiJSUzI1NiIsImtpZCI6IjIzNTJFMjcwQkFDQjUwMDAwNjM1NkY3RjIwRDM0MEIwQjk3NDRCRThSUzI1NiIsInR5cCI6IkpXVCIsIng1dCI6IkkxTGljTHJMVUFBR05XOV9JTk5Bc0xsMFMtZyJ9.eyJuYmYiOjE2NTgwNjEzODEsImV4cCI6MTY1ODA2NDk4MSwiaXNzIjoiaHR0cHM6Ly9pZHAub3Vpb3VpZGlzY291bnQuY29tIiwiYXVkIjoiSWRwLlVzZXJJZGVudGl0eVN3YWdnZXIiLCJpYXQiOjE2NTgwNjEzODEsImF0X2hhc2giOiJFWWRZYWtpb0ZFUTN6Z19qeHZ1Umd3Iiwic19oYXNoIjoiMUxYeTNQMXpaOTZiU2lDWjBrRmNBZyIsInNpZCI6IjYzREQ4OEQ5QTQ0NEEyRDQzRDU1QUNBMjYyQTM1MTc3Iiwic3ViIjoiMzY4MGQ1YWEtNGIzNS00ZTM5LWExY2UtY2ZiYzY5NjFmNGMzIiwiYXV0aF90aW1lIjoxNjU4MDYxMzczLCJpZHAiOiJsb2NhbCIsImFtciI6WyJwd2QiXX0.kyOSEob49JTd10Wmz3YMgg48MB-RRWmSJ6JB2dZeu-0r8WPOK69XXlq74bGAoyV6DwytsyTOmwb7h5Wnu5zcgbHFJ_ycGAi5PwOiO1clyDIpYW5ql__SZ2JH31ppuRg616eDaX0M2p9PFfW4MBSM1d4p69aWrbqAmuj8g833VjtZOFkZcgS6OZotqbM_zxOGLhfkzwJQtDjHdh1_imJp80fa4uv_0KOpWc62hclOXcBS8oKvgQYyeeS8AIXGrIBoNII8ZQ8yK-BrqOAjm4f1PVyyhQa8P19gXWoASQL6EHb-zCUo5VUXAu7bukBb4JNNzk8jUTCWvSUo9z4_rDdlrQ
[12:36:21 VRB] Access token issued for Idp.UserIdentitySwagger (Idp.UserIdentity Swagger) / 3680d5aa-4b35-4e39-a1ce-cfbc6961f4c3: eyJhbGciOiJSUzI1NiIsImtpZCI6IjIzNTJFMjcwQkFDQjUwMDAwNjM1NkY3RjIwRDM0MEIwQjk3NDRCRThSUzI1NiIsInR5cCI6ImF0K2p3dCIsIng1dCI6IkkxTGljTHJMVUFBR05XOV9JTk5Bc0xsMFMtZyJ9.eyJuYmYiOjE2NTgwNjEzODEsImV4cCI6MTY1ODA2NDk4MSwiaXNzIjoiaHR0cHM6Ly9pZHAub3Vpb3VpZGlzY291bnQuY29tIiwiY2xpZW50X2lkIjoiSWRwLlVzZXJJZGVudGl0eVN3YWdnZXIiLCJzdWIiOiIzNjgwZDVhYS00YjM1LTRlMzktYTFjZS1jZmJjNjk2MWY0YzMiLCJhdXRoX3RpbWUiOjE2NTgwNjEzNzMsImlkcCI6ImxvY2FsIiwic2lkIjoiNjNERDg4RDlBNDQ0QTJENDNENTVBQ0EyNjJBMzUxNzciLCJpYXQiOjE2NTgwNjEzODEsInNjb3BlIjpbIm9wZW5pZCIsInByb2ZpbGUiLCJlbWFpbCJdLCJhbXIiOlsicHdkIl19.BXtDlQKqw8rGmgnLjJuWJicF2BIHPzpp48NC-aP9cpzy7dqYY2a8kI1x07vTnhX2rcEjdfqhfMIfyJuqZJBhXVtfI7R60QyfuAj3Ozpa4KGE2Y28d9Xntizf4ctwUXFLZVboH8MrXflcIiDL8s5h_c6P6W2NafYK_1m7xpU68Qq0NsxqXsaG2SZT_nph-bl_hEvfR_AfXbkDI12Z606hSqAhjP5v_TQfc6_0zveCVTiFRUMCzTzndtRSVtNrP3WPGXalOTtOaeOIUFssDvqNYeF6nch245vjw5NQQu3zUgETOSJfeO_d0c7VCeEvp_s_yCEFCVOIl2_xvWd3Hig_rw
I disconnect and try to login again and a “invalid_grant” is raised. I clear the cache and try again and it does not work. After several retries I can login. I think it is random error. I cannot figure out the reason behind this error. Here is the error message and the IDP configuration and the client configuration. I hope that it can help.
[12:42:06 DBG] A data reader was disposed.
[12:42:06 DBG] Closing connection to database 'IdpDb' on server 'tcp://XXXXXXXXXXX:5432'.
[12:42:06 DBG] Closed connection to database 'IdpDb' on server ''.
[12:42:06 DBG] tJc155MKnmvPDXowrLH4laE8GBDyxFtEveiaB/ONE4w= found in database: False
[12:42:06 DBG] authorization_code grant with value: E3661868CE07773D4612B6A32A5D10B9B0A48D00E616718C795D9ED5F6827348 not found in store.
[12:42:06 ERR] Invalid authorization code{"code": "E3661868CE07773D4612B6A32A5D10B9B0A48D00E616718C795D9ED5F6827348"}, details: {"ClientId": "Idp.UserIdentitySwagger", "ClientName": "Idp.UserIdentity Swagger", "GrantType": "authorization_code", "Scopes": null, "AuthorizationCode": "****7348", "RefreshToken": "********", "UserName": null, "AuthenticationContextReferenceClasses": null, "Tenant": null, "IdP": null, "Raw": {"grant_type": "authorization_code", "code": "E3661868CE07773D4612B6A32A5D10B9B0A48D00E616718C795D9ED5F6827348", "client_id": "Idp.UserIdentitySwagger", "client_secret": "***REDACTED***", "redirect_uri": "https://identity.*******.com/swagger/oauth2-redirect.html", "code_verifier": "eMCIRwHDzhTf1YrRr651Uaqi_COopBhc7ZfOGyjRiAc"}, "$type": "TokenRequestValidationLog"}
[12:42:06 INF] {"ClientId": "Idp.UserIdentitySwagger", "ClientName": "Idp.UserIdentity Swagger", "RedirectUri": null, "Endpoint": "Token", "SubjectId": null, "Scopes": null, "GrantType": "authorization_code", "Error": "invalid_grant", "ErrorDescription": null, "Category": "Token", "Name": "Token Issued Failure", "EventType": "Failure", "Id": 2001, "Message": null, "ActivityId": "0HMJ7TTLK79RH:00000008", "TimeStamp": "2022-07-17T12:42:06.0000000Z", "ProcessId": 1, "LocalIpAddress": "10.244.1.16:443", "RemoteIpAddress": "10.244.0.9", "$type": "TokenIssuedFailureEvent"}
[12:42:06 VRB] Invoking result: IdentityServer4.Endpoints.Results.TokenErrorResult
IdpConfiguration
services.AddIdentityServer(options =>
{
options.Events.RaiseErrorEvents = true;
options.Events.RaiseInformationEvents = true;
options.Events.RaiseFailureEvents = true;
options.Events.RaiseSuccessEvents = true;
})
.AddConfigurationStore(options =>
{
options.ConfigureDbContext = (t) =>
{
t.UseNpgsql(configuration.GetConnectionString("IdpDb"),
b => b.MigrationsAssembly(migrationsAssembly));
t.EnableSensitiveDataLogging();
};
})
.AddOperationalStore(options =>
{
options.ConfigureDbContext = (t) =>
{
t.UseNpgsql(configuration.GetConnectionString("IdpDb"),
b => b.MigrationsAssembly(migrationsAssembly));
t.EnableSensitiveDataLogging();
};
})
.AddProfileService<BrandeeUserProfileService>()
.AddSigningCredential(LoadCertificate(configuration));
DataProtection Code:
services.AddDataProtection()
.SetApplicationName("TAASe")
.UseCryptographicAlgorithms(
new AuthenticatedEncryptorConfiguration()
{
EncryptionAlgorithm = EncryptionAlgorithm.AES_256_CBC,
ValidationAlgorithm = ValidationAlgorithm.HMACSHA256,
}
)
.ProtectKeysWithCertificate(new X509Certificate2(configuration["Certificate:Path"],
configuration["Certificate:Password"]))
.PersistKeysToDbContext<AppDataProtectionDbContext>()
.SetDefaultKeyLifetime(TimeSpan.FromDays(14));
Client Definition:
{
"clientId": "Idp.UserIdentity Swagger",
"clientName": "Idp.UserIdentity Swagger",
"requireConsent": true,
"accessTokenLifetime": 3600,
"identityTokenLifetime": 3600,
"allowOfflineAccess": true,
"alwaysSendClientClaims": true,
"secrets": [
"secret"
],
"scopes": [
"openid","profile","email"
],
"allowedGrantType": [
"authorization_code"
],
"redirectUris": [
"https://identity.XXXXXXXXXX.com/swagger/oauth2-redirect.html"
],
"corsOrigins": [
"https://identity.XXXXXXX.com"
],
"postLogoutRedirectUri": []
}
and in Swagger
services.AddSwaggerGen(options =>
{
var oauthSecuritySchema = new OpenApiSecurityScheme()
{
Type = SecuritySchemeType.OAuth2,
Flows = new OpenApiOAuthFlows()
{
AuthorizationCode = new OpenApiOAuthFlow()
{
AuthorizationUrl = new Uri(configuration["Idp:AuthorizationUrl"]),
Scopes = new Dictionary<string, string>()
{
// {"Idp.UserManagement","Identity"},
{"openid","openid"},
{"profile","profile"},
{"email","email"}
},
TokenUrl = new Uri(configuration["Idp:TokenUrl"]),
}
},
Name = configuration["Swagger:Name"],
};
options.SwaggerDoc("v1", new OpenApiInfo {Title = "Protected API", Version = "v1"});
options.AddSecurityDefinition("oauth2", oauthSecuritySchema);
options.OperationFilter<AuthorizeCheckOperationFilter>();
options.EnableAnnotations();
});
When the user logs in, the Idp saves the code in the PersistedGrants table with the key formed by (code + ":" + "authorization_code").Sha256(). For your code E3661868CE07773D4612B6A32A5D10B9B0A48D00E616718C795D9ED5F6827348 the key is tJc155MKnmvPDXowrLH4laE8GBDyxFtEveiaB/ONE4w=. That is correct according to the logs. Then, the Idp returns this code to the caller.
Then, the client can change this code for the tokens in the token endpoint. The Idp try to recover this record by forming the key again, retrieving it from the database and checking if the passed code match with the stored previously.
It seems the persistence in the operational store is not working properly. Either this record is not saved in the first part, or the query to get it in the second part is not working. Whatever the reason the service returns a generic invalid_grant error message.
Check if the record is saved in the PersistedGrants table. You can use my Fiddle to form the key and test with other codes.
Check the previous logs if you have any EF exception when SaveAsync is called.

System.Security.Cryptography.CryptographicException: Error occurred during a cryptographic operation

I've recently installed stackify on my dev API server and I have this error coming in on the stackify error dashboard but I cannot reproduce the error. I believe there is an error logged for almost every request made to the API, eventhough all the requests are OK(200) and none have responded with ServerError(5XX).
This is the error message:
System.Security.Cryptography.CryptographicException: System.Security.Cryptography.CryptographicException: Error occurred during a cryptographic operation.
at System.Web.Security.Cryptography.HomogenizingCryptoServiceWrapper.HomogenizeErrors(Func`2 func, Byte[] input)
Error Document:
{
"id": "1266b838-a261-4bde-9220-ff7993d72c0e",
"env": "dev",
"host": "raidsrv3",
"appname": "environment.appname.com",
"version": null,
"apploc": "D:\\StageApplications\\environment.appname.com",
"message": "System.NullReferenceException: Object reference not set to an instance of an object.\r\nSystem.NullReferenceException: System.NullReferenceException: Object reference not set to an instance of an object.\r\n at lambda_method(Closure , LoginViewModel )\r\n",
"json": null,
"jsonPreview": null,
"thread": "40",
"threadOs": null,
"transid": "7af3de61-9bf1-43d8-b60c-ff9850a35490",
"timestamp": "2021-01-20T14:21:41.247Z",
"inserted": "2021-01-20T14:22:11.8261135Z",
"level": "ERROR",
"logType": "app-dotnet",
"logger": null,
"urlRoute": "Home.Login",
"urlFull": null,
"sourcemethod": "lambda_method(Closure , LoginViewModel )",
"sourceline": null,
"stackify": {
"CdWebAppId": null,
"CdId": 1,
"CdAppId": 215,
"Error": 1,
"WebLogUrlId": null,
"Queued": "2021-01-20T14:21:47.0806791Z",
"Tooksecs": 24.745,
"QueuedPartition": "Jan201400p1",
"Trace": null,
"FromApm": null,
"Order": 1,
"InvalidEpochStr": null,
"IsWebLog": false,
"AppNameId": "23f72352-2d5a-eb11-a607-0003ffcfb91b",
"AppEnvId": "43f72352-2d5a-eb11-a607-0003ffcfb91b",
"EnvId": 2,
"Timestamp1M": "2021-01-20T14:21:00Z",
"Timestamp5M": "2021-01-20T14:20:00Z",
"Timestamp1H": "2021-01-20T14:00:00Z",
"Timestamp1D": "2021-01-20T00:00:00Z",
"IsProd": true,
"Expiration1D": "2021-02-05T00:00:00Z",
"DeploymentId": null
},
"error": {
"StackifyErrorID": "1266b838-a261-4bde-9220-ff7993d72c0e",
"OccurredEpochMillis": 1611152501247,
"Error": {
"InnerError": null,
"StackTrace": [
{
"LineNum": null,
"Method": "lambda_method(Closure , LoginViewModel )",
"CodeFileName": null
}
],
"Message": "System.NullReferenceException: Object reference not set to an instance of an object.",
"ErrorType": "System.NullReferenceException",
"ErrorTypeCode": "-2147467261",
"Data": null,
"SourceMethod": "lambda_method(Closure , LoginViewModel )"
},
"data": {},
"EnvironmentDetail": {
"DeviceName": "RAIDSRV3",
"AppLocation": "D:\\StageApplications\\environment.appname.com",
"AppName": "environment.appname.com",
"WebAppID": null,
"ConfiguredAppName": null,
"ConfiguredEnvironmentName": null,
"ConfiguredLocationName": null,
"IsAzureWorkerRole": false
},
"WebRequestDetail": {
"UserIPAddress": null,
"HttpMethod": "GET",
"RequestProtocol": null,
"WebLogUrl": "Home.Login",
"RequestDomain": "environment.appname.com",
"ReportingUrl": "Home.Login",
"UrlKey": "get-home.login",
"RequestUrl": "https://environment.appname.com/",
"RequestUrlRoot": null,
"RequestRoute": null,
"ReferralUrl": null,
"UserAgent": null,
"Headers": {},
"Cookies": {},
"QueryString": {},
"PostData": {},
"SessionData": {},
"PostDataRaw": null,
"MvcAction": null,
"MvcController": null,
"MvcArea": null
},
"ApiClient": {
"Name": null,
"Platform": ".net"
},
"ServerVariables": {},
"CustomerName": null,
"UserName": null,
"errorGroupId": "b772fbd6-db5a-eb11-a607-0003ffcfb91b",
"errorGroupInstanceId": "bf72fbd6-db5a-eb11-a607-0003ffcfb91b",
"displayMethodId": "d65c87ef-ca5a-eb11-a607-0003ffcfb91b",
"errorSourceMethodId": "d65c87ef-ca5a-eb11-a607-0003ffcfb91b",
"errorTypeMessageId": "2-df28da1c-715a-eb11-a607-0003ffcfb91b-0e8ec107143a2e3d04bfee99e49c20a5",
"errorUniqueId": "d75c87ef-ca5a-eb11-a607-0003ffcfb91b",
"errorPlatformTypeId": 2,
"errorStateId": 0,
"errorTypeId": "df28da1c-715a-eb11-a607-0003ffcfb91b",
"message": "System.NullReferenceException: Object reference not set to an instance of an object.",
"errorType": "System.NullReferenceException",
"errorTypeClass": "NullReferenceException",
"errorTypeCode": "-2147467261",
"sourceMethodName": "lambda_method(Closure , LoginViewModel )",
"sourceMethodShort": "lambda_method(Closure , LoginViewModel )",
"errorGroupCreatedUtc": "2021-01-20T04:55:18.767",
"displayMethodName": "lambda_method(Closure , LoginViewModel )",
"displayMethodShort": "lambda_method(Closure , LoginViewModel )",
"stackTraceHash": "858F2DB7DA4C81444B39BA60C9CC5B65",
"stackTrace": "System.NullReferenceException: System.NullReferenceException: Object reference not set to an instance of an object.\n\tat lambda_method(Closure , LoginViewModel )\n",
"appended": "2021-01-20T14:22:22.5880117Z"
},
"winevent": null,
"weblog": null,
"tag": [
"fromapm"
],
"container": null,
"kubernetes": null
}
I have searched all over but I can't find an explanation for this error.
Here's some background info about my dev environment:
The API is .net Framework 4.7.2
I updated all the nuget packages and libries to their latest supported version
The machine key is already configured and I have verified the same key exists in both API servers web.config files. eg: <machineKey validationKey="***" decryptionKey="***" />
API is deployed on 2 servers, with nginx inbetween the client and the servers.
Ocotopus Deploy is used to deploy the API
DFS is used to sync the application files from the main server to the sister server
Any help will be greatly appreciated!
Turns out this exception that was being caught by stackify was a First Chance exception that is handled inside the .net framework.
More on first chance exceptions at this answer here
And if you're like me and your organization is concerned about all the exceptions being captured by Stackify, you can go to the environment settings > Editing Environment > Automatic collection & viewing of app errors via APM and change the setting from
Upload all errors to error module to Upload unhandled errors to error module.
That will make sure that only unhandled exceptions bubble up into stackify.

WebApi returning serialized HttpResponseMessage instead of text/html

I can't for the life of me figure this out because if I start a fresh WebApi project this works just fine. But in my existing application, it isn't working the same way. I'm dynamically building HTML and returning. Code is below:
var response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent(some html goes here)
};
response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html");
return response;
The response from that code is (200 OK):
{
"version": {
"major": 1,
"minor": 1,
"build": -1,
"revision": -1,
"majorRevision": -1,
"minorRevision": -1
},
"content": {
"headers": [
{
"key": "Content-Type",
"value": [
"text/html"
]
}
]
},
"statusCode": 200,
"reasonPhrase": "OK",
"headers": [],
"requestMessage": null,
"isSuccessStatusCode": true
}
Some of the configuration that might be relevant:
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver =new CamelCasePropertyNamesContractResolver();
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.None;
config.Formatters.JsonFormatter.UseDataContractJsonSerializer = false;
config.Formatters.Remove(config.Formatters.XmlFormatter);
The request is configured to accept the standard content types.
I've read some things about creating a custom formatter but I think that isn't necessary seeing that I'm able to return HTML just fine in a blank Web API project. I'm thinking something with the middleware or something else in the pipeline is intercepting the object and serializing.
.NET 4.6
NuGet Packges: Microsoft.AspNet.WebApi.* are set to 5.2.5.
This is an issue I'm experiencing in my local environment.
As always, any help is appreciated. Thanks!

Is there a way to update a notification sent by Firebase Cloud Message (FCM) to an web app instead of creating a new one?

I'm using FCM for a chat app. Everytime an user receives a message, I send him a notification via FCM. If user isn't with my web app in foreground, the message handling happens in a default Service Worker that generates a notification with the parameters I've specified on the body of my request. The problem is, everytime a new push message is sent and the app is in background, browsers (tested on Chrome and Firefox) are creating a new message instead of updating the existing one. I would like to keep the already visible notification and only update its value, is that possible?
Service Worker that handles the push if app isn't in foreground:
importScripts('https://www.gstatic.com/firebasejs/3.5.2/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/3.5.2/firebase-messaging.js');
firebase.initializeApp({
'messagingSenderId': '*****'
});
const messaging = firebase.messaging();
JSON body of the request sent to FCM server
{
"priority" : "normal",
"collapse_key": "demo",
"notification": {
"title": "Felicius Humble",
"body": "This is a sample message content",
"click_action": "https://****.herokuapp.com",
"icon": "****"
},
"to": "****",
"data": {
"id": 7,
"timestamp": 1493573846692,
"content": "teste",
"type": "MESSAGE",
"direction": "OUTPUT",
"sender": {
"id": 5,
"name": "Felicius Humble",
"email": "****#gmail.com",
"gender": "MALE",
"picture": "****",
"facebookID": "****",
"fcmToken": "****",
"accessToken": "****"
},
"chatID": 3
}
}
Ok, so I've found this that shows all options available for the json body. For what I need I just need to add "tag" param on notification obj in my json body. If you want to update the notification, sent it with the same tag. Example:
{
"notification": {
"title": "",
"body": "",
"click_action": "",
"icon": "",
"tag" : "this must be the same for the notifications you want to update"
},
"to": "****",
"data": {}
}
}
There are scenarios where you might want a replacing notification to notify the user rather than silently update. Chat applications are a good example. In this case you should set tag and renotify to true.
write this code on your sw.js
const title = 'Notification 2 of 2';
const options = {
tag: 'renotify',
renotify: true
};
registration.showNotification(title, options);
You can test demo on here by clicking in renotify button

Resources